Refactor keycodes moving helper functions into the class

main
Ilya Zhuravlev 2021-03-14 17:31:25 -04:00
parent 4fb584b6c3
commit ad34e2464b
7 changed files with 77 additions and 51 deletions

View File

@ -34,6 +34,18 @@ class Keycode:
if masked: if masked:
self.masked_keycodes.add(code) 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 @classmethod
def find_by_recorder_alias(cls, alias): def find_by_recorder_alias(cls, alias):
return cls.recorder_alias_to_keycode.get(alias) return cls.recorder_alias_to_keycode.get(alias)
@ -42,6 +54,41 @@ class Keycode:
def find_by_qmk_id(cls, qmk_id): def find_by_qmk_id(cls, qmk_id):
return cls.qmk_id_to_keycode.get(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 K = Keycode
@ -446,37 +493,6 @@ KEYCODES = []
K = None 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(): def recreate_keycodes():
""" Regenerates global KEYCODES array """ """ Regenerates global KEYCODES array """

View File

@ -8,7 +8,7 @@ from PyQt5.QtCore import Qt
from any_keycode_dialog import AnyKeycodeDialog from any_keycode_dialog import AnyKeycodeDialog
from basic_editor import BasicEditor from basic_editor import BasicEditor
from keyboard_widget import KeyboardWidget, EncoderWidget 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 keymaps import KEYMAPS
from square_button import SquareButton from square_button import SquareButton
from tabbed_keycodes import TabbedKeycodes from tabbed_keycodes import TabbedKeycodes
@ -124,14 +124,14 @@ class KeymapEditor(BasicEditor):
def code_is_overriden(self, code): def code_is_overriden(self, code):
""" Check whether a country-specific keymap overrides a 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 return key is not None and key.qmk_id in self.keymap_override
def get_label(self, code): def get_label(self, code):
""" Get label for a specific keycode """ """ Get label for a specific keycode """
if self.code_is_overriden(code): if self.code_is_overriden(code):
return self.keymap_override[find_keycode(code).qmk_id] return self.keymap_override[Keycode.find_outer_keycode(code).qmk_id]
return keycode_label(code) return Keycode.label(code)
def refresh_layer_display(self): def refresh_layer_display(self):
""" Refresh text on key widgets to display data corresponding to current layer """ """ 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, code = self.keyboard.encoder_layout[(self.current_layer, widget.desc.encoder_idx,
widget.desc.encoder_dir)] widget.desc.encoder_dir)]
text = self.get_label(code) text = self.get_label(code)
tooltip = keycode_tooltip(code) tooltip = Keycode.tooltip(code)
mask = keycode_is_mask(code) mask = Keycode.is_mask(code)
mask_text = self.get_label(code & 0xFF) mask_text = self.get_label(code & 0xFF)
if mask: if mask:
text = text.split("\n")[0] text = text.split("\n")[0]

View File

@ -1,5 +1,5 @@
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
from keycodes import keycode_label from keycodes import Keycode
class BasicKey: class BasicKey:
@ -13,7 +13,7 @@ class KeyDown(BasicKey):
self.keycode = keycode self.keycode = keycode
def __repr__(self): def __repr__(self):
return "Down({})".format(keycode_label(self.keycode.code)) return "Down({})".format(Keycode.label(self.keycode.code))
def __eq__(self, other): def __eq__(self, other):
return isinstance(other, KeyDown) and other.keycode == self.keycode return isinstance(other, KeyDown) and other.keycode == self.keycode
@ -25,7 +25,7 @@ class KeyUp(BasicKey):
self.keycode = keycode self.keycode = keycode
def __repr__(self): def __repr__(self):
return "Up({})".format(keycode_label(self.keycode.code)) return "Up({})".format(Keycode.label(self.keycode.code))
def __eq__(self, other): def __eq__(self, other):
return isinstance(other, KeyUp) and other.keycode == self.keycode return isinstance(other, KeyUp) and other.keycode == self.keycode
@ -37,7 +37,7 @@ class KeyTap(BasicKey):
self.keycode = keycode self.keycode = keycode
def __repr__(self): def __repr__(self):
return "Tap({})".format(keycode_label(self.keycode.code)) return "Tap({})".format(Keycode.label(self.keycode.code))
def __eq__(self, other): def __eq__(self, other):
return isinstance(other, KeyTap) and other.keycode == self.keycode return isinstance(other, KeyTap) and other.keycode == self.keycode

View File

@ -6,7 +6,7 @@ from PyQt5.QtWidgets import QPushButton, QGridLayout, QHBoxLayout, QToolButton,
QTabWidget, QWidget, QLabel, QMenu, QScrollArea, QFrame QTabWidget, QWidget, QLabel, QMenu, QScrollArea, QFrame
from basic_editor import BasicEditor 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_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_key import KeyString, KeyDown, KeyUp, KeyTap
from macro_line import MacroLine from macro_line import MacroLine
@ -154,7 +154,7 @@ class MacroTab(QVBoxLayout):
# map integer values to qmk keycodes # map integer values to qmk keycodes
keycodes = [] keycodes = []
for code in s[1]: for code in s[1]:
keycode = find_keycode(code) keycode = Keycode.find_outer_keycode(code)
if keycode: if keycode:
keycodes.append(keycode) keycodes.append(keycode)
cls = {SS_TAP_CODE: ActionTap, SS_DOWN_CODE: ActionDown, SS_UP_CODE: ActionUp}[s[0]] 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() self.changed.emit()
def on_tap_enter(self): 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): def pre_record(self):
self.btn_record.hide() self.btn_record.hide()

View File

@ -6,8 +6,8 @@ from PyQt5.QtGui import QPalette
from constants import KEYCODE_BTN_RATIO from constants import KEYCODE_BTN_RATIO
from flowlayout import FlowLayout from flowlayout import FlowLayout
from keycodes import keycode_tooltip, KEYCODES_BASIC, KEYCODES_ISO, KEYCODES_MACRO, KEYCODES_LAYERS, KEYCODES_QUANTUM, \ from keycodes import KEYCODES_BASIC, KEYCODES_ISO, KEYCODES_MACRO, KEYCODES_LAYERS, KEYCODES_QUANTUM, \
KEYCODES_BACKLIGHT, KEYCODES_MEDIA, KEYCODES_SPECIAL, KEYCODES_SHIFTED, KEYCODES_USER KEYCODES_BACKLIGHT, KEYCODES_MEDIA, KEYCODES_SPECIAL, KEYCODES_SHIFTED, KEYCODES_USER, Keycode
from keymaps import KEYMAPS from keymaps import KEYMAPS
from square_button import SquareButton from square_button import SquareButton
from util import tr from util import tr
@ -78,7 +78,7 @@ class TabbedKeycodes(QTabWidget):
for keycode in keycodes: for keycode in keycodes:
btn = SquareButton() btn = SquareButton()
btn.setRelSize(KEYCODE_BTN_RATIO) 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.clicked.connect(lambda st, k=keycode: self.keycode_changed.emit(k.code))
btn.keycode = keycode btn.keycode = keycode
layout.addWidget(btn) layout.addWidget(btn)

View File

@ -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"))

View File

@ -1,13 +1,13 @@
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
import unittest import unittest
from keycodes import find_keycode from keycodes import Keycode
from macro_key import KeyDown, KeyTap, KeyUp, KeyString from macro_key import KeyDown, KeyTap, KeyUp, KeyString
from macro_optimizer import remove_repeats, replace_with_tap, replace_with_string from macro_optimizer import remove_repeats, replace_with_tap, replace_with_string
KC_A = find_keycode(0x04) KC_A = Keycode.find_by_qmk_id("KC_A")
KC_B = find_keycode(0x05) KC_B = Keycode.find_by_qmk_id("KC_B")
KC_C = find_keycode(0x06) KC_C = Keycode.find_by_qmk_id("KC_C")
class TestMacro(unittest.TestCase): class TestMacro(unittest.TestCase):