Files
macropad/nmlkpy/keymap_delta.py

116 lines
3.6 KiB
Python
Executable File

class KeyIdentifier:
_layer_index: int
_key_index: int
def __init__(self, layer_index: int, key_index: int) -> None:
assert layer_index is not None
assert key_index is not None
self._layer_index = layer_index
self._key_index = key_index
class LayerChange:
_issued_by: KeyIdentifier
_to_layer: int
_is_toggle: bool
def __init__(self, to_layer: int, is_toggle: bool = False) -> None:
assert to_layer is not None
self._issued_by = None
self._to_layer = to_layer
self._is_toggle = is_toggle
def get_layer(self) -> int:
return self._to_layer
def is_toggle_layer_change(self) -> bool:
return self._is_toggle
class LayerDelta:
_layers_to_apply: list[LayerChange]
_layers_to_remove: list[LayerChange]
def __init__(self) -> None:
self._layers_to_remove = []
self._layers_to_apply = []
def contains_layer_change(self) -> bool:
return len(self._layers_to_apply) + len(self._layers_to_remove) > 0
def contains_layers_to_apply(self) -> bool:
return len(self.get_layers_to_apply()) > 0
def contains_layers_to_remove(self) -> bool:
return len(self.get_layers_to_remove()) > 0
def get_hold_layers_to_apply(self) -> list[LayerChange]:
return filter(lambda delta: not delta.is_toggle_layer_change(), self._layers_to_apply)
def get_hold_layers_to_remove(self) -> list[LayerChange]:
return filter(lambda delta: not delta.is_toggle_layer_change(), self._layers_to_remove)
def get_toggle_layers_to_apply(self) -> list[LayerChange]:
return filter(lambda delta: delta.is_toggle_layer_change(), self._layers_to_apply)
def get_toggle_layers_to_remove(self) -> list[LayerChange]:
return filter(lambda delta: delta.is_toggle_layer_change(), self._layers_to_remove)
def get_layers_to_apply(self) -> list[LayerChange]:
return self._layers_to_apply
def get_layers_to_remove(self) -> list[LayerChange]:
return self._layers_to_remove
def apply_layer(self, layer_change: LayerChange) -> None:
assert layer_change is not None
self._layers_to_apply.append(layer_change)
def remove_layer(self, layer_change: LayerChange) -> None:
assert layer_change is not None
self._layers_to_remove.append(layer_change)
def merge_deltas(self, other_delta) -> None:
for layer in other_delta.get_layers_to_apply():
self.apply_layer(layer)
for layer in other_delta.get_layers_to_remove():
self.remove_layer(layer)
class KeymapDelta:
_keycodes_to_press: set[int]
_keycodes_to_unpress: set[int]
def __init__(self) -> None:
self._keycodes_to_press = set()
self._keycodes_to_unpress = set()
def get_to_press(self) -> set[int]:
return self._keycodes_to_press
def get_to_unpress(self) -> set[int]:
return self._keycodes_to_unpress
def contains_keycode_changes(self) -> bool:
return len(self._keycodes_to_unpress) + len(self._keycodes_to_press) > 0
def press(self, keycode: int) -> None:
self._keycodes_to_press.add(keycode)
try:
self._keycodes_to_unpress.remove(keycode)
except KeyError:
pass
def unpress(self, keycode: int) -> None:
self._keycodes_to_unpress.add(keycode)
try:
self._keycodes_to_press.remove(keycode)
except KeyError:
pass
def merge_deltas(self, other_delta) -> None:
for keycode in other_delta.get_to_press():
self.press(keycode)
for keycode in other_delta.get_to_unpress():
self.unpress(keycode)