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
 
+       def setCurrent(self, ref):
+               self.l.setCurrent(ref)
+
        def getCurrent(self):
                r = eServiceReference()
                self.l.getCurrent(r)
@@ -47,6 +50,9 @@ class ServiceList(HTMLComponent, GUIComponent):
                                        break
                return dest
 
+       def setNumberOffset(self, offset):
+               self.l.setNumberOffset(offset)
+
        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 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.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 = [ ]
@@ -251,6 +250,70 @@ class ChannelSelection(Screen):
                                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"]
@@ -260,6 +323,8 @@ class ChannelSelection(Screen):
 
                        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)
index 52b1c3c005989d889873df2035b7fdafb3052a34..d9c42bdb3175a209d0b0efbd983f097c403a66bd 100644 (file)
@@ -134,12 +134,11 @@ class InfoBarShowHide:
 class NumberZap(Screen):
        def quit(self):
                self.Timer.stop()
-               self.close()
+               self.close(0)
 
        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
@@ -221,8 +220,13 @@ class InfoBarNumberZap:
                        })
 
        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 
index 19ff69333907d8ae6dbe6aaabb7b2df2c9798110..938b1795035b1b7911078099dfc8112c3b55e88a 100644 (file)
@@ -22,6 +22,18 @@ void eListboxServiceContent::setRoot(const eServiceReference &root)
                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())
@@ -124,7 +136,7 @@ void eListboxServiceContent::sort()
 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);
@@ -307,7 +319,7 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const
                        case celServiceNumber:
                        {
                                char bla[10];
-                               sprintf(bla, "%d", m_cursor_number + 1);
+                               sprintf(bla, "%d", m_numberoffset + m_cursor_number + 1);
                                text = bla;
                                break;
                        }
index d64805c5ed4eef64586f66a27b8526cb538a628d..b06e7ef8ad72b89a95bd31e5714a86ae48818fb9 100644 (file)
@@ -25,7 +25,8 @@ public:
        int markedQueryNext(eServiceReference &ref);
 
        int lookupService(const eServiceReference &ref);
-       
+       void setCurrent(const eServiceReference &ref);
+
        enum {
                visModeSimple,
                visModeComplex
@@ -49,6 +50,7 @@ public:
 
        int setCurrentMarked(bool);
 
+       void setNumberOffset(int offset) { m_numberoffset = offset; }
 protected:
        void cursorHome();
        void cursorEnd();
@@ -92,6 +94,8 @@ private:
                /* support for movemode */
        bool m_current_marked;
        list::iterator m_swap;
+
+       int m_numberoffset;
 };
 
 #endif