unlocker: show image of keys to hold
parent
de476ee63c
commit
e5487a0ae6
|
|
@ -298,6 +298,18 @@ class Keyboard:
|
||||||
data = self.usb_send(self.dev, struct.pack("BB", CMD_VIA_VIAL_PREFIX, CMD_VIAL_GET_LOCK))
|
data = self.usb_send(self.dev, struct.pack("BB", CMD_VIA_VIAL_PREFIX, CMD_VIAL_GET_LOCK))
|
||||||
return data[0]
|
return data[0]
|
||||||
|
|
||||||
|
def get_lock_keys(self):
|
||||||
|
""" Return keys users have to hold to unlock the keyboard as a list of rowcols """
|
||||||
|
|
||||||
|
data = self.usb_send(self.dev, struct.pack("BB", CMD_VIA_VIAL_PREFIX, CMD_VIAL_GET_LOCK))
|
||||||
|
rowcol = []
|
||||||
|
for x in range(15):
|
||||||
|
row = data[2 + x * 2]
|
||||||
|
col = data[3 + x * 2]
|
||||||
|
if row != 255 and col != 255:
|
||||||
|
rowcol.append((row, col))
|
||||||
|
return rowcol
|
||||||
|
|
||||||
def unlock_start(self):
|
def unlock_start(self):
|
||||||
self.usb_send(self.dev, struct.pack("BB", CMD_VIA_VIAL_PREFIX, CMD_VIAL_UNLOCK_START))
|
self.usb_send(self.dev, struct.pack("BB", CMD_VIA_VIAL_PREFIX, CMD_VIAL_UNLOCK_START))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@ from constants import KEY_WIDTH, KEY_SPACING, KEY_HEIGHT, KEYBOARD_WIDGET_PADDIN
|
||||||
class KeyWidget:
|
class KeyWidget:
|
||||||
|
|
||||||
def __init__(self, desc, shift_x=0, shift_y=0):
|
def __init__(self, desc, shift_x=0, shift_y=0):
|
||||||
|
self.active = False
|
||||||
|
self.masked = False
|
||||||
self.desc = desc
|
self.desc = desc
|
||||||
self.text = ""
|
self.text = ""
|
||||||
self.mask_text = ""
|
self.mask_text = ""
|
||||||
|
|
@ -88,6 +90,9 @@ class KeyWidget:
|
||||||
def setToolTip(self, tooltip):
|
def setToolTip(self, tooltip):
|
||||||
self.tooltip = tooltip
|
self.tooltip = tooltip
|
||||||
|
|
||||||
|
def setActive(self, active):
|
||||||
|
self.active = active
|
||||||
|
|
||||||
|
|
||||||
class EncoderWidget(KeyWidget):
|
class EncoderWidget(KeyWidget):
|
||||||
|
|
||||||
|
|
@ -117,6 +122,10 @@ class KeyboardWidget(QWidget):
|
||||||
|
|
||||||
def __init__(self, layout_editor):
|
def __init__(self, layout_editor):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
self.enabled = True
|
||||||
|
self.scale = 1
|
||||||
|
|
||||||
self.setMouseTracking(True)
|
self.setMouseTracking(True)
|
||||||
|
|
||||||
self.layout_editor = layout_editor
|
self.layout_editor = layout_editor
|
||||||
|
|
@ -192,8 +201,8 @@ class KeyboardWidget(QWidget):
|
||||||
max_w = max_h = 0
|
max_w = max_h = 0
|
||||||
for key in self.widgets:
|
for key in self.widgets:
|
||||||
p = key.polygon.boundingRect().bottomRight()
|
p = key.polygon.boundingRect().bottomRight()
|
||||||
max_w = max(max_w, p.x())
|
max_w = max(max_w, p.x() * self.scale)
|
||||||
max_h = max(max_h, p.y())
|
max_h = max(max_h, p.y() * self.scale)
|
||||||
|
|
||||||
self.width = max_w + 2 * KEYBOARD_WIDGET_PADDING
|
self.width = max_w + 2 * KEYBOARD_WIDGET_PADDING
|
||||||
self.height = max_h + 2 * KEYBOARD_WIDGET_PADDING
|
self.height = max_h + 2 * KEYBOARD_WIDGET_PADDING
|
||||||
|
|
@ -231,11 +240,12 @@ class KeyboardWidget(QWidget):
|
||||||
|
|
||||||
for idx, key in enumerate(self.widgets):
|
for idx, key in enumerate(self.widgets):
|
||||||
qp.save()
|
qp.save()
|
||||||
|
qp.scale(self.scale, self.scale)
|
||||||
qp.translate(key.rotation_x, key.rotation_y)
|
qp.translate(key.rotation_x, key.rotation_y)
|
||||||
qp.rotate(key.rotation_angle)
|
qp.rotate(key.rotation_angle)
|
||||||
qp.translate(-key.rotation_x, -key.rotation_y)
|
qp.translate(-key.rotation_x, -key.rotation_y)
|
||||||
|
|
||||||
if self.active_key == key and not self.active_mask:
|
if key.active or (self.active_key == key and not self.active_mask):
|
||||||
qp.setPen(active_pen)
|
qp.setPen(active_pen)
|
||||||
qp.setBrush(active_brush)
|
qp.setBrush(active_brush)
|
||||||
|
|
||||||
|
|
@ -277,6 +287,9 @@ class KeyboardWidget(QWidget):
|
||||||
return None, False
|
return None, False
|
||||||
|
|
||||||
def mousePressEvent(self, ev):
|
def mousePressEvent(self, ev):
|
||||||
|
if not self.enabled:
|
||||||
|
return
|
||||||
|
|
||||||
self.active_key, self.active_mask = self.hit_test(ev.pos())
|
self.active_key, self.active_mask = self.hit_test(ev.pos())
|
||||||
if self.active_key is not None:
|
if self.active_key is not None:
|
||||||
self.clicked.emit()
|
self.clicked.emit()
|
||||||
|
|
@ -299,6 +312,9 @@ class KeyboardWidget(QWidget):
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
def event(self, ev):
|
def event(self, ev):
|
||||||
|
if not self.enabled:
|
||||||
|
super().event(ev)
|
||||||
|
|
||||||
if ev.type() == QEvent.ToolTip:
|
if ev.type() == QEvent.ToolTip:
|
||||||
key = self.hit_test(ev.pos())[0]
|
key = self.hit_test(ev.pos())[0]
|
||||||
if key is not None:
|
if key is not None:
|
||||||
|
|
@ -306,3 +322,9 @@ class KeyboardWidget(QWidget):
|
||||||
else:
|
else:
|
||||||
QToolTip.hideText()
|
QToolTip.hideText()
|
||||||
return super().event(ev)
|
return super().event(ev)
|
||||||
|
|
||||||
|
def set_enabled(self, val):
|
||||||
|
self.enabled = val
|
||||||
|
|
||||||
|
def set_scale(self, scale):
|
||||||
|
self.scale = scale
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,6 @@ class MainWindow(QMainWindow):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
self.unlocker = Unlocker()
|
|
||||||
|
|
||||||
self.current_device = None
|
self.current_device = None
|
||||||
self.devices = []
|
self.devices = []
|
||||||
self.sideload_json = None
|
self.sideload_json = None
|
||||||
|
|
@ -45,6 +43,7 @@ class MainWindow(QMainWindow):
|
||||||
|
|
||||||
self.editors = [(self.keymap_editor, "Keymap"), (self.layout_editor, "Layout"), (self.macro_recorder, "Macros"),
|
self.editors = [(self.keymap_editor, "Keymap"), (self.layout_editor, "Layout"), (self.macro_recorder, "Macros"),
|
||||||
(self.firmware_flasher, "Firmware updater")]
|
(self.firmware_flasher, "Firmware updater")]
|
||||||
|
self.unlocker = Unlocker(self.layout_editor)
|
||||||
|
|
||||||
self.tabs = QTabWidget()
|
self.tabs = QTabWidget()
|
||||||
self.refresh_tabs()
|
self.refresh_tabs()
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,13 @@ import time
|
||||||
from PyQt5.QtCore import QCoreApplication, Qt
|
from PyQt5.QtCore import QCoreApplication, Qt
|
||||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QProgressBar
|
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QProgressBar
|
||||||
|
|
||||||
|
from keyboard_widget import KeyboardWidget
|
||||||
from util import tr
|
from util import tr
|
||||||
|
|
||||||
|
|
||||||
class Unlocker(QWidget):
|
class Unlocker(QWidget):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, layout_editor):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.keyboard = None
|
self.keyboard = None
|
||||||
|
|
||||||
|
|
@ -23,7 +24,11 @@ class Unlocker(QWidget):
|
||||||
layout.addWidget(QLabel(tr("Unlocker", "Press and hold the following keys until the progress bar "
|
layout.addWidget(QLabel(tr("Unlocker", "Press and hold the following keys until the progress bar "
|
||||||
"below fills up:")))
|
"below fills up:")))
|
||||||
|
|
||||||
# TODO: add image/text reference of keys user needs to hold
|
self.keyboard_reference = KeyboardWidget(layout_editor)
|
||||||
|
self.keyboard_reference.set_enabled(False)
|
||||||
|
self.keyboard_reference.set_scale(0.5)
|
||||||
|
layout.addWidget(self.keyboard_reference)
|
||||||
|
layout.setAlignment(self.keyboard_reference, Qt.AlignHCenter)
|
||||||
|
|
||||||
layout.addWidget(self.progress)
|
layout.addWidget(self.progress)
|
||||||
|
|
||||||
|
|
@ -36,11 +41,29 @@ class Unlocker(QWidget):
|
||||||
def get(cls):
|
def get(cls):
|
||||||
return cls.obj
|
return cls.obj
|
||||||
|
|
||||||
|
def update_reference(self, keyboard):
|
||||||
|
""" Updates keycap reference image """
|
||||||
|
|
||||||
|
self.keyboard_reference.set_keys(keyboard.keys, keyboard.encoders)
|
||||||
|
|
||||||
|
# use "active" background to indicate keys to hold
|
||||||
|
lock_keys = keyboard.get_lock_keys()
|
||||||
|
for w in self.keyboard_reference.widgets:
|
||||||
|
if (w.desc.row, w.desc.col) in lock_keys:
|
||||||
|
w.setActive(True)
|
||||||
|
|
||||||
|
self.keyboard_reference.update_layout()
|
||||||
|
self.keyboard_reference.update()
|
||||||
|
self.keyboard_reference.updateGeometry()
|
||||||
|
|
||||||
def perform_unlock(self, keyboard):
|
def perform_unlock(self, keyboard):
|
||||||
# if it's already unlocked, don't need to do anything
|
# if it's already unlocked, don't need to do anything
|
||||||
if keyboard.get_lock() == 0:
|
lock = keyboard.get_lock()
|
||||||
|
if lock == 0:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self.update_reference(keyboard)
|
||||||
|
|
||||||
self.progress.setMaximum(1)
|
self.progress.setMaximum(1)
|
||||||
self.progress.setValue(0)
|
self.progress.setValue(0)
|
||||||
|
|
||||||
|
|
@ -64,3 +87,6 @@ class Unlocker(QWidget):
|
||||||
|
|
||||||
# ok all done, the keyboard is now set to insecure state
|
# ok all done, the keyboard is now set to insecure state
|
||||||
self.hide()
|
self.hide()
|
||||||
|
|
||||||
|
def closeEvent(self, ev):
|
||||||
|
ev.ignore()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue