From 2cd1d9f6f550f89747a579fe923299ac9916afe0 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Thu, 17 Nov 2005 16:40:07 +0000 Subject: [PATCH 1/1] zap with numbers is now possible --- lib/python/Components/ServiceList.py | 6 +++ lib/python/Screens/ChannelSelection.py | 69 +++++++++++++++++++++++++- lib/python/Screens/InfoBarGenerics.py | 14 ++++-- lib/service/listboxservice.cpp | 16 +++++- lib/service/listboxservice.h | 6 ++- 5 files changed, 101 insertions(+), 10 deletions(-) diff --git a/lib/python/Components/ServiceList.py b/lib/python/Components/ServiceList.py index 9d3ffb52..e0a31534 100644 --- a/lib/python/Components/ServiceList.py +++ b/lib/python/Components/ServiceList.py @@ -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) diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 1604150d..b730ccb2 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -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) diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index 52b1c3c0..d9c42bdb 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -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 diff --git a/lib/service/listboxservice.cpp b/lib/service/listboxservice.cpp index 19ff6933..938b1795 100644 --- a/lib/service/listboxservice.cpp +++ b/lib/service/listboxservice.cpp @@ -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; } diff --git a/lib/service/listboxservice.h b/lib/service/listboxservice.h index d64805c5..b06e7ef8 100644 --- a/lib/service/listboxservice.h +++ b/lib/service/listboxservice.h @@ -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 -- 2.30.2