add layer switching

main
Ilya Zhuravlev 2020-10-14 20:27:24 -04:00
parent 5a6c17e833
commit 3e75339d35
2 changed files with 56 additions and 11 deletions

View File

@ -0,0 +1,12 @@
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QLabel
class ClickableLabel(QLabel):
clicked = pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
def mousePressEvent(self, ev):
self.clicked.emit()

View File

@ -6,10 +6,13 @@ import sys
import json import json
import struct import struct
import lzma import lzma
from collections import defaultdict
from flowlayout import FlowLayout 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
class TabbedKeycodes(QTabWidget): class TabbedKeycodes(QTabWidget):
@ -61,20 +64,33 @@ class KeyboardContainer(QWidget):
self.keys = [] self.keys = []
self.layer_labels = [] self.layer_labels = []
self.rowcol = defaultdict(list)
self.layout = dict()
def rebuild_layers(self, dev):
self.layers = hid_send(dev, b"\x11")[1]
def rebuild_layers(self):
for label in self.layer_labels: for label in self.layer_labels:
label.deleteLater() label.deleteLater()
self.layer_labels = [] self.layer_labels = []
# create new layer labels # create new layer labels
for x in range(self.layers): for x in range(self.layers):
label = QLabel(str(x)) label = ClickableLabel(str(x))
label.setStyleSheet("border: 1px solid black; padding: 5px")
label.setAlignment(Qt.AlignCenter) label.setAlignment(Qt.AlignCenter)
label.clicked.connect(lambda idx=x: self.switch_layer(idx))
self.layout_layers.addWidget(label) self.layout_layers.addWidget(label)
self.layer_labels.append(label) self.layer_labels.append(label)
def rebuild_layout(self, dev):
""" Load current key mapping from the keyboard """
for layer in range(self.layers):
for row, col in self.rowcol.keys():
data = hid_send(dev, b"\x04" + struct.pack("<BBB", layer, row, col))
keycode = struct.unpack(">H", data[4:6])[0]
self.layout[(layer, row, col)] = keycode
def rebuild(self, dev, data): def rebuild(self, dev, data):
# delete current layout # delete current layout
for key in self.keys: for key in self.keys:
@ -82,8 +98,10 @@ class KeyboardContainer(QWidget):
self.keys = [] self.keys = []
# get number of layers # get number of layers
self.layers = hid_send(dev, b"\x11")[1] self.rebuild_layers(dev)
self.rebuild_layers()
# prepare for fetching keymap
self.rowcol = defaultdict(list)
serial = KleSerial() serial = KleSerial()
kb = serial.deserialize(data["layouts"]["keymap"]) kb = serial.deserialize(data["layouts"]["keymap"])
@ -96,9 +114,7 @@ class KeyboardContainer(QWidget):
if key.labels[0] and "," in key.labels[0]: if key.labels[0] and "," in key.labels[0]:
row, col = key.labels[0].split(",") row, col = key.labels[0].split(",")
row, col = int(row), int(col) row, col = int(row), int(col)
data = hid_send(dev, b"\x04" + struct.pack("<BBB", 0, row, col)) self.rowcol[(row, col)].append(widget)
keycode = struct.unpack(">H", data[4:6])[0]
widget.setText("0x{:X}".format(keycode))
widget.setParent(self.container) widget.setParent(self.container)
widget.setStyleSheet('background-color:white; border: 1px solid black') widget.setStyleSheet('background-color:white; border: 1px solid black')
@ -113,14 +129,32 @@ class KeyboardContainer(QWidget):
widget.move(x, y) widget.move(x, y)
widget.show() widget.show()
# print("{} {}x{}+{}x{}".format(key.labels, key.x, key.y, key.width, key.height))
max_w = max(max_w, x + w) max_w = max(max_w, x + w)
max_h = max(max_h, y + h) max_h = max(max_h, y + h)
self.keys.append(widget) self.keys.append(widget)
self.container.setFixedSize(max_w, max_h) self.container.setFixedSize(max_w, max_h)
self.rebuild_layout(dev)
self.current_layer = 0
self.refresh_layer_display()
def refresh_layer_display(self):
""" Refresh text on key widgets to display data corresponding to current layer """
for label in self.layer_labels:
label.setStyleSheet("border: 1px solid black; padding: 5px")
self.layer_labels[self.current_layer].setStyleSheet("border: 1px solid black; padding: 5px; background-color: black; color: white")
for (row, col), widgets in self.rowcol.items():
keycode = self.layout[(self.current_layer, row, col)]
text = "0x{:X}".format(keycode)
for widget in widgets:
widget.setText(text)
def switch_layer(self, idx):
self.current_layer = idx
self.refresh_layer_display()
class MainWindow(QWidget): class MainWindow(QWidget):
@ -154,7 +188,6 @@ class MainWindow(QWidget):
# make sure initial state is valid # make sure initial state is valid
self.on_click_refresh() self.on_click_refresh()
self.on_device_selected()
def on_click_refresh(self): def on_click_refresh(self):
self.devices = find_vial_keyboards() self.devices = find_vial_keyboards()