diff --git a/src/main/python/keyboard_container.py b/src/main/python/keyboard_container.py index 09ce656..e30ecae 100644 --- a/src/main/python/keyboard_container.py +++ b/src/main/python/keyboard_container.py @@ -1,7 +1,8 @@ # SPDX-License-Identifier: GPL-2.0-or-later from PyQt5.QtCore import pyqtSignal, Qt -from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLabel, QVBoxLayout +from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLabel, QVBoxLayout, QPushButton, QApplication +from PyQt5.QtGui import QPalette from clickable_label import ClickableLabel from keyboard_widget import KeyboardWidget, EncoderWidget @@ -36,7 +37,7 @@ class KeyboardContainer(QWidget): layout.setAlignment(self.container, Qt.AlignHCenter) self.setLayout(layout) - self.layer_labels = [] + self.layer_buttons = [] self.keyboard = None self.current_layer = 0 @@ -46,18 +47,19 @@ class KeyboardContainer(QWidget): def rebuild_layers(self): # delete old layer labels - for label in self.layer_labels: + for label in self.layer_buttons: label.hide() label.deleteLater() - self.layer_labels = [] + self.layer_buttons = [] # create new layer labels for x in range(self.keyboard.layers): - label = ClickableLabel(str(x)) - label.setAlignment(Qt.AlignCenter) - label.clicked.connect(lambda idx=x: self.switch_layer(idx)) - self.layout_layers.addWidget(label) - self.layer_labels.append(label) + btn = QPushButton(str(x)) + btn.setFixedSize(25, 25) + btn.setCheckable(True) + btn.clicked.connect(lambda state, idx=x: self.switch_layer(idx)) + self.layout_layers.addWidget(btn) + self.layer_buttons.append(btn) def rebuild(self, keyboard): self.keyboard = keyboard @@ -86,9 +88,11 @@ class KeyboardContainer(QWidget): self.container.update_layout() - for label in self.layer_labels: - label.setStyleSheet(LAYER_BTN_STYLE) - self.layer_labels[self.current_layer].setStyleSheet(ACTIVE_LAYER_BTN_STYLE) + for btn in self.layer_buttons: + btn.setEnabled(True) + btn.setChecked(False) + self.layer_buttons[self.current_layer].setEnabled(False) + self.layer_buttons[self.current_layer].setChecked(True) for widget in self.container.widgets: if widget.desc.row is not None: @@ -107,7 +111,7 @@ class KeyboardContainer(QWidget): widget.setMaskText(mask_text) widget.setToolTip(tooltip) if self.code_is_overriden(code): - widget.setColor(Qt.blue) + widget.setColor(QApplication.palette().color(QPalette.Link)) else: widget.setColor(None) self.container.update() diff --git a/src/main/python/keyboard_widget.py b/src/main/python/keyboard_widget.py index 3622aa1..bd8a8df 100644 --- a/src/main/python/keyboard_widget.py +++ b/src/main/python/keyboard_widget.py @@ -1,7 +1,7 @@ from collections import defaultdict -from PyQt5.QtGui import QPainter, QColor, QPainterPath, QTransform, QBrush, QPolygonF -from PyQt5.QtWidgets import QWidget, QToolTip +from PyQt5.QtGui import QPainter, QColor, QPainterPath, QTransform, QBrush, QPolygonF, QPalette +from PyQt5.QtWidgets import QWidget, QToolTip, QApplication from PyQt5.QtCore import Qt, QSize, QRect, QPointF, pyqtSignal, QEvent, QRectF from constants import KEY_WIDTH, KEY_SPACING, KEY_HEIGHT, KEYBOARD_WIDGET_PADDING, KEYBOARD_WIDGET_MASK_PADDING @@ -226,20 +226,20 @@ class KeyboardWidget(QWidget): # for regular keycaps regular_pen = qp.pen() - regular_pen.setColor(QColor("black")) + regular_pen.setColor(QApplication.palette().color(QPalette.ButtonText)) qp.setPen(regular_pen) regular_brush = QBrush() - regular_brush.setColor(QColor("white")) + regular_brush.setColor(QApplication.palette().color(QPalette.Button)) regular_brush.setStyle(Qt.SolidPattern) qp.setBrush(regular_brush) # for currently selected keycap active_pen = qp.pen() - active_pen.setColor(QColor("white")) + active_pen.setColor(QApplication.palette().color(QPalette.Button)) active_brush = QBrush() - active_brush.setColor(QColor("black")) + active_brush.setColor(QApplication.palette().color(QPalette.ButtonText)) active_brush.setStyle(Qt.SolidPattern) mask_font = qp.font() diff --git a/src/main/python/main_window.py b/src/main/python/main_window.py index cc5d1ac..fa673bf 100644 --- a/src/main/python/main_window.py +++ b/src/main/python/main_window.py @@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-or-later -from PyQt5.QtCore import Qt +from PyQt5.QtCore import Qt, QSettings from PyQt5.QtWidgets import QWidget, QComboBox, QToolButton, QHBoxLayout, QVBoxLayout, QMainWindow, QAction, qApp, \ QFileDialog, QDialog, QTabWidget, QActionGroup @@ -15,12 +15,17 @@ from unlocker import Unlocker from util import tr, find_vial_devices from vial_device import VialKeyboard +import themes + class MainWindow(QMainWindow): def __init__(self): super().__init__() + self.settings = QSettings("Vial", "Vial") + themes.set_theme(self.settings.value("theme")) + self.current_device = None self.devices = [] self.sideload_json = None @@ -112,6 +117,24 @@ class MainWindow(QMainWindow): self.security_menu.addSeparator() self.security_menu.addAction(keyboard_reset_act) + theme_set_default = QAction(tr("MenuTheme", "System"), self) + theme_set_default.triggered.connect(lambda: self.set_theme("default")) + + theme_set_light = QAction(tr("MenuTheme", "Light"), self) + theme_set_light.triggered.connect(lambda: self.set_theme("light")) + + theme_set_dark = QAction(tr("MenuTheme", "Dark"), self) + theme_set_dark.triggered.connect(lambda: self.set_theme("dark")) + + theme_set_arc = QAction(tr("MenuTheme", "Arc"), self) + theme_set_arc.triggered.connect(lambda: self.set_theme("arc")) + + self.theme_menu = self.menuBar().addMenu(tr("Menu", "Theme")) + self.theme_menu.addAction(theme_set_default) + self.theme_menu.addAction(theme_set_light) + self.theme_menu.addAction(theme_set_dark) + self.theme_menu.addAction(theme_set_arc) + def on_layout_load(self): dialog = QFileDialog() dialog.setDefaultSuffix("vil") @@ -214,3 +237,7 @@ class MainWindow(QMainWindow): def change_keyboard_layout(self, index): self.keymap_editor.set_keymap_override(KEYMAPS[index][1]) + + def set_theme(self, theme): + themes.set_theme(theme) + self.settings.setValue("theme", theme) diff --git a/src/main/python/tabbed_keycodes.py b/src/main/python/tabbed_keycodes.py index 1339bd1..f43d048 100644 --- a/src/main/python/tabbed_keycodes.py +++ b/src/main/python/tabbed_keycodes.py @@ -1,7 +1,8 @@ # SPDX-License-Identifier: GPL-2.0-or-later from PyQt5.QtCore import Qt, pyqtSignal -from PyQt5.QtWidgets import QTabWidget, QWidget, QPushButton, QScrollArea +from PyQt5.QtWidgets import QTabWidget, QWidget, QPushButton, QScrollArea, QApplication +from PyQt5.QtGui import QPalette from constants import KEYCODE_BTN_WIDTH, KEYCODE_BTN_HEIGHT from flowlayout import FlowLayout @@ -93,7 +94,8 @@ class TabbedKeycodes(QTabWidget): qmk_id = widget.keycode.qmk_id if qmk_id in self.keymap_override: label = self.keymap_override[qmk_id] - widget.setStyleSheet("QPushButton {color: blue;}") + highlight_color = QApplication.palette().color(QPalette.Link).getRgb() + widget.setStyleSheet("QPushButton {color: rgb"+str(highlight_color)+";}") else: label = widget.keycode.label widget.setStyleSheet("QPushButton {}") diff --git a/src/main/python/themes.py b/src/main/python/themes.py new file mode 100644 index 0000000..c678f07 --- /dev/null +++ b/src/main/python/themes.py @@ -0,0 +1,60 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +from PyQt5.QtCore import Qt, QSettings +from PyQt5.QtWidgets import QApplication +from PyQt5.QtGui import QPalette, QColor + +dark_palette = QPalette() +dark_palette.setColor(QPalette.Window, QColor(53, 53, 53)) +dark_palette.setColor(QPalette.WindowText, Qt.white) +dark_palette.setColor(QPalette.Base, QColor(35, 35, 35)) +dark_palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53)) +dark_palette.setColor(QPalette.ToolTipBase, QColor(25, 25, 25)) +dark_palette.setColor(QPalette.ToolTipText, Qt.white) +dark_palette.setColor(QPalette.Text, Qt.white) +dark_palette.setColor(QPalette.Button, QColor(53, 53, 53)) +dark_palette.setColor(QPalette.ButtonText, Qt.white) +dark_palette.setColor(QPalette.BrightText, Qt.red) +dark_palette.setColor(QPalette.Link, QColor(247, 169, 72)) +dark_palette.setColor(QPalette.Highlight, QColor(186, 186, 186)) +dark_palette.setColor(QPalette.HighlightedText, QColor(35, 35, 35)) +dark_palette.setColor(QPalette.Active, QPalette.Button, QColor(53, 53, 53)) +dark_palette.setColor(QPalette.Disabled, QPalette.ButtonText, Qt.darkGray) +dark_palette.setColor(QPalette.Disabled, QPalette.WindowText, Qt.darkGray) +dark_palette.setColor(QPalette.Disabled, QPalette.Text, Qt.darkGray) +dark_palette.setColor(QPalette.Disabled, QPalette.Light, QColor(53, 53, 53)) + +arc_palette = QPalette() +arc_palette.setColor(QPalette.Window, QColor("#353945")) +arc_palette.setColor(QPalette.WindowText, QColor("#d3dae3")) +arc_palette.setColor(QPalette.Base, QColor("#353945")) +arc_palette.setColor(QPalette.AlternateBase, QColor("#404552")) +arc_palette.setColor(QPalette.ToolTipBase, QColor("#4B5162")) +arc_palette.setColor(QPalette.ToolTipText, QColor("#d3dae3")) +arc_palette.setColor(QPalette.Text, QColor("#d3dae3")) +arc_palette.setColor(QPalette.Button, QColor("#353945")) +arc_palette.setColor(QPalette.ButtonText, QColor("#d3dae3")) +arc_palette.setColor(QPalette.BrightText, QColor("#5294e2")) +arc_palette.setColor(QPalette.Link, QColor("#89b1e0")) +arc_palette.setColor(QPalette.Highlight, QColor("#5294e2")) +arc_palette.setColor(QPalette.HighlightedText, QColor("#d3dae3")) +arc_palette.setColor(QPalette.Active, QPalette.Button, QColor("#353945")) +arc_palette.setColor(QPalette.Disabled, QPalette.ButtonText, QColor("#d3dae3")) +arc_palette.setColor(QPalette.Disabled, QPalette.WindowText, QColor("#d3dae3")) +arc_palette.setColor(QPalette.Disabled, QPalette.Text, QColor("#d3dae3")) +arc_palette.setColor(QPalette.Disabled, QPalette.Light, QColor("#404552")) + + +def set_theme(theme): + if theme == "light": + QApplication.setPalette(QApplication.style().standardPalette()) + QApplication.setStyle("Fusion") + elif theme == "dark": + QApplication.setPalette(dark_palette) + QApplication.setStyle("Fusion") + elif theme == "arc": + QApplication.setPalette(arc_palette) + QApplication.setStyle("Fusion") + else: + QApplication.setPalette(QApplication.style().standardPalette()) + QApplication.setStyle(None)