add perService position display with gauge
[enigma2.git] / lib / python / Components / ActionMap.py
1 from enigma import *
2
3 class ActionMap:
4         def __init__(self, contexts = [ ], actions = { }, prio=0):
5                 self.actions = actions
6                 self.contexts = contexts
7                 self.prio = prio
8                 self.p = eActionMapPtr()
9                 self.bound = False
10                 self.exec_active = False
11                 self.enabled = True
12                 eActionMap.getInstance(self.p)
13         
14         def setEnabled(self, enabled):
15                 self.enabled = enabled
16                 self.checkBind()
17
18         def doBind(self):
19                 if not self.bound:
20                         for ctx in self.contexts:
21                                 self.p.bindAction(ctx, self.prio, self.action)
22                         self.bound = True
23
24         def doUnbind(self):
25                 if self.bound:
26                         for ctx in self.contexts:
27                                 self.p.unbindAction(ctx, self.action)
28                         self.bound = False
29
30         def checkBind(self):
31                 if self.exec_active and self.enabled:
32                         self.doBind()
33                 else:
34                         self.doUnbind()
35
36         def execBegin(self):
37                 self.exec_active = True
38                 self.checkBind()
39
40         def execEnd(self):
41                 self.exec_active = False
42                 self.checkBind()
43
44         def action(self, context, action):
45                 print " ".join(("action -> ", context, action))
46                 if self.actions.has_key(action):
47                         self.actions[action]()
48                         return 1
49                 else:
50                         print "unknown action %s/%s! typo in keymap?" % (context, action)
51                         return 0
52
53 class NumberActionMap(ActionMap):
54         def action(self, contexts, action):
55                 numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
56                 if (action in numbers and self.actions.has_key(action)):
57                         self.actions[action](int(action))
58                         return 1
59                 else:
60                         return ActionMap.action(self, contexts, action)
61
62 class HelpableActionMap(ActionMap):
63         """An Actionmap which automatically puts the actions into the helpList.
64
65         Note that you can only use ONE context here!"""
66         
67         # sorry for this complicated code.
68         # it's not more than converting a "documented" actionmap 
69         # (where the values are possibly (function, help)-tuples)
70         # into a "classic" actionmap, where values are just functions.
71         # the classic actionmap is then passed to the ActionMap constructor,
72         # the collected helpstrings (with correct context, action) is
73         # added to the screen's "helpList", which will be picked up by
74         # the "HelpableScreen".
75         def __init__(self, parent, context, actions = { }, prio=0):
76                 alist = [ ]
77                 adict = { }
78                 for (action, funchelp) in actions.iteritems():
79                         # check if this is a tuple
80                         if type(funchelp) is type(()):
81                                 alist.append((action, funchelp[1]))
82                                 adict[action] = funchelp[0]
83                         else:
84                                 adict[action] = funchelp
85
86                 ActionMap.__init__(self, [context], adict, prio)
87
88                 parent.helpList.append((self, context, alist))