Audio/AudioControl: Lots of fixes
[audiocontrol.git] / Actions.py
1 import Bindings, Node
2
3 class Action(Node.Node):
4
5     def __init__(self, name):
6         Node.Node.__init__(self)
7         self.name = name
8
9     def __call__(self, binding):
10         raise NotImplementedError()
11
12     def bindings(self):
13         return [ binding
14                  for binding in self.owners
15                  if isinstance(binding, Bindings.Binding) ]
16
17
18 class _ActionRegistry(object):
19
20     def __init__(self):
21         self._registry = {}
22
23     def register(self, action):
24         self._registry[action.name] = action
25
26     def __getitem__(self, key):
27         return self._registry[key]
28
29 Actions = _ActionRegistry()
30
31
32 class Nop(Action):
33
34     def __init__(self, name='nop'):
35         Action.__init__(self, name)
36
37     def __call__(self, binding):
38         pass
39     
40
41 class Macro(Action):
42
43     _actions = Node.NodeList()
44
45     def __init__(self, name, actions):
46         Action.__init__(self, name)
47         for i in range(len(actions)):
48             if type(actions[i]) is str:
49                 actions[i] = Actions[actions[i]]
50         self._actions = actions
51
52     def __call__(self, binding):
53         for action in self._actions:
54             action(binding)
55             
56 class Command(Action):
57
58     def __init__(self, name, callable):
59         Action.__init__(self, name)
60         self._callable = callable
61
62     def __call__(self, binding):
63         self._callable(binding)
64         
65
66 class ChangeBindingsAbsolute(Action):
67
68     def __init__(self, name, mapIndex, keymaps):
69         Action.__init__(self, name)
70         self._mapIndex = mapIndex
71         self._keymaps = keymaps
72
73     def __call__(self, binding):
74         binding.keymap().keylist().replaceFromIndex(self._mapIndex, self._keymaps)
75
76
77 class ChangeBindingsRelative(Action):
78
79     def __init__(self, name, mapIndex, keymaps):
80         Action.__init__(self, name)
81         self._mapIndex = mapIndex
82         self._keymaps = keymaps
83
84     def __call__(self, binding):
85         keymap = binding.keymap()
86         keymap.keylist().replaceFromIndex(keymap.index()+self._mapIndex, self._keymaps)
87
88 def action(func):
89     action = Command(func.__name__, func)
90     Actions.register(action)
91     return func