honor horizontal alignment also when a mark is present
[enigma2.git] / lib / python / Screens / Setup.py
1 from Screen import Screen
2 from Components.ActionMap import NumberActionMap
3 from Components.config import config                            #global config instance
4 from Components.config import configSelection
5 from Components.ConfigList import ConfigList
6 from Components.Label import Label
7 from Components.Pixmap import Pixmap
8
9 import xml.dom.minidom
10 from xml.dom import EMPTY_NAMESPACE
11 from skin import elementsWithTag
12
13 from Tools import XMLTools
14
15 # FIXME: use resolveFile!
16 # read the setupmenu
17 try:
18         # first we search in the current path
19         setupfile = file('data/setup.xml', 'r')
20 except:
21         # if not found in the current path, we use the global datadir-path
22         setupfile = file('/usr/share/enigma2/setup.xml', 'r')
23 setupdom = xml.dom.minidom.parseString(setupfile.read())
24 setupfile.close()
25
26 class SetupSummary(Screen):
27         skin = """
28         <screen position="0,0" size="132,64">
29                 <widget name="SetupTitle" position="0,0" size="132,16" font="Regular;12" />
30                 <widget name="SetupEntry" position="0,16" size="132,32" font="Regular;12" />
31                 <widget name="SetupValue" position="0,48" size="132,16" font="Regular;12" />
32         </screen>"""
33
34         def __init__(self, session, parent):
35                 Screen.__init__(self, session)
36                 self["SetupTitle"] = Label(_(parent.setup_title))
37                 self["SetupEntry"] = Label("")
38                 self["SetupValue"] = Label("")
39                 self.parent = parent
40                 self.onShow.append(self.addWatcher)
41                 self.onHide.append(self.removeWatcher)
42                 
43         def addWatcher(self):
44                 self.parent.onChangedEntry.append(self.selectionChanged)
45                 self.parent["config"].onSelectionChanged.append(self.selectionChanged)
46                 self.selectionChanged()
47         
48         def removeWatcher(self):
49                 self.parent.onChangedEntry.remove(self.selectionChanged)
50                 self.parent["config"].onSelectionChanged.remove(self.selectionChanged)
51
52         def selectionChanged(self):
53                 self["SetupEntry"].text = self.parent.getCurrentEntry()
54                 self["SetupValue"].text = self.parent.getCurrentValue()
55
56 class Setup(Screen):
57
58         ALLOW_SUSPEND = True
59
60         def __init__(self, session, setup):
61                 Screen.__init__(self, session)
62
63                 xmldata = setupdom.childNodes[0]
64                 
65                 entries = xmldata.childNodes
66
67                 self.onChangedEntry = [ ]
68                 list = []
69                                 
70                 for x in entries:             #walk through the actual nodelist
71                         if x.nodeType != xml.dom.minidom.Element.nodeType:
72                                 continue
73                         elif x.tagName == 'setup':
74                                 if x.getAttribute("key") != setup:
75                                         continue
76                                 self.addItems(list, x.childNodes);
77                                 myTitle = x.getAttribute("title").encode("UTF-8")
78
79                 #check for list.entries > 0 else self.close
80                 
81                 self["config"] = ConfigList(list)
82
83                 self.setup_title = myTitle
84                 self["title"] = Label(_(self.setup_title))
85
86                 self["oktext"] = Label(_("OK"))
87                 self["canceltext"] = Label(_("Cancel"))
88                 self["ok"] = Pixmap()
89                 self["cancel"] = Pixmap()
90                 
91                 self["actions"] = NumberActionMap(["SetupActions"], 
92                         {
93                                 "cancel": self.keyCancel,
94                                 "ok": self.keyOk,
95                                 "left": self.keyLeft,
96                                 "right": self.keyRight,
97                                 "save": self.keySave,
98                                 "1": self.keyNumberGlobal,
99                                 "2": self.keyNumberGlobal,
100                                 "3": self.keyNumberGlobal,
101                                 "4": self.keyNumberGlobal,
102                                 "5": self.keyNumberGlobal,
103                                 "6": self.keyNumberGlobal,
104                                 "7": self.keyNumberGlobal,
105                                 "8": self.keyNumberGlobal,
106                                 "9": self.keyNumberGlobal,
107                                 "0": self.keyNumberGlobal
108                         }, -1)
109
110                 self.changedEntry()
111
112         # for summary:
113         def changedEntry(self):
114                 for x in self.onChangedEntry:
115                         x()
116
117         def getCurrentEntry(self):
118                 return self["config"].getCurrent()[0]
119
120         def getCurrentValue(self):
121                 return str(self["config"].getCurrent()[1].parent.value)
122
123         def createSummary(self):
124                 return SetupSummary
125
126         def addItems(self, list, childNode):
127                 for x in childNode:
128                         if x.nodeType != xml.dom.minidom.Element.nodeType:
129                                 continue
130                         elif x.tagName == 'item':
131                                 item_text = _(x.getAttribute("text").encode("UTF-8") or "??")
132                                 b = eval(XMLTools.mergeText(x.childNodes));
133                                 print "item " + item_text + " " + b.configPath
134                                 if b == "":
135                                         continue
136                                 #add to configlist
137                                 item = b.controlType(b)
138                                 
139                                 # the first b is the item itself, ignored by the configList.
140                                 # the second one is converted to string.
141                                 list.append( (item_text, item) )
142
143         def handleKey(self, key):
144                 # ignore keys when not enabled
145                 if self["config"].getCurrent()[1].parent.enabled:
146                         self["config"].handleKey(config.key[key])
147                         print self["config"].getCurrent()
148                         self.changedEntry()
149
150         def keyOk(self):
151                 self.handleKey("choseElement")
152
153         def keyLeft(self):
154                 self.handleKey("prevElement")
155
156         def keyRight(self):
157                 self.handleKey("nextElement")
158
159         def keySave(self):
160                 print "save requested"
161                 for x in self["config"].list:
162                         x[1].save()
163                 self.close()
164
165         def keyCancel(self):
166                 print "cancel requested"
167                 for x in self["config"].list:
168                         x[1].cancel()
169                 self.close()
170                 
171         def keyNumberGlobal(self, number):
172                 self.handleKey(str(number))
173
174 def getSetupTitle(id):
175         xmldata = setupdom.childNodes[0].childNodes
176         for x in elementsWithTag(xmldata, "setup"):
177                 if x.getAttribute("key") == id:
178                         return x.getAttribute("title").encode("UTF-8")