zap with numbers is now possible
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Thu, 17 Nov 2005 16:40:07 +0000 (16:40 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Thu, 17 Nov 2005 16:40:07 +0000 (16:40 +0000)
lib/python/Components/ServiceList.py
lib/python/Screens/ChannelSelection.py
lib/python/Screens/InfoBarGenerics.py
lib/service/listboxservice.cpp
lib/service/listboxservice.h

index 9d3ffb5287f4e77d4e8fdc6815dba179806e87da..e0a3153410a851f9360a161d49ba39173a12f917 100644 (file)
@@ -13,6 +13,9 @@ class ServiceList(HTMLComponent, GUIComponent):
                self.l = eListboxServiceContent()
                self.root = None
 
                self.l = eListboxServiceContent()
                self.root = None
 
+       def setCurrent(self, ref):
+               self.l.setCurrent(ref)
+
        def getCurrent(self):
                r = eServiceReference()
                self.l.getCurrent(r)
        def getCurrent(self):
                r = eServiceReference()
                self.l.getCurrent(r)
@@ -47,6 +50,9 @@ class ServiceList(HTMLComponent, GUIComponent):
                                        break
                return dest
 
                                        break
                return dest
 
+       def setNumberOffset(self, offset):
+               self.l.setNumberOffset(offset)
+
        def setRoot(self, root):
                self.root = root
                self.l.setRoot(root)
        def setRoot(self, root):
                self.root = root
                self.l.setRoot(root)
index 1604150d34ff413aabc92eba9183a93e3eacd827..b730ccb279e5d06854a7de9ea77714c18bad1b45 100644 (file)
@@ -5,7 +5,6 @@ from Components.ActionMap import ActionMap
 from EpgSelection import EPGSelection
 from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer
 from Components.config import config, configElement, ConfigSubsection, configText
 from EpgSelection import EPGSelection
 from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer
 from Components.config import config, configElement, ConfigSubsection, configText
-
 from Screens.FixedMenu import FixedMenu
 
 import xml.dom.minidom
 from Screens.FixedMenu import FixedMenu
 
 import xml.dom.minidom
@@ -119,7 +118,7 @@ class ChannelSelection(Screen):
                self.entry_marked = False
                self.movemode = False
                self.bouquet_mark_edit = False
                self.entry_marked = False
                self.movemode = False
                self.bouquet_mark_edit = False
-               self.bouquet_root = eServiceReference('1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet')
+               self.bouquet_root = eServiceReference('1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.tv" ORDER BY bouquet')
                self.mutableList = None
 
                self.__marked = [ ]
                self.mutableList = None
 
                self.__marked = [ ]
@@ -251,6 +250,70 @@ class ChannelSelection(Screen):
                                mutableList.flushChanges()
                self.close()
 
                                mutableList.flushChanges()
                self.close()
 
+       def findService(self, serviceHandler, num, bouquet):
+               list = serviceHandler.list(bouquet)
+               if not list is None:
+                       while num > 0:
+                               s = list.getNext()
+                               if not s.valid():
+                                       break
+                               if s.flags != 0: #assume normal dvb service have no flags set
+                                       continue
+                               num = num - 1;
+                       if num == 0:
+                               return s, 0
+               return None, num
+
+       def zapToNumber(self, number):
+               bouquet = None
+               service = None
+               serviceHandler = eServiceCenter.getInstance()
+               if self.bouquet_root.toString().find('FROM BOUQUET "bouquets.') == -1:
+                       service, number = self.findService(serviceHandler, number, self.bouquet_root)
+                       bouquet = self.bouquet_root
+               else:
+                       list = serviceHandler.list(self.bouquet_root)
+                       if not list is None:
+                               while number:
+                                       s = list.getNext()
+                                       if not s.valid():
+                                               break
+                                       bouquet = s
+                                       service, number = self.findService(serviceHandler, number, s)
+               if not service is None:
+                       self.session.nav.playService(service)
+                       if not bouquet is None:
+                               if self["list"].getRoot() != bouquet:
+                                       self.setRoot(bouquet)
+                               self.setCurrent(service)
+
+       def setCurrent(self, service):
+               self["list"].setCurrent(service)
+
+       def getBouquetNumOffset(self, bouquet):
+               if self.bouquet_root.toString().find('FROM BOUQUET "bouquets.') == -1:
+                       return 0
+               offset=0
+               serviceHandler = eServiceCenter.getInstance()
+               list = serviceHandler.list(self.bouquet_root)
+               if not list is None:
+                       while 1:
+                               s = list.getNext()
+                               if not s.valid() or s == bouquet:
+                                       break
+                               if ((s.flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory):
+                                       continue
+                               slist = serviceHandler.list(s)
+                               if not slist is None:
+                                       while 1:
+                                               ss = slist.getNext()
+                                               if not ss.valid():
+                                                       break
+                                               if ss.flags != 0:
+                                                       continue
+                                               offset = offset + 1
+               return offset
+
        def setRoot(self, root):
                if not self.movemode: # dont change root when movemode is enabled
                        list = self["list"]
        def setRoot(self, root):
                if not self.movemode: # dont change root when movemode is enabled
                        list = self["list"]
@@ -260,6 +323,8 @@ class ChannelSelection(Screen):
 
                        if not inBouquetRootList and ((root.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory):
                                list.setMode(list.MODE_FAVOURITES)
 
                        if not inBouquetRootList and ((root.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory):
                                list.setMode(list.MODE_FAVOURITES)
+                               offset = self.getBouquetNumOffset(root)
+                               list.setNumberOffset(offset)
                        else:
                                list.setMode(list.MODE_NORMAL)
                        list.setRoot(root)
                        else:
                                list.setMode(list.MODE_NORMAL)
                        list.setRoot(root)
index 52b1c3c005989d889873df2035b7fdafb3052a34..d9c42bdb3175a209d0b0efbd983f097c403a66bd 100644 (file)
@@ -134,12 +134,11 @@ class InfoBarShowHide:
 class NumberZap(Screen):
        def quit(self):
                self.Timer.stop()
 class NumberZap(Screen):
        def quit(self):
                self.Timer.stop()
-               self.close()
+               self.close(0)
 
        def keyOK(self):
                self.Timer.stop()
 
        def keyOK(self):
                self.Timer.stop()
-               print "do the action here"
-               self.close()
+               self.close(int(self["number"].getText()))
 
        def keyNumberGlobal(self, number):
                self.Timer.start(3000)          #reset timer
 
        def keyNumberGlobal(self, number):
                self.Timer.start(3000)          #reset timer
@@ -221,8 +220,13 @@ class InfoBarNumberZap:
                        })
 
        def keyNumberGlobal(self, number):
                        })
 
        def keyNumberGlobal(self, number):
-               print "You pressed number " + str(number)
-               self.session.open(NumberZap, number)
+#              print "You pressed number " + str(number)
+               self.session.openWithCallback(self.numberEntered, NumberZap, number)
+
+       def numberEntered(self, retval):
+#              print self.servicelist
+               if retval > 0:
+                       self.servicelist.zapToNumber(retval)
 
 class InfoBarChannelSelection:
        """ ChannelSelection - handles the channelSelection dialog and the initial 
 
 class InfoBarChannelSelection:
        """ ChannelSelection - handles the channelSelection dialog and the initial 
index 19ff69333907d8ae6dbe6aaabb7b2df2c9798110..938b1795035b1b7911078099dfc8112c3b55e88a 100644 (file)
@@ -22,6 +22,18 @@ void eListboxServiceContent::setRoot(const eServiceReference &root)
                m_listbox->entryReset();
 }
 
                m_listbox->entryReset();
 }
 
+void eListboxServiceContent::setCurrent(const eServiceReference &ref)
+{
+       int index=0;
+       for (list::iterator i(m_list.begin()); i != m_list.end(); ++i, ++index)
+               if ( *i == ref )
+               {
+                       m_cursor = i;
+                       m_cursor_number = index;
+                       break;
+               }
+}
+
 void eListboxServiceContent::getCurrent(eServiceReference &ref)
 {
        if (cursorValid())
 void eListboxServiceContent::getCurrent(eServiceReference &ref)
 {
        if (cursorValid())
@@ -124,7 +136,7 @@ void eListboxServiceContent::sort()
 DEFINE_REF(eListboxServiceContent);
 
 eListboxServiceContent::eListboxServiceContent()
 DEFINE_REF(eListboxServiceContent);
 
 eListboxServiceContent::eListboxServiceContent()
-       :m_visual_mode(visModeSimple), m_size(0), m_current_marked(false), m_swap(m_list.end())
+       :m_visual_mode(visModeSimple), m_size(0), m_current_marked(false), m_swap(m_list.end()), m_numberoffset(0)
 {
        cursorHome();
        eServiceCenter::getInstance(m_service_center);
 {
        cursorHome();
        eServiceCenter::getInstance(m_service_center);
@@ -307,7 +319,7 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const
                        case celServiceNumber:
                        {
                                char bla[10];
                        case celServiceNumber:
                        {
                                char bla[10];
-                               sprintf(bla, "%d", m_cursor_number + 1);
+                               sprintf(bla, "%d", m_numberoffset + m_cursor_number + 1);
                                text = bla;
                                break;
                        }
                                text = bla;
                                break;
                        }
index d64805c5ed4eef64586f66a27b8526cb538a628d..b06e7ef8ad72b89a95bd31e5714a86ae48818fb9 100644 (file)
@@ -25,7 +25,8 @@ public:
        int markedQueryNext(eServiceReference &ref);
 
        int lookupService(const eServiceReference &ref);
        int markedQueryNext(eServiceReference &ref);
 
        int lookupService(const eServiceReference &ref);
-       
+       void setCurrent(const eServiceReference &ref);
+
        enum {
                visModeSimple,
                visModeComplex
        enum {
                visModeSimple,
                visModeComplex
@@ -49,6 +50,7 @@ public:
 
        int setCurrentMarked(bool);
 
 
        int setCurrentMarked(bool);
 
+       void setNumberOffset(int offset) { m_numberoffset = offset; }
 protected:
        void cursorHome();
        void cursorEnd();
 protected:
        void cursorHome();
        void cursorEnd();
@@ -92,6 +94,8 @@ private:
                /* support for movemode */
        bool m_current_marked;
        list::iterator m_swap;
                /* support for movemode */
        bool m_current_marked;
        list::iterator m_swap;
+
+       int m_numberoffset;
 };
 
 #endif
 };
 
 #endif