Generate settings pages automatically.

This adds metadata to settings fields that can be used to automatically
generate the settings window. For now I have replaced the Difficulty
page. Will follow up to replace the others.
This commit is contained in:
Dan Albert
2021-09-12 16:44:01 -07:00
parent 39fae9effc
commit 7bec4c62f7
13 changed files with 518 additions and 329 deletions

View File

@@ -3,21 +3,27 @@ from typing import Optional
from PySide2.QtWidgets import QSpinBox
class TenthsSpinner(QSpinBox):
class FloatSpinner(QSpinBox):
def __init__(
self,
minimum: Optional[int] = None,
maximum: Optional[int] = None,
initial: Optional[int] = None,
divisor: int,
minimum: Optional[float] = None,
maximum: Optional[float] = None,
initial: Optional[float] = None,
) -> None:
super().__init__()
self.divisor = divisor
if minimum is not None:
self.setMinimum(minimum)
self.setMinimum(int(minimum * divisor))
if maximum is not None:
self.setMaximum(maximum)
self.setMaximum(int(maximum * divisor))
if initial is not None:
self.setValue(initial)
self.setValue(int(initial * divisor))
def textFromValue(self, val: int) -> str:
return f"X {val / 10:.1f}"
return f"X {val / self.divisor:.1f}"
@property
def real_value(self) -> float:
return self.value() / self.divisor

View File

@@ -1,30 +1,33 @@
from datetime import timedelta
from typing import Optional
from PySide2 import QtWidgets
from PySide2.QtCore import Qt
from PySide2.QtWidgets import QGridLayout, QLabel, QSlider
from typing import Optional
from qt_ui.widgets.floatspinners import TenthsSpinner
from datetime import timedelta
from PySide2.QtWidgets import QSlider, QHBoxLayout
from qt_ui.widgets.floatspinners import FloatSpinner
class TenthsSpinSlider(QGridLayout):
def __init__(self, label: str, minimum: int, maximum: int, initial: int) -> None:
class FloatSpinSlider(QHBoxLayout):
def __init__(
self, minimum: float, maximum: float, initial: float, divisor: int
) -> None:
super().__init__()
self.addWidget(QLabel(label), 0, 0)
slider = QSlider(Qt.Horizontal)
slider.setMinimum(minimum)
slider.setMaximum(maximum)
slider.setMinimum(int(minimum * divisor))
slider.setMaximum(int(maximum * divisor))
slider.setValue(initial)
self.spinner = TenthsSpinner(minimum, maximum, initial)
self.spinner = FloatSpinner(divisor, minimum, maximum, initial)
slider.valueChanged.connect(lambda x: self.spinner.setValue(x))
self.spinner.valueChanged.connect(lambda x: slider.setValue(x))
self.addWidget(slider, 1, 0)
self.addWidget(self.spinner, 1, 1)
self.addWidget(slider)
self.addWidget(self.spinner)
@property
def value(self) -> float:
return self.spinner.value() / 10
return self.spinner.real_value
class TimeInputs(QtWidgets.QGridLayout):