- improved scan error handling
[enigma2.git] / screens.py
index a04772db3620e9d9a1bee435dc5c66904c9f0c1f..fe8d69dbdbe73522a393aae34734dbb48ae30b5d 100644 (file)
@@ -1,5 +1,6 @@
 from components import *
 import sys
 from components import *
 import sys
+from enigma import quitMainloop
 
 # some screens
 def doGlobal(screen):
 
 # some screens
 def doGlobal(screen):
@@ -7,77 +8,177 @@ def doGlobal(screen):
 
 class Screen(dict, HTMLSkin, GUISkin):
        """ bla """
 
 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)
        
        # 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()
        
        def close(self, retval=None):
                self.session.close()
+
+class mainMenu(Screen):
        
        
-# a test dialog
-class testDialog(Screen):
-       def testDialogClick(self):
-               selection = self["menu"].getCurrent()
-               selection[1]()
-       
-       def goMain(self):
-#              self.close(0)
-               self["title"].setText("you selected the main menu!");
-               
        def goEmu(self):
        def goEmu(self):
-#              self.close(1)
-               self["title"].setText("EMUs ARE ILLEGAL AND NOT SUPPORTED!");
+               self["title"].setText("EMUs ARE ILLEGAL AND NOT SUPPORTED!")
        
        def goTimeshift(self):
        
        def goTimeshift(self):
-#              self.close(2)
-               self["title"].setText("JUST PRESS THE YELLOW BUTTON!");
+               self["title"].setText("JUST PRESS THE YELLOW BUTTON!")
        
        def goHDTV(self):
        
        def goHDTV(self):
-#              self.close(3)
-               self["title"].setText("HDTV GREEN FLASHES: ENABLED");
+               self["title"].setText("HDTV GREEN FLASHES: ENABLED")
+       
+       def goScan(self):
+               self.session.open(serviceScan)
+       
+       def goClock(self):
+               self.session.open(clockDisplay, Clock())
 
 
-       def __init__(self):
-               GUISkin.__init__(self)
+       def okbuttonClick(self):
+               selection = self["menu"].getCurrent()
+               selection[1]()
+       
+       def __init__(self, session):
+               Screen.__init__(self, session)
                b = Button("ok")
                b = Button("ok")
-               b.onClick = [ self.testDialogClick ]
+
+               self["actions"] = ActionMap(["OkCancelActions"], 
+                       {
+                               "ok": self.okbuttonClick,
+                               "cancel": self.close
+                       })
+
+               b.onClick = [ self.okbuttonClick ]
                self["okbutton"] = b
                self["okbutton"] = b
-               self["title"] = Header("Test Dialog - press ok to leave!")
+               self["title"] = Header("Main Menu! - press ok to leave!")
                self["menu"] = MenuList(
                        [
                self["menu"] = MenuList(
                        [
-                               ("MAIN MENU", self.goMain), 
+                               ("Close Main Menu", self.close),
+                               ("Service Scan", self.goScan),
+                               ("Quit", quitMainloop),
                                ("EMU SETUP", self.goEmu),
                                ("TIMESHIFT SETUP", self.goTimeshift),
                                ("EMU SETUP", self.goEmu),
                                ("TIMESHIFT SETUP", self.goTimeshift),
-                               ("HDTV PIP CONFIG", self.goHDTV)
+                               ("HDTV PIP CONFIG", self.goHDTV),
+                               ("wie spaet ists?!", self.goClock)
                        ])
 
                        ])
 
+class channelSelection(Screen):
+       def __init__(self, session):
+               Screen.__init__(self, session)
+               
+               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)
 
 
-class MainMenu(Screen):
-       def __init__(self):
-               GUISkin.__init__(self)
+               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()
+               pass
+
+class infoBar(Screen):
+       def __init__(self, session):
+               Screen.__init__(self, session)
+               
+               self["actions"] = ActionMap( [ "InfobarActions" ], 
+                       {
+                               "switchChannel": self.switchChannel,
+                               "mainMenu": self.mainMenu
+                       })
+               self["okbutton"] = Button("mainMenu", [self.mainMenu])
+               
+               self["CurrentTime"] = Clock()
                
                
-               self["ok"] = Button("ok")
-               self["ok"].onClick = [ self.close ]
+               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)
        
        
+       def mainMenu(self):
+               self.session.open(mainMenu)
+               
+       def switchChannel(self):
+               self.session.open(channelSelection)
+
 # a clock display dialog
 class clockDisplay(Screen):
        def okbutton(self):
 # a clock display dialog
 class clockDisplay(Screen):
        def okbutton(self):
-               print "clockDisplay close"
-               
                self.session.close()
        
                self.session.close()
        
-       def __init__(self, clock):
-               GUISkin.__init__(self)
+       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!")
 
                self["theClock"] = clock
                b = Button("bye")
                b.onClick = [ self.okbutton ]
                self["okbutton"] = b
                self["title"] = Header("clock dialog: here you see the current uhrzeit!")
 
-# defined screens
-screens = {
-       "global": doGlobal,
-       "testDialog": testDialog,
-       "clockDisplay": clockDisplay }
+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"] = ServiceScan(self["scan_progress"], self["scan_state"])
+
+               self["actions"] = ActionMap(["OkCancelActions"], 
+                       {
+                               "ok": self.ok,
+                               "cancel": self.cancel
+                       })