From: Neal H. Walfield Date: Tue, 6 Sep 2011 20:42:34 +0000 (+0200) Subject: Modify the DisplayFeed widget so it need not be destroyed. X-Git-Url: http://git.maemo.org/git/?p=feedingit;a=commitdiff_plain;h=a21306fb3996e6c90da79582894e5a5dc95c00ed Modify the DisplayFeed widget so it need not be destroyed. --- diff --git a/src/FeedingIt.py b/src/FeedingIt.py index 22db363..926f139 100644 --- a/src/FeedingIt.py +++ b/src/FeedingIt.py @@ -331,7 +331,6 @@ class DownloadBar(gtk.ProgressBar): self.downloadbars.append(weakref.ref (self)) self.set_fraction(0) self.__class__.update_bars() - self.show_all() @classmethod def downloading(cls): @@ -829,13 +828,15 @@ class DisplayArticle(hildon.StackableWindow): error_handler=error_handler()) class DisplayFeed(hildon.StackableWindow): - def __init__(self, listing, feed, title, key, config): + def __init__(self, listing, config): hildon.StackableWindow.__init__(self) + self.connect('configure-event', self.on_configure_event) + self.connect("delete_event", self.delete_window) + self.connect("destroy", self.destroyWindow) + self.listing = listing - self.feed = feed - self.feedTitle = title - self.set_title(title) - self.key=key + self.config = config + # Articles to show. # # If hide read articles is set, this is set to the set of @@ -844,7 +845,6 @@ class DisplayFeed(hildon.StackableWindow): # but then decides to move back, previous should select the # just read article. self.articles = list() - self.config = config self.downloadDialog = False @@ -862,27 +862,50 @@ class DisplayFeed(hildon.StackableWindow): button.set_label("Mark all as read") button.connect("clicked", self.buttonReadAllClicked) menu.append(button) - - if key=="ArchivedArticles": - button = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - button.set_label("Delete read articles") - button.connect("clicked", self.buttonPurgeArticles) - menu.append(button) + + button = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) + button.set_label("Delete read articles") + button.connect("clicked", self.buttonPurgeArticles) + menu.append(button) + self.archived_article_buttons = [button] self.set_app_menu(menu) menu.show_all() - self.main_vbox = gtk.VBox(False, 0) - self.add(self.main_vbox) + self.feedItems = gtk.ListStore(str, str) - self.pannableFeed = None - self.displayFeed() + self.feedList = hildon.GtkTreeView(gtk.HILDON_UI_MODE_NORMAL) + self.feedList.set_model(self.feedItems) + self.feedList.set_rules_hint(True) + self.feedList.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_HORIZONTAL) + self.feedList.set_hover_selection(False) + self.feedList.connect('hildon-row-tapped', + self.on_feedList_row_activated) + + self.markup_renderer = gtk.CellRendererText() + self.markup_renderer.set_property('wrap-mode', pango.WRAP_WORD_CHAR) + self.markup_renderer.set_property('background', bg_color) #"#333333") + (width, height) = self.get_size() + self.markup_renderer.set_property('wrap-width', width-20) + self.markup_renderer.set_property('ypad', 8) + self.markup_renderer.set_property('xpad', 5) + markup_column = gtk.TreeViewColumn('', self.markup_renderer, \ + markup=FEED_COLUMN_MARKUP) + self.feedList.append_column(markup_column) - if DownloadBar.downloading (): - self.show_download_bar () + vbox = gtk.VBox(False, 10) + vbox.pack_start(self.feedList) - self.connect('configure-event', self.on_configure_event) - self.connect("destroy", self.destroyWindow) + self.pannableFeed = hildon.PannableArea() + self.pannableFeed.set_property('hscrollbar-policy', gtk.POLICY_NEVER) + self.pannableFeed.add_with_viewport(vbox) + + self.main_vbox = gtk.VBox(False, 0) + self.main_vbox.pack_start(self.pannableFeed) + + self.add(self.main_vbox) + + self.main_vbox.show_all() def on_configure_event(self, window, event): if getattr(self, 'markup_renderer', None) is None: @@ -897,61 +920,67 @@ class DisplayFeed(hildon.StackableWindow): self.feedItems.set_value(it, FEED_COLUMN_MARKUP, markup) it = self.feedItems.iter_next(it) + def delete_window(self, *args): + """ + Prevent the window from being deleted. + """ + self.hide() + + try: + key = self.key + except AttributeError: + key = None + + if key is not None: + self.listing.updateUnread(key) + self.emit("feed-closed", key) + self.key = None + self.feedItems.clear() + + return True + def destroyWindow(self, *args): - #self.feed.saveUnread(CONFIGDIR) - self.listing.updateUnread(self.key) - self.emit("feed-closed", self.key) + try: + key = self.key + except AttributeError: + key = None + self.destroy() - #gobject.idle_add(self.feed.saveFeed, CONFIGDIR) - #self.listing.closeCurrentlyDisplayedFeed() def fix_title(self, title): return escape(unescape(title).replace("","").replace("","").replace("","").replace("","").replace("","")) - def displayFeed(self): - if self.pannableFeed: - self.pannableFeed.destroy() - - self.pannableFeed = hildon.PannableArea() + def displayFeed(self, key=None): + """ + Select and display a feed. If feed, title and key are None, + reloads the current feed. + """ + if key: + try: + old_key = self.key + except AttributeError: + old_key = None - self.pannableFeed.set_property('hscrollbar-policy', gtk.POLICY_NEVER) + if old_key: + self.listing.updateUnread(self.key) + self.emit("feed-closed", self.key) - self.feedItems = gtk.ListStore(str, str) - #self.feedList = gtk.TreeView(self.feedItems) - self.feedList = hildon.GtkTreeView(gtk.HILDON_UI_MODE_NORMAL) - self.feedList.set_rules_hint(True) + self.feed = self.listing.getFeed(key) + self.feedTitle = self.listing.getFeedTitle(key) + self.key = key - selection = self.feedList.get_selection() - selection.set_mode(gtk.SELECTION_NONE) - #selection.connect("changed", lambda w: True) - - self.feedList.set_model(self.feedItems) - self.feedList.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_HORIZONTAL) + self.set_title(self.feedTitle) - - self.feedList.set_hover_selection(False) - #self.feedList.set_property('enable-grid-lines', True) - #self.feedList.set_property('hildon-mode', 1) - #self.pannableFeed.connect("motion-notify-event", lambda w,ev: True) - - #self.feedList.connect('row-activated', self.on_feedList_row_activated) + selection = self.feedList.get_selection() + if selection is not None: + selection.set_mode(gtk.SELECTION_NONE) - vbox= gtk.VBox(False, 10) - vbox.pack_start(self.feedList) + for b in self.archived_article_buttons: + if key == "ArchivedArticles": + b.show() + else: + b.hide() - self.pannableFeed.add_with_viewport(vbox) - - self.markup_renderer = gtk.CellRendererText() - self.markup_renderer.set_property('wrap-mode', pango.WRAP_WORD_CHAR) - self.markup_renderer.set_property('background', bg_color) #"#333333") - (width, height) = self.get_size() - self.markup_renderer.set_property('wrap-width', width-20) - self.markup_renderer.set_property('ypad', 8) - self.markup_renderer.set_property('xpad', 5) - markup_column = gtk.TreeViewColumn('', self.markup_renderer, \ - markup=FEED_COLUMN_MARKUP) - self.feedList.append_column(markup_column) - #self.pannableFeed.set_property("mov-mode", hildon.MOVEMENT_MODE_BOTH) hideReadArticles = self.config.getHideReadArticles() if hideReadArticles: @@ -959,14 +988,14 @@ class DisplayFeed(hildon.StackableWindow): else: articles = self.feed.getIds() - hasArticle = False self.articles[:] = [] + + self.feedItems.clear() for id in articles: - isRead = False try: isRead = self.feed.isEntryRead(id) - except: - pass + except Exception: + isRead = False if not ( isRead and hideReadArticles ): title = self.fix_title(self.feed.getTitle(id)) self.articles.append(id) @@ -976,21 +1005,22 @@ class DisplayFeed(hildon.StackableWindow): markup = ENTRY_TEMPLATE_UNREAD % (self.config.getFontSize(), title) self.feedItems.append((markup, id)) - hasArticle = True - if hasArticle: - self.feedList.connect('hildon-row-tapped', self.on_feedList_row_activated) - else: + if not articles: + # No articles. markup = ENTRY_TEMPLATE % (self.config.getFontSize(), "No Articles To Display") self.feedItems.append((markup, "")) - self.main_vbox.pack_start(self.pannableFeed) - self.show_all() + self.show() def clear(self): self.pannableFeed.destroy() #self.remove(self.pannableFeed) def on_feedList_row_activated(self, treeview, path): #, column): + if not self.articles: + # There are not actually any articles. Ignore. + return False + selection = self.feedList.get_selection() selection.set_mode(gtk.SELECTION_SINGLE) self.feedList.get_selection().select_path(path) @@ -1069,10 +1099,10 @@ class DisplayFeed(hildon.StackableWindow): self.downloadDialog.connect("download-done", self.onDownloadDone) self.main_vbox.pack_end(self.downloadDialog, expand=False, fill=False) - self.show_all() - + self.downloadDialog.show() + def onDownloadDone(self, widget, feed): - if feed == self.feed: + if feed is not None and hasattr(self, 'feed') and feed == self.feed: self.feed = self.listing.getFeed(self.key) self.displayFeed() @@ -1204,7 +1234,7 @@ class FeedingIt: self.downloadDialog = DownloadBar(self.window) self.downloadDialog.connect("download-done", self.onDownloadDone) self.mainVbox.pack_end(self.downloadDialog, expand=False, fill=False) - self.mainVbox.show_all() + self.downloadDialog.show() if self.__dict__.get ('disp', None): self.disp.show_download_bar () @@ -1224,6 +1254,13 @@ class FeedingIt: dbus_interface='org.marcoz.feedingit', path='/org/marcoz/feedingit/update') + gobject.idle_add(self.build_feed_display) + + def build_feed_display(self): + if not hasattr(self, 'disp'): + self.disp = DisplayFeed(self.listing, self.config) + self.disp.connect("feed-closed", self.onFeedClosed) + def button_markAll(self, button): for key in self.listing.getListOfFeeds(): feed = self.listing.getFeed(key) @@ -1397,11 +1434,8 @@ class FeedingIt: def openFeed(self, key): if key != None: - self.disp = DisplayFeed( - self.listing, self.listing.getFeed(key), - self.listing.getFeedTitle(key), key, - self.config) - self.disp.connect("feed-closed", self.onFeedClosed) + self.build_feed_display() + self.disp.displayFeed(key) def openArticle(self, key, id): if key != None: @@ -1409,7 +1443,7 @@ class FeedingIt: self.disp.button_clicked(None, id) def onFeedClosed(self, object, key): - self.displayListing() + gobject.idle_add(self.displayListing) def quit(self, *args): self.window.hide()