Add dynamically-generated layer keycodes

main
Ilya Zhuravlev 2020-10-16 05:29:41 -04:00
parent c1a1b93859
commit bd1e167f85
2 changed files with 49 additions and 6 deletions

View File

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

View File

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