fix radio player
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Sat, 21 Jan 2006 23:45:27 +0000 (23:45 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Sat, 21 Jan 2006 23:45:27 +0000 (23:45 +0000)
code cleanup in channelselector (more scalable)

data/keymap.xml
data/skin.xml
lib/python/Screens/ChannelSelection.py
lib/python/Screens/InfoBarGenerics.py

index 7a26f85..55f43ba 100644 (file)
                <key id="KEY_9" mapto="9" flags="m" />
                <key id="KEY_0" mapto="0" flags="m" />
        </map>
-       
-       <map context="NumberZapActions">
-               <key id="KEY_1" mapto="1" flags="m" />
-               <key id="KEY_2" mapto="2" flags="m" />
-               <key id="KEY_3" mapto="3" flags="m" />
-               <key id="KEY_4" mapto="4" flags="m" />
-               <key id="KEY_5" mapto="5" flags="m" />
-               <key id="KEY_6" mapto="6" flags="m" />
-               <key id="KEY_7" mapto="7" flags="m" />
-               <key id="KEY_8" mapto="8" flags="m" />
-               <key id="KEY_9" mapto="9" flags="m" />
-               <key id="KEY_0" mapto="0" flags="m" />
-       </map>
-       
 
-       
        <map context="TextEntryActions">
                <key id="KEY_MUTE" mapto="delete" flags="mr" />
        </map>  
        <map context="MoviePlayerActions">
                <key id="KEY_TV" mapto="leavePlayer" flags="m" />
        </map>
-       
-       <map context="ChannelSelectActions">
-               <key id="m" mapto="mark" flags="m" />
+
+       <map context="ChannelSelectBaseActions">
                <!-- yes, this is flexible as hell. -->
                <!--key id="p" mapto="bouquet:(provider == PREMIERE) &amp;&amp; (type == 1)" flags="m" />
-               <key id="d" mapto="bouquet:(provider == ARD) &amp;&amp; (type == 1)" flags="m" />
-               <key id="a" mapto="bouquet:" flags="m" />
-               <key id="KEY_M" mapto="mark" flags="m" />
-               <key id="KEY_D" mapto="bouquet:(provider == ARD)" flags="m" />
-               <key id="KEY_A" mapto="bouquet:" flags="m" />
-               <key id="KEY_RED" mapto="bouquet:(type == 1) || (type == 17) ORDER BY name" flags="m" />
-               <key id="KEY_GREEN" mapto="bouquet:(type == 1) || (type == 17) FROM SATELLITES ORDER BY satellitePosition" flags="m" />
-               <key id="KEY_YELLOW" mapto="bouquet:(type == 1) || (type == 17) FROM PROVIDERS ORDER BY name" flags="m" /-->
-
+       <key id="d" mapto="bouquet:(provider == ARD) &amp;&amp; (type == 1)" flags="m" />
+       <key id="a" mapto="bouquet:" flags="m" />
+       <key id="KEY_M" mapto="mark" flags="m" />
+       <key id="KEY_D" mapto="bouquet:(provider == ARD)" flags="m" />
+       <key id="KEY_A" mapto="bouquet:" flags="m" />
+       <key id="KEY_RED" mapto="bouquet:(type == 1) || (type == 17) ORDER BY name" flags="m" />
+       <key id="KEY_GREEN" mapto="bouquet:(type == 1) || (type == 17) FROM SATELLITES ORDER BY satellitePosition" flags="m" />
+       <key id="KEY_YELLOW" mapto="bouquet:(type == 1) || (type == 17) FROM PROVIDERS ORDER BY name" flags="m" /-->
                <key id="KEY_RED" mapto="showAllServices" flags="m" />
                <key id="KEY_GREEN" mapto="showSatellites" flags="m" />
                <key id="KEY_YELLOW" mapto="showProviders" flags="m" />
                <key id="KEY_BLUE" mapto="showFavourites" flags="m" />
+       </map>
+
+       <map context="ChannelSelectEPGActions">
                <key id="KEY_INFO" mapto="showEPGList" flags="m" />
-               
-               <key id="KEY_1" mapto="1" flags="m" />
-               <key id="KEY_2" mapto="2" flags="m" />
-               <key id="KEY_3" mapto="3" flags="m" />
-               <key id="KEY_4" mapto="4" flags="m" />
-               <key id="KEY_5" mapto="5" flags="m" />
-               <key id="KEY_6" mapto="6" flags="m" />
-               <key id="KEY_7" mapto="7" flags="m" />
-               <key id="KEY_8" mapto="8" flags="m" />
-               <key id="KEY_9" mapto="9" flags="m" />
-               <key id="KEY_0" mapto="0" flags="m" />
        </map>
 
-       <map context="ContextMenuActions">
+       <map context="ChannelSelectEditActions">
                <key id="KEY_MENU" mapto="contextMenu" flags="m" />
        </map>
 
index eca85e9..26b6b9d 100644 (file)
                        <widget name="key_blue" position="420,0" size="140,40" backgroundColor="blue" font="Regular;21" />
                        <widget name="list" position="0,45" size="560,252" scrollbarMode="showOnDemand" />
                </screen>
-               <screen name="ServiceInfoWindow" position="90,420" size="560,95" zPosition="-1">
-                       <widget name="Service_Name" position="0,0" size="400,26" font="Regular;22" backgroundColor="dark" />
-                       <widget name="Clock" position="470,0" size="90,26" font="Regular;22" backgroundColor="dark" />
-                       <widget name="Event_Now_StartTime" position="0,35" size="60,22" font="Regular;20" backgroundColor="dark" />
-                       <widget name="Event_Next_StartTime" position="0,65" size="60,22" font="Regular;20" backgroundColor="dark" />
-                       <widget name="Event_Now" position="80,35" size="380,22" font="Regular;20" backgroundColor="dark" />
-                       <widget name="Event_Next" position="80,65" size="380,22" font="Regular;20" backgroundColor="dark" />
-                       <widget name="Event_Now_Duration" position="470,35" size="150,22" font="Regular;20" backgroundColor="dark" />
-                       <widget name="Event_Next_Duration" position="470,65" size="150,22" font="Regular;20" backgroundColor="dark" />
+               <screen name="RadioInfoBar" position="90,420" size="560,105" zPosition="-1">
+                       <widget name="ServiceName" position="0,0" size="390,26" font="Regular;22" backgroundColor="dark" />
+                       <widget name="BlinkingPoint" pixmap="/usr/share/enigma2/record.png" position="400,0" zPosition="2" size="58,25" />
+                       <widget name="Clock" position="465,0" size="95,28" font="Regular;22" backgroundColor="dark" />
+                       <widget name="Now_ProgressBar" position="465,27" size="90,9" zPosition="1" borderWidth="2" />
+                       <widget name="Event_Now_StartTime" position="0,44" size="60,22" font="Regular;20" backgroundColor="dark" />
+                       <widget name="Event_Next_StartTime" position="0,74" size="60,22" font="Regular;20" backgroundColor="dark" />
+                       <widget name="Event_Now" position="80,44" size="380,22" font="Regular;20" backgroundColor="dark" />
+                       <widget name="Event_Next" position="80,74" size="380,22" font="Regular;20" backgroundColor="dark" />
+                       <widget name="Event_Now_Duration" position="470,44" size="150,22" font="Regular;20" backgroundColor="dark" />
+                       <widget name="Event_Next_Duration" position="470,74" size="150,22" font="Regular;20" backgroundColor="dark" />
                </screen>
                <screen name="SimpleChannelSelection" position="90,98" size="560,417" title="Channel Selection">
                        <widget name="list" position="00,45" size="560,364" scrollbarMode="showOnDemand" />
index e30c0d3..04c3c44 100644 (file)
@@ -1,7 +1,7 @@
 from Screen import Screen
 from Components.Button import Button
 from Components.ServiceList import ServiceList
-from Components.ActionMap import NumberActionMap
+from Components.ActionMap import NumberActionMap, ActionMap
 from EpgSelection import EPGSelection
 from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer
 from Components.config import config, configElement, ConfigSubsection, configText, currentConfigSelectionElement
@@ -107,6 +107,21 @@ class ChannelContextMenu(FixedMenu):
                self.csel.endMarkedEdit(abort=True)
                self.close()
 
+class ChannelSelectionEPG:
+       def __init__(self):
+               self["ChannelSelectEPGActions"] = ActionMap(["ChannelSelectEPGActions"],
+                       {
+                               "showEPGList": self.showEPGList,
+                       })
+
+       def showEPGList(self):
+               ref=self.getCurrentSelection()
+               ptr=eEPGCache.getInstance()
+               if ptr.startTimeQuery(ref) != -1:
+                       self.session.open(EPGSelection, ref)
+               else:
+                       print 'no epg for service', ref.toString()
+
 class ChannelSelectionEdit:
        def __init__(self):
                self.entry_marked = False
@@ -117,6 +132,19 @@ class ChannelSelectionEdit:
                self.saved_title = None
                self.saved_root = None
 
+               class ChannelSelectionEditActionMap(ActionMap):
+                       def __init__(self, csel, contexts = [ ], actions = { }, prio=0):
+                               ActionMap.__init__(self, contexts, actions, prio)
+                               self.csel = csel
+                       def action(self, contexts, action):
+                               if action == "cancel":
+                                       self.csel.handleEditCancel()
+                               ActionMap.action(self, contexts, action)
+               self["ChannelSelectEditActions"] = ChannelSelectionEditActionMap(self, ["ChannelSelectEditActions"],
+                       {
+                               "contextMenu": self.doContext,
+                       })
+
        def getMutableList(self, root=eServiceReference()):
                if not self.mutableList is None:
                        return self.mutableList
@@ -261,6 +289,31 @@ class ChannelSelectionBase(Screen):
                self.servicePathTV = [ ]
                self.servicePathRadio = [ ]
 
+               class ChannelBaseActionMap(NumberActionMap):
+                       def __init__(self, csel, contexts = [ ], actions = { }, prio=0):
+                               NumberActionMap.__init__(self, contexts, actions, prio)
+                               self.csel = csel
+                       def action(self, contexts, action):
+                               if not self.csel.enterBouquet(action):
+                                       NumberActionMap.action(self, contexts, action)
+               self["ChannelSelectBaseActions"] = ChannelBaseActionMap(self, ["ChannelSelectBaseActions"],
+                       {
+                               "showFavourites": self.showFavourites,
+                               "showAllServices": self.showAllServices,
+                               "showProviders": self.showProviders,
+                               "showSatellites": self.showSatellites,
+                               "1": self.keyNumberGlobal,
+                               "2": self.keyNumberGlobal,
+                               "3": self.keyNumberGlobal,
+                               "4": self.keyNumberGlobal,
+                               "5": self.keyNumberGlobal,
+                               "6": self.keyNumberGlobal,
+                               "7": self.keyNumberGlobal,
+                               "8": self.keyNumberGlobal,
+                               "9": self.keyNumberGlobal,
+                               "0": self.keyNumberGlobal
+                       })
+
        def appendDVBTypes(self, ref):
                path = ref.getPath()
                pos = path.find(' FROM BOUQUET')
@@ -527,10 +580,11 @@ class ChannelSelectionBase(Screen):
                        return bouquets
                return None
 
-class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
+class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG):
        def __init__(self, session):
                ChannelSelectionBase.__init__(self,session)
                ChannelSelectionEdit.__init__(self)
+               ChannelSelectionEPG.__init__(self)
 
                #config for lastservice
                config.tv = ConfigSubsection();
@@ -539,35 +593,11 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
                config.tv.prevservice = configElement("config.tv.prevservice", configText, "", 0);
                config.tv.prevroot = configElement("config.tv.prevroot", configText, "", 0);
 
-               class ChannelActionMap(NumberActionMap):
-                       def action(self, contexts, action):
-                               if not self.csel.enterBouquet(action):
-                                       if action == "cancel":
-                                               self.csel.handleEditCancel()
-                                       NumberActionMap.action(self, contexts, action)
-               self["actions"] = ChannelActionMap(["ChannelSelectActions", "OkCancelActions", "ContextMenuActions"],
+               self["actions"] = ActionMap(["OkCancelActions"],
                        {
                                "cancel": self.cancel,
                                "ok": self.channelSelected,
-                               "mark": self.doMark,
-                               "contextMenu": self.doContext,
-                               "showFavourites": self.showFavourites,
-                               "showAllServices": self.showAllServices,
-                               "showProviders": self.showProviders,
-                               "showSatellites": self.showSatellites,
-                               "showEPGList": self.showEPGList,
-                               "1": self.keyNumberGlobal,
-                               "2": self.keyNumberGlobal,
-                               "3": self.keyNumberGlobal,
-                               "4": self.keyNumberGlobal,
-                               "5": self.keyNumberGlobal,
-                               "6": self.keyNumberGlobal,
-                               "7": self.keyNumberGlobal,
-                               "8": self.keyNumberGlobal,
-                               "9": self.keyNumberGlobal,
-                               "0": self.keyNumberGlobal
                        })
-               self["actions"].csel = self
                self.onShown.append(self.onShow)
 
                self.lastChannelRootTimer = eTimer()
@@ -591,14 +621,6 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
                else:
                        self.servicelist.setPlayableIgnoreService(eServiceReference())
 
-       def showEPGList(self):
-               ref=self.getCurrentSelection()
-               ptr=eEPGCache.getInstance()
-               if ptr.startTimeQuery(ref) != -1:
-                       self.session.open(EPGSelection, ref)
-               else:
-                       print 'no epg for service', ref.toString()
-
        def channelSelected(self):
                ref = self.getCurrentSelection()
                if self.movemode:
@@ -699,57 +721,36 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
                if lastservice.valid() and self.getCurrentSelection() != lastservice:
                        self.setCurrentSelection(lastservice)
 
-class ServiceInfoWindow(Screen):
+from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord
+
+class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord):
        def __init__(self, session):
                Screen.__init__(self, session)
-               self["Service_Name"] = ServiceName(self.session.nav)
+               InfoBarEvent.__init__(self)
+               InfoBarServiceName.__init__(self)
+               InfoBarInstantRecord.__init__(self)
                self["Clock"] = Clock()
-               self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
-               self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
-               self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
-               self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
-               self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
-               self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
-
-class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit):
+
+class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG):
        def __init__(self, session):
                ChannelSelectionBase.__init__(self, session)
                ChannelSelectionEdit.__init__(self)
+               ChannelSelectionEPG.__init__(self)
 
                config.radio = ConfigSubsection();
                config.radio.lastservice = configElement("config.radio.lastservice", configText, "", 0);
                config.radio.lastroot = configElement("config.radio.lastroot", configText, "", 0);
                self.onLayoutFinish.append(self.onCreate)
 
-               self.info = session.instantiateDialog(ServiceInfoWindow)
+               self.info = session.instantiateDialog(RadioInfoBar)
 
-               class ChannelActionMap(NumberActionMap):
-                       def action(self, contexts, action):
-                               if not self.csel.enterBouquet(action):
-                                       NumberActionMap.action(self, contexts, action)
-               self["actions"] = ChannelActionMap(["ChannelSelectActions", "OkCancelActions", "ContextMenuActions", "TvRadioActions"],
+               self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
                        {
                                "keyTV": self.closeRadio,
                                "keyRadio": self.closeRadio,
-                               "contextMenu": self.doContext,
                                "cancel": self.closeRadio,
                                "ok": self.channelSelected,
-                               "showFavourites": self.showFavourites,
-                               "showAllServices": self.showAllServices,
-                               "showProviders": self.showProviders,
-                               "showSatellites": self.showSatellites,
-                               "1": self.keyNumberGlobal,
-                               "2": self.keyNumberGlobal,
-                               "3": self.keyNumberGlobal,
-                               "4": self.keyNumberGlobal,
-                               "5": self.keyNumberGlobal,
-                               "6": self.keyNumberGlobal,
-                               "7": self.keyNumberGlobal,
-                               "8": self.keyNumberGlobal,
-                               "9": self.keyNumberGlobal,
-                               "0": self.keyNumberGlobal
                        })
-               self["actions"].csel = self
 
        def saveRoot(self):
                path = ''
@@ -780,7 +781,7 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit):
                        pathstr = config.radio.lastroot.value
                        if pathstr is not None and pathstr.find(refstr) == 0:
                                self.restoreRoot()
-                               lastservice=eServiceReference(config.tv.lastservice.value)
+                               lastservice=eServiceReference(config.radio.lastservice.value)
                                if lastservice is not None:
                                        self.setCurrentSelection(lastservice)
                                return True
@@ -805,7 +806,8 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit):
                elif self.bouquet_mark_edit:
                        self.doMark()
                else:
-                       if self.session.nav.getCurrentlyPlayingServiceReference() != ref:
+                       playingref = self.session.nav.getCurrentlyPlayingServiceReference()
+                       if playingref is None or playingref != ref:
                                self.session.nav.playService(ref)
                                self.servicelist.setPlayableIgnoreService(ref)
                                config.radio.lastservice.value = ref.toString()
@@ -828,32 +830,13 @@ class SimpleChannelSelection(ChannelSelectionBase):
                self.title = title
                self.onShown.append(self.onExecCallback)
 
-               class ChannelActionMap(NumberActionMap):
-                       def action(self, contexts, action):
-                               if not self.csel.enterBouquet(action):
-                                       NumberActionMap.action(self, contexts, action)
-               self["actions"] = ChannelActionMap(["ChannelSelectActions", "OkCancelActions", "ContextMenuActions", "TvRadioActions"],
+               self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
                        {
                                "cancel": self.cancel,
                                "ok": self.channelSelected,
-                               "showFavourites": self.showFavourites,
-                               "showAllServices": self.showAllServices,
-                               "showProviders": self.showProviders,
-                               "showSatellites": self.showSatellites,
                                "keyRadio": self.setModeRadio,
                                "keyTV": self.setModeTv,
-                               "1": self.keyNumberGlobal,
-                               "2": self.keyNumberGlobal,
-                               "3": self.keyNumberGlobal,
-                               "4": self.keyNumberGlobal,
-                               "5": self.keyNumberGlobal,
-                               "6": self.keyNumberGlobal,
-                               "7": self.keyNumberGlobal,
-                               "8": self.keyNumberGlobal,
-                               "9": self.keyNumberGlobal,
-                               "0": self.keyNumberGlobal
                        })
-               self["actions"].csel = self
 
        def onExecCallback(self):
                self.session.currentDialog.instance.setTitle(self.title)
index 5615842..605a15f 100644 (file)
@@ -184,7 +184,7 @@ class InfoBarPowerKey:
 class InfoBarNumberZap:
        """ Handles an initial number for NumberZapping """
        def __init__(self):
-               self["NumberZapActions"] = NumberActionMap( [ "NumberZapActions"],
+               self["NumberActions"] = NumberActionMap( [ "NumberActions"],
                        {
                                "1": self.keyNumberGlobal,
                                "2": self.keyNumberGlobal,
@@ -350,7 +350,7 @@ class InfoBarEPG:
                                self.session.open(EventView, self.epglist[0], ServiceReference(ref), self.eventViewCallback)
                except:
                        pass
-                       
+
        def openSingleServiceEPG(self):
                ref=self.session.nav.getCurrentlyPlayingServiceReference()
                ptr=eEPGCache.getInstance()
@@ -359,7 +359,6 @@ class InfoBarEPG:
                else: # try to show now/next
                        print 'no epg for service', ref.toString()
 
-       
        def openBouquetEPG(self, bouquet):
                ptr=eEPGCache.getInstance()
                services = [ ]