From bd1e167f858a4214b427839420b0b4911a32eba3 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Fri, 16 Oct 2020 05:29:41 -0400 Subject: [PATCH] Add dynamically-generated layer keycodes --- src/main/python/keycodes.py | 25 +++++++++++++++++++++++++ src/main/python/main.py | 30 ++++++++++++++++++++++++------ 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/main/python/keycodes.py b/src/main/python/keycodes.py index 7be62a6..b72df25 100644 --- a/src/main/python/keycodes.py +++ b/src/main/python/keycodes.py @@ -224,3 +224,28 @@ def keycode_tooltip(code): if keycode.tooltip: tooltip = "{}: {}".format(tooltip, keycode.tooltip) return tooltip + +def recreate_layer_keycodes(layers): + """ Generates layer keycodes based on number of layers a keyboard provides """ + + def generate_keycodes_for_mask(label, mask): + keycodes = [] + for layer in range(layers): + lbl = "{}({})".format(label, layer) + keycodes.append(Keycode(mask | layer, lbl, lbl)) + return keycodes + + KEYCODES_LAYERS.clear() + + if layers >= 4: + KEYCODES_LAYERS.append(Keycode(0x5F10, "FN_MO13", "Fn1\n(Fn3)")) + KEYCODES_LAYERS.append(Keycode(0x5F11, "FN_MO23", "Fn2\n(Fn3)")) + + KEYCODES_LAYERS.extend(generate_keycodes_for_mask("MO", 0x5100)) + KEYCODES_LAYERS.extend(generate_keycodes_for_mask("TG", 0x5300)) + KEYCODES_LAYERS.extend(generate_keycodes_for_mask("TT", 0x5800)) + KEYCODES_LAYERS.extend(generate_keycodes_for_mask("OSL", 0x5400)) + KEYCODES_LAYERS.extend(generate_keycodes_for_mask("TO", 0x5000 | (1 << 4))) + + KEYCODES.clear() + KEYCODES.extend(KEYCODES_BASIC + KEYCODES_ISO + KEYCODES_MACRO + KEYCODES_LAYERS + KEYCODES_SPECIAL) diff --git a/src/main/python/main.py b/src/main/python/main.py index 93f6776..b441573 100644 --- a/src/main/python/main.py +++ b/src/main/python/main.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later from fbs_runtime.application_context.PyQt5 import ApplicationContext -from PyQt5.QtCore import Qt +from PyQt5.QtCore import Qt, pyqtSignal from PyQt5.QtWidgets import QWidget, QTabWidget, QVBoxLayout, QPushButton, QLabel, QComboBox, QToolButton, QHBoxLayout, QSizePolicy import sys @@ -14,7 +14,7 @@ from flowlayout import FlowLayout from util import tr, find_vial_keyboards, open_device, hid_send, MSG_LEN from kle_serial import Serial as KleSerial from clickable_label import ClickableLabel -from keycodes import keycode_label, keycode_tooltip, KEYCODES_BASIC, KEYCODES_ISO, KEYCODES_MACRO, KEYCODES_LAYERS, KEYCODES_SPECIAL +from keycodes import keycode_label, keycode_tooltip, recreate_layer_keycodes, KEYCODES_BASIC, KEYCODES_ISO, KEYCODES_MACRO, KEYCODES_LAYERS, KEYCODES_SPECIAL class TabbedKeycodes(QTabWidget): @@ -35,11 +35,15 @@ class TabbedKeycodes(QTabWidget): (self.tab_layers, "Layers", KEYCODES_LAYERS), (self.tab_special, "Special", KEYCODES_SPECIAL), ]: - self.create_buttons(tab, keycodes) + layout = FlowLayout() + buttons = self.create_buttons(layout, keycodes) + tab.setLayout(layout) self.addTab(tab, tr("TabbedKeycodes", label)) - def create_buttons(self, tab, keycodes): - layout = FlowLayout() + self.layer_keycode_buttons = [] + + def create_buttons(self, layout, keycodes): + buttons = [] for keycode in keycodes: btn = QPushButton(keycode.label) @@ -47,8 +51,14 @@ class TabbedKeycodes(QTabWidget): btn.setToolTip(keycode_tooltip(keycode.code)) btn.clicked.connect(lambda st, k=keycode: kb.set_key(k.code)) layout.addWidget(btn) + buttons.append(btn) - tab.setLayout(layout) + return buttons + + def recreate_layer_keycode_buttons(self): + for btn in self.layer_keycode_buttons: + btn.deleteLater() + self.layer_keycode_buttons = self.create_buttons(self.tab_layers.layout(), KEYCODES_LAYERS) KEY_WIDTH = 40 @@ -58,6 +68,8 @@ KEY_SPACING = 4 class KeyboardContainer(QWidget): + number_layers_changed = pyqtSignal() + def __init__(self, parent=None): super().__init__(parent) @@ -88,6 +100,7 @@ class KeyboardContainer(QWidget): def rebuild_layers(self, dev): self.layers = hid_send(dev, b"\x11")[1] + self.number_layers_changed.emit() for label in self.layer_labels: label.deleteLater() @@ -212,6 +225,7 @@ class MainWindow(QWidget): self.devices = [] self.keyboard_container = KeyboardContainer() + self.keyboard_container.number_layers_changed.connect(self.on_number_layers_changed) self.tabbed_keycodes = TabbedKeycodes(self.keyboard_container) @@ -273,6 +287,10 @@ class MainWindow(QWidget): payload = json.loads(lzma.decompress(payload)) self.keyboard_container.rebuild(self.device, payload) + def on_number_layers_changed(self): + recreate_layer_keycodes(self.keyboard_container.layers) + self.tabbed_keycodes.recreate_layer_keycode_buttons() + if __name__ == '__main__': appctxt = ApplicationContext() # 1. Instantiate ApplicationContext