qmk_settings: disable save/undo buttons unless there are changes

main
Ilya Zhuravlev 2021-07-06 01:05:31 -04:00
parent c7e782d23c
commit 13f6521076
1 changed files with 43 additions and 11 deletions

View File

@ -3,6 +3,7 @@ import json
from collections import defaultdict from collections import defaultdict
from PyQt5 import QtCore from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QVBoxLayout, QCheckBox, QGridLayout, QLabel, QWidget, QSizePolicy, QTabWidget, QSpinBox, \ from PyQt5.QtWidgets import QVBoxLayout, QCheckBox, QGridLayout, QLabel, QWidget, QSizePolicy, QTabWidget, QSpinBox, \
QHBoxLayout, QPushButton, QMessageBox QHBoxLayout, QPushButton, QMessageBox
@ -11,9 +12,13 @@ from util import tr
from vial_device import VialKeyboard from vial_device import VialKeyboard
class GenericOption: class GenericOption(QObject):
changed = pyqtSignal()
def __init__(self, option, container): def __init__(self, option, container):
super().__init__()
self.row = container.rowCount() self.row = container.rowCount()
self.option = option self.option = option
self.qsid = self.option["qsid"] self.qsid = self.option["qsid"]
@ -29,6 +34,9 @@ class GenericOption:
self.lbl.hide() self.lbl.hide()
self.lbl.deleteLater() self.lbl.deleteLater()
def on_change(self):
self.changed.emit()
class BooleanOption(GenericOption): class BooleanOption(GenericOption):
@ -38,6 +46,7 @@ class BooleanOption(GenericOption):
self.qsid_bit = self.option["bit"] self.qsid_bit = self.option["bit"]
self.checkbox = QCheckBox() self.checkbox = QCheckBox()
self.checkbox.stateChanged.connect(self.on_change)
self.container.addWidget(self.checkbox, self.row, 1) self.container.addWidget(self.checkbox, self.row, 1)
def reload(self, keyboard): def reload(self, keyboard):
@ -66,10 +75,14 @@ class IntegerOption(GenericOption):
self.spinbox = QSpinBox() self.spinbox = QSpinBox()
self.spinbox.setMinimum(option["min"]) self.spinbox.setMinimum(option["min"])
self.spinbox.setMaximum(option["max"]) self.spinbox.setMaximum(option["max"])
self.spinbox.valueChanged.connect(self.on_change)
self.container.addWidget(self.spinbox, self.row, 1) self.container.addWidget(self.spinbox, self.row, 1)
def reload(self, keyboard): def reload(self, keyboard):
self.spinbox.setValue(super().reload(keyboard)) value = super().reload(keyboard)
self.spinbox.blockSignals(True)
self.spinbox.setValue(value)
self.spinbox.blockSignals(False)
def value(self): def value(self):
return self.spinbox.value() return self.spinbox.value()
@ -90,12 +103,12 @@ class QmkSettings(BasicEditor):
self.addWidget(self.tabs_widget) self.addWidget(self.tabs_widget)
buttons = QHBoxLayout() buttons = QHBoxLayout()
buttons.addStretch() buttons.addStretch()
btn_save = QPushButton(tr("QmkSettings", "Save")) self.btn_save = QPushButton(tr("QmkSettings", "Save"))
btn_save.clicked.connect(self.save_settings) self.btn_save.clicked.connect(self.save_settings)
buttons.addWidget(btn_save) buttons.addWidget(self.btn_save)
btn_undo = QPushButton(tr("QmkSettings", "Undo")) self.btn_undo = QPushButton(tr("QmkSettings", "Undo"))
btn_undo.clicked.connect(self.reload_settings) self.btn_undo.clicked.connect(self.reload_settings)
buttons.addWidget(btn_undo) buttons.addWidget(self.btn_undo)
btn_reset = QPushButton(tr("QmkSettings", "Reset")) btn_reset = QPushButton(tr("QmkSettings", "Reset"))
btn_reset.clicked.connect(self.reset_settings) btn_reset.clicked.connect(self.reset_settings)
buttons.addWidget(btn_reset) buttons.addWidget(btn_reset)
@ -110,9 +123,13 @@ class QmkSettings(BasicEditor):
if field["qsid"] not in self.keyboard.supported_settings: if field["qsid"] not in self.keyboard.supported_settings:
continue continue
if field["type"] == "boolean": if field["type"] == "boolean":
options.append(BooleanOption(field, container)) opt = BooleanOption(field, container)
options.append(opt)
opt.changed.connect(self.on_change)
elif field["type"] == "integer": elif field["type"] == "integer":
options.append(IntegerOption(field, container)) opt = IntegerOption(field, container)
options.append(opt)
opt.changed.connect(self.on_change)
else: else:
raise RuntimeError("unsupported field type: {}".format(field)) raise RuntimeError("unsupported field type: {}".format(field))
return options return options
@ -162,17 +179,32 @@ class QmkSettings(BasicEditor):
for field in tab: for field in tab:
field.reload(self.keyboard) field.reload(self.keyboard)
self.on_change()
def on_change(self):
changed = False
qsid_values = self.prepare_settings()
for qsid, value in qsid_values.items():
if self.keyboard.settings[qsid] != value:
changed = True
self.btn_save.setEnabled(changed)
self.btn_undo.setEnabled(changed)
def rebuild(self, device): def rebuild(self, device):
super().rebuild(device) super().rebuild(device)
if self.valid(): if self.valid():
self.keyboard = device.keyboard self.keyboard = device.keyboard
self.reload_settings() self.reload_settings()
def save_settings(self): def prepare_settings(self):
qsid_values = defaultdict(int) qsid_values = defaultdict(int)
for tab in self.tabs: for tab in self.tabs:
for field in tab: for field in tab:
qsid_values[field.qsid] |= field.value() qsid_values[field.qsid] |= field.value()
return qsid_values
def save_settings(self):
qsid_values = self.prepare_settings()
for qsid, value in qsid_values.items(): for qsid, value in qsid_values.items():
self.keyboard.qmk_settings_set(qsid, value) self.keyboard.qmk_settings_set(qsid, value)