implement key remapping

main
Ilya Zhuravlev 2020-10-14 21:12:53 -04:00
parent 42d4a91a8e
commit c556163ce6
2 changed files with 41 additions and 7 deletions

View File

@ -177,6 +177,8 @@ KEYCODES = [
K(0x5C00, "RESET", "Reset"),
]
KEYCODES_BASIC = KEYCODES
K = None
def keycode_to_label(code):

View File

@ -12,19 +12,20 @@ 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_to_label
from keycodes import keycode_to_label, KEYCODES_BASIC
class TabbedKeycodes(QTabWidget):
def __init__(self, parent=None):
def __init__(self, kb, parent=None):
super().__init__(parent)
self.tab_basic = QWidget()
layout = FlowLayout()
for lbl in ["", "hello", "Esc", "A", "B", "C", "D", "E", "F"]:
btn = QPushButton(lbl)
for keycode in KEYCODES_BASIC:
btn = QPushButton(keycode.label)
btn.setFixedSize(50, 50)
btn.clicked.connect(lambda st, k=keycode: kb.set_key(k.keycode))
layout.addWidget(btn)
self.tab_basic.setLayout(layout)
@ -67,6 +68,9 @@ class KeyboardContainer(QWidget):
self.layer_labels = []
self.rowcol = defaultdict(list)
self.layout = dict()
self.selected_key = None
self.selected_row = -1
self.selected_col = -1
def rebuild_layers(self, dev):
self.layers = hid_send(dev, b"\x11")[1]
@ -110,7 +114,8 @@ class KeyboardContainer(QWidget):
max_w = max_h = 0
for key in kb.keys:
widget = QLabel()
widget = ClickableLabel()
widget.clicked.connect(lambda w=widget: self.select_key(w))
if key.labels[0] and "," in key.labels[0]:
row, col = key.labels[0].split(",")
@ -118,7 +123,6 @@ class KeyboardContainer(QWidget):
self.rowcol[(row, col)].append(widget)
widget.setParent(self.container)
widget.setStyleSheet('background-color:white; border: 1px solid black')
widget.setAlignment(Qt.AlignCenter)
x = (KEY_WIDTH + KEY_SPACING) * key.x
@ -151,10 +155,36 @@ class KeyboardContainer(QWidget):
keycode = self.layout[(self.current_layer, row, col)]
text = keycode_to_label(keycode)
for widget in widgets:
widget.setStyleSheet('background-color:white; border: 1px solid black')
if widget == self.selected_key:
widget.setStyleSheet('background-color:black; color: white; border: 1px solid black')
widget.setText(text)
def switch_layer(self, idx):
self.current_layer = idx
self.selected_key = None
self.selected_row = -1
self.selected_col = -1
self.refresh_layer_display()
def set_key(self, keycode):
""" Change currently selected key to provided keycode """
if self.selected_row >= 0 and self.selected_col >= 0:
hid_send(self.dev, struct.pack(">BBBBH", 5, self.current_layer, self.selected_row, self.selected_col, keycode))
self.layout[(self.current_layer, self.selected_row, self.selected_col)] = keycode
self.refresh_layer_display()
def select_key(self, widget):
""" Change which key is currently selected """
self.selected_key = widget
for (row, col), widgets in self.rowcol.items():
if widget in widgets:
self.selected_row = row
self.selected_col = col
break
self.refresh_layer_display()
@ -167,7 +197,7 @@ class MainWindow(QWidget):
self.keyboard_container = KeyboardContainer()
self.tabbed_keycodes = TabbedKeycodes()
self.tabbed_keycodes = TabbedKeycodes(self.keyboard_container)
self.combobox_devices = QComboBox()
self.combobox_devices.currentIndexChanged.connect(self.on_device_selected)
@ -199,9 +229,11 @@ class MainWindow(QWidget):
def on_device_selected(self):
self.device = None
self.keyboard_container.dev = None
idx = self.combobox_devices.currentIndex()
if idx >= 0:
self.device = open_device(self.devices[idx])
self.keyboard_container.dev = self.device
self.reload_layout()
def reload_layout(self):