-
Notifications
You must be signed in to change notification settings - Fork 0
/
device_options.py
102 lines (75 loc) · 3.56 KB
/
device_options.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# Embedded file name: c:\Jenkins\live\output\win_64_static\Release\midi-remote-scripts\Push2\device_options.py
from __future__ import absolute_import
from ableton.v2.base import liveobj_valid, listenable_property, listens, const, Subject, Slot, SlotManager
class DeviceTriggerOption(Subject):
__events__ = ('default_label',)
def __init__(self, name = None, default_label = None, callback = None, is_active = None):
raise callback or AssertionError
self.trigger = callback
self._name = name or 'Option'
self._default_label = default_label or self._name
self._is_active_callback = is_active or const(True)
@property
def name(self):
return self._name
@listenable_property
def active(self):
return self._is_active()
def _is_active(self):
return self._is_active_callback()
def _get_default_label(self):
return self._default_label
def _set_default_label(self, label):
self._default_label = label
self.notify_default_label()
default_label = property(_get_default_label, _set_default_label)
class DeviceSwitchOption(SlotManager, DeviceTriggerOption):
def __init__(self, second_label = None, parameter = None, *a, **k):
super(DeviceSwitchOption, self).__init__(callback=self.cycle_index, *a, **k)
self._second_label = second_label or ''
self.set_parameter(parameter)
def set_parameter(self, parameter):
self._parameter = parameter
self.__on_value_changed.subject = parameter
self.notify_active_index()
self.notify_active()
def _is_active(self):
return super(DeviceSwitchOption, self)._is_active() and liveobj_valid(self._parameter)
@listenable_property
def active_index(self):
return int(bool(self._parameter.value)) if liveobj_valid(self._parameter) else 0
@listens('value')
def __on_value_changed(self):
self.notify_active_index()
@property
def second_label(self):
return self._second_label
def cycle_index(self):
if liveobj_valid(self._parameter):
self._parameter.value = float((self.active_index + 1.0) % 2)
class DeviceOnOffOption(SlotManager, DeviceTriggerOption):
ON_LABEL = 'ON'
OFF_LABEL = 'OFF'
def __init__(self, name = None, property_host = None, property_name = '', *a, **k):
super(DeviceOnOffOption, self).__init__(callback=self.cycle_index, name=name, *a, **k)
self._property_host = property_host
self._property_name = property_name
def notify_index_and_default_label():
self.notify_active_index()
self.notify_default_label()
self._property_slot = self.register_slot(Slot(subject=property_host, event=property_name, listener=notify_index_and_default_label))
def _property_value(self):
return getattr(self._property_host, self._property_name, False) if liveobj_valid(self._property_host) else False
def _is_active(self):
return super(DeviceOnOffOption, self)._is_active() and liveobj_valid(self._property_host)
@listenable_property
def active_index(self):
return int(not self._property_value())
def cycle_index(self):
if liveobj_valid(self._property_host):
value_type = type(self._property_value())
new_value = not bool((self.active_index + 1) % 2)
setattr(self._property_host, self._property_name, value_type(new_value))
@property
def default_label(self):
return '%s %s' % (self._default_label, self.ON_LABEL if self._property_value() else self.OFF_LABEL)