fix next/previous in entry view
[vuplus_dvbapp-plugin] / simplerss / src / RSSScreens.py
index 1fc212f..fea8a5e 100644 (file)
@@ -1,94 +1,77 @@
+# for localized messages
+from . import _
+
 from enigma import eTimer
 
 from Screens.Screen import Screen
 from Screens.MessageBox import MessageBox
-from Screens.ChoiceBox import ChoiceBox
+
 from Components.ActionMap import ActionMap
-from Components.Label import Label
 from Components.ScrollLabel import ScrollLabel
-from Components.Pixmap import Pixmap
-
-from RSSList import RSSList
-from RSSSetup import RSSSetup
+from Components.Sources.List import List
+from Components.Sources.StaticText import StaticText
 
-class PictureView(Screen):
-       """Downloads a Picture, shows it and delete the temporary file"""
+from RSSList import RSSFeedList
 
+class RSSSummary(Screen):
        skin = """
-               <screen position="100,100" size="460,400" title="Simple RSS Reader" >
-                       <widget name="content" position="0,0" size="460,400" alphatest="on"/>
-               </screen>"""
-
-       filename = '/tmp/simplerss_enclosure'
-
-       def __init__(self, session, url):
-               Screen.__init__(self, session)
-
-               self.url = url
-
-               self["actions"] = ActionMap([ "OkCancelActions" ], 
-               {
-                       "ok": self.close,
-                       "cancel": self.close,
-               })
+       <screen position="0,0" size="132,64">
+               <widget source="parent.title" render="Label" position="6,4" size="120,21" font="Regular;18" />
+               <widget source="entry" render="Label" position="6,25" size="120,21" font="Regular;16" />
+               <widget source="global.CurrentTime" render="Label" position="56,46" size="82,18" font="Regular;16" >
+                       <convert type="ClockToText">WithSeconds</convert>
+               </widget>
+       </screen>"""
+
+       def __init__(self, session, parent):
+               Screen.__init__(self, session, parent = parent)
+               self["entry"] = StaticText("")
+               parent.onChangedEntry.append(self.selectionChanged)
+               self.onShow.append(parent.updateInfo)
+               self.onClose.append(self.removeWatcher)
+
+       def removeWatcher(self):
+               self.parent.onChangedEntry.remove(self.selectionChanged)
+
+       def selectionChanged(self, text):
+               self["entry"].text = text
 
-               self["content"] = Pixmap()
-
-               self.onLayoutFinish.append(self.fetchFile)
-
-       def fetchFile(self):
-               # Fetch file
-               from twisted.web.client import downloadPage
-               downloadPage(self.url, self.filename).addCallback(self.gotFile).addErrback(self.error)
-
-       def gotFile(self, data = ""):
-               # Determine Aspect
-               from Components.AVSwitch import AVSwitch
-               aspect = AVSwitch().getAspectRatioSetting()/2
+class RSSBaseView(Screen):
+       """Base Screen for all Screens used in SimpleRSS"""
 
-               # Load Picture
-               from enigma import loadPic
-               ptr = loadPic(self.filename, 460, 400, aspect)
+       def __init__(self, session, poller, parent = None):
+               Screen.__init__(self, session, parent)
+               self["title"] = StaticText()
+               self.onChangedEntry = []
+               self.rssPoller = poller
+               self.pollDialog = None
 
-               # Show Picture
-               self["content"].instance.setPixmap(ptr)
+       def createSummary(self):
+               return RSSSummary
 
-               # Remove Temporary File
-               from os import unlink
-               unlink(self.filename)
+       def setTitle(self, title):
+               Screen.setTitle(self, title)
+               self["title"].text = title
 
-       def error(self):
+       def errorPolling(self, errmsg = ""):
+               # An error occured while polling
                self.session.open(
                        MessageBox,
-                       "Error while loading Picture.",
+                       _("Error while parsing Feed, this usually means there is something wrong with it."),
                        type = MessageBox.TYPE_ERROR,
                        timeout = 3
                )
-               self.close()
-
-class RSSBaseView(Screen):
-       """Base Screen for all Screens used in SimpleRSS"""
-
-       def __init__(self, session, poller):
-               Screen.__init__(self, session)
-               self.rssPoller = poller
-               self.pollDialog = None
 
-       def errorPolling(self, errmsg = ""):
-               # Hide Dialog if shown
+               # Don't show "we're updating"-dialog any longer
                if self.pollDialog:
                        self.pollDialog.close()
                        self.pollDialog = None
 
-               # TODO: fix error not showing when dialog was just hid (work around by using a timer?)
-               self.session.open(
-                       MessageBox,
-                       "Error while parsing Feed, this usually means there is something wrong with it.",
-                       type = MessageBox.TYPE_ERROR,
-                       timeout = 3
-               )
-
        def singleUpdate(self, feedid, errback = None):
+               # Don't do anything if we have no poller
+               if self.rssPoller is None:
+                       return
+
                # Default errorback to self.errorPolling
                # If an empty errorback is wanted the Screen needs to provide it
                if errback is None:
@@ -100,7 +83,7 @@ class RSSBaseView(Screen):
                # Open Dialog and save locally
                self.pollDialog = self.session.open(
                        MessageBox,
-                       "Update is being done in Background.\nContents will automatically be updated when it's done.",
+                       _("Update is being done in Background.\nContents will automatically be updated when it's done."),
                        type = MessageBox.TYPE_INFO,
                        timeout = 5
                )
@@ -110,67 +93,40 @@ class RSSBaseView(Screen):
                if enclosures is None:
                        return
 
-               count = len(enclosures)
-               # Select stream in ChoiceBox if more than one present
-               if count > 1:
-                       self.session.openWithCallback(
-                               self.enclosureSelected,
-                               ChoiceBox,
-                               "Select enclosure to play",
-                               [(x[0][x[0].rfind("/")+1:].replace('%20', ' ').replace('%5F', '_').replace('%2D', '-'), x) for x in enclosures]
-                       )
-               # Play if one present
-               elif count:
-                       self.enclosureSelected((None, enclosures[0]))
-
-       def enclosureSelected(self, enclosure):
-               if enclosure:
-                       (url, type) = enclosure[1]
-
-                       print "[SimpleRSS] Trying to play back enclosure: url=%s, type=%s" % (url, type)
+               from Components.Scanner import openList
 
-                       if type in ["video/mpeg", "audio/mpeg"]:
-                               from enigma import eServiceReference
-                               from Screens.MediaPlayer import MediaPlayer
-
-                               mp = self.session.open(MediaPlayer)
-                               ref = eServiceReference(4097, 0, url)
-
-                               mp.switchToPlayList()
-                               mp.playlist.addFile(ref)
-                               mp.playlist.updateList()
-
-                               mp.playServiceRefEntry(ref)
-                       elif type in ["image/jpeg", "image/png", "image/gif", "image/bmp"]:
-                               self.session.open(PictureView, url)
+               if not openList(self.session, enclosures):
+                       self.session.open(
+                               MessageBox,
+                               _("Found no Enclosure we can display."),
+                               type = MessageBox.TYPE_INFO,
+                               timeout = 5
+                       )
 
 class RSSEntryView(RSSBaseView):
        """Shows a RSS Item"""
+
        skin = """
-               <screen position="100,100" size="460,420" title="Simple RSS Reader" >
-                       <widget name="info" position="0,0" size="460, 20" halign="right" font="Regular; 18" />
-                       <widget name="content" position="0,20" size="460,420" font="Regular; 22" />
+               <screen position="center,center" size="460,420" title="Simple RSS Reader" >
+                       <widget source="info" render="Label" position="0,0" size="460, 20" halign="right" font="Regular; 18" />
+                       <widget name="content" position="0,20" size="460,400" font="Regular; 22" />
                </screen>"""
 
-       def __init__(self, session, data, feedTitle="", cur_idx=None, entries=None, nextEntryCB=None, previousEntryCB=None, nextFeedCB=None, previousFeedCB=None):
-               RSSBaseView.__init__(self, session, None)
+       def __init__(self, session, data, feedTitle="", cur_idx=None, entries=None, parent=None):
+               RSSBaseView.__init__(self, session, None, parent)
 
                self.data = data
                self.feedTitle = feedTitle
-               self.nextEntryCB = nextEntryCB
-               self.previousEntryCB = previousEntryCB
-               self.nextFeedCB = nextFeedCB
-               self.previousFeedCB = previousFeedCB
                self.cur_idx = cur_idx
                self.entries = entries
 
                if cur_idx is not None and entries is not None:
-                       self["info"] = Label("Entry %s/%s" % (cur_idx+1, entries))
+                       self["info"] = StaticText(_("Entry %s/%s") % (cur_idx+1, entries))
                else:
-                       self["info"] = Label()
+                       self["info"] = StaticText()
 
-               if data is not None:
-                       self["content"] = ScrollLabel("\n\n".join([data[0], data[2], " ".join([str(len(data[3])), "Enclosures"])]))
+               if data:
+                       self["content"] = ScrollLabel(''.join((data[0], '\n\n', data[2], '\n\n', str(len(data[3])), ' ',  _("Enclosures"))))
                else:
                        self["content"] = ScrollLabel()
 
@@ -190,7 +146,19 @@ class RSSEntryView(RSSBaseView):
                self.onLayoutFinish.append(self.setConditionalTitle)
 
        def setConditionalTitle(self):
-               self.setTitle(': '.join(["Simple RSS Reader", self.feedTitle]))
+               self.setTitle(_("Simple RSS Reader: %s") % (self.feedTitle))
+
+       def updateInfo(self):
+               if self.data:
+                       text = self.data[0]
+               else:
+                       text = _("No such Item.")
+
+               for x in self.onChangedEntry:
+                       try:
+                               x(text)
+                       except Exception:
+                               pass
 
        def up(self):
                self["content"].pageUp()
@@ -199,19 +167,19 @@ class RSSEntryView(RSSBaseView):
                self["content"].pageDown()
 
        def next(self):
-               if self.nextEntryCB is not None:
-                       (self.data, self.cur_idx, self.entries) = self.nextEntryCB()
+               if self.parent is not None:
+                       (self.data, self.cur_idx, self.entries) = self.parent.nextEntry()
                        self.setContent()
 
        def previous(self):
-               if self.previousEntryCB is not None:
-                       (self.data, self.cur_idx, self.entries) = self.previousEntryCB()
+               if self.parent is not None:
+                       (self.data, self.cur_idx, self.entries) = self.parent.previousEntry()
                        self.setContent()
 
        def nextFeed(self):
                # Show next Feed
-               if self.nextFeedCB is not None:
-                       result = self.nextFeedCB()
+               if self.parent is not None:
+                       result = self.parent.next()
                        self.feedTitle = result[0]
                        self.entries = len(result[1])
                        if self.entries:
@@ -225,8 +193,8 @@ class RSSEntryView(RSSBaseView):
 
        def previousFeed(self):
                # Show previous Feed
-               if self.previousFeedCB is not None:
-                       result = self.previousFeedCB()
+               if self.parent is not None:
+                       result = self.parent.previous()
                        self.feedTitle = result[0]
                        self.entries = len(result[1])
                        if self.entries:
@@ -240,13 +208,15 @@ class RSSEntryView(RSSBaseView):
 
        def setContent(self):
                if self.cur_idx is not None and self.entries is not None:
-                       self["info"].setText("Entry %s/%s" % (self.cur_idx+1, self.entries))
+                       self["info"].text = _("Entry %s/%s") % (self.cur_idx+1, self.entries)
                else:
-                       self["info"].setText("")
-               if self.data is not None:
-                       self["content"].setText("\n\n".join([self.data[0], self.data[2], " ".join([str(len(self.data[3])), "Enclosures"])]))
+                       self["info"].text = ""
+               data = self.data
+               if data:
+                       self["content"].setText(''.join((data[0], '\n\n', data[2], '\n\n', str(len(data[3])), ' ',  _("Enclosures"))))
                else:
-                       self["content"].setText("No such Item.")
+                       self["content"].setText(_("No such Item."))
+               self.updateInfo()
 
        def selectEnclosure(self):
                if self.data is not None:
@@ -254,29 +224,36 @@ class RSSEntryView(RSSBaseView):
 
 class RSSFeedView(RSSBaseView):
        """Shows a RSS-Feed"""
+
        skin = """
-               <screen position="100,100" size="460,415" title="Simple RSS Reader" >
-                       <widget name="info" position="0,0" size="460,20" halign="right" font="Regular; 18" />
-                       <widget name="content" position="0,20" size="460,300" scrollbarMode="showOnDemand" />
-                       <widget name="summary" position="0,320" size="460,95" font="Regular;16" />
+               <screen position="center,center" size="460,415" title="Simple RSS Reader" >
+                       <widget source="info" render="Label" position="0,0" size="460,20" halign="right" font="Regular; 18" />
+                       <widget source="content" render="Listbox" position="0,20" size="460,300" scrollbarMode="showOnDemand">
+                               <convert type="TemplatedMultiContent">
+                                       {"template": [
+                                                       MultiContentEntryText(pos=(0, 3), size=(460, 294), font=0, flags = RT_HALIGN_LEFT|RT_WRAP, text = 0)
+                                               ],
+                                        "fonts": [gFont("Regular", 22)],
+                                        "itemHeight": 50
+                                       }
+                               </convert>
+                       </widget>
+                       <widget source="summary" render="Label" position="0,320" size="460,95" font="Regular;16" />
                </screen>"""
 
-       def __init__(self, session, data, feedTitle = "", newItems=False, nextFeedCB=None, previousFeedCB=None, rssPoller=None, id = None):
-               RSSBaseView.__init__(self, session, rssPoller)
+       def __init__(self, session, feed=None, newItems=False, parent=None, rssPoller=None,id=None):
+               RSSBaseView.__init__(self, session, rssPoller, parent)
 
-               self.data = data
-               self.feedTitle = feedTitle
+               self.feed = feed
                self.newItems = newItems
                self.id = id
-               self.nextFeedCB=nextFeedCB
-               self.previousFeedCB=previousFeedCB
 
-               self["content"] = RSSList(data)
-               self["summary"] = Label()
-               self["info"] = Label()
+               self["content"] = List(self.feed.history)
+               self["summary"] = StaticText()
+               self["info"] = StaticText()
 
                if not newItems:
-                       self["actions"] = ActionMap([ "OkCancelActions", "ChannelSelectBaseActions", "MenuActions", "ColorActions" ], 
+                       self["actions"] = ActionMap([ "OkCancelActions", "ChannelSelectBaseActions", "MenuActions", "ColorActions" ],
                        {
                                "ok": self.showCurrentEntry,
                                "cancel": self.close,
@@ -285,27 +262,32 @@ class RSSFeedView(RSSBaseView):
                                "menu": self.menu,
                                "yellow": self.selectEnclosure,
                        })
-                       self.onShown.append(self.__show)
+                       self.onLayoutFinish.append(self.__show)
                        self.onClose.append(self.__close)
 
                        self.timer = None
                else:
-                       self["actions"] = ActionMap([ "OkCancelActions" ], 
+                       self["actions"] = ActionMap([ "OkCancelActions" ],
                        {
                                "cancel": self.close,
                        })
 
                        self.timer = eTimer()
-                       self.timer.timeout.get().append(self.timerTick)
+                       self.timer.callback.append(self.timerTick)
                        self.onExecBegin.append(self.startTimer)
 
-               self["content"].connectSelChanged(self.updateInfo)
-               self.onLayoutFinish.extend([self.updateInfo, self.setConditionalTitle])
+               self["content"].onSelectionChanged.append(self.updateInfo)
+               self.onLayoutFinish.extend((
+                       self.updateInfo,
+                       self.setConditionalTitle
+               ))
 
        def startTimer(self):
                self.timer.startLongTimer(5)
 
        def timerTick(self):
+               self.timer.callback.remove(self.timerTick)
+
                self.close()
 
        def __show(self):
@@ -313,132 +295,114 @@ class RSSFeedView(RSSBaseView):
 
        def __close(self):
                if self.timer is not None:
-                       self.timer.timeout.get().remove(self.timerTick)
+                       self.timer.callback.remove(self.timerTick)
                        self.timer = None
                self.rssPoller.removeCallback(self.pollCallback)
 
        def pollCallback(self, id = None):
                print "[SimpleRSS] SimpleRSSFeed called back"
-               current_entry = self["content"].getCurrentEntry()
-
-               if id is not None and self.id == id+1:
-                       print "[SimpleRSS] pollCallback recieved local feed", self.id
-                       self.feedTitle = self.rssPoller.feeds[id].title
-                       self.data = self.rssPoller.feeds[id].history
-               elif self.id == 0:
-                       print "[SimpleRSS] pollCallback recieved all or non-local feed, updating active view (new_items)"
-                       self.data = self.rssPoller.new_items
-               else:
-                       print "[SimpleRSS] pollCallback recieved all or non-local feed, updating", self.id
-                       self.feedTitle = self.rssPoller.feeds[self.id-1].title
-                       self.data = self.rssPoller.feeds[self-id-1].history
 
-               self["content"].l.setList(self.data)
-               self["content"].moveToEntry(current_entry)
-
-               self.setConditionalTitle()
-               self.updateInfo()
+               if id is None or id+1 == self.id:
+                       self["content"].updateList(self.feed.history)
+                       self.setConditionalTitle()
+                       self.updateInfo()
 
        def setConditionalTitle(self):
-               if not self.newItems:
-                       self.setTitle(': '.join(["Simple RSS Reader", self.feedTitle]))
-               else:
-                       self.setTitle("Simple RSS Reader: New Items")
+               self.setTitle(_("Simple RSS Reader: %s") % (self.feed.title))
 
        def updateInfo(self):
-               current_entry = self["content"].getCurrentEntry()
+               current_entry = self["content"].current
                if current_entry:
-                       self["summary"].setText(current_entry[2])
+                       self["summary"].text = current_entry[2]
 
-                       cur_idx = self["content"].getCurrentIndex()
-                       self["info"].setText("Entry %s/%s" % (cur_idx+1, len(self.data)))
+                       cur_idx = self["content"].index
+                       self["info"].text = _("Entry %s/%s") % (cur_idx+1, len(self.feed.history))
+                       summary_text = current_entry[0]
                else:
-                       self["summary"].setText("Feed is empty.")
-                       self["info"].setText("")
+                       self["summary"].text = _("Feed is empty.")
+                       self["info"].text = ""
+                       summary_text = _("Feed is empty.")
+
+               for x in self.onChangedEntry:
+                       try:
+                               x(summary_text)
+                       except Exception:
+                               pass
 
        def menu(self):
                if self.id > 0:
                        self.singleUpdate(self.id-1)
 
-       def nextEntryCB(self):
-               self["content"].moveDown()
-               return (self["content"].getCurrentEntry(), self["content"].getCurrentIndex(), len(self.data))
+       def nextEntry(self):
+               self["content"].selectNext()
+               return (self["content"].current, self["content"].index, len(self.feed.history))
 
-       def previousEntryCB(self):
-               self["content"].moveUp()
-               return (self["content"].getCurrentEntry(), self["content"].getCurrentIndex(), len(self.data))
+       def previousEntry(self):
+               self["content"].selectPrevious()
+               return (self["content"].current, self["content"].index, len(self.feed.history))
 
-       # TODO: Fix moving back to previously marked entry (same goes for self.previous)
        def next(self):
                # Show next Feed
-               if self.nextFeedCB is not None:
-                       result = self.nextFeedCB()
-                       (self.feedTitle, self.data, self.id) = result
-                       #current_entry = self["content"].getCurrentEntry()
-                       self["content"].l.setList(self.data) # Update list
-                       self["content"].moveToIndex(0)
-                       #self["content"].moveToEntry(current_entry)
-                       self.updateInfo() # In case entry is no longer in history
+               if self.parent is not None:
+                       (self.feed, self.id) = self.parent.nextFeed()
+                       self["content"].list = self.feed.history
+                       self["content"].index = 0
+                       self.updateInfo()
                        self.setConditionalTitle() # Update title
-                       return result
-               return (self.feedTitle, self.data, self.id)
+                       return (self.feed.title, self.feed.history, self.id)
+               return (self.feed.title, self.feed.history, self.id)
 
        def previous(self):
                # Show previous Feed
-               if self.previousFeedCB is not None:
-                       result = self.previousFeedCB()
-                       (self.feedTitle, self.data, self.id) = result
-                       #current_entry = self["content"].getCurrentEntry()
-                       self["content"].l.setList(self.data) # Update list
-                       self["content"].moveToIndex(0)
-                       #self["content"].moveToEntry(current_entry)
-                       self.updateInfo() # In case entry is no longer in history
+               if self.parent is not None:
+                       (self.feed, self.id) = self.parent.previousFeed()
+                       self["content"].list = self.feed.history
+                       self["content"].index = 0
+                       self.updateInfo()
                        self.setConditionalTitle() # Update title
-                       return result
-               return (self.feedTitle, self.data, self.id)
+                       return (self.feed.title, self.feed.history, self.id)
+               return (self.feed.title, self.feed.history, self.id)
 
        def checkEmpty(self):
-               if self.id > 0 and not len(self.data):
+               if self.id > 0 and not len(self.feed.history):
                        self.singleUpdate(self.id-1)
 
        def showCurrentEntry(self):
-               current_entry = self["content"].getCurrentEntry()
-               if current_entry is None: # empty list
+               current_entry = self["content"].current
+               if not current_entry: # empty list
                        return
 
                self.session.openWithCallback(
                        self.updateInfo,
                        RSSEntryView,
                        current_entry,
-                       cur_idx=self["content"].getCurrentIndex(),
-                       entries=len(self.data),
-                       feedTitle=self.feedTitle,
-                       nextEntryCB=self.nextEntryCB,
-                       previousEntryCB=self.previousEntryCB,
-                       nextFeedCB=self.next,
-                       previousFeedCB=self.previous
+                       cur_idx = self["content"].index,
+                       entries = len(self.feed.history),
+                       feedTitle = self.feed.title,
+                       parent = self
                )
 
        def selectEnclosure(self):
-               current_entry = self["content"].getCurrentEntry()
-               if current_entry is None: # empty list
+               current_entry = self["content"].current
+               if not current_entry: # empty list
                        return
 
                RSSBaseView.selectEnclosure(self, current_entry[3])
 
 class RSSOverview(RSSBaseView):
        """Shows an Overview over all RSS-Feeds known to rssPoller"""
+
        skin = """
-               <screen position="100,100" size="460,415" title="Simple RSS Reader" >
-                       <widget name="info" position="0,0" size="460,20" halign="right" font="Regular; 18" />
+               <screen position="center,center" size="460,415" title="Simple RSS Reader" >
+                       <widget source="info" render="Label" position="0,0" size="460,20" halign="right" font="Regular; 18" />
                        <widget name="content" position="0,20" size="460,300" scrollbarMode="showOnDemand" />
-                       <widget name="summary" position="0,320" size="460,95" font="Regular;16" />
+                       <widget source="summary" render="Label" position="0,320" size="460,95" font="Regular;16" />
                </screen>"""
 
        def __init__(self, session, poller):
                RSSBaseView.__init__(self, session, poller)
 
-               self["actions"] = ActionMap([ "OkCancelActions", "MenuActions", "ColorActions" ], 
+               self["actions"] = ActionMap([ "OkCancelActions", "MenuActions", "ColorActions" ],
                {
                        "ok": self.showCurrentEntry,
                        "cancel": self.close,
@@ -449,141 +413,115 @@ class RSSOverview(RSSBaseView):
                self.fillFeeds()
 
                # We always have at least "New Items"-Feed
-               self["content"] = RSSList(self.feeds)
-               self["summary"] = Label(self.feeds[0][2])
-               self["info"] = Label("Feed 1/%s" % len(self.feeds))
+               self["content"] = RSSFeedList(self.feeds)
+               self["summary"] = StaticText(' '.join((str(len(self.feeds[0][0].history)), _("Entries"))))
+               self["info"] = StaticText(_("Feed %s/%s") % (1, len(self.feeds)))
 
                self["content"].connectSelChanged(self.updateInfo)
-               self.onShown.append(self.__show)
+               self.onLayoutFinish.append(self.__show)
                self.onClose.append(self.__close)
 
        def __show(self):
                self.rssPoller.addCallback(self.pollCallback)
+               self.setTitle(_("Simple RSS Reader"))
 
        def __close(self):
                self.rssPoller.removeCallback(self.pollCallback)
 
        def fillFeeds(self):
-               self.feeds = [(
-                       "New Items",
-                       "New Items since last Auto-Update",
-                       ' '.join([str(len(self.rssPoller.new_items)), "Entries"]),
-                       self.rssPoller.new_items
-               )]
-               self.feeds.extend([
-                       (
-                               feed.title,
-                               feed.description,
-                               ' '.join([str(len(feed.history)), "Entries"]),
-                               feed.history
-                       )
-                               for feed in self.rssPoller.feeds
-               ])
+               # Feedlist contains our virtual Feed and all real ones
+               self.feeds = [(self.rssPoller.newItemFeed,)]
+               self.feeds.extend([(feed,) for feed in self.rssPoller.feeds])
 
        def pollCallback(self, id = None):
                print "[SimpleRSS] SimpleRSS called back"
-               current_entry = self["content"].getCurrentEntry()
-
-               if id is not None:
-                       print "[SimpleRSS] pollCallback updating feed", id
-                       self.feeds[id+1] = (
-                               self.rssPoller.feeds[id].title,
-                               self.rssPoller.feeds[id].description,
-                               ' '.join([str(len(self.rssPoller.feeds[id].history)), "Entries"]),
-                               self.rssPoller.feeds[id].history
-                       )
-               else:
-                       print "[SimpleRSS] pollCallback updating all feeds"
-                       self.fillFeeds()
-
-               self["content"].l.setList(self.feeds)
-               self["content"].moveToEntry(current_entry)
-
                self.updateInfo()
+               self["content"].invalidate()
 
        def updateInfo(self):
-               current_entry = self["content"].getCurrentEntry()
-               if current_entry:
-                       self["summary"].setText(current_entry[2])
-                       self["info"].setText("Feed %s/%s" % (self["content"].getCurrentIndex()+1, len(self.feeds)))
-               # Should never happen
-               else:
-                       self["summary"].setText("")
-                       self["info"].setText("")
+               current_entry = self["content"].getCurrent()
+               self["summary"].text = ' '.join((str(len(current_entry.history)), _("Entries")))
+               self["info"].text = _("Feed %s/%s") % (self["content"].getSelectedIndex()+1, len(self.feeds))
+               summary_text = current_entry.title
+
+               for x in self.onChangedEntry:
+                       try:
+                               x(summary_text)
+                       except Exception:
+                               pass
 
        def menu(self):
-               cur_idx = self["content"].getCurrentIndex()
+               from Screens.ChoiceBox import ChoiceBox
+
+               cur_idx = self["content"].getSelectedIndex()
                if cur_idx > 0:
-                       possible_actions = [
+                       possible_actions = (
                                (_("Update Feed"), "update"),
                                (_("Setup"), "setup"),
                                (_("Close"), "close")
-                       ]
+                       )
                else:
-                       possible_actions = [
+                       possible_actions = (
                                (_("Setup"), "setup"),
                                (_("Close"), "close")
-                       ]
+                       )
+
                self.session.openWithCallback(
                        self.menuChoice,
                        ChoiceBox,
-                       "What to do?",
+                       _("What to do?"),
                        possible_actions
                )
 
        def menuChoice(self, result):
                if result:
                        if result[1] == "update":
-                               cur_idx = self["content"].getCurrentIndex()
+                               cur_idx = self["content"].getSelectedIndex()
                                if cur_idx > 0:
                                        self.singleUpdate(cur_idx-1)
                        elif result[1] == "setup":
-                               self.session.openWithCallback(self.refresh, RSSSetup, rssPoller=self.rssPoller)
+                               from RSSSetup import RSSSetup
+
+                               self.session.openWithCallback(
+                                       self.refresh,
+                                       RSSSetup,
+                                       rssPoller=self.rssPoller
+                               )
                        elif result[1] == "close":
                                self.close()
 
        def refresh(self):
-               current_entry = self["content"].getCurrentEntry()
+               current_entry = self["content"].getCurrent()
 
                self.fillFeeds()
-               self["content"].l.setList(self.feeds)
+               self["content"].setList(self.feeds)
 
                self["content"].moveToEntry(current_entry)
                self.updateInfo()
 
-       def nextFeedCB(self):
-               self["content"].moveUp()
-               current_entry = self["content"].getCurrentEntry()
-               return (current_entry[0], current_entry[3], self["content"].getCurrentIndex())
+       def nextFeed(self):
+               self["content"].up()
+               return (self["content"].getCurrent(), self["content"].getSelectedIndex())
 
-       def previousFeedCB(self):
-               self["content"].moveDown()
-               current_entry = self["content"].getCurrentEntry()
-               return (current_entry[0], current_entry[3], self["content"].getCurrentIndex())
+       def previousFeed(self):
+               self["content"].down()
+               return (self["content"].getCurrent(), self["content"].getSelectedIndex())
 
        def showCurrentEntry(self):
-               current_entry = self["content"].getCurrentEntry()
-               if current_entry is None: # empty list
-                       return
-
+               current_entry = self["content"].getCurrent()
                self.session.openWithCallback(
-                       self.refresh,
+                       self.updateInfo,
                        RSSFeedView,
-                       current_entry[3],
-                       feedTitle=current_entry[0],
-                       nextFeedCB=self.nextFeedCB,
-                       previousFeedCB=self.previousFeedCB,
+                       feed=current_entry,
+                       parent=self,
                        rssPoller=self.rssPoller,
-                       id=self["content"].getCurrentIndex()
+                       id=self["content"].getSelectedIndex()
                )
 
        def selectEnclosure(self):
-               current_entry = self["content"].getCurrentEntry()
-               if current_entry is None: # empty list
-                       return
-
                # Build a list of all enclosures in this feed
                enclosures = []
-               for entry in current_entry[3]:
+               for entry in self["content"].getCurrent().history:
                                enclosures.extend(entry[3])
                RSSBaseView.selectEnclosure(self, enclosures)
+