From ad34e2464b4355b279c03345fa2d214bbb9124a3 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Sun, 14 Mar 2021 17:31:25 -0400 Subject: [PATCH] Refactor keycodes moving helper functions into the class --- src/main/python/keycodes.py | 78 +++++++++++++++++----------- src/main/python/keymap_editor.py | 12 ++--- src/main/python/macro_key.py | 8 +-- src/main/python/macro_recorder.py | 6 +-- src/main/python/tabbed_keycodes.py | 6 +-- src/main/python/test/test_keycode.py | 10 ++++ src/main/python/test/test_macro.py | 8 +-- 7 files changed, 77 insertions(+), 51 deletions(-) create mode 100644 src/main/python/test/test_keycode.py diff --git a/src/main/python/keycodes.py b/src/main/python/keycodes.py index a09c822..30380c8 100644 --- a/src/main/python/keycodes.py +++ b/src/main/python/keycodes.py @@ -34,6 +34,18 @@ class Keycode: if masked: self.masked_keycodes.add(code) + @classmethod + def find_outer_keycode(cls, code): + """ + Finds outer keycode, i.e. if it is masked like 0x5Fxx, just return the 0x5F00 portion + """ + if cls.is_mask(code): + code = code & 0xFF00 + for keycode in KEYCODES: + if keycode.code == code: + return keycode + return None + @classmethod def find_by_recorder_alias(cls, alias): return cls.recorder_alias_to_keycode.get(alias) @@ -42,6 +54,41 @@ class Keycode: def find_by_qmk_id(cls, qmk_id): return cls.qmk_id_to_keycode.get(qmk_id) + @classmethod + def is_mask(cls, code): + return (code & 0xFF00) in cls.masked_keycodes + + @classmethod + def label(cls, code): + keycode = cls.find_outer_keycode(code) + if keycode is None: + return "0x{:X}".format(code) + return keycode.label + + @classmethod + def tooltip(cls, code): + keycode = cls.find_outer_keycode(code) + if keycode is None: + return None + tooltip = keycode.qmk_id + if keycode.tooltip: + tooltip = "{}: {}".format(tooltip, keycode.tooltip) + return tooltip + + @classmethod + def serialize(cls, qmk_id): + # TODO + pass + + @classmethod + def deserialize(cls, val): + if isinstance(val, int): + return val + if "(" not in val and val in cls.qmk_id_to_keycode: + return cls.qmk_id_to_keycode[val].code + # TODO: process macro-like keycodes with () etc + return 0 + K = Keycode @@ -446,37 +493,6 @@ KEYCODES = [] K = None -def find_keycode(code): - if keycode_is_mask(code): - code = code & 0xFF00 - - for keycode in KEYCODES: - if keycode.code == code: - return keycode - return None - - -def keycode_label(code): - keycode = find_keycode(code) - if keycode is None: - return "0x{:X}".format(code) - return keycode.label - - -def keycode_tooltip(code): - keycode = find_keycode(code) - if keycode is None: - return None - tooltip = keycode.qmk_id - if keycode.tooltip: - tooltip = "{}: {}".format(tooltip, keycode.tooltip) - return tooltip - - -def keycode_is_mask(code): - return (code & 0xFF00) in Keycode.masked_keycodes - - def recreate_keycodes(): """ Regenerates global KEYCODES array """ diff --git a/src/main/python/keymap_editor.py b/src/main/python/keymap_editor.py index 536b958..dbd8508 100644 --- a/src/main/python/keymap_editor.py +++ b/src/main/python/keymap_editor.py @@ -8,7 +8,7 @@ from PyQt5.QtCore import Qt from any_keycode_dialog import AnyKeycodeDialog from basic_editor import BasicEditor from keyboard_widget import KeyboardWidget, EncoderWidget -from keycodes import recreate_keyboard_keycodes, find_keycode, keycode_label, keycode_tooltip, keycode_is_mask +from keycodes import recreate_keyboard_keycodes, Keycode from keymaps import KEYMAPS from square_button import SquareButton from tabbed_keycodes import TabbedKeycodes @@ -124,14 +124,14 @@ class KeymapEditor(BasicEditor): def code_is_overriden(self, code): """ Check whether a country-specific keymap overrides a code """ - key = find_keycode(code) + key = Keycode.find_outer_keycode(code) return key is not None and key.qmk_id in self.keymap_override def get_label(self, code): """ Get label for a specific keycode """ if self.code_is_overriden(code): - return self.keymap_override[find_keycode(code).qmk_id] - return keycode_label(code) + return self.keymap_override[Keycode.find_outer_keycode(code).qmk_id] + return Keycode.label(code) def refresh_layer_display(self): """ Refresh text on key widgets to display data corresponding to current layer """ @@ -149,8 +149,8 @@ class KeymapEditor(BasicEditor): code = self.keyboard.encoder_layout[(self.current_layer, widget.desc.encoder_idx, widget.desc.encoder_dir)] text = self.get_label(code) - tooltip = keycode_tooltip(code) - mask = keycode_is_mask(code) + tooltip = Keycode.tooltip(code) + mask = Keycode.is_mask(code) mask_text = self.get_label(code & 0xFF) if mask: text = text.split("\n")[0] diff --git a/src/main/python/macro_key.py b/src/main/python/macro_key.py index 65c164e..786e3d4 100644 --- a/src/main/python/macro_key.py +++ b/src/main/python/macro_key.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-or-later -from keycodes import keycode_label +from keycodes import Keycode class BasicKey: @@ -13,7 +13,7 @@ class KeyDown(BasicKey): self.keycode = keycode def __repr__(self): - return "Down({})".format(keycode_label(self.keycode.code)) + return "Down({})".format(Keycode.label(self.keycode.code)) def __eq__(self, other): return isinstance(other, KeyDown) and other.keycode == self.keycode @@ -25,7 +25,7 @@ class KeyUp(BasicKey): self.keycode = keycode def __repr__(self): - return "Up({})".format(keycode_label(self.keycode.code)) + return "Up({})".format(Keycode.label(self.keycode.code)) def __eq__(self, other): return isinstance(other, KeyUp) and other.keycode == self.keycode @@ -37,7 +37,7 @@ class KeyTap(BasicKey): self.keycode = keycode def __repr__(self): - return "Tap({})".format(keycode_label(self.keycode.code)) + return "Tap({})".format(Keycode.label(self.keycode.code)) def __eq__(self, other): return isinstance(other, KeyTap) and other.keycode == self.keycode diff --git a/src/main/python/macro_recorder.py b/src/main/python/macro_recorder.py index f323c92..7db6601 100644 --- a/src/main/python/macro_recorder.py +++ b/src/main/python/macro_recorder.py @@ -6,7 +6,7 @@ from PyQt5.QtWidgets import QPushButton, QGridLayout, QHBoxLayout, QToolButton, QTabWidget, QWidget, QLabel, QMenu, QScrollArea, QFrame from basic_editor import BasicEditor -from keycodes import find_keycode +from keycodes import Keycode from macro_action import ActionText, ActionTap, ActionDown, ActionUp, SS_TAP_CODE, SS_DOWN_CODE, SS_UP_CODE from macro_key import KeyString, KeyDown, KeyUp, KeyTap from macro_line import MacroLine @@ -154,7 +154,7 @@ class MacroTab(QVBoxLayout): # map integer values to qmk keycodes keycodes = [] for code in s[1]: - keycode = find_keycode(code) + keycode = Keycode.find_outer_keycode(code) if keycode: keycodes.append(keycode) cls = {SS_TAP_CODE: ActionTap, SS_DOWN_CODE: ActionDown, SS_UP_CODE: ActionUp}[s[0]] @@ -164,7 +164,7 @@ class MacroTab(QVBoxLayout): self.changed.emit() def on_tap_enter(self): - self.add_action(ActionTap(self.container, [find_keycode(0x28)])) + self.add_action(ActionTap(self.container, [Keycode.find_by_qmk_id("KC_ENTER")])) def pre_record(self): self.btn_record.hide() diff --git a/src/main/python/tabbed_keycodes.py b/src/main/python/tabbed_keycodes.py index 2ebf721..062af4b 100644 --- a/src/main/python/tabbed_keycodes.py +++ b/src/main/python/tabbed_keycodes.py @@ -6,8 +6,8 @@ from PyQt5.QtGui import QPalette from constants import KEYCODE_BTN_RATIO from flowlayout import FlowLayout -from keycodes import keycode_tooltip, KEYCODES_BASIC, KEYCODES_ISO, KEYCODES_MACRO, KEYCODES_LAYERS, KEYCODES_QUANTUM, \ - KEYCODES_BACKLIGHT, KEYCODES_MEDIA, KEYCODES_SPECIAL, KEYCODES_SHIFTED, KEYCODES_USER +from keycodes import KEYCODES_BASIC, KEYCODES_ISO, KEYCODES_MACRO, KEYCODES_LAYERS, KEYCODES_QUANTUM, \ + KEYCODES_BACKLIGHT, KEYCODES_MEDIA, KEYCODES_SPECIAL, KEYCODES_SHIFTED, KEYCODES_USER, Keycode from keymaps import KEYMAPS from square_button import SquareButton from util import tr @@ -78,7 +78,7 @@ class TabbedKeycodes(QTabWidget): for keycode in keycodes: btn = SquareButton() btn.setRelSize(KEYCODE_BTN_RATIO) - btn.setToolTip(keycode_tooltip(keycode.code)) + btn.setToolTip(Keycode.tooltip(keycode.code)) btn.clicked.connect(lambda st, k=keycode: self.keycode_changed.emit(k.code)) btn.keycode = keycode layout.addWidget(btn) diff --git a/src/main/python/test/test_keycode.py b/src/main/python/test/test_keycode.py new file mode 100644 index 0000000..a6f5f67 --- /dev/null +++ b/src/main/python/test/test_keycode.py @@ -0,0 +1,10 @@ +import unittest + +from keycodes import Keycode + + +class TestKeycode(unittest.TestCase): + + def test_serialize(self): + print(Keycode.serialize(0x100)) + print(Keycode.deserialize("KC_A")) diff --git a/src/main/python/test/test_macro.py b/src/main/python/test/test_macro.py index 3805067..9d5b620 100644 --- a/src/main/python/test/test_macro.py +++ b/src/main/python/test/test_macro.py @@ -1,13 +1,13 @@ # SPDX-License-Identifier: GPL-2.0-or-later import unittest -from keycodes import find_keycode +from keycodes import Keycode from macro_key import KeyDown, KeyTap, KeyUp, KeyString from macro_optimizer import remove_repeats, replace_with_tap, replace_with_string -KC_A = find_keycode(0x04) -KC_B = find_keycode(0x05) -KC_C = find_keycode(0x06) +KC_A = Keycode.find_by_qmk_id("KC_A") +KC_B = Keycode.find_by_qmk_id("KC_B") +KC_C = Keycode.find_by_qmk_id("KC_C") class TestMacro(unittest.TestCase):