initial commit of my widget system. it is quite alpha, so please dont relay on the...
authorRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sun, 7 Feb 2010 16:35:11 +0000 (16:35 +0000)
committerRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sun, 7 Feb 2010 16:35:11 +0000 (16:35 +0000)
do not build it into plugin-ipkg-feeds for now, i will add it when i think it is stable. i have checked it in, because i want to get feedback :)

26 files changed:
widgets/src/LICENSE [new file with mode: 0644]
widgets/src/Widget.py [new file with mode: 0644]
widgets/src/__init__.py [new file with mode: 0644]
widgets/src/keymap.xml [new file with mode: 0644]
widgets/src/plugin.py [new file with mode: 0644]
widgets/src/skin.xml [new file with mode: 0644]
widgets/src/widgets/__init__.py [new file with mode: 0644]
widgets/src/widgets/bigclock/__init__.py [new file with mode: 0644]
widgets/src/widgets/bigclock/widget.py [new file with mode: 0644]
widgets/src/widgets/bigclock/widget_skin.xml [new file with mode: 0644]
widgets/src/widgets/counter/__init__.py [new file with mode: 0644]
widgets/src/widgets/counter/widget.py [new file with mode: 0644]
widgets/src/widgets/counter/widget_skin.xml [new file with mode: 0644]
widgets/src/widgets/frontendstatus/__init__.py [new file with mode: 0644]
widgets/src/widgets/frontendstatus/widget.py [new file with mode: 0644]
widgets/src/widgets/frontendstatus/widget_skin.xml [new file with mode: 0644]
widgets/src/widgets/imageswitch/WebPixmap.py [new file with mode: 0644]
widgets/src/widgets/imageswitch/__init__.py [new file with mode: 0644]
widgets/src/widgets/imageswitch/widget.py [new file with mode: 0644]
widgets/src/widgets/imageswitch/widget_skin.xml [new file with mode: 0644]
widgets/src/widgets/serviceinfo/__init__.py [new file with mode: 0644]
widgets/src/widgets/serviceinfo/widget.py [new file with mode: 0644]
widgets/src/widgets/serviceinfo/widget_skin.xml [new file with mode: 0644]
widgets/src/widgets/testwidget/__init__.py [new file with mode: 0644]
widgets/src/widgets/testwidget/widget.py [new file with mode: 0644]
widgets/src/widgets/testwidget/widget_skin.xml [new file with mode: 0644]

diff --git a/widgets/src/LICENSE b/widgets/src/LICENSE
new file mode 100644 (file)
index 0000000..9970059
--- /dev/null
@@ -0,0 +1,12 @@
+This plugin is licensed under the Creative Commons 
+Attribution-NonCommercial-ShareAlike 3.0 Unported 
+License. To view a copy of this license, visit
+http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative
+Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
+
+Alternatively, this plugin may be distributed and executed on hardware which
+is licensed by Dream Multimedia GmbH.
+
+This plugin is NOT free software. It is open source, you are allowed to
+modify it (if you keep the license), but it may not be commercially 
+distributed other than under the conditions noted above.
diff --git a/widgets/src/Widget.py b/widgets/src/Widget.py
new file mode 100644 (file)
index 0000000..3de4d8a
--- /dev/null
@@ -0,0 +1,42 @@
+import skin
+from Components.Label import Label
+
+class Widget:
+    
+    
+    def __init__(self,session,name="no Name",description="unknown Description",version="unknown Version",author="unknown Author",homepage="http://www.unknown.de"):
+        self.name = name
+        self.author = author
+        self.description = description
+        self.version = version
+        self.homepage = homepage
+        self.session = session
+        self.dir = "" # the directory the widget is saved in the filesystem
+        self.elements ={} # contains all Labels etc. 
+        self.prefix = "" # the prefix of the name of the elements after it is patched into the main screen skin depending on its place in the widgetdesktop 
+        self.wname = "" # the place name, the widget is placed and running in
+        
+    def setDir(self,directory):
+        """ called after the import """
+        self.dir = directory
+            
+    def setPositionname(self,wname):
+        """ called after the widget is placed at a place at the widgetdesktop """
+        self.wname = wname
+        self.prefix = wname+"_e_"
+    
+    def getElement(self,elementname):
+        """ returns the intance of an element of self.elements """
+        return self.instance[self.prefix+elementname]  
+    
+    def onLoadFinished(self,instance):
+        """ overwrite this in your widget to do things after the widget is shown on the widgetdesktop """
+        self.instance = instance
+    
+    def onClose(self):
+        """ overwrite this, if you have to stop things when the widgetdesktop """
+        pass
+    
+    def onInfo(self):
+        """ overwrite this, if you whant to do something if the user presses the info-key and your widget is selected """
+        print "unhandled infokey"
\ No newline at end of file
diff --git a/widgets/src/__init__.py b/widgets/src/__init__.py
new file mode 100644 (file)
index 0000000..98b932e
--- /dev/null
@@ -0,0 +1 @@
+#djhkjh
\ No newline at end of file
diff --git a/widgets/src/keymap.xml b/widgets/src/keymap.xml
new file mode 100644 (file)
index 0000000..c435b4f
--- /dev/null
@@ -0,0 +1,50 @@
+<keymap>
+       <map context="WidgetDesktopActions">
+               <key id="KEY_OK" mapto="ok" flags="m" />
+               <key id="KEY_EXIT" mapto="cancel" flags="m" />
+               <key id="KEY_ESC" mapto="cancel" flags="m" />
+               <key id="KEY_LEFT" mapto="left" flags="mr" />
+               <key id="KEY_RIGHT" mapto="right" flags="mr" />
+               <key id="KEY_UP" mapto="up" flags="mr" />
+               <key id="KEY_DOWN" mapto="down" flags="mr" />
+               
+               <key id="KEY_CHANNELUP" mapto="pageUp" flags="mr" />
+               <key id="KEY_CHANNELDOWN" mapto="pageDown" flags="mr" />
+               
+               <key id = "KEY_MENU"    mapto = "menu"          flags = "m" />
+               <key id = "KEY_INFO"    mapto = "info"          flags = "m" />
+               
+               <key id="KEY_RED" mapto="red" flags="m" />
+               <key id="KEY_GREEN" mapto="green" flags="m" />
+               <key id="KEY_YELLOW" mapto="yellow" flags="m" />
+               <key id="KEY_BLUE" mapto="blue" flags="m" />
+               
+               <key id="KEY_1" mapto="1" flags="m" />
+               <key id="KEY_2" mapto="2" flags="m" />
+               <key id="KEY_3" mapto="3" flags="m" />
+               <key id="KEY_4" mapto="4" flags="m" />
+               <key id="KEY_5" mapto="5" flags="m" />
+               <key id="KEY_6" mapto="6" flags="m" />
+               <key id="KEY_7" mapto="7" flags="m" />
+               <key id="KEY_8" mapto="8" flags="m" />
+               <key id="KEY_9" mapto="9" flags="m" />
+               <key id="KEY_0" mapto="0" flags="m" />
+       </map>
+       <map context="WidgetPositionConfigScreenActions">
+               <key id="KEY_OK" mapto="ok" flags="m" />
+               <key id="KEY_EXIT" mapto="cancel" flags="m" />
+               <key id="KEY_LEFT" mapto="left" flags="mr" />
+               <key id="KEY_RIGHT" mapto="right" flags="mr" />
+               <key id="KEY_UP" mapto="up" flags="mr" />
+               <key id="KEY_DOWN" mapto="down" flags="mr" />
+               
+               <key id="KEY_RED" mapto="cancel" flags="m" />
+               <key id="KEY_GREEN" mapto="ok" flags="m" />
+               
+               
+       </map>
+       <map context="WidgetStartActions">
+               <key id="KEY_OK" mapto="ok_but" flags="m" />
+               <key id="KEY_EXIT" mapto="exit_but" flags="m" />
+       </map>
+</keymap>
\ No newline at end of file
diff --git a/widgets/src/plugin.py b/widgets/src/plugin.py
new file mode 100644 (file)
index 0000000..6754f5d
--- /dev/null
@@ -0,0 +1,413 @@
+from Screens.Screen import Screen
+from Screens.InfoBarGenerics import InfoBarPlugins
+from Screens.InfoBar import InfoBar
+from Plugins.Plugin import PluginDescriptor
+from Components.ActionMap import ActionMap
+from Components.config import config, ConfigSubsection, ConfigSubDict, ConfigText, ConfigBoolean
+from Components.Element import cached
+from enigma import eTimer
+from Components.Label import Label
+from Components.MenuList import MenuList
+from enigma import  getDesktop, eSize,ePoint
+from skin import applyAllAttributes, dom_skins
+
+               
+from Widget import Widget
+from widgets import importWidgets, importSingleWidget
+               
+
+
+
+SIBbase__init__ = None
+SIB_StartOnlyOneTime = False
+SIB_TOGGLE_SHOW = InfoBar.toggleShow
+SIB_SWOFF = InfoBar.hide
+SIB_STATE = -1
+
+config.plugins.Widgets = ConfigSubsection()
+config.plugins.Widgets.show_empty_positions = ConfigBoolean(default = True,descriptions = {False: _("hide"), True: _("show")})
+config.plugins.Widgets.active_widgets = ConfigSubDict()
+for x in range(0,16):
+       for y in range(0,16):
+               config.plugins.Widgets.active_widgets["w%i_%i"%(x,y)] = ConfigText("")
+
+
+def Plugins(**kwargs):
+       return [PluginDescriptor(where = PluginDescriptor.WHERE_SESSIONSTART, fnc = SIBautostart)]
+
+
+
+class ReplaceInfoBar():
+       def __init__(self):
+               pass
+       @cached
+       def Replace(self):
+               return True
+       boolean = property(Replace)
+
+
+
+def SIBautostart(reason, **kwargs):
+       global SIBbase__init__
+       if "session" in kwargs:
+               if SIBbase__init__ is None:
+                       SIBbase__init__ = InfoBarPlugins.__init__
+               InfoBarPlugins.__init__ = InfoBarPlugins__init__
+               InfoBarPlugins.switch = switch
+               InfoBarPlugins.swOff = swOff
+
+
+
+def InfoBarPlugins__init__(self):
+       global SIB_StartOnlyOneTime
+       if not SIB_StartOnlyOneTime: 
+               SIB_StartOnlyOneTime = True
+               self["SIBActions"] = ActionMap(["WidgetStartActions"],{"ok_but": self.switch,"exit_but": self.swOff}, -1)
+               self.SIBtimer = eTimer()
+               self.SIBtimer.callback.append(self.swOff)
+               self.SIBtimer.start(4000, True)
+       else:
+               InfoBarPlugins.__init__ = InfoBarPlugins.__init__
+               InfoBarPlugins.switch = None
+               InfoBarPlugins.swOff = None
+       SIBbase__init__(self)
+
+
+
+def switch(self):
+       if InfoBar and InfoBar.instance and ReplaceInfoBar.Replace:
+               global SIB_STATE
+               if (SIB_STATE == 0):
+                       SIB_STATE = 1
+                       idx = config.usage.infobar_timeout.index
+                       if idx:
+                               self.SIBtimer.start(idx*1000, True)
+                       SIB_TOGGLE_SHOW(InfoBar.instance)
+               elif (SIB_STATE == 1):
+                       SIB_STATE = 0
+                       self.SIBtimer.stop()
+                       SIB_SWOFF(InfoBar.instance)
+                       self.session.open(WidgetDesktop)
+               else:
+                       SIB_STATE = 0
+                       self.SIBtimer.stop()
+                       SIB_SWOFF(InfoBar.instance)
+
+
+
+def swOff(self):
+       if InfoBar and InfoBar.instance and ReplaceInfoBar.Replace:
+               global SIB_STATE
+               SIB_STATE = 0
+               self.SIBtimer.stop()
+               SIB_SWOFF(InfoBar.instance)
+####
+def lookupScreenSkin(screenname):
+       for skin in dom_skins:
+               for scr in skin[1].findall("screen"):
+                       if scr.get("name") == screenname:
+                               return scr
+       return False
+####
+def lookupWidgetConfig():
+       for skin in dom_skins:
+               for scr in skin[1].findall("widgetconfig"):
+                       if scr.findall("num_widgets"):
+                               return scr
+       return False
+       
+def getWidgetForPosition(session,positionname):
+       #print "positionname value",config.plugins.Widgets.active_widgets[positionname].value
+       wpath = config.plugins.Widgets.active_widgets[positionname].value
+       if wpath == "":
+               return False
+       else:
+               return importSingleWidget(session,wpath)
+       
+class WidgetDesktop(Screen):
+       
+       selection_x = 0
+       selection_y = 0
+       
+       def __init__(self, session):
+               self.num_widgets_x = 3
+               self.num_widgets_y = 3
+               self.imported_widgets = []
+               self.widgets_on_position = {}
+               self.session = session
+               Screen.__init__(self, session)
+               
+               loadSkinReal("/usr/lib/enigma2/python/Plugins/Extensions/Widgets/skin.xml")
+               
+
+               cfg = lookupWidgetConfig()
+               if cfg is not False:
+                       for config in cfg.getchildren():
+                               if config.tag == "num_widgets":
+                                       self.num_widgets_x = int(config.get("x"))
+                                       self.num_widgets_y = int(config.get("y"))
+               print "init screen with",self.num_widgets_x,"x",self.num_widgets_y                      
+               self.initBackgrounds()
+               
+               self.positions = []
+               for x in range(1,self.num_widgets_x+1):
+                       for y in range(1,self.num_widgets_y+1):
+                               self.positions.append("w%i_%i"%(x,y))
+                               
+
+               
+               scr = lookupScreenSkin("WidgetDesktop")
+               if scr is not False:
+                       self.original_screen = scr
+                       self.original_screen_newchilds = []
+                       for wname in self.positions:
+                               twidget = getWidgetForPosition(session,wname)
+                               if twidget is not False:
+                                       print "found widget for position",wname,twidget
+                                       twidget[1].setPositionname(wname)
+                                       self.importWidgetElements(twidget, wname)
+                                       self.importWidgetSkin(scr, twidget, wname)
+                                       self.imported_widgets.append(twidget)
+                                       self.widgets_on_position[wname] = twidget
+                               else:
+                                       print "position is empty",wname
+                                       
+               self["actions"] = ActionMap(["WidgetDesktopActions"],{
+                                                                                                                         "ok": self.close,
+                                                                                                                         "cancel": self.close,
+                                                                                                                         "up": self.key_up,
+                                                                                                                         "down": self.key_down,
+                                                                                                                         "left": self.key_left,
+                                                                                                                         "right": self.key_right,
+                                                                                                                         "menu": self.key_menu,
+                                                                                                                         "info": self.key_info,
+                                                                                                                         }, -1)
+               self.onLayoutFinish.append(self.restoreSkin)
+               self.onLayoutFinish.append(self._onLoadFinished)
+               self.onClose.append(self._onClose )
+       
+       def importWidgetElements(self,widget,wname):
+               for elementname in widget[1].elements.keys():
+                       self[wname+"_e_"+elementname] = widget[1].elements[elementname]
+
+       def importWidgetSkin(self,scr,widget,wname):
+               x,y = self.getPositionOfBackgroundElement(scr,wname)
+               for screenelement in widget[2].find("desktopwidget").getchildren():
+                       element = self.patchWidgetElementSkinPosition(screenelement,x,y,wname)
+                       self.original_screen_newchilds.append(element)
+                       scr.append(element)
+               
+       def getPositionOfBackgroundElement(self,screen,elementname):
+               for w in screen.getchildren():
+                       if w.get("name") == elementname:
+                               xy = w.get("position").split(",")
+                               return int(xy[0]),int(xy[1])
+               return 0,0
+               
+       def restoreSkin(self):
+               for old in self.original_screen_newchilds:
+                       self.original_screen.remove(old)
+               
+                                       
+       def initBackgrounds(self):
+               for x in range(1,self.num_widgets_x+1):
+                       for y in range(1,self.num_widgets_y+1):
+                               wname = "w%i_%i"%(x,y)
+                               self[wname] = Label()
+                               if not config.plugins.Widgets.show_empty_positions.value:
+                                       self[wname].hide()
+                               self[wname+"_h"] = Label(_("press menu to edit"))
+                               self[wname+"_h"].hide()
+                               
+       def patchWidgetElementSkinPosition(self,element,x1,y1,wname):
+               pos1= element.get("position").split(",")
+               x2 = int(pos1[0])+x1
+               y2 = int(pos1[1])+y1
+               pos2 = "%i,%i"%(x2,y2)
+               element.set("position",pos2)
+               if element.get("name") is not None:
+                       element.set("name",wname+"_e_"+element.get("name"))
+               return element
+
+       def _onLoadFinished(self):
+               for w in self.imported_widgets:
+                       try:
+                               w[1].onLoadFinished(self)
+                       except Exception,e:
+                               print "Exception in onLoadFinished of widget",w[0],e
+                               
+       def _onClose(self):
+               for w in self.imported_widgets:
+                       try:
+                               # notify the widget that it will be closed
+                               w[1].onClose()
+                               
+                               #deleting the instance of the widget
+                               #del w                          
+                       except Exception,e:
+                               print "Exception in onClose of widget",w[0],e
+                               
+       def key_up(self):
+               self.selectionHide()
+               self.selection_x -= 1
+               if self.selection_x <= 0:
+                       self.selection_x = self.num_widgets_x
+               self.selectionShow()            
+
+       def key_down(self):
+               self.selectionHide()
+               self.selection_x += 1
+               if self.selection_x>self.num_widgets_x:
+                       self.selection_x = 1            
+               self.selectionShow()            
+       
+       def key_left(self):
+               self.selectionHide()
+               self.selection_y -= 1           
+               if self.selection_y <= 0:
+                       self.selection_y = self.num_widgets_y
+               self.selectionShow()            
+
+       def key_right(self):
+               self.selectionHide()
+               self.selection_y += 1
+               if self.selection_y>self.num_widgets_y:
+                       self.selection_y = 1            
+               self.selectionShow()            
+       
+       def selectionShow(self):
+               if self.selection_x==0:
+                       self.selection_x=1
+               if self.selection_y==0:
+                       self.selection_y=1
+               if self.selection_x in range(1,self.num_widgets_x+1) and self.selection_y in range(1,self.num_widgets_y+1):
+                       self["w%i_%i_h"%(self.selection_x,self.selection_y)].show()
+
+       def selectionHide(self):
+               if self.selection_x in range(1,self.num_widgets_x+1) and self.selection_y in range(1,self.num_widgets_y+1):
+                       self["w%i_%i_h"%(self.selection_x,self.selection_y)].hide()
+                               
+       def key_menu(self):
+               if self.selection_x != 0 and self.selection_y != 0:
+                       print "menukey on position",self.selection_x,self.selection_y
+                       w = self.getWidgetOnPosition(self.selection_x,self.selection_y)
+                       if w is not False:
+                               self.session.open(WidgetPositionConfigScreen,self.selection_x,self.selection_y,widget=w)
+                       else:
+                               self.session.open(WidgetPositionConfigScreen,self.selection_x,self.selection_y)
+                               
+       def key_info(self):
+               if self.selection_x != 0 and self.selection_y != 0:
+                       w = self.getWidgetOnPosition(self.selection_x,self.selection_y)
+                       if w is not False:
+                               print "infokey on widget",w[0]
+                               w[1].onInfo()
+       
+       def getWidgetOnPosition(self,x,y):
+               try:
+                       return self.widgets_on_position["w%i_%i"%(self.selection_x,self.selection_y)]
+               except KeyError:
+                       return False
+
+###########
+class WidgetPositionConfigScreen(Screen):
+       def __init__(self, session,x,y,widget=False):
+               self.session = session
+               self.position_x = x
+               self.position_y = y
+               self.widget = widget
+               Screen.__init__(self, session)
+               list = []
+               
+               if widget is not False:
+                       list.append((_("clear position"),"remove"))
+               
+               for widget in importWidgets(session):
+                       list.append((widget[1].name,widget))
+               
+               self["list"] = MenuList(list)
+               self["preview"] = Label("")
+               self["description"] = Label("")
+               self["version"] = Label("")
+               self["author"] = Label("")
+               self["homepage"] = Label("")
+               self["key_green"] = Label(_("ok"))
+               self["key_red"] = Label(_("cancel"))
+               
+               
+               self["actions"] = ActionMap(["WidgetPositionConfigScreenActions"],{
+                                                                                                                         "ok":      self.ok,
+                                                                                                                         "cancel":  self.close,
+                                                                                                                         "down":        self.down,
+                                                                             "up":      self.up,
+                                                                                         "left":        self.left,
+                                                                                         "right":       self.right,
+                                                                                         }, -1)
+               
+       def ok(self):
+               if self["list"].getCurrent() is not None:
+                       self.setValue(self["list"].getCurrent()[1][3])
+
+       def up(self):
+               self["list"].up()
+               self.update()
+    
+       def down(self):
+               self["list"].down()
+               self.update()
+        
+       def left(self):
+               self["list"].pageUp()
+               self.update()
+    
+       def right(self):
+               self["list"].pageDown()
+               self.update()
+       
+       def update(self):
+               if self["list"].getCurrent() is not None:
+                       value = self["list"].getCurrent()[1]
+                       print "update",value
+                       if value == "remove":
+                               self["description"].setText("remove current widget")
+                               self["version"].setText("")
+                               self["author"].setText("")
+                               self["homepage"].setText("")
+                       else:
+                               self["description"].setText(value[1].description)
+                               self["version"].setText(value[1].version)
+                               self["author"].setText(value[1].author)
+                               self["homepage"].setText(value[1].homepage)
+               
+               
+       
+       def setValue(self,value):
+               config.plugins.Widgets.active_widgets["w%i_%i"%(self.position_x,self.position_y)].value = value
+               config.plugins.Widgets.active_widgets["w%i_%i"%(self.position_x,self.position_y)].save()
+               self.close()
+        
+############################################################################
+#    Copyright (C) 2008 by Volker Christian                                #
+#    Volker.Christian@fh-hagenberg.at                                      #
+from skin import loadSkin
+import os
+
+
+def loadSkinReal(skinPath):
+    if os.path.exists(skinPath):
+        print "[Widgets] Loading skin ", skinPath
+        for skin in dom_skins:
+               print "skin",skin
+                       
+               if skin[0] == skinPath.replace("skin.xml",""):
+                       dom_skins.remove(skin)
+        loadSkin(skinPath)
+
+
+def loadPluginSkin(pluginPath):
+    pass #loadSkinReal(pluginPath + "/skin.xml")
+                                                                          #
+############################################################################
+
+
+
diff --git a/widgets/src/skin.xml b/widgets/src/skin.xml
new file mode 100644 (file)
index 0000000..2b0b932
--- /dev/null
@@ -0,0 +1,45 @@
+<skin>
+               <widgetconfig>
+                       <num_widgets x="3" y="3"/>
+               </widgetconfig>
+               <screen flags="wfNoBorder" name="WidgetDesktop" position="0,0" size="720,576" title="WidgetDesktop" backgroundColor="transparent">
+                       <!-- 
+                               w2_3 = widget on x=2 y=3
+                               w2_3_h = highlight on x=2 y=3
+                        -->
+               
+                       <widget name="w1_1"  position="50,51" size="200,150"    font="Regular;22" halign="center" valign="center" zPosition="-1" />
+                       <widget name="w1_1_h"  position="48,49" size="204,154"          font="Regular;22" halign="center" valign="center" zPosition="-2" backgroundColor="red" />
+                       <widget name="w1_2"  position="260,51" size="200,150"   font="Regular;22" halign="center" valign="center" zPosition="-1" />
+                       <widget name="w1_2_h"  position="258,49" size="204,154"         font="Regular;22" halign="center" valign="center" zPosition="-2" backgroundColor="red" />
+                       <widget name="w1_3"  position="470,51" size="200,150"   font="Regular;22" halign="center" valign="center" zPosition="-1" />
+                       <widget name="w1_3_h"  position="468,49" size="204,154"         font="Regular;22" halign="center" valign="center" zPosition="-2" backgroundColor="red" />
+                       <widget name="w2_1"  position="50,211" size="200,150"   font="Regular;22" halign="center" valign="center" zPosition="-1" />
+                       <widget name="w2_1_h"  position="48,209" size="204,154"         font="Regular;22" halign="center" valign="center" zPosition="-2" backgroundColor="red" />
+                       <widget name="w2_2"  position="260,211" size="200,150"  font="Regular;22" halign="center" valign="center" zPosition="-1" />
+                       <widget name="w2_2_h"  position="258,209" size="204,154"        font="Regular;22" halign="center" valign="center" zPosition="-2" backgroundColor="red" />
+                       <widget name="w2_3"  position="470,211" size="200,150"  font="Regular;22" halign="center" valign="center" zPosition="-1" />
+                       <widget name="w2_3_h"  position="468,209" size="204,154"        font="Regular;22" halign="center" valign="center" zPosition="-2" backgroundColor="red" />
+                       <widget name="w3_1"  position="50,371" size="200,150"   font="Regular;22" halign="center" valign="center" zPosition="-1" />
+                       <widget name="w3_1_h"  position="48,369" size="204,154"         font="Regular;22" halign="center" valign="center" zPosition="-2" backgroundColor="red" />
+                       <widget name="w3_2"  position="260,371" size="200,150"  font="Regular;22" halign="center" valign="center" zPosition="-1" />
+                       <widget name="w3_2_h"  position="258,369" size="204,154"        font="Regular;22" halign="center" valign="center" zPosition="-2" backgroundColor="red" />
+                       <widget name="w3_3"  position="470,371" size="200,150"  font="Regular;22" halign="center" valign="center" zPosition="-1" />
+                       <widget name="w3_3_h"  position="468,369" size="204,154"        font="Regular;22" halign="center" valign="center" zPosition="-2" backgroundColor="red" />                       
+               </screen>
+               
+               <screen name="WidgetPositionConfigScreen" position="center,center" size="530,350" title="WidgetPositionConfigScreen">
+                       <widget name="list" position="10,10" size="250,150" scrollbarMode="showOnDemand" />  
+                       <widget name="preview" position="270,10" size="250,150"                 zPosition="1" font="Regular;22" halign="center" valign="center"/>
+                       <widget name="description" position="10,170" size="250,120"     zPosition="1" font="Regular;22" halign="center" valign="center"/>
+                       <widget name="version" position="270,170" size="250,30"                 zPosition="1" font="Regular;22" halign="center" valign="center"/>
+                       <widget name="author" position="270,210" size="250,30"                  zPosition="1" font="Regular;22" halign="center" valign="center"/>
+                       <widget name="homepage" position="270,250" size="250,30"                zPosition="1" font="Regular;22" halign="center" valign="center"/>       
+                       
+                       <widget name="key_red" position="10,300" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget name="key_green" position="160,300" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                                                    
+               </screen>
+               
+               
+</skin>
\ No newline at end of file
diff --git a/widgets/src/widgets/__init__.py b/widgets/src/widgets/__init__.py
new file mode 100644 (file)
index 0000000..67247ab
--- /dev/null
@@ -0,0 +1,42 @@
+from os import listdir
+from os.path import isdir, isfile
+from os.path import abspath, splitext
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS
+from xml.etree.cElementTree import parse
+
+def importSingleWidget(session,widgetdir):
+    print "importing widget from",widgetdir
+    widgetname = widgetdir.split("/")[-1]
+    module_name, ext = splitext(widgetname+".widget.py") # Handles no-extension files, etc.
+    if ext == '.py' and module_name != "__init__":                
+        try:
+            #import python part
+            spam = __import__(module_name, globals(), locals(), [], -1)
+            w = spam.widget.get_widget(session)
+            w.setDir(widgetdir)
+            #import skin
+            skin = parse(widgetdir+"/"+"widget_skin.xml").getroot()
+            return widgetname,w,skin,widgetdir,module_name
+        
+        except (ImportError,IOError), e:                
+            print 'Could NOT import widget: %s' % (module_name)
+            print 'Exception Caught\n%s' %e
+    return False
+    print "#"*20
+    
+    
+
+def importWidgets(session,):
+    widgets = []
+    dir = abspath(resolveFilename(SCOPE_PLUGINS) + "Extensions/Widgets/widgets/")
+    for widgetdir in listdir(dir):
+        abs_path =  "/".join([dir,widgetdir])
+        if isdir(abs_path):
+            if isfile(abs_path+"/widget.py"):
+                w = importSingleWidget(session,abs_path)
+                if w is not None:
+                    widgets.append(w)
+            else:
+                print "found NO widget.py", abs_path+"/widget.py"
+                continue
+    return widgets
\ No newline at end of file
diff --git a/widgets/src/widgets/bigclock/__init__.py b/widgets/src/widgets/bigclock/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/widgets/src/widgets/bigclock/widget.py b/widgets/src/widgets/bigclock/widget.py
new file mode 100644 (file)
index 0000000..5e61b02
--- /dev/null
@@ -0,0 +1,12 @@
+from Plugins.Extensions.Widgets.Widget import Widget
+from Components.Label import Label
+#from Components.Clock import Clock 
+from enigma import eSize,ePoint
+
+
+class BigclockWidget(Widget):
+    def __init__(self,session):
+        Widget.__init__(self,session,name="Big Clock Widget",description="a simple big clock",version="0.1",author="3c5x9",homepage="cvs://schwerkraft")
+
+def get_widget(session):
+    return BigclockWidget(session)
diff --git a/widgets/src/widgets/bigclock/widget_skin.xml b/widgets/src/widgets/bigclock/widget_skin.xml
new file mode 100644 (file)
index 0000000..d1ccd04
--- /dev/null
@@ -0,0 +1,14 @@
+<skin>
+               <desktopwidget name="bigclock">
+                       <widget source="global.CurrentTime" render="Label" position="0,0" size="200,50" font="Regular;40" halign="center" valign="center">
+                               <convert type="ClockToText">Format:%H:%M:%S</convert>
+                       </widget>
+                       <widget source="global.CurrentTime" render="Label" position="0,50" size="200,50" font="Regular;38" halign="center" valign="center">
+                               <convert type="ClockToText">Format:%A</convert>
+                       </widget>
+                       <widget source="global.CurrentTime" render="Label" position="0,100" size="200,50" font="Regular;38" halign="center" valign="center">
+                               <convert type="ClockToText">Format:%d.%m.%Y</convert>
+                       </widget>
+               
+               </desktopwidget>
+</skin>
\ No newline at end of file
diff --git a/widgets/src/widgets/counter/__init__.py b/widgets/src/widgets/counter/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/widgets/src/widgets/counter/widget.py b/widgets/src/widgets/counter/widget.py
new file mode 100644 (file)
index 0000000..c6caae7
--- /dev/null
@@ -0,0 +1,33 @@
+from Plugins.Extensions.Widgets.Widget import Widget
+from Components.Label import Label
+from enigma import eTimer
+
+class CounterWidget(Widget):
+    def __init__(self,session):
+        Widget.__init__(self,session,name="Simple Counter Widget",description="Example of a Widget with dynamicly changing Text",version="0.1",author="3c5x9",homepage="cvs://schwerkraft")
+        self.elements["counter_title"] = Label("0")
+        self.Timer = eTimer()
+        self.Timer.callback.append(self.TimerFire)
+        self.counter = 0
+       
+    def onLoadFinished(self,instance):
+        self.instance = instance
+        print "refresh CounterWidget"
+        
+        self.getElement("counter_title").setText("###")
+        self.Timer.start(200)
+        
+    def onClose(self):
+        self.Timer.stop()
+        
+    def TimerFire(self):
+        #print "TimerFire"
+        self.counter += 1
+        try:
+            self.getElement("counter_title").setText(str(self.counter))
+            self.Timer.start(200)
+        except Exception,e:
+            pass
+        
+def get_widget(session):
+    return CounterWidget(session)
diff --git a/widgets/src/widgets/counter/widget_skin.xml b/widgets/src/widgets/counter/widget_skin.xml
new file mode 100644 (file)
index 0000000..5a49537
--- /dev/null
@@ -0,0 +1,5 @@
+<skin>
+               <desktopwidget name="testwidget">
+                       <widget name="counter_title"  position="0,0" size="200,150" font="Regular;40" halign="center" valign="center"/>
+               </desktopwidget>
+</skin>
\ No newline at end of file
diff --git a/widgets/src/widgets/frontendstatus/__init__.py b/widgets/src/widgets/frontendstatus/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/widgets/src/widgets/frontendstatus/widget.py b/widgets/src/widgets/frontendstatus/widget.py
new file mode 100644 (file)
index 0000000..8192631
--- /dev/null
@@ -0,0 +1,13 @@
+from Plugins.Extensions.Widgets.Widget import Widget
+from Components.Label import Label
+
+
+class FrontendstatusWidget(Widget):
+    def __init__(self,session):
+        Widget.__init__(self,session,name="FrontendStatus",description="shows the Frontend Status of the tuned service",version="0.1",author="3c5x9",homepage="cvs://schwerkraft")
+        self.elements["frontendstatuswidget_SNR"] = Label(_("SNR")+":")
+        self.elements["frontendstatuswidget_AGC"] = Label(_("AGC")+":")
+        self.elements["frontendstatuswidget_BER"] = Label(_("BER")+":")
+
+def get_widget(session):
+    return FrontendstatusWidget(session)
diff --git a/widgets/src/widgets/frontendstatus/widget_skin.xml b/widgets/src/widgets/frontendstatus/widget_skin.xml
new file mode 100644 (file)
index 0000000..0723460
--- /dev/null
@@ -0,0 +1,32 @@
+<skin>
+               <desktopwidget name="tunerstatus">
+                       <widget source="session.FrontendStatus" render="Label" position="0,0" zPosition="2" size="200,50" font="Regular;19" halign="center" valign="center" >
+                               <convert type="FrontendInfo">SNRdB</convert>
+                       </widget>
+               
+                       <widget name="frontendstatuswidget_SNR"  position="0,50" size="50,25" font="Regular;18" halign="center" valign="center"  />
+                       <widget source="session.FrontendStatus" render="Progress" position="50,50" size="100,25" pixmap="skin_default/bar_snr.png" borderWidth="1" borderColor="#000000">
+                               <convert type="FrontendInfo">SNR</convert>
+                       </widget>
+                       <widget source="session.FrontendStatus" render="Label" position="150,50" size="50,25" font="Regular;21">
+                               <convert type="FrontendInfo">SNR</convert>
+                       </widget>
+                       
+                       <widget name="frontendstatuswidget_AGC"  position="0,75" size="50,25" font="Regular;18" halign="center" valign="center"  />
+                       <widget source="session.FrontendStatus" render="Progress" position="50,75" size="100,25" pixmap="skin_default/bar_snr.png" borderWidth="1" borderColor="#000000">
+                               <convert type="FrontendInfo">AGC</convert>
+                       </widget>
+                       <widget source="session.FrontendStatus" render="Label" position="150,75" size="50,25" font="Regular;21">
+                               <convert type="FrontendInfo">AGC</convert>
+                       </widget>
+                       
+                       <widget name="frontendstatuswidget_BER"  position="0,100" size="50,25" font="Regular;18" halign="center" valign="center" />
+                       <widget source="session.FrontendStatus" render="Progress" position="50,100" size="100,25" pixmap="skin_default/bar_snr.png" borderWidth="1" borderColor="#000000">
+                               <convert type="FrontendInfo">BER</convert>
+                       </widget>
+                       <widget source="session.FrontendStatus" render="Label" position="150,100" size="50,25" font="Regular;21">
+                               <convert type="FrontendInfo">BER</convert>
+                       </widget>
+                       
+               </desktopwidget>
+</skin>
\ No newline at end of file
diff --git a/widgets/src/widgets/imageswitch/WebPixmap.py b/widgets/src/widgets/imageswitch/WebPixmap.py
new file mode 100644 (file)
index 0000000..d0ffb2a
--- /dev/null
@@ -0,0 +1,79 @@
+from enigma import ePicLoad, ePixmap, getDesktop
+from Components.Pixmap import Pixmap
+from twisted.web.client import downloadPage
+from urllib import quote_plus
+from os import remove as os_remove, mkdir as os_mkdir
+from os.path import isdir as os_path_isdir, isfile as os_isfile
+
+from Components.AVSwitch import AVSwitch
+from Components.config import config
+
+def getAspect():
+       val = AVSwitch().getAspectRatioSetting()
+       if val == 0 or val == 1:
+               r = (5*576, 4*720)
+       elif val == 2 or val == 3 or val == 6:
+               r = (16*720, 9*1280)
+       elif val == 4 or val == 5:
+               r = (16*576, 10*720)
+       return r
+
+class WebPixmap(Pixmap):
+       def __init__(self, default = None):
+               Pixmap.__init__(self)
+               self.picload = ePicLoad()
+               self.picload.PictureData.get().append(self.setPixmapCB)
+               self.cachedir = "/tmp/"
+               self.default = default
+
+       def onShow(self):
+               Pixmap.onShow(self)
+               sc = getAspect()
+               resize = 1
+               background = '#ff000000'
+               self.picload.setPara((self.instance.size().width(), self.instance.size().height(), sc[0], sc[1], False, resize, background))
+
+       def load(self, url = None):
+               tmpfile = ''.join((self.cachedir, quote_plus(url), '.jpg'))
+               if os_path_isdir(self.cachedir) is False:
+                       print "cachedir not existing, creating it"
+                       os_mkdir(self.cachedir)
+               if os_isfile(tmpfile):
+                       self.tmpfile = tmpfile
+                       self.onLoadFinished(None)
+               elif url is not None:
+                       self.tmpfile = tmpfile
+                       head = {
+                               "Accept":"image/png,image/*;q=0.8,*/*;q=0.5",
+                               "Accept-Language":"de",
+                               "Accept-Encoding":"gzip,deflate",
+                               "Accept-Charset":"ISO-8859-1,utf-8;q=0.7,*;q=0.7",
+                               "Keep-Alive":"300",
+                               "Referer":"http://maps.google.de/",
+                               "Cookie:": "khcookie=fzwq1BaIQeBvxLjHsDGOezbBcCBU1T_t0oZKpA; PREF=ID=a9eb9d6fbca69f5f:TM=1219251671:LM=1219251671:S=daYFLkncM3cSOKsF; NID=15=ADVC1mqIWQWyJ0Wz655SirSOMG6pXP2ocdXwdfBZX56SgYaDXNNySnaOav-6_lE8G37iWaD7aBFza-gsX-kujQeH_8WTelqP9PpaEg0A_vZ9G7r50tzRBAZ-8GUwnEfl",
+                               "Connection":"keep-alive"
+                       }
+                       agt = "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.2) Gecko/2008091620 Firefox/3.0.2"
+                       downloadPage(url,self.tmpfile,headers=head,agent=agt).addCallback(self.onLoadFinished).addErrback(self.onLoadFailed)
+               elif self.default:
+                       self.picload.startDecode(self.default)
+
+       def onLoadFinished(self,result):
+               self.picload.startDecode(self.tmpfile)
+
+       def onLoadFailed(self,error):
+               print "WebPixmap:onLoadFAILED", error
+               if self.default and self.instance:
+                       print "showing 404", self.default
+                       self.picload.startDecode(self.default)
+               if os_isfile(self.tmpfile):
+                       os_remove(self.tmpfile)
+
+       def setPixmapCB(self, picInfo = None):
+               if os_isfile(self.tmpfile):
+                       if config.plugins.GoogleMaps.cache_enabled.value is not True:
+                               os_remove(self.tmpfile)
+               ptr = self.picload.getData()
+               if ptr and self.instance:
+                       self.instance.setPixmap(ptr.__deref__())
+
diff --git a/widgets/src/widgets/imageswitch/__init__.py b/widgets/src/widgets/imageswitch/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/widgets/src/widgets/imageswitch/widget.py b/widgets/src/widgets/imageswitch/widget.py
new file mode 100644 (file)
index 0000000..17d2a38
--- /dev/null
@@ -0,0 +1,97 @@
+from Plugins.Extensions.Widgets.Widget import Widget
+from enigma import ePicLoad, ePixmap, getDesktop, eTimer
+from Components.Pixmap import Pixmap
+from twisted.web.client import downloadPage
+from urllib import quote_plus
+from os import remove as os_remove, mkdir as os_mkdir
+from os.path import isdir as os_path_isdir, isfile as os_isfile
+
+from Components.AVSwitch import AVSwitch
+def getAspect():
+    val = AVSwitch().getAspectRatioSetting()
+    if val == 0 or val == 1:
+        r = (5*576, 4*720)
+    elif val == 2 or val == 3 or val == 6:
+        r = (16*720, 9*1280)
+    elif val == 4 or val == 5:
+        r = (16*576, 10*720)
+    return r
+
+class WebPixmap(Pixmap):
+    def __init__(self, default = None):
+        Pixmap.__init__(self)
+        self.picload = ePicLoad()
+        self.picload.PictureData.get().append(self.setPixmapCB)
+        self.cachedir = "/tmp/"
+        self.default = default
+
+    def onShow(self):
+        Pixmap.onShow(self)
+        sc = getAspect()
+        resize = 1
+        background = '#ff000000'
+        self.picload.setPara((self.instance.size().width(), self.instance.size().height(), sc[0], sc[1], False, resize, background))
+
+    def load(self, url = None):
+        tmpfile = ''.join((self.cachedir, quote_plus(url), ''))
+        if os_path_isdir(self.cachedir) is False:
+            print "cachedir not existing, creating it"
+            os_mkdir(self.cachedir)
+        if os_isfile(tmpfile):
+            self.tmpfile = tmpfile
+            self.onLoadFinished(None)
+        elif url is not None:
+            self.tmpfile = tmpfile
+            head = { }
+            agt = "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.2) Gecko/2008091620 Firefox/3.0.2"
+            downloadPage(url,self.tmpfile,headers=head,agent=agt).addCallback(self.onLoadFinished).addErrback(self.onLoadFailed)
+        elif self.default:
+            self.picload.startDecode(self.default)
+
+    def onLoadFinished(self,result):
+        self.picload.startDecode(self.tmpfile)
+
+    def onLoadFailed(self,error):
+        print "WebPixmap:onLoadFAILED", error
+        if self.default and self.instance:
+            print "showing 404", self.default
+            self.picload.startDecode(self.default)
+        if os_isfile(self.tmpfile):
+            os_remove(self.tmpfile)
+
+    def setPixmapCB(self, picInfo = None):
+        if os_isfile(self.tmpfile):
+            os_remove(self.tmpfile)
+        ptr = self.picload.getData()
+        if ptr and self.instance:
+            self.instance.setPixmap(ptr.__deref__())
+        
+
+class ImageswitchWidget(Widget):
+    def __init__(self,session):
+        Widget.__init__(self,session,name="Image Switch Widget",description="Example of a simple Widget images from the web",version="0.1",author="3c5x9",homepage="cvs://schwerkraft")
+        self.elements["imageswitch_pixmap"] = WebPixmap()
+        self.Timer = eTimer()
+        self.Timer.callback.append(self.TimerFire)
+        self.last = False
+       
+    def onLoadFinished(self,instance):
+        self.instance = instance
+        self.TimerFire()
+        
+    def onClose(self):
+        self.Timer.stop()
+        
+    def TimerFire(self):
+        if self.last:
+            self.getElement("imageswitch_pixmap").load("http://www.google.de/intl/de_de/images/logo.gif")
+            self.last = False
+        else:
+            self.getElement("imageswitch_pixmap").load("http://maps.google.de/intl/de_de/images/maps_small_horizontal_logo.png")
+            self.last = True
+            
+        self.Timer.start(5000)
+
+        
+def get_widget(session):
+    return ImageswitchWidget(session)
diff --git a/widgets/src/widgets/imageswitch/widget_skin.xml b/widgets/src/widgets/imageswitch/widget_skin.xml
new file mode 100644 (file)
index 0000000..9fd772e
--- /dev/null
@@ -0,0 +1,5 @@
+<skin>
+               <desktopwidget name="imageswitch">
+                       <widget name="imageswitch_pixmap"  position="0,0" size="200,150"  zPosition="2" alphatest="blend" />
+               </desktopwidget>
+</skin>
\ No newline at end of file
diff --git a/widgets/src/widgets/serviceinfo/__init__.py b/widgets/src/widgets/serviceinfo/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/widgets/src/widgets/serviceinfo/widget.py b/widgets/src/widgets/serviceinfo/widget.py
new file mode 100644 (file)
index 0000000..bce909b
--- /dev/null
@@ -0,0 +1,8 @@
+from Plugins.Extensions.Widgets.Widget import Widget
+
+class ServiceinfoWidget(Widget):
+    def __init__(self,session):
+        Widget.__init__(self,session,name="Service Info",description="NIM and Position data",version="0.1",author="3c5x9",homepage="cvs://schwerkraft")
+
+def get_widget(session):
+    return ServiceinfoWidget(session)
diff --git a/widgets/src/widgets/serviceinfo/widget_skin.xml b/widgets/src/widgets/serviceinfo/widget_skin.xml
new file mode 100644 (file)
index 0000000..612fa90
--- /dev/null
@@ -0,0 +1,137 @@
+<skin>
+               <desktopwidget name="serviceinfo">
+                       <eLabel text=" " font="Regular;18" position="0,0" size="200,150" halign="center" zPosition="1" />
+                       <!-- resolution -->
+                       <widget source="session.CurrentService" render="Label" font="Regular;18" position="0,0" size="55,20" halign="right" zPosition="2">
+                               <convert type="ServiceInfo">VideoWidth</convert>
+                       </widget>
+                       <eLabel text="x" font="Regular;18" position="55,0" size="15,20" halign="center" zPosition="2"/>
+                       <widget source="session.CurrentService" render="Label" font="Regular;18" position="70,0" size="55,20" halign="left" zPosition="2">
+                               <convert type="ServiceInfo">VideoHeight</convert>
+                       </widget>
+                       
+                       <!-- frontend type -->
+                       <widget source="session.FrontendInfo" render="FixedLabel" text="DVB-S" position="135,0" size="60,20" font="Regular;18" halign="center" zPosition="2">
+                               <convert type="FrontendInfo">TYPE</convert>
+                               <convert type="ValueRange">0,0</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       <widget source="session.FrontendInfo" render="FixedLabel" text="DVB-C" position="135,0" size="60,20" font="Regular;18" halign="center" zPosition="2">
+                               <convert type="FrontendInfo">TYPE</convert>
+                               <convert type="ValueRange">1,1</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       <widget source="session.FrontendInfo" render="FixedLabel" text="DVB-T" position="135,0" size="60,20" font="Regular;18" halign="center" zPosition="2">
+                               <convert type="FrontendInfo">TYPE</convert>
+                               <convert type="ValueRange">2,2</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       
+                       <!-- used nims  -->
+                       <eLabel text="A" position="0,20" zPosition="1" size="20,20" font="Regular;18" halign="center" foregroundColor="#333333" backgroundColor="black" transparent="1" />
+                       <eLabel text="B" position="20,20" zPosition="1" size="20,20" font="Regular;18" halign="center" foregroundColor="#333333" backgroundColor="black" transparent="1" />
+                       <eLabel text="C" position="40,20" zPosition="1" size="20,20" font="Regular;18" halign="center" foregroundColor="#333333" backgroundColor="black" transparent="1" />
+                       <eLabel text="D" position="60,20" zPosition="1" size="20,20" font="Regular;18" halign="center" foregroundColor="#333333" backgroundColor="black" transparent="1" />
+                       
+                       <widget source="session.TunerInfo" render="FixedLabel" text="A" position="0,20" zPosition="2" size="20,20" font="Regular;18" halign="center" foregroundColor="yellow" backgroundColor="black" transparent="1">
+                               <convert type="TunerInfo">TunerUseMask</convert>
+                               <convert type="ValueBitTest">1</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       <widget source="session.TunerInfo" render="FixedLabel" text="B" position="20,20" zPosition="2" size="20,20" font="Regular;18" halign="center" foregroundColor="yellow" backgroundColor="black" transparent="1">
+                               <convert type="TunerInfo">TunerUseMask</convert>
+                               <convert type="ValueBitTest">2</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       <widget source="session.TunerInfo" render="FixedLabel" text="C" position="40,20" zPosition="2" size="20,20" font="Regular;18" halign="center" foregroundColor="yellow" backgroundColor="black" transparent="1">
+                               <convert type="TunerInfo">TunerUseMask</convert>
+                               <convert type="ValueBitTest">4</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       <widget source="session.TunerInfo" render="FixedLabel" text="D" position="60,20" zPosition="2" size="20,20" font="Regular;18" halign="center" foregroundColor="yellow" backgroundColor="black" transparent="1">
+                               <convert type="TunerInfo">TunerUseMask</convert>
+                               <convert type="ValueBitTest">8</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       <widget source="session.FrontendInfo" render="FixedLabel" text="A" position="0,20" zPosition="3" size="20,20" font="Regular;18" halign="center" foregroundColor="green" backgroundColor="black" transparent="1">
+                               <convert type="FrontendInfo">NUMBER</convert>
+                               <convert type="ValueRange">0,0</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       <widget source="session.FrontendInfo" render="FixedLabel" text="B" position="20,20" zPosition="3" size="20,20" font="Regular;18" halign="center" foregroundColor="green" backgroundColor="black" transparent="1">
+                               <convert type="FrontendInfo">NUMBER</convert>
+                               <convert type="ValueRange">1,1</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       <widget source="session.FrontendInfo" render="FixedLabel" text="C" position="40,20" zPosition="3" size="20,20" font="Regular;18" halign="center" foregroundColor="green" backgroundColor="black" transparent="1">
+                               <convert type="FrontendInfo">NUMBER</convert>
+                               <convert type="ValueRange">2,2</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       <widget source="session.FrontendInfo" render="FixedLabel" text="D" position="60,20" zPosition="3" size="20,20" font="Regular;18" halign="center" foregroundColor="green" backgroundColor="black" transparent="1">
+                               <convert type="FrontendInfo">NUMBER</convert>
+                               <convert type="ValueRange">3,3</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                                       
+                       <!--  -->
+                       <widget source="session.CurrentService"  render="Pixmap" pixmap="skin_default/icons/icon_format.png"  position="70,20" size="30,20" zPosition="2">
+                               <convert type="ServiceInfo">SubservicesAvailable</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>                       
+                       <widget source="session.CurrentService"  render="Pixmap" pixmap="skin_default/icons/icon_format.png"  position="100,20" size="30,20" zPosition="2">
+                               <convert type="ServiceInfo">IsWidescreen</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>                       
+                       <widget source="session.CurrentService"  render="Pixmap" pixmap="skin_default/icons/icon_txt.png"  position="130,20" size="30,20" zPosition="2">
+                               <convert type="ServiceInfo">HasTelext</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>                       
+                       <widget source="session.CurrentService"  render="Pixmap" pixmap="skin_default/icons/icon_crypt.png"  position="160,20" size="20,20" zPosition="2">
+                               <convert type="ServiceInfo">IsMultichannel</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>                       
+                       <widget source="session.CurrentService"  render="Pixmap" pixmap="skin_default/icons/icon_crypt.png"  position="180,20" size="20,20" zPosition="2">
+                               <convert type="ServiceInfo">IsCrypted</convert>
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       
+                       <!-- PIDs -->
+                       <eLabel text="APid:" font="Regular;18" position="0,50" size="65,20" halign="right" zPosition="2"/>
+                       <widget source="session.CurrentService" render="Label" position="65,50" size="40,20" font="Regular;18" halign="left" zPosition="2">
+                               <convert type="ServiceInfo">AudioPid</convert>                          
+                       </widget>
+                       
+                       <eLabel text="VPid:" font="Regular;18" position="0,70" size="65,20" halign="right" zPosition="2"/>
+                       <widget source="session.CurrentService" render="Label" position="65,70" size="40,20" font="Regular;18" halign="left" zPosition="2">
+                               <convert type="ServiceInfo">VideoPid</convert>                          
+                       </widget>
+                       <eLabel text="PcrPid:" font="Regular;18" position="0,90" size="65,20" halign="right" zPosition="2"/>
+                       <widget source="session.CurrentService" render="Label" position="65,90" size="40,20" font="Regular;18" halign="left" zPosition="2">
+                               <convert type="ServiceInfo">PcrPid</convert>                            
+                       </widget>
+                       <eLabel text="PmtPid:" font="Regular;18" position="0,110" size="65,20" halign="right" zPosition="2"/>
+                       <widget source="session.CurrentService" render="Label" position="65,110" size="40,20" font="Regular;18" halign="left" zPosition="2">
+                               <convert type="ServiceInfo">PmtPid</convert>                            
+                       </widget>
+                       <eLabel text="TxtPid:" font="Regular;18" position="0,130" size="65,20" halign="right" zPosition="2"/>
+                       <widget source="session.CurrentService" render="Label" position="65,130" size="40,20" font="Regular;18" halign="left" zPosition="2">
+                               <convert type="ServiceInfo">TxtPid</convert>                            
+                       </widget>
+                       
+                       <eLabel text="TsId:" font="Regular;18" position="105,50" size="55,20" halign="right" zPosition="2"/>
+                       <widget source="session.CurrentService" render="Label" position="160,50" size="40,20" font="Regular;18" halign="left" zPosition="2">
+                               <convert type="ServiceInfo">TxtPid</convert>                            
+                       </widget>
+                       <eLabel text="OnId:" font="Regular;18" position="105,70" size="55,20" halign="right" zPosition="2"/>
+                       <widget source="session.CurrentService" render="Label" position="160,70" size="40,20" font="Regular;18" halign="left" zPosition="2">
+                               <convert type="ServiceInfo">OnId</convert>                              
+                       </widget>
+                       <eLabel text="Sid:" font="Regular;18" position="105,90" size="55,20" halign="right" zPosition="2"/>
+                       <widget source="session.CurrentService" render="Label" position="160,90" size="40,20" font="Regular;18" halign="left" zPosition="2">
+                               <convert type="ServiceInfo">Sid</convert>                               
+                       </widget>
+                       
+                                               
+               </desktopwidget>
+</skin>
\ No newline at end of file
diff --git a/widgets/src/widgets/testwidget/__init__.py b/widgets/src/widgets/testwidget/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/widgets/src/widgets/testwidget/widget.py b/widgets/src/widgets/testwidget/widget.py
new file mode 100644 (file)
index 0000000..563613d
--- /dev/null
@@ -0,0 +1,15 @@
+from Plugins.Extensions.Widgets.Widget import Widget
+from Components.Label import Label
+
+
+class TestWidget(Widget):
+    def __init__(self,session):
+        Widget.__init__(self,session,name="Static Text Widget",description="Example of a simple Widget with static text",version="0.1",author="3c5x9",homepage="cvs://schwerkraft")
+        self.elements["testwidget_title"] = Label("ich bin ein test widget")
+        self.elements["testwidget_blablub"] = Label("bla bla blub")
+       
+    def onLoadFinished(self,instance):
+        print "refresh TestWidget"
+        
+def get_widget(session):
+    return TestWidget(session)
diff --git a/widgets/src/widgets/testwidget/widget_skin.xml b/widgets/src/widgets/testwidget/widget_skin.xml
new file mode 100644 (file)
index 0000000..d0c9471
--- /dev/null
@@ -0,0 +1,6 @@
+<skin>
+               <desktopwidget name="testwidget">
+                       <widget name="testwidget_title"  position="0,0" size="200,100" font="Regular;22" halign="center" valign="center" />
+                       <widget name="testwidget_blablub"  position="0,100" size="200,50" font="Regular;35" halign="center" valign="center" />
+               </desktopwidget>
+</skin>
\ No newline at end of file