X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/3af66122574386a2856e83ba9c5d73d27a6f3710..da40b2aac3c7b8efdc9061aadf9038306f44789c:/screens.py diff --git a/screens.py b/screens.py index 82646282..ec81c2d5 100644 --- a/screens.py +++ b/screens.py @@ -2,6 +2,11 @@ from components import * import sys 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() @@ -15,17 +20,22 @@ class Screen(dict, HTMLSkin, GUISkin): 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] @@ -33,17 +43,173 @@ class Screen(dict, HTMLSkin, GUISkin): def close(self, retval=None): self.session.close() -class mainMenu(Screen): - - def goEmu(self): - self["title"].setText("EMUs ARE ILLEGAL AND NOT SUPPORTED!") - - def goTimeshift(self): - self["title"].setText("JUST PRESS THE YELLOW BUTTON!") - - def goHDTV(self): - self["title"].setText("HDTV GREEN FLASHES: ENABLED") + +mdom = xml.dom.minidom.parseString( + """ + + self.setModeTV() + self.setModeRadio() + self.setModeFile() + self.openDialog(ScartLoopThrough) + + + + + + + + + + + + + self.openDialog(serviceScan) + + + + + + + + + + self.openDialog(configOSD) + + + + + + + + + + + + + + self.goSetup() + + quitMainloop() + """) + +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 ScartLoopThrough(Screen): + def __init__(self, session): + Screen.__init__(self, session) + + self["actions"] = ActionMap(["OkCancelActions"], + { + "cancel": self.close + }) + +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 + }) + + +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) @@ -53,47 +219,68 @@ class mainMenu(Screen): def okbuttonClick(self): selection = self["menu"].getCurrent() selection[1]() - - def __init__(self, session): + + 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) - b = Button("ok") + + 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 }) - - b.onClick = [ self.okbuttonClick ] - self["okbutton"] = b - self["title"] = Header("Main Menu! - press ok to leave!") - self["menu"] = MenuList( - [ - ("Close Main Menu", self.close), - ("Service Scan", self.goScan), - ("Quit", quitMainloop), - ("EMU SETUP", self.goEmu), - ("TIMESHIFT SETUP", self.goTimeshift), - ("HDTV PIP CONFIG", self.goHDTV), - ("wie spaet ists?!", self.goClock) - ]) - -#class mainMenu(Screen): -# def __init__(self): -# GUISkin.__init__(self) -# -# self["title"] = Header("this is the\nMAIN MENU !!!"); -# self["okbutton"] = Button("ok") -# self["okbutton"].onClick = [ self.close ] + + a = getValbyAttr(parent, "title") + if a == "": #if empty use name + a = getValbyAttr(parent, "text") + self["title"] = Header(a) 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]) + #self["okbutton"] = Button("ok", [self.channelSelected]) class ChannelActionMap(ActionMap): def action(self, contexts, action): @@ -121,16 +308,29 @@ class channelSelection(Screen): def channelSelected(self): self.session.nav.playService(self["list"].getCurrent()) self.close() - pass + + #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()) 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 + "mainMenu": self.mainMenu, + "zapUp": self.zapUp, + "zapDown": self.zapDown }) self["okbutton"] = Button("mainMenu", [self.mainMenu]) @@ -145,10 +345,19 @@ class infoBar(Screen): self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration) def mainMenu(self): - self.session.open(mainMenu) - - def switchChannel(self): - self.session.open(channelSelection) + 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() # a clock display dialog class clockDisplay(Screen): @@ -165,9 +374,13 @@ class clockDisplay(Screen): 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) @@ -175,5 +388,9 @@ class serviceScan(Screen): self["scan_state"] = Label("scan state") self["scan"] = ServiceScan(self["scan_progress"], self["scan_state"]) - self["okbutton"] = Button("ok", [self.ok]) - self["okbutton"].disable() + self["actions"] = ActionMap(["OkCancelActions"], + { + "ok": self.ok, + "cancel": self.cancel + }) +