1 #!/usr/bin/env python2.5
4 # Copyright (c) 2007-2008 INdT.
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Lesser General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 # ============================================================================
21 # Author : Yves Marcoz
23 # Description : Simple RSS Reader
24 # ============================================================================
26 #sys.path.insert(0, '/opt/FeedingIt')
27 #sys.path.insert(0, '/home/user/workspace/feedingit/src/')
29 import gtk, pickle, gobject, dbus
30 import hildondesktop, hildon
31 #from rss import Listing
33 # Create a session bus.
35 from dbus.mainloop.glib import DBusGMainLoop
36 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
37 bus = dbus.SessionBus()
39 CONFIGDIR="/home/user/.feedingit/"
41 class FeedingItHomePlugin(hildondesktop.HomePluginItem):
44 hildondesktop.HomePluginItem.__init__(self)
45 self.set_settings(True)
46 self.connect("show-settings", self.show_settings)
49 vbox = gtk.VBox(False, 0)
51 button = gtk.Button("Update")
52 button.connect("clicked", self.update_list)
54 vbox.pack_start(button)
56 #for feed in ["Slashdot", "Engadget", "Cheez"]:
57 # self.treestore.append([feed, "0"])
58 self.treeview = gtk.TreeView()
60 self.treeview.append_column(gtk.TreeViewColumn('Feed Name', gtk.CellRendererText(), text = 0))
61 self.treeview.append_column(gtk.TreeViewColumn('Unread Items', gtk.CellRendererText(), text = 1))
62 #self.treeview.get_selection().set_mode(gtk.SELECTION_NONE)
63 #hildon.hildon_gtk_tree_view_set_ui_mode(self.treeview, gtk.HILDON_UI_MODE_NORMAL)
65 vbox.pack_start(self.treeview)
68 self.treeview.connect("row-activated", self.row_activated)
71 gobject.timeout_add_seconds(30*60, self.update_list)
74 file = open("/home/user/.feedingit/feedingit_widget.log", "w")
75 traceback.print_exc(file=file)
77 def row_activated(self, treeview, treepath, column):
78 (model, iter) = self.treeview.get_selection().get_selected()
79 key = model.get_value(iter, 2)
80 # Create an object that will proxy for a particular remote object.
81 remote_object = bus.get_object("org.maemo.feedingit", # Connection name
82 "/org/maemo/feedingit" # Object's path
84 iface = dbus.Interface(remote_object, 'org.maemo.feedingit')
87 def update_list(self, *widget):
88 #listing = Listing(CONFIGDIR)
89 treestore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
91 if self.feed_list == {}:
95 #for key in listOfFeeds["feedingit-order"]:
96 for key in self.feed_list.keys():
98 file = open(CONFIGDIR+key+".d/unread", "r")
99 readItems = pickle.load( file )
102 for id in readItems.keys():
103 if readItems[id]==False:
104 countUnread = countUnread + 1
105 list.append([self.feed_list[key], countUnread, key])
108 list = sorted(list, key=lambda item: item[1], reverse=True)
109 for item in list[0:8]:
110 treestore.append(item)
111 self.treeview.set_model(treestore)
112 self.treeview.get_selection().unselect_all()
115 def show_settings(self, widget):
116 file = open(CONFIGDIR+"feeds.pickle")
117 listOfFeeds = pickle.load(file)
119 dialog = gtk.Dialog("Settings", None, gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
121 self.pannableArea = hildon.PannableArea()
123 #self.treestore_settings = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
124 self.treeview_settings = gtk.TreeView()
126 self.treeview_settings.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
127 hildon.hildon_gtk_tree_view_set_ui_mode(self.treeview_settings, gtk.HILDON_UI_MODE_EDIT)
128 dialog.vbox.pack_start(self.pannableArea)
130 self.treeview_settings.append_column(gtk.TreeViewColumn('Feed Name', gtk.CellRendererText(), text = 0))
131 self.treestore_settings = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
132 self.treeview_settings.set_model(self.treestore_settings)
134 for key in listOfFeeds["feedingit-order"]:
135 title = listOfFeeds[key]["title"]
136 item = self.treestore_settings.append([title, key])
137 if key in self.feed_list:
138 self.treeview_settings.get_selection().select_iter(item)
140 self.pannableArea.add(self.treeview_settings)
141 self.pannableArea.show_all()
142 dialog.set_default_size(-1, 600)
144 response = dialog.run()
146 if response == gtk.RESPONSE_ACCEPT:
147 self.feed_list = self.getItems()
150 #self.treeview_settings.get_selection().select_all()
154 treeselection = self.treeview_settings.get_selection()
155 (model, pathlist) = treeselection.get_selected_rows()
156 for path in pathlist:
157 list[model.get_value(model.get_iter(path),1)] = model.get_value(model.get_iter(path),0)
162 #from dbus.mainloop.glib import DBusGMainLoop
163 #dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
165 #loop = gobject.MainLoop()
166 #bus = dbus.Bus(dbus.Bus.TYPE_SESSION)
167 #bus = dbus.SessionBus(mainloop=loop)
168 #bus = dbus.Bus.get_system()
169 #bus = dbus.Bus.get_session(True)
170 #bus.set_exit_on_disconnect(False)
172 remote_object = bus.get_object("org.maemo.feedingit", # Connection name
173 "/org/maemo/feedingit" # Object's path
175 iface = dbus.Interface(remote_object, 'org.maemo.feedingit')
176 iface.connect_to_signal("ArticleCountUpdated", self.update_list)
178 #bus.add_signal_receiver(self.update_list,
179 # dbus_interface="org.maemo.feedingit",
180 # signal_name="ArticleCountUpdated",
181 # path="/org/maemo/feedingit")
183 def save_config(self):
184 if not isdir(CONFIGDIR):
186 file = open(CONFIGDIR+"widget", "w")
187 pickle.dump(self.feed_list, file )
190 def load_config(self):
192 file = open(CONFIGDIR+"widget", "r")
193 self.feed_list = pickle.load( file )
196 file = open(CONFIGDIR+"feeds.pickle")
197 listOfFeeds = pickle.load(file)
200 #self.feed_list = listOfFeeds["feedingit-order"]
201 for key in listOfFeeds["feedingit-order"]:
202 self.feed_list[key] = listOfFeeds[key]["title"]
206 hd_plugin_type = FeedingItHomePlugin
208 # The code below is just for testing purposes.
209 # It allows to run the widget as a standalone process.
210 if __name__ == "__main__":
212 gobject.type_register(hd_plugin_type)
213 obj = gobject.new(hd_plugin_type, plugin_id="plugin_id")