M1-Survey-Engine/source/survey/IntegerQuestion.py

71 lines
2.2 KiB
Python

from typing import Any, Optional
from PyQt6.QtCore import Qt, pyqtSignal
from PyQt6.QtGui import QFont
from PyQt6.QtWidgets import QVBoxLayout, QLabel, QSpinBox
from source import translate
from source.survey.base import BaseSurvey
class IntegerQuestion(BaseSurvey):
def __init__(
self,
title: translate.Translatable,
default: Optional[int] = None,
minimum: Optional[int] = None,
maximum: Optional[int] = None,
signals: dict[str, pyqtSignal] = None
):
super().__init__()
default = default if default is not None else 0
minimum = minimum if minimum is not None else 0
maximum = maximum if maximum is not None else 100
self.signals = signals if signals is not None else {}
# set layout
self._layout = QVBoxLayout()
self.setLayout(self._layout)
# question title
self.label_question = QLabel()
self._layout.addWidget(self.label_question)
self.label_question.setText(translate.translate(title))
self.label_question.setAlignment(Qt.AlignmentFlag.AlignCenter)
font_title = self.label_question.font()
font_title.setPointSize(24)
font_title.setWeight(QFont.Weight.Bold)
self.label_question.setFont(font_title)
# response
self.entry_response = QSpinBox()
self.entry_response.setMinimum(minimum)
self.entry_response.setMaximum(maximum)
self.entry_response.setValue(default)
self._layout.addWidget(self.entry_response)
@classmethod
def from_dict(cls, data: dict[str, Any], signals: dict[str, pyqtSignal]) -> "IntegerQuestion":
return cls(
title=data["title"],
default=data.get("default"),
minimum=data.get("minimum"),
maximum=data.get("maximum"),
signals=signals,
)
# events
def on_show(self) -> None:
# immediately mark the survey as successful
if "success" in self.signals:
self.signals["success"].emit() # NOQA: emit exist
# data collection
def get_collected_data(self) -> dict:
return {
"value": self.entry_response.value()
}