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

70 lines
2.1 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.survey.base import BaseSurvey
class IntegerQuestion(BaseSurvey):
def __init__(
self,
title: str,
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(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()
}