From fea0dcaa9b8403d4d6c6ea8c77780337aaa0ac7d Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Sat, 3 Jul 2021 14:56:41 -0400 Subject: [PATCH] move keymap override handling into global util --- src/main/python/key_widget.py | 4 +++ src/main/python/keymap_editor.py | 42 ++++-------------------- src/main/python/main_window.py | 12 +++---- src/main/python/tabbed_keycodes.py | 29 ++++++++++++----- src/main/python/util.py | 52 +++++++++++++++++++++++++++++- 5 files changed, 89 insertions(+), 50 deletions(-) diff --git a/src/main/python/key_widget.py b/src/main/python/key_widget.py index 0e018fe..b686816 100644 --- a/src/main/python/key_widget.py +++ b/src/main/python/key_widget.py @@ -23,3 +23,7 @@ class KeyWidget(KeyboardWidget): TabbedKeycodes.open_tray(self) else: TabbedKeycodes.close_tray() + + def on_keycode_changed(self, kc): + """ Unlike set_keycode, this handles setting masked keycode inside the mask """ + print(kc) diff --git a/src/main/python/keymap_editor.py b/src/main/python/keymap_editor.py index 85139a9..8f9c543 100644 --- a/src/main/python/keymap_editor.py +++ b/src/main/python/keymap_editor.py @@ -1,8 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later import json -from PyQt5.QtGui import QPalette -from PyQt5.QtWidgets import QHBoxLayout, QLabel, QVBoxLayout, QMessageBox, QApplication +from PyQt5.QtWidgets import QHBoxLayout, QLabel, QVBoxLayout, QMessageBox from PyQt5.QtCore import Qt from any_keycode_dialog import AnyKeycodeDialog @@ -12,7 +11,7 @@ from keycodes import recreate_keyboard_keycodes, Keycode from keymaps import KEYMAPS from square_button import SquareButton from tabbed_keycodes import TabbedKeycodes -from util import tr +from util import tr, KeycodeDisplay from vial_device import VialKeyboard @@ -48,8 +47,6 @@ class KeymapEditor(BasicEditor): layout_editor.changed.connect(self.on_layout_changed) - self.keymap_override = KEYMAPS[0][1] - self.container.anykey.connect(self.on_any_keycode) self.tabbed_keycodes = TabbedKeycodes() @@ -60,6 +57,7 @@ class KeymapEditor(BasicEditor): self.addWidget(self.tabbed_keycodes) self.device = None + KeycodeDisplay.notify_keymap_override(self) def on_container_clicked(self): """ Called when a mouse click event is bubbled up to the editor's container """ @@ -135,11 +133,6 @@ class KeymapEditor(BasicEditor): self.keyboard.restore_layout(data) self.refresh_layer_display() - def set_keymap_override(self, override): - self.keymap_override = override - self.refresh_layer_display() - self.tabbed_keycodes.set_keymap_override(override) - def on_any_keycode(self): if self.container.active_key is None: return @@ -148,17 +141,6 @@ class KeymapEditor(BasicEditor): if dlg.exec_() and dlg.value >= 0: self.on_keycode_changed(dlg.value) - def code_is_overriden(self, code): - """ Check whether a country-specific keymap overrides a code """ - key = Keycode.find_outer_keycode(code) - return key is not None and key.qmk_id in self.keymap_override - - def get_label(self, code): - """ Get label for a specific keycode """ - if self.code_is_overriden(code): - return self.keymap_override[Keycode.find_outer_keycode(code).qmk_id] - return Keycode.label(code) - def code_for_widget(self, widget): if widget.desc.row is not None: return self.keyboard.layout[(self.current_layer, widget.desc.row, widget.desc.col)] @@ -177,20 +159,7 @@ class KeymapEditor(BasicEditor): for widget in self.container.widgets: code = self.code_for_widget(widget) - text = self.get_label(code) - tooltip = Keycode.tooltip(code) - mask = Keycode.is_mask(code) - mask_text = self.get_label(code & 0xFF) - if mask: - text = text.split("\n")[0] - widget.masked = mask - widget.setText(text) - widget.setMaskText(mask_text) - widget.setToolTip(tooltip) - if self.code_is_overriden(code): - widget.setColor(QApplication.palette().color(QPalette.Link)) - else: - widget.setColor(None) + KeycodeDisplay.display_keycode(widget, code) self.container.update() self.container.updateGeometry() @@ -245,3 +214,6 @@ class KeymapEditor(BasicEditor): self.refresh_layer_display() self.keyboard.set_layout_options(self.layout_editor.pack()) + + def on_keymap_override(self): + self.refresh_layer_display() diff --git a/src/main/python/main_window.py b/src/main/python/main_window.py index a30b4e3..43011e6 100644 --- a/src/main/python/main_window.py +++ b/src/main/python/main_window.py @@ -21,7 +21,7 @@ from rgb_configurator import RGBConfigurator from tabbed_keycodes import TabbedKeycodes from tap_dance import TapDance from unlocker import Unlocker -from util import tr, find_vial_devices, EXAMPLE_KEYBOARDS +from util import tr, find_vial_devices, EXAMPLE_KEYBOARDS, KeycodeDisplay from vial_device import VialKeyboard from matrix_test import MatrixTest @@ -92,10 +92,10 @@ class MainWindow(QMainWindow): layout.addWidget(self.tabs) layout.addWidget(self.lbl_no_devices) layout.setAlignment(self.lbl_no_devices, Qt.AlignHCenter) - self.popup_keycodes = TabbedKeycodes() - TabbedKeycodes.set_tray(self.popup_keycodes) - layout.addWidget(self.popup_keycodes) - self.popup_keycodes.hide() + self.tray_keycodes = TabbedKeycodes() + self.tray_keycodes.make_tray() + layout.addWidget(self.tray_keycodes) + self.tray_keycodes.hide() w = QWidget() w.setLayout(layout) self.setCentralWidget(w) @@ -335,7 +335,7 @@ class MainWindow(QMainWindow): def change_keyboard_layout(self, index): self.settings.setValue("keymap", KEYMAPS[index][0]) - self.keymap_editor.set_keymap_override(KEYMAPS[index][1]) + KeycodeDisplay.set_keymap_override(KEYMAPS[index][1]) def get_theme(self): return self.settings.value("theme", "Dark") diff --git a/src/main/python/tabbed_keycodes.py b/src/main/python/tabbed_keycodes.py index edb2471..b59eff4 100644 --- a/src/main/python/tabbed_keycodes.py +++ b/src/main/python/tabbed_keycodes.py @@ -8,9 +8,8 @@ from constants import KEYCODE_BTN_RATIO from flowlayout import FlowLayout from keycodes import KEYCODES_BASIC, KEYCODES_ISO, KEYCODES_MACRO, KEYCODES_LAYERS, KEYCODES_QUANTUM, \ KEYCODES_BACKLIGHT, KEYCODES_MEDIA, KEYCODES_SPECIAL, KEYCODES_SHIFTED, KEYCODES_USER, Keycode -from keymaps import KEYMAPS from square_button import SquareButton -from util import tr +from util import tr, KeycodeDisplay class TabbedKeycodes(QTabWidget): @@ -21,8 +20,8 @@ class TabbedKeycodes(QTabWidget): def __init__(self, parent=None): super().__init__(parent) - self.keymap_override = None self.target = None + self.is_tray = False self.tab_basic = QScrollArea() self.tab_iso = QScrollArea() @@ -74,7 +73,7 @@ class TabbedKeycodes(QTabWidget): self.layer_keycode_buttons = [] self.macro_keycode_buttons = [] self.user_keycode_buttons = [] - self.set_keymap_override(KEYMAPS[0][1]) + KeycodeDisplay.notify_keymap_override(self) def create_buttons(self, layout, keycodes, wordWrap = False): buttons = [] @@ -102,15 +101,14 @@ class TabbedKeycodes(QTabWidget): self.widgets += self.layer_keycode_buttons + self.macro_keycode_buttons + self.user_keycode_buttons self.relabel_buttons() - def set_keymap_override(self, override): - self.keymap_override = override + def on_keymap_override(self): self.relabel_buttons() def relabel_buttons(self): for widget in self.widgets: qmk_id = widget.keycode.qmk_id - if qmk_id in self.keymap_override: - label = self.keymap_override[qmk_id] + if qmk_id in KeycodeDisplay.keymap_override: + label = KeycodeDisplay.keymap_override[qmk_id] highlight_color = QApplication.palette().color(QPalette.Link).getRgb() widget.setStyleSheet("QPushButton {color: rgb"+str(highlight_color)+";}") else: @@ -133,4 +131,19 @@ class TabbedKeycodes(QTabWidget): def close_tray(cls): if cls.tray.target is not None: cls.tray.target.deselect() + cls.tray.target = None cls.tray.hide() + + def make_tray(self): + self.is_tray = True + TabbedKeycodes.set_tray(self) + + self.keycode_changed.connect(self.on_tray_keycode_changed) + self.anykey.connect(self.on_tray_anykey) + + def on_tray_keycode_changed(self, kc): + if self.target is not None: + self.target.on_keycode_changed(kc) + + def on_tray_anykey(self): + pass diff --git a/src/main/python/util.py b/src/main/python/util.py index 1c020ae..2740431 100644 --- a/src/main/python/util.py +++ b/src/main/python/util.py @@ -5,9 +5,12 @@ import time from logging.handlers import RotatingFileHandler from PyQt5.QtCore import QCoreApplication, QStandardPaths +from PyQt5.QtGui import QPalette +from PyQt5.QtWidgets import QApplication from hidproxy import hid - +from keycodes import Keycode +from keymaps import KEYMAPS tr = QCoreApplication.translate @@ -147,3 +150,50 @@ def init_logger(): handler = RotatingFileHandler(path, maxBytes=5 * 1024 * 1024, backupCount=5) handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(module)s:%(lineno)d - %(message)s")) logging.getLogger().addHandler(handler) + + +class KeycodeDisplay: + + keymap_override = KEYMAPS[0][1] + clients = [] + + @classmethod + def get_label(cls, code): + """ Get label for a specific keycode """ + if cls.code_is_overriden(code): + return cls.keymap_override[Keycode.find_outer_keycode(code).qmk_id] + return Keycode.label(code) + + @classmethod + def code_is_overriden(cls, code): + """ Check whether a country-specific keymap overrides a code """ + key = Keycode.find_outer_keycode(code) + return key is not None and key.qmk_id in cls.keymap_override + + @classmethod + def display_keycode(cls, widget, code): + text = cls.get_label(code) + tooltip = Keycode.tooltip(code) + mask = Keycode.is_mask(code) + mask_text = cls.get_label(code & 0xFF) + if mask: + text = text.split("\n")[0] + widget.masked = mask + widget.setText(text) + widget.setMaskText(mask_text) + widget.setToolTip(tooltip) + if cls.code_is_overriden(code): + widget.setColor(QApplication.palette().color(QPalette.Link)) + else: + widget.setColor(None) + + @classmethod + def set_keymap_override(cls, override): + cls.keymap_override = override + for client in cls.clients: + client.on_keymap_override() + + @classmethod + def notify_keymap_override(cls, client): + cls.clients.append(client) + client.on_keymap_override()