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 :)
--- /dev/null
+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.
--- /dev/null
+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
--- /dev/null
+#djhkjh
\ No newline at end of file
--- /dev/null
+<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
--- /dev/null
+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")
+ #
+############################################################################
+
+
+
--- /dev/null
+<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
--- /dev/null
+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
--- /dev/null
+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)
--- /dev/null
+<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
--- /dev/null
+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)
--- /dev/null
+<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
--- /dev/null
+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)
--- /dev/null
+<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
--- /dev/null
+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__())
+
--- /dev/null
+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)
--- /dev/null
+<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
--- /dev/null
+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)
--- /dev/null
+<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
--- /dev/null
+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)
--- /dev/null
+<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