Add dynamically-generated layer keycodes
parent
c1a1b93859
commit
bd1e167f85
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue