fix memleak
[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         def destroy(self):
54                 pass
55
56 class NumberActionMap(ActionMap):
57         def action(self, contexts, action):
58                 numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
59                 if (action in numbers and self.actions.has_key(action)):
60                         self.actions[action](int(action))
61                         return 1
62                 else:
63                         return ActionMap.action(self, contexts, action)
64
65 class HelpableActionMap(ActionMap):
66         """An Actionmap which automatically puts the actions into the helpList.
67
68         Note that you can only use ONE context here!"""
69         
70         # sorry for this complicated code.
71         # it's not more than converting a "documented" actionmap 
72         # (where the values are possibly (function, help)-tuples)
73         # into a "classic" actionmap, where values are just functions.
74         # the classic actionmap is then passed to the ActionMap constructor,
75         # the collected helpstrings (with correct context, action) is
76         # added to the screen's "helpList", which will be picked up by
77         # the "HelpableScreen".
78         def __init__(self, parent, context, actions = { }, prio=0):
79                 alist = [ ]
80                 adict = { }
81                 for (action, funchelp) in actions.iteritems():
82                         # check if this is a tuple
83                         if type(funchelp) is type(()):
84                                 alist.append((action, funchelp[1]))
85                                 adict[action] = funchelp[0]
86                         else:
87                                 adict[action] = funchelp
88
89                 ActionMap.__init__(self, [context], adict, prio)
90
91                 parent.helpList.append((self, context, alist))