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)
self.connect("destroy", self.destroyWindow)
def destroyWindow(self, *args):
+ self.emit("article-closed", self.index)
self.destroy()
def reloadArticle(self, widget):
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)
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):
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
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()
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)
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)
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'):
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()
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"]
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