Added read/unread flags for articles
authorYves <ymarcoz@n900-sdk.(none)>
Mon, 4 Jan 2010 07:06:43 +0000 (23:06 -0800)
committerYves <ymarcoz@n900-sdk.(none)>
Mon, 4 Jan 2010 07:06:43 +0000 (23:06 -0800)
src/FeedingIt.py
src/rss.py

index 446d73f..7475f3a 100644 (file)
@@ -91,8 +91,9 @@ class AddWidgetWizard(hildon.WizardDialog):
             return True
 
 class DisplayArticle(hildon.StackableWindow):
-    def __init__(self, title, text):
+    def __init__(self, title, text, index):
         hildon.StackableWindow.__init__(self)
+        self.index = index
         self.text = text
         self.set_title(title)
 
@@ -128,6 +129,7 @@ class DisplayArticle(hildon.StackableWindow):
         self.connect("destroy", self.destroyWindow)
         
     def destroyWindow(self, *args):
+        self.emit("article-closed", self.index)
         self.destroy()
         
     def reloadArticle(self, widget):
@@ -145,11 +147,12 @@ class DisplayArticle(hildon.StackableWindow):
 
 
 class DisplayFeed(hildon.StackableWindow):
-    def __init__(self, feed, title):
+    def __init__(self, feed, title, key):
         hildon.StackableWindow.__init__(self)
         self.feed = feed
         self.feedTitle = title
         self.set_title(title)
+        self.key=key
         
         menu = hildon.AppMenu()
         button = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
@@ -164,6 +167,10 @@ class DisplayFeed(hildon.StackableWindow):
         self.connect("destroy", self.destroyWindow)
         
     def destroyWindow(self, *args):
+        for index in range(self.feed.getNumberOfEntries()):
+            self.feed.setEntryRead(index)
+        self.feed.saveFeed()
+        self.emit("feed-closed", self.key)
         self.destroy()
 
     def displayFeed(self):
@@ -171,17 +178,20 @@ class DisplayFeed(hildon.StackableWindow):
         self.pannableFeed = hildon.PannableArea()
         self.pannableFeed.add_with_viewport(self.vboxFeed)
         self.pannableFeed.set_property("mov-mode", hildon.MOVEMENT_MODE_BOTH)
-        
-        index = 0
-        for item in self.feed.getEntries():
-            button = gtk.Button(item["title"])
+        self.buttons = []
+        for index in range(self.feed.getNumberOfEntries()):
+            button = gtk.Button(self.feed.getTitle(index))
             button.set_alignment(0,0)
             label = button.child
-            label.modify_font(pango.FontDescription("sans 18"))
+            if self.feed.isEntryRead(index):
+                label.modify_font(pango.FontDescription("sans 18"))
+            else:
+                label.modify_font(pango.FontDescription("sans bold 18"))
             label.set_line_wrap(True)
             
             label.set_size_request(self.get_size()[0]-50, -1)
             button.connect("clicked", self.button_clicked, index)
+            self.buttons.append(button)
             
             self.vboxFeed.pack_start(button, expand=False)           
             index=index+1
@@ -193,7 +203,13 @@ class DisplayFeed(hildon.StackableWindow):
         self.remove(self.pannableFeed)
         
     def button_clicked(self, button, index):
-        disp = DisplayArticle(self.feedTitle, self.feed.getArticle(index))
+        disp = DisplayArticle(self.feedTitle, self.feed.getArticle(index), index)
+        disp.connect("article-closed", self.onArticleClosed)
+        
+    def onArticleClosed(self, object, index):
+        label = self.buttons[index].child
+        label.modify_font(pango.FontDescription("sans 18"))
+        self.buttons[index].show()
 
     def button_update_clicked(self, button):
         self.listing.getFeed(key).updateFeed()
@@ -303,21 +319,28 @@ class FeedingIt:
         self.pannableListing = hildon.PannableArea()
         self.pannableListing.add_with_viewport(self.vboxListing)
 
+        self.buttons = {}
         for key in self.listing.getListOfFeeds():
             #button = gtk.Button(item)
             button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
                               hildon.BUTTON_ARRANGEMENT_VERTICAL)
-            button.set_text(self.listing.getFeedTitle(key), self.listing.getFeedUpdateTime(key))
+            button.set_text(self.listing.getFeedTitle(key), self.listing.getFeedUpdateTime(key) + " / " 
+                            + str(self.listing.getFeedNumberOfUnreadItems(key)) + " Unread Items")
             button.set_alignment(0,0,1,1)
-            #label = button.child
-            #label.modify_font(pango.FontDescription("sans 10"))
             button.connect("clicked", self.buttonFeedClicked, self, self.window, key)
             self.vboxListing.pack_start(button, expand=False)
+            self.buttons[key] = button
         self.window.add(self.pannableListing)
         self.window.show_all()
     
     def buttonFeedClicked(widget, button, self, window, key):
-        disp = DisplayFeed(self.listing.getFeed(key), self.listing.getFeedTitle(key))
+        disp = DisplayFeed(self.listing.getFeed(key), self.listing.getFeedTitle(key), key)
+        disp.connect("feed-closed", self.onFeedClosed)
+        
+    def onFeedClosed(self, object, key):
+        self.buttons[key].set_text(self.listing.getFeedTitle(key), self.listing.getFeedUpdateTime(key) + " / " 
+                            + str(self.listing.getFeedNumberOfUnreadItems(key)) + " Unread Items")
+        self.buttons[key].show()
      
     def run(self):
         self.window.connect("destroy", gtk.main_quit)
@@ -325,6 +348,9 @@ class FeedingIt:
 
 
 if __name__ == "__main__":
+    gobject.signal_new("feed-closed", DisplayFeed, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))
+    gobject.signal_new("article-closed", DisplayArticle, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))
+    
     if not isdir(CONFIGDIR):
         try:
             mkdir(CONFIGDIR)
index 63ecbc6..d2a347d 100644 (file)
@@ -39,38 +39,67 @@ def getId(string):
 class Feed:
     # Contains all the info about a single feed (articles, ...), and expose the data
     def __init__(self, name, url):
-        self.feed = []
+        self.entries = []
+        self.readItems = {}
+        self.countUnread = 0
         self.name = name
         self.url = url
         self.updateTime = "Never"
-        #self.feed=feedparser.parse(url)
-    
+
+    def saveFeed(self):
+        file = open(CONFIGDIR+getId(self.name), "w")
+        pickle.dump(self, file )
+        file.close()
+
     def updateFeed(self):
         tmp=feedparser.parse(self.url)
+        # Check if the parse was succesful (number of entries > 0, else do nothing)
         if len(tmp["entries"])>0:
-           self.feed = tmp
-          self.updateTime = time.asctime()
-           file = open(CONFIGDIR+getId(self.name), "w")
-           pickle.dump(self, file )
-           file.close()
+           self.updateTime = time.asctime()
+           self.entries = tmp["entries"]
+           # Initialize the new articles to unread
+           for index in range(self.getNumberOfEntries()):
+               if not self.readItems.has_key(self.getTitle(index)):
+                   self.countUnread = self.countUnread + 1
+                   self.readItems[self.getTitle(index)] = False
+           del tmp
+           self.saveFeed()
+    
+    def setEntryRead(self, index):
+        if self.readItems[self.getTitle(index)]==False:
+            self.countUnread = self.countUnread - 1
+            self.readItems[self.getTitle(index)] = True
+    
+    def isEntryRead(self, index):
+        return self.readItems[self.getTitle(index)]
+    
+    def getTitle(self, index):
+        return self.entries[index]["title"]
     
     def getUpdateTime(self):
         return self.updateTime
     
     def getEntries(self):
         try:
-            return self.feed["entries"]
+            return self.entries
         except:
             return []
     
+    def getNumberOfUnreadItems(self):
+        return self.countUnread
+    
+    def getNumberOfEntries(self):
+        return len(self.entries)
+    
     def getItem(self, index):
         try:
-            return self.feed["entries"][index]
+            return self.entries[index]
         except:
             return []
     
     def getArticle(self, index):
-        entry = self.feed["entries"][index]
+        self.setEntryRead(index)
+        entry = self.entries[index]
         title = entry.get('title', 'No title')
         #content = entry.get('content', entry.get('summary_detail', {}))
         if entry.has_key('content'):
@@ -88,10 +117,27 @@ class Feed:
         text = text + "<BR /><BR />"
         text = text + content
         return text    
-    
+
+
 class Listing:
     # Lists all the feeds in a dictionary, and expose the data
-    
+    def __init__(self):
+        self.feeds = {}
+        if isfile(CONFIGDIR+"feeds.pickle"):
+            file = open(CONFIGDIR+"feeds.pickle")
+            self.listOfFeeds = pickle.load(file)
+            file.close()
+        else:
+            self.listOfFeeds = {getId("Slashdot"):{"title":"Slashdot", "url":"http://rss.slashdot.org/Slashdot/slashdot"}, }
+        for key in self.listOfFeeds.keys():
+            if isfile(CONFIGDIR+key):
+                file = open(CONFIGDIR+key)
+                self.feeds[key] = pickle.load(file)
+                file.close()
+            else:
+                self.feeds[key] = Feed(self.listOfFeeds[key]["title"], self.listOfFeeds[key]["url"])
+        self.saveConfig()
+        
     def updateFeeds(self):
         for key in self.listOfFeeds.keys():
             self.feeds[key].updateFeed()
@@ -101,6 +147,9 @@ class Listing:
     
     def getFeedUpdateTime(self, key):
         return self.feeds[key].getUpdateTime()
+    
+    def getFeedNumberOfUnreadItems(self, key):
+        return self.feeds[key].getNumberOfUnreadItems()
    
     def getFeedTitle(self, key):
         return self.listOfFeeds[key]["title"]
@@ -125,21 +174,4 @@ class Listing:
     def saveConfig(self):
         file = open(CONFIGDIR+"feeds.pickle", "w")
         pickle.dump(self.listOfFeeds, file)
-        file.close()
-    
-    def __init__(self):
-        self.feeds = {}
-        if isfile(CONFIGDIR+"feeds.pickle"):
-            file = open(CONFIGDIR+"feeds.pickle")
-            self.listOfFeeds = pickle.load(file)
-            file.close()
-        else:
-            self.listOfFeeds = {getId("Slashdot"):{"title":"Slashdot", "url":"http://rss.slashdot.org/Slashdot/slashdot"}, }
-        for key in self.listOfFeeds.keys():
-            if isfile(CONFIGDIR+key):
-                file = open(CONFIGDIR+key)
-                self.feeds[key] = pickle.load(file)
-                file.close()
-            else:
-                self.feeds[key] = Feed(self.listOfFeeds[key]["title"], self.listOfFeeds[key]["url"])
-        self.saveConfig()
\ No newline at end of file
+        file.close()
\ No newline at end of file