remove annoying debug message
[vuplus_dvbapp] / lib / python / Components / config.py
1 class configFile:
2         def __init__(self):
3                 self.changed = 0
4                 self.configElements = { }
5                 try:
6                         self.file = open("config")
7                 except IOError:
8                         print "cannot open config file"
9                         return 
10                 
11                 while 1:
12                         line = self.file.readline()
13                         if line == "":
14                                 break
15                         
16                         if line.startswith("#"):                #skip comments
17                                 continue        
18                                 
19                         self.addElement(line)
20                 self.file.close()
21
22         def addElement(self, line):
23                 x = line.find("=")
24                 if x > -1:
25                         self.configElements[line[:x]] = line[x + 1:]
26         
27         def getKey(self, key):
28                 return self.configElements[key]
29
30         def setKey(self, key, value):
31                 self.changed = 1
32                 self.configElements[key] = value
33
34         def save(self):
35                 if self.changed == 0:           #no changes, so no write to disk needed
36                         return
37                         
38                 fileHandle = open("config", "w")
39                 
40                 keys = self.configElements.keys()
41                 keys.sort()
42                 for x in keys:
43                         wstr = x + "=" + self.configElements[x]
44                         
45                         if wstr[len(wstr) - 1] != '\n':
46                                 wstr = wstr + "\n"
47
48                         fileHandle.write(wstr)
49
50                 fileHandle.close()              
51
52 class configSelection:
53         def __init__(self, parent):
54                 self.parent = parent
55                 
56         def checkValues(self):
57                 if self.parent.value < 0:
58                         self.parent.value = 0   
59
60                 if(self.parent.value >= (len(self.parent.vals) - 1)):
61                         self.parent.value = len(self.parent.vals) - 1
62
63         def cancel(self):
64                 self.parent.reload()
65
66         def save(self):
67                 self.parent.save()
68
69         def handleKey(self, key):
70                 if key == config.key["prevElement"]:
71                         self.parent.value = self.parent.value - 1
72                 if key == config.key["nextElement"]:
73                         self.parent.value = self.parent.value + 1
74                 
75                 self.checkValues()                      
76
77                 self.parent.change()    
78
79         def __call__(self, selected):                   #needed by configlist
80                 self.checkValues()
81                 return ("text", self.parent.vals[self.parent.value])
82
83 class configSatlist:
84         def __init__(self, parent):
85                 self.parent = parent
86
87         def checkValues(self):
88                 if self.parent.value < 0:
89                         self.parent.value = 0   
90
91                 if(self.parent.value >= (len(self.parent.vals) - 1)):
92                         self.parent.value = len(self.parent.vals) - 1
93                         
94         def cancel(self):
95                 self.parent.reload()
96
97         def save(self):
98                 self.parent.save()
99
100         def handleKey(self, key):
101                 if key == config.key["prevElement"]:
102                         self.parent.value = self.parent.value - 1
103                 if key == config.key["nextElement"]:
104                         self.parent.value = self.parent.value + 1
105                 
106                 self.checkValues()                      
107
108                 self.parent.change()    
109
110         def __call__(self, selected):                   #needed by configlist
111                 self.checkValues()
112                 #fixme
113                 return ("text", str(self.parent.vals[self.parent.value][0]))
114
115 class configSequenceArg:
116         def get(self, type, args = ()):
117                 # configsequencearg.get ("IP")
118                 if (type == "IP"):
119                         return (("."), [(1,255),(0,255),(0,255),(0,255)])
120                 # configsequencearg.get ("MAC")
121                 if (type == "MAC"):
122                         return ((":"), [(1,255),(1,255),(1,255),(1,255),(1,255),(1,255)])
123                 # configsequencearg.get("INTEGER", (min, max)) => x with min <= x <= max
124                 if (type == "INTEGER"):
125                         return ((":"), [args])
126                 # configsequencearg.get("FLOAT", [(min,max),(min1,max1)]) => x.y with min <= x <= max and min1 <= y <= max1
127                 if (type == "FLOAT"):
128                         return (("."), args)
129
130 configsequencearg = configSequenceArg()
131                 
132 class configSequence:
133         def __init__(self, parent):
134                 self.parent = parent
135                 self.markedPos = 0
136                 self.seperator = self.parent.vals[0]
137                 self.valueBounds = self.parent.vals[1]
138
139         def checkValues(self):
140                 maxPos = 0
141                 num = 0
142                 for i in self.parent.value:
143                         maxPos += len(str(self.valueBounds[num][1]))
144                         while (self.valueBounds[num][0] > self.parent.value[num]):
145                                 self.parent.value[num] += 1
146
147                         while (self.valueBounds[num][1] < self.parent.value[num]):
148                                 self.parent.value[num] -= 1
149                                 
150 #                       if (self.valueBounds[num][0] <= i <= self.valueBounds[num][1]):
151                                 #pass
152                         #else:
153                                 #self.parent.value[num] = self.valueBounds[num][0]
154                         num += 1
155                 
156                 if self.markedPos >= maxPos:
157                         self.markedPos = maxPos - 1
158                 if self.markedPos < 0:
159                         self.markedPos = 0
160                         
161         def cancel(self):
162                 self.parent.reload()
163
164         def save(self):
165                 self.parent.save()
166
167         def handleKey(self, key):
168                 #this will no change anything on the value itself
169                 #so we can handle it here in gui element
170                 if key == config.key["prevElement"]:
171                         self.markedPos -= 1
172                 if key == config.key["nextElement"]:
173                         self.markedPos += 1
174                 
175                 if key >= config.key["0"] and key <= config.key["9"]:
176                         number = 9 - config.key["9"] + key
177                         # length of numberblock
178                         numberLen = len(str(self.valueBounds[0][1]))
179                         # position in the block
180                         posinblock = self.markedPos % numberLen
181                         # blocknumber
182                         blocknumber = self.markedPos / numberLen
183                         
184                         oldvalue = self.parent.value[blocknumber]
185                         olddec = oldvalue % 10 ** (numberLen - posinblock) - (oldvalue % 10 ** (numberLen - posinblock - 1))
186                         newvalue = oldvalue - olddec + (10 ** (numberLen - posinblock - 1) * number)
187                         
188                         print "You actually pressed a number (" + str(number) + ") which will be added at block number " + str(blocknumber) + " on position " + str(posinblock)
189                         print "Old value: " + str(oldvalue) + " olddec: " + str(olddec) + " newvalue: " + str(newvalue)
190                         self.parent.value[blocknumber] = newvalue
191                         self.markedPos += 1
192                 
193                 self.checkValues()                      
194                 
195                 print "markPos:",
196                 print self.markedPos
197
198                 #FIXME: dont call when press left/right
199                 self.parent.change()    
200
201         def __call__(self, selected):                   #needed by configlist
202                 value = ""
203                 mPos = self.markedPos
204                 print "Positon: " + str(mPos)
205                 num = 0;
206                 for i in self.parent.value:
207                         if len(value):  #fixme no heading separator possible
208                                 value += self.seperator
209                                 if mPos >= len(value) - 1:
210                                         mPos += 1
211                                 
212                         #diff =         self.valueBounds - len(str(i))
213                         #if diff > 0:
214                                 ## if this helps?!
215                                 #value += " " * diff
216                         print (("%0" + str(len(str(self.valueBounds[num][1]))) + "d") % i)
217                         value += ("%0" + str(len(str(self.valueBounds[num][1]))) + "d") % i
218                         num += 1
219                         # only mark cursor when we are selected
220                         # (this code is heavily ink optimized!)
221                 return ("mtext"[1-selected:], value, [mPos])
222
223 class configValue:
224         def __init__(self, obj):
225                 self.obj = obj
226                 
227         def __str__(self):
228                 return self.obj
229
230 class Config:
231         def __init__(self):
232                 self.key = { "choseElement": 0,
233                                          "prevElement": 1,
234                                          "nextElement": 2,
235                                          "0": 10,
236                                          "1": 11,
237                                          "2": 12,
238                                          "3": 13,
239                                          "4": 14,
240                                          "5": 15,
241                                          "6": 16,
242                                          "7": 17,
243                                          "8": 18,
244                                          "9": 19 }
245                 
246 config = Config();
247 configfile = configFile()
248
249 class ConfigSlider:
250         def __init__(self, parent):
251                 self.parent = parent
252
253         def cancel(self):
254                 self.parent.reload()
255
256         def save(self):
257                 self.parent.save()
258
259         def checkValues(self):
260                 if self.parent.value < 0:
261                         self.parent.value = 0   
262
263                 if self.parent.value > 10:
264                         self.parent.value = 10  
265
266         def handleKey(self, key):
267                 if key == config.key["prevElement"]:
268                         self.parent.value = self.parent.value - 1
269                 if key == config.key["nextElement"]:
270                         self.parent.value = self.parent.value + 1
271                                         
272                 self.checkValues()      
273                 self.parent.change()    
274
275         def __call__(self, selected):                   #needed by configlist
276                 self.checkValues()
277                 return ("slider", self.parent.value * 10)
278
279 class ConfigSubsection:
280         def __init__(self):
281                 pass
282
283 class configElement:
284
285         def getIndexbyEntry(self, data):
286                 cnt = 0;
287                 tcnt = -1; #for defaultval
288                 for x in self.vals:
289                         if int(x[1]) == int(data):
290                                         return cnt
291                         if int(x[1]) == int(self.defaultValue):
292                                         tcnt = cnt
293                         cnt += 1
294                 if tcnt != -1:
295                         return tcnt                     
296                 return 0        #prevent bigger then array
297
298         def datafromFile(self, control, data):
299                 if control == ConfigSlider:
300                         return int(data);
301                 elif control == configSelection:
302                         return int(data);
303                 elif control == configSequence:
304                         list = [ ]
305                         part = data.split(self.vals[0])
306                         for x in part:
307                                 list.append(int(x))
308                         return list
309                 elif control == configSatlist:
310                         return self.getIndexbyEntry(data)
311                 else: 
312                         return ""       
313
314         def datatoFile(self, control, data):
315                 if control == ConfigSlider:
316                         return str(data);
317                 elif control == configSelection:
318                         return str(data);
319                 elif control == configSequence:
320                         value = ((len(data) * ("%d" + self.vals[0]))[0:-1]) % tuple(data)
321 #                       just in case you don't understand the above, here an equivalent:
322 #                       value = ""
323 #                       for i in data:
324 #                               if value !="":
325 #                                       value += self.vals[0]
326 #                               value += str(i)
327                         return value
328                 elif control == configSatlist:
329                         return str(self.vals[self.value][1]);
330                 else: 
331                         return ""       
332
333         def loadData(self):
334                 try:
335                         value = self.datafromFile(self.controlType, configfile.getKey(self.configPath))
336                 except:         
337                         value = ""
338
339                 if value == "":
340                         #print "value not found - using default"
341
342                         if self.controlType == configSatlist:
343                                 self.value = self.getIndexbyEntry(self.defaultValue)
344                         else:   
345                                 self.value = self.defaultValue
346
347                         self.save()             #add missing value to dict
348                 else:
349                         self.value = value
350                         
351                 #is this right? activate settings after load/cancel and use default     
352                 self.change()
353
354         def __init__(self, configPath, control, defaultValue, vals):
355                 self.configPath = configPath
356                 self.defaultValue = defaultValue
357                 self.controlType = control
358                 self.vals = vals
359                 self.notifierList = [ ]
360                 self.enabled = True
361                 self.loadData()         
362         def addNotifier(self, notifier):
363                 self.notifierList.append(notifier);
364                 notifier(self);
365         def change(self):
366                 for notifier in self.notifierList:
367                         notifier(self)
368         def reload(self):
369                 self.loadData()
370         def save(self):
371                 configfile.setKey(self.configPath, self.datatoFile(self.controlType,self.value))
372
373 class configElement_nonSave(configElement):
374         def __init__(self, configPath, control, defaultValue, vals):
375                 configElement.__init__(self, configPath, control, defaultValue, vals)
376
377         def save(self):
378                 pass
379                 
380 def getConfigListEntry(description, element):
381         b = element
382         item = b.controlType(b)
383         return ((description, item))