From: Felix Domke Date: Thu, 5 May 2005 23:38:38 +0000 (+0000) Subject: - split 2 (Screens) X-Git-Tag: 2.6.0~5876 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/a4da9cccc2575c4bf299bde9594dad3e049ddf6a - split 2 (Screens) --- diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py new file mode 100644 index 00000000..fa2f9da5 --- /dev/null +++ b/lib/python/Screens/ChannelSelection.py @@ -0,0 +1,57 @@ +from Screen import Screen +from Components.Button import Button +from Components.ServiceList import ServiceList +from Components.ActionMap import ActionMap + +from enigma import eServiceReference + +class ChannelSelection(Screen): + def __init__(self, session): + Screen.__init__(self, session) + + self["key_red"] = Button("red") + self["key_green"] = Button("green") + self["key_yellow"] = Button("yellow") + self["key_blue"] = Button("blue") + + self["list"] = ServiceList() + self["list"].setRoot(eServiceReference("""1:0:1:0:0:0:0:0:0:0:(provider=="ARD") && (type == 1)""")) + + #self["okbutton"] = Button("ok", [self.channelSelected]) + + class ChannelActionMap(ActionMap): + def action(self, contexts, action): + if action[:7] == "bouquet": + print "setting root to " + action[8:] + self.csel["list"].setRoot(eServiceReference("1:0:1:0:0:0:0:0:0:0:" + action[8:])) + else: + ActionMap.action(self, contexts, action) + + self["actions"] = ChannelActionMap(["ChannelSelectActions", "OkCancelActions"], + { + "cancel": self.close, + "ok": self.channelSelected, + "mark": self.doMark + }) + self["actions"].csel = self + + def doMark(self): + ref = self["list"].getCurrent() + if self["list"].isMarked(ref): + self["list"].removeMarked(ref) + else: + self["list"].addMarked(ref) + + def channelSelected(self): + self.session.nav.playService(self["list"].getCurrent()) + self.close() + + #called from infoBar + def zapUp(self): + self["list"].moveUp() + self.session.nav.playService(self["list"].getCurrent()) + + def zapDown(self): + self["list"].moveDown() + self.session.nav.playService(self["list"].getCurrent()) + diff --git a/lib/python/Screens/ClockDisplay.py b/lib/python/Screens/ClockDisplay.py new file mode 100644 index 00000000..8c1e2924 --- /dev/null +++ b/lib/python/Screens/ClockDisplay.py @@ -0,0 +1,13 @@ +# a clock display dialog +class ClockDisplay(Screen): + def okbutton(self): + self.session.close() + + def __init__(self, session, clock): + Screen.__init__(self, session) + self["theClock"] = clock + b = Button("bye") + b.onClick = [ self.okbutton ] + self["okbutton"] = b + self["title"] = Header("clock dialog: here you see the current uhrzeit!") + diff --git a/lib/python/Screens/ConfigMenu.py b/lib/python/Screens/ConfigMenu.py new file mode 100644 index 00000000..88271759 --- /dev/null +++ b/lib/python/Screens/ConfigMenu.py @@ -0,0 +1,37 @@ +from Screen import Screen +from Components.ConfigList import ConfigList +from Components.config import * +from Components.ActionMap import ActionMap + +class ConfigMenu(Screen): + #create a generic class for view/edit settings + #all stuff come from xml file + #configtype / datasource / validate-call / ... + + def __init__(self, session): + Screen.__init__(self, session) + + self["actions"] = ActionMap(["OkCancelActions"], + { + #"ok": self.okbuttonClick, + "cancel": self.close + }) + +class configTest(Screen): + + def __init__(self, session): + Screen.__init__(self, session) + + + self["config"] = ConfigList( + [ + configEntry("HKEY_LOCAL_ENIGMA/IMPORTANT/USER_ANNOYING_STUFF/SDTV/FLASHES/GREEN"), + configEntry("HKEY_LOCAL_ENIGMA/IMPORTANT/USER_ANNOYING_STUFF/HDTV/FLASHES/GREEN"), + ]) + + self["actions"] = ActionMap(["OkCancelActions"], + { + "ok": self["config"].toggle, + "cancel": self.close + }) + diff --git a/lib/python/Screens/InfoBar.py b/lib/python/Screens/InfoBar.py new file mode 100644 index 00000000..5eb5ab10 --- /dev/null +++ b/lib/python/Screens/InfoBar.py @@ -0,0 +1,80 @@ +from Screen import Screen +from ChannelSelection import ChannelSelection +from Components.Clock import Clock +from Components.ActionMap import ActionMap +from Components.Button import Button +from Components.ServiceName import ServiceName +from Components.EventInfo import EventInfo + +from enigma import * + +import time + +# hack alert! +from Menu import * + +class InfoBar(Screen): + def __init__(self, session): + Screen.__init__(self, session) + + #instantiate forever + self.servicelist = self.session.instantiateDialog(ChannelSelection) + + self["actions"] = ActionMap( [ "InfobarActions" ], + { + "switchChannel": self.switchChannel, + "mainMenu": self.mainMenu, + "zapUp": self.zapUp, + "zapDown": self.zapDown, + "instantRecord": self.instantRecord + }) + self["okbutton"] = Button("mainMenu", [self.mainMenu]) + + self["CurrentTime"] = Clock() + + self["ServiceName"] = ServiceName(self.session.nav) + + 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) + + self.recording = None + + def mainMenu(self): + print "loading mainmenu XML..." + menu = mdom.childNodes[0] + assert menu.tagName == "menu", "root element in menu must be 'menu'!" + self.session.open(Menu, menu, menu.childNodes) + + def switchChannel(self): + self.session.execDialog(self.servicelist) + + def zapUp(self): + self.servicelist.zapUp() + + def zapDown(self): + self.servicelist.zapDown() + + def instantRecord(self): + if self.recording != None: + print "remove entry" + self.session.nav.RecordTimer.removeEntry(self.recording) + self.recording = None + else: + serviceref = self.session.nav.getCurrentlyPlayingServiceReference() + + # try to get event info + epg = None + service = self.session.nav.getCurrentService() + if service != None: + info = iServiceInformationPtr() + if not service.info(info): + ev = eServiceEventPtr() + if info.getEvent(ev, 0) == 0: + epg = ev + + self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 30, serviceref, epg) + print "got entry: %s" % (str(self.recording)) + diff --git a/lib/python/Screens/Menu.py b/lib/python/Screens/Menu.py new file mode 100644 index 00000000..ce73a954 --- /dev/null +++ b/lib/python/Screens/Menu.py @@ -0,0 +1,210 @@ +from Screen import * +from Components.MenuList import MenuList +from Components.ActionMap import ActionMap +from Components.Header import Header + +# hack ... must be made dynamic +from ServiceScan import ServiceScan +from ScartLoopThrough import ScartLoopThrough +from Components.Button import Button +from Components.Label import Label +from Components.ProgressBar import ProgressBar +from ConfigMenu import * + +from enigma import quitMainloop + +import xml.dom.minidom +from xml.dom import EMPTY_NAMESPACE +from skin import elementsWithTag + +# some screens +def doGlobal(screen): + screen["clock"] = Clock() + + +mdom = xml.dom.minidom.parseString( + """ + + quitMainloop() + self.openDialog(ServiceScan) + + self.setModeTV() + self.setModeRadio() + self.setModeFile() + self.openDialog(ScartLoopThrough) + + + + + + + + + + + + + self.openDialog(ServiceScan) + + + + + + + + + + self.openDialog(configOSD) + + + + + + + + + + + + + + self.goSetup() + + """) + +def getText(nodelist): + rc = "" + for node in nodelist: + if node.nodeType == node.TEXT_NODE: + rc = rc + node.data + return rc + +def getValbyAttr(x, attr): + for p in range(x.attributes.length): + a = x.attributes.item(p) + attrib = str(a.name) + value = str(a.value) + if attrib == attr: + return value + + return "" + +class boundFunction: + def __init__(self, fnc, *args): + self.fnc = fnc + self.args = args + def __call__(self): + self.fnc(*self.args) + +class configOSD(Screen): + #this needs focus handling - so not useable + + def okbuttonClick(self): + self.close + + def __init__(self, session): + Screen.__init__(self, session) + + self["actions"] = ActionMap(["OkCancelActions"], + { + "ok": self.okbuttonClick, + "cancel": self.close + }) + + self["okbutton"] = Button("Save") + + self["txt_alpha"] = Label("Alpha:") + self["sld_alpha"] = ProgressBar() + self["sld_alpha"].setValue(50) + + self["txt_brightness"] = Label("Brightness:") + self["sld_brightness"] = ProgressBar() + self["sld_brightness"].setValue(50) + + self["txt_gamma"] = Label("Contrast:") + self["sld_gamma"] = ProgressBar() + self["sld_gamma"].setValue(50) + + + + +class Menu(Screen): + #add file load functions for the xml-file + #remove old code (i.e. goScan / goClock...) + + def openDialog(self, dialog): + self.session.open(dialog) + + def goSetup(self): + self.session.open(configTest) + + def setModeTV(self): + print "set Mode to TV" + pass + + def setModeRadio(self): + print "set Mode to Radio" + pass + + def setModeFile(self): + print "set Mode to File" + pass + + def goScan(self): + self.session.open(ServiceScan) + + def goClock(self): + self.session.open(clockDisplay, Clock()) + + def okbuttonClick(self): + selection = self["menu"].getCurrent() + selection[1]() + + def evalText(self, text): + eval(text) + + def nothing(self): #dummy + pass + + def addMenu(self, destList, node): + MenuTitle = getValbyAttr(node, "text") + if MenuTitle != "": #check for title + a = boundFunction(self.session.open, Menu, node, node.childNodes) + #TODO add check if !empty(node.childNodes) + destList.append((MenuTitle, a)) + + def addItem(self, destList, node): + ItemText = getValbyAttr(node, "text") + if ItemText != "": #check for name + b = getText(node.childNodes) + if b != "": #check for function + destList.append((ItemText,boundFunction(self.evalText,b))) + else: + destList.append((ItemText,self.nothing)) #use dummy as function + + def __init__(self, session, parent, childNode): + Screen.__init__(self, session) + + list = [] + + for x in childNode: #walk through the actual nodelist + if x.nodeType != xml.dom.minidom.Element.nodeType: + continue + elif x.tagName == 'item': + self.addItem(list, x) + elif x.tagName == 'menu': + self.addMenu(list, x) + + self["menu"] = MenuList(list) + + self["actions"] = ActionMap(["OkCancelActions"], + { + "ok": self.okbuttonClick, + "cancel": self.close + }) + + a = getValbyAttr(parent, "title") + if a == "": #if empty use name + a = getValbyAttr(parent, "text") + self["title"] = Header(a) + diff --git a/lib/python/Screens/ScartLoopThrough.py b/lib/python/Screens/ScartLoopThrough.py new file mode 100644 index 00000000..b46d1694 --- /dev/null +++ b/lib/python/Screens/ScartLoopThrough.py @@ -0,0 +1,12 @@ +from Screen import Screen +from Components.ActionMap import ActionMap + +class ScartLoopThrough(Screen): + def __init__(self, session): + Screen.__init__(self, session) + + self["actions"] = ActionMap(["OkCancelActions"], + { + "cancel": self.close + }) + diff --git a/lib/python/Screens/Screen.py b/lib/python/Screens/Screen.py new file mode 100644 index 00000000..ef9b2bb0 --- /dev/null +++ b/lib/python/Screens/Screen.py @@ -0,0 +1,37 @@ +from Components.HTMLSkin import * +from Components.GUISkin import * + +import sys + +class Screen(dict, HTMLSkin, GUISkin): + """ bla """ + + def __init__(self, session): + self.skinName = self.__class__.__name__ + self.session = session + GUISkin.__init__(self) + + def execBegin(self): +# assert self.session == None, "a screen can only exec one per time" +# self.session = session + for (name, val) in self.items(): + val.execBegin() + + def execEnd(self): + for (name, val) in self.items(): + val.execEnd() +# assert self.session != None, "execEnd on non-execing screen!" +# self.session = None + + # never call this directly - it will be called from the session! + def doClose(self): + GUISkin.close(self) + + del self.session + for (name, val) in self.items(): + print "%s -> %d" % (name, sys.getrefcount(val)) + del self[name] + + def close(self, retval=None): + self.session.close() + diff --git a/lib/python/Screens/ServiceScan.py b/lib/python/Screens/ServiceScan.py new file mode 100644 index 00000000..0c27237c --- /dev/null +++ b/lib/python/Screens/ServiceScan.py @@ -0,0 +1,27 @@ +from Screen import Screen +from Components.ServiceScan import ServiceScan as CScan +from Components.ProgressBar import ProgressBar +from Components.Label import Label +from Components.ActionMap import ActionMap + +class ServiceScan(Screen): + def ok(self): + print "ok" + if self["scan"].isDone(): + self.close() + + def cancel(self): + print "cancel not yet implemented ;)" + + def __init__(self, session): + Screen.__init__(self, session) + + self["scan_progress"] = ProgressBar() + self["scan_state"] = Label("scan state") + self["scan"] = CScan(self["scan_progress"], self["scan_state"]) + + self["actions"] = ActionMap(["OkCancelActions"], + { + "ok": self.ok, + "cancel": self.cancel + }) diff --git a/lib/python/Screens/__init__.py b/lib/python/Screens/__init__.py new file mode 100644 index 00000000..90b22c27 --- /dev/null +++ b/lib/python/Screens/__init__.py @@ -0,0 +1,3 @@ +__all__ = ["ChannelSelection", "ClockDisplay", "ConfigMenu", + "InfoBar", "Menu", "ScartLoopThrough", "Screen", "ServiceScan"] + diff --git a/screens.py b/screens.py deleted file mode 100644 index e69de29b..00000000 diff --git a/skin.py b/skin.py index 9de0a722..dc01e34e 100644 --- a/skin.py +++ b/skin.py @@ -76,7 +76,7 @@ dom = xml.dom.minidom.parseString( - + @@ -87,7 +87,7 @@ dom = xml.dom.minidom.parseString( - + @@ -95,7 +95,7 @@ dom = xml.dom.minidom.parseString( - +