Refactor keycodes moving helper functions into the class
parent
4fb584b6c3
commit
ad34e2464b
|
|
@ -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 """
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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"))
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue