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: if keycode.tooltip:
tooltip = "{}: {}".format(tooltip, keycode.tooltip) tooltip = "{}: {}".format(tooltip, keycode.tooltip)
return 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 # SPDX-License-Identifier: GPL-2.0-or-later
from fbs_runtime.application_context.PyQt5 import ApplicationContext 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 from PyQt5.QtWidgets import QWidget, QTabWidget, QVBoxLayout, QPushButton, QLabel, QComboBox, QToolButton, QHBoxLayout, QSizePolicy
import sys import sys
@ -14,7 +14,7 @@ from flowlayout import FlowLayout
from util import tr, find_vial_keyboards, open_device, hid_send, MSG_LEN from util import tr, find_vial_keyboards, open_device, hid_send, MSG_LEN
from kle_serial import Serial as KleSerial from kle_serial import Serial as KleSerial
from clickable_label import ClickableLabel 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): class TabbedKeycodes(QTabWidget):
@ -35,11 +35,15 @@ class TabbedKeycodes(QTabWidget):
(self.tab_layers, "Layers", KEYCODES_LAYERS), (self.tab_layers, "Layers", KEYCODES_LAYERS),
(self.tab_special, "Special", KEYCODES_SPECIAL), (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)) self.addTab(tab, tr("TabbedKeycodes", label))
def create_buttons(self, tab, keycodes): self.layer_keycode_buttons = []
layout = FlowLayout()
def create_buttons(self, layout, keycodes):
buttons = []
for keycode in keycodes: for keycode in keycodes:
btn = QPushButton(keycode.label) btn = QPushButton(keycode.label)
@ -47,8 +51,14 @@ class TabbedKeycodes(QTabWidget):
btn.setToolTip(keycode_tooltip(keycode.code)) btn.setToolTip(keycode_tooltip(keycode.code))
btn.clicked.connect(lambda st, k=keycode: kb.set_key(k.code)) btn.clicked.connect(lambda st, k=keycode: kb.set_key(k.code))
layout.addWidget(btn) 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 KEY_WIDTH = 40
@ -58,6 +68,8 @@ KEY_SPACING = 4
class KeyboardContainer(QWidget): class KeyboardContainer(QWidget):
number_layers_changed = pyqtSignal()
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
@ -88,6 +100,7 @@ class KeyboardContainer(QWidget):
def rebuild_layers(self, dev): def rebuild_layers(self, dev):
self.layers = hid_send(dev, b"\x11")[1] self.layers = hid_send(dev, b"\x11")[1]
self.number_layers_changed.emit()
for label in self.layer_labels: for label in self.layer_labels:
label.deleteLater() label.deleteLater()
@ -212,6 +225,7 @@ class MainWindow(QWidget):
self.devices = [] self.devices = []
self.keyboard_container = KeyboardContainer() self.keyboard_container = KeyboardContainer()
self.keyboard_container.number_layers_changed.connect(self.on_number_layers_changed)
self.tabbed_keycodes = TabbedKeycodes(self.keyboard_container) self.tabbed_keycodes = TabbedKeycodes(self.keyboard_container)
@ -273,6 +287,10 @@ class MainWindow(QWidget):
payload = json.loads(lzma.decompress(payload)) payload = json.loads(lzma.decompress(payload))
self.keyboard_container.rebuild(self.device, 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__': if __name__ == '__main__':
appctxt = ApplicationContext() # 1. Instantiate ApplicationContext appctxt = ApplicationContext() # 1. Instantiate ApplicationContext