aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2007-09-23 23:29:09 +0000
committerFelix Domke <tmbinc@elitedvb.net>2007-09-23 23:29:09 +0000
commita12f0f98d99109a64942abf1bb1f6e429c2fc7f5 (patch)
treeaae97daaf858cc545cbc9b64ba6b327bd1f22b8a
parentc62a259bfa8d576c05e7ac6bd1b978340f30135b (diff)
downloadenigma2-a12f0f98d99109a64942abf1bb1f6e429c2fc7f5.tar.gz
enigma2-a12f0f98d99109a64942abf1bb1f6e429c2fc7f5.zip
add concept of 'related screen', which can be used to get shared sources (like clock, current service, ...) from global,session-global,parent screen. replace 'fake' with 'session.VideoPicture' for pig usage.
-rw-r--r--lib/python/Screens/Globals.py7
-rw-r--r--lib/python/Screens/Screen.py15
-rw-r--r--lib/python/Screens/SessionGlobals.py14
-rw-r--r--mytest.py8
-rw-r--r--skin.py50
5 files changed, 81 insertions, 13 deletions
diff --git a/lib/python/Screens/Globals.py b/lib/python/Screens/Globals.py
new file mode 100644
index 00000000..9ae10026
--- /dev/null
+++ b/lib/python/Screens/Globals.py
@@ -0,0 +1,7 @@
+from Screens.Screen import Screen
+from Components.Sources.Clock import Clock
+
+class Globals(Screen):
+ def __init__(self):
+ Screen.__init__(self, None)
+ self["CurrentTime"] = Clock()
diff --git a/lib/python/Screens/Screen.py b/lib/python/Screens/Screen.py
index ed61d9d6..4e3b117e 100644
--- a/lib/python/Screens/Screen.py
+++ b/lib/python/Screens/Screen.py
@@ -7,9 +7,12 @@ class Screen(dict, HTMLSkin, GUISkin):
ALLOW_SUSPEND = False
- def __init__(self, session):
+ global_scren = None
+
+ def __init__(self, session, parent = None):
self.skinName = self.__class__.__name__
self.session = session
+ self.parent = parent
GUISkin.__init__(self)
self.onClose = [ ]
@@ -140,3 +143,13 @@ class Screen(dict, HTMLSkin, GUISkin):
def __repr__(self):
return str(type(self))
+
+ def getRelatedScreen(self, name):
+ if name == "session":
+ return self.session.screen
+ elif name == "parent":
+ return self.parent
+ elif name == "global":
+ return self.global_screen
+ else:
+ return None
diff --git a/lib/python/Screens/SessionGlobals.py b/lib/python/Screens/SessionGlobals.py
new file mode 100644
index 00000000..d90c2080
--- /dev/null
+++ b/lib/python/Screens/SessionGlobals.py
@@ -0,0 +1,14 @@
+from Screens.Screen import Screen
+from Components.Sources.CurrentService import CurrentService
+from Components.Sources.EventInfo import EventInfo
+from Components.Sources.FrontendStatus import FrontendStatus
+from Components.Sources.Source import Source
+
+class SessionGlobals(Screen):
+ def __init__(self, session):
+ Screen.__init__(self, session)
+ self["CurrentService"] = CurrentService(self.session.nav)
+ self["Event_Now"] = EventInfo(self.session.nav, EventInfo.NOW)
+ self["Event_Next"] = EventInfo(self.session.nav, EventInfo.NEXT)
+ self["FrontendStatus"] = FrontendStatus(service_source = self.session.nav.getCurrentService)
+ self["VideoPicture"] = Source()
diff --git a/mytest.py b/mytest.py
index 81c9f95f..3a5ec3ec 100644
--- a/mytest.py
+++ b/mytest.py
@@ -92,6 +92,12 @@ class GUIOutputDevice(OutputDevice):
def create(self, comp, desktop):
comp.createGUIScreen(self.parent, desktop)
+from Screens.Globals import Globals
+from Screens.SessionGlobals import SessionGlobals
+from Screens.Screen import Screen
+
+Screen.global_screen = Globals()
+
# Session.open:
# * push current active dialog ('current_dialog') onto stack
# * call execEnd for this dialog
@@ -133,6 +139,8 @@ class Session:
self.in_exec = False
+ self.screen = SessionGlobals(self)
+
for p in plugins.getPlugins(PluginDescriptor.WHERE_SESSIONSTART):
p(reason=0, session=self)
diff --git a/skin.py b/skin.py
index d40c593b..3c4b9e1f 100644
--- a/skin.py
+++ b/skin.py
@@ -6,7 +6,7 @@ from enigma import eSize, ePoint, gFont, eWindow, eLabel, ePixmap, eWindowStyleM
from Components.config import ConfigSubsection, ConfigText, config
from Components.Converter.Converter import Converter
-from Components.Sources.Source import Source
+from Components.Sources.Source import Source, ObsoleteSource
from Tools.Directories import resolveFilename, SCOPE_SKIN, SCOPE_SKIN_IMAGE, SCOPE_FONTS
from Tools.Import import my_import
@@ -297,15 +297,17 @@ def readSkin(screen, skin, name, desktop):
for n in name:
myscreen, path = lookupScreen(n)
if myscreen is not None:
+ # use this name for debug output
+ name = n
break
# otherwise try embedded skin
myscreen = myscreen or getattr(screen, "parsedSkin", None)
-
+
# try uncompiled embedded skin
if myscreen is None and getattr(screen, "skin", None):
myscreen = screen.parsedSkin = xml.dom.minidom.parseString(screen.skin).childNodes[0]
-
+
assert myscreen is not None, "no skin for screen '" + repr(name) + "' found!"
screen.skinAttributes = [ ]
@@ -347,15 +349,39 @@ def readSkin(screen, skin, name, desktop):
collectAttributes(attributes, widget, skin_path_prefix, ignore=['name'])
elif wsource:
# get corresponding source
- source = screen.get(wsource)
- if source is None:
- if wsource == "fake":
- if screen.get("fake"):
- raise SkinError("screen '" + name + "has a element named 'fake' but its not a Source!!")
- source = Source()
- screen["fake"] = source
+
+ while True: # until we found a non-obsolete source
+
+ # parse our current "wsource", which might specifiy a "related screen" before the dot,
+ # for example to reference a parent, global or session-global screen.
+ scr = screen
+
+ # resolve all path components
+ path = wsource.split('.')
+ while len(path) > 1:
+ scr = screen.getRelatedScreen(path[0])
+ if scr is None:
+ print wsource
+ print name
+ raise SkinError("specified related screen '" + wsource + "' was not found in screen '" + name + "'!")
+ path = path[1:]
+
+ # resolve the source.
+ source = scr.get(path[0])
+ if isinstance(source, ObsoleteSource):
+ # however, if we found an "obsolete source", issue warning, and resolve the real source.
+ print "WARNING: SKIN '%s' USES OBSOLETE SOURCE '%s', USE '%s' INSTEAD!" % (name, wsource, source.new_source)
+ print "OBSOLETE SOURCE WILL BE REMOVED %s, PLEASE UPDATE!" % (source.removal_date)
+ if source.description:
+ print source.description
+
+ wsource = source.new_source
else:
- raise SkinError("source '" + wsource + "' was not found in screen '" + name + "'!")
+ # otherwise, use that source.
+ break
+
+ if source is None:
+ raise SkinError("source '" + wsource + "' was not found in screen '" + name + "'!")
wrender = widget.getAttribute('render')
@@ -379,7 +405,7 @@ def readSkin(screen, skin, name, desktop):
c = converter_class(parms)
c.connect(source)
else:
- print "reused conveter!"
+ print "reused converter!"
source = c