Skip to content

Commit 8afadfe

Browse files
committed
fix plan regulation widget fields default value initialization, refactor initialization
1 parent d091a0c commit 8afadfe

4 files changed

+79
-32
lines changed

arho_feature_template/core/plan_regulation_config.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ class PlanRegulationDefinition:
176176
"""Associates a PlanRegulationConfig with an optional default value and additional data."""
177177

178178
regulation_config: PlanRegulationConfig
179-
default_value: str | Number | None
179+
default_value: str | Number | list[int] | None
180180
additional_information: list[
181181
dict[str, str | Number | None]
182182
] # NOTE: Correct typing for additional information values?

arho_feature_template/gui/new_plan_regulation_group_form.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def add_selected_plan_regulation(self, item: QTreeWidgetItem, column: int):
5757
self.add_plan_regulation(config)
5858

5959
def add_plan_regulation(self, config: PlanRegulationConfig):
60-
widget = PlanRegulationWidget(config=config, parent=self.plan_regulations_scroll_area_contents)
60+
widget = PlanRegulationWidget.from_config(config=config, parent=self.plan_regulations_scroll_area_contents)
6161
widget.delete_signal.connect(self.delete_plan_regulation)
6262
index = self.plan_regulations_layout.count() - 1
6363
self.plan_regulations_layout.insertWidget(index, widget)

arho_feature_template/gui/plan_regulation_group_widget.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
if TYPE_CHECKING:
1414
from qgis.PyQt.QtWidgets import QFrame, QLineEdit, QPushButton
1515

16-
from arho_feature_template.core.plan_regulation_config import PlanRegulationConfig
16+
from arho_feature_template.core.plan_regulation_config import PlanRegulationDefinition
1717
from arho_feature_template.core.plan_regulation_group_config import PlanRegulationGroupDefinition
1818

1919
ui_path = resources.files(__package__) / "plan_regulation_group_widget.ui"
@@ -41,16 +41,14 @@ def __init__(self, group_definition: PlanRegulationGroupDefinition):
4141
self.heading.setText(self.group_definition.name)
4242
self.init_buttons()
4343
for plan_regulation_definition in self.group_definition.plan_regulations:
44-
config = plan_regulation_definition.regulation_config
45-
widget = self.add_plan_regulation_widget(config)
46-
widget.populate_from_definition(plan_regulation_definition)
44+
_ = self.add_plan_regulation_widget(plan_regulation_definition)
4745

4846
def init_buttons(self):
4947
self.del_btn.setIcon(QgsApplication.getThemeIcon("mActionDeleteSelected.svg"))
5048
self.del_btn.clicked.connect(lambda: self.delete_signal.emit(self))
5149

52-
def add_plan_regulation_widget(self, config: PlanRegulationConfig) -> PlanRegulationWidget:
53-
widget = PlanRegulationWidget(config=config, parent=self.frame)
50+
def add_plan_regulation_widget(self, definition: PlanRegulationDefinition) -> PlanRegulationWidget:
51+
widget = PlanRegulationWidget.from_definition(definition=definition, parent=self.frame)
5452
widget.delete_signal.connect(self.delete_plan_regulation_widget)
5553
self.frame.layout().addWidget(widget)
5654
return widget

arho_feature_template/gui/plan_regulation_widget.py

+73-24
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
from importlib import resources
4+
from numbers import Number
45
from typing import TYPE_CHECKING, cast
56

67
from qgis.core import QgsApplication
@@ -73,42 +74,70 @@ def __init__(self, config: PlanRegulationConfig, parent=None):
7374
self.widgets: list[tuple[QLabel, QWidget]] = []
7475
self.plan_regulation_name.setText(config.name)
7576
self.plan_regulation_name.setReadOnly(True)
76-
self.init_value_fields()
77-
self.init_additional_information_btn()
78-
self.init_other_information_btn()
7977
self.del_btn.setIcon(QgsApplication.getThemeIcon("mActionDeleteSelected.svg"))
8078
self.del_btn.clicked.connect(lambda: self.delete_signal.emit(self))
8179
self.expand_hide_btn.clicked.connect(self._on_expand_hide_btn_clicked)
80+
self.init_additional_information_btn()
81+
self.init_other_information_btn()
82+
83+
@classmethod
84+
def from_config(cls, config: PlanRegulationConfig, parent=None) -> PlanRegulationWidget:
85+
instance = cls(config, parent)
86+
instance.init_fields()
87+
return instance
88+
89+
@classmethod
90+
def from_definition(cls, definition: PlanRegulationDefinition, parent=None) -> PlanRegulationWidget:
91+
instance = cls(definition.regulation_config, parent)
92+
instance.init_fields_from_definition(definition)
93+
return instance
94+
95+
def init_fields_from_definition(self, definition: PlanRegulationDefinition):
96+
# Value input
97+
value_type = self.config.value_type
98+
if value_type:
99+
self._add_value_input(value_type, self.config.unit, definition.default_value)
82100

83-
def populate_from_definition(self, definition: PlanRegulationDefinition):
84101
# Additional information
85102
for info in definition.additional_information:
86103
info_type: str = cast("str", info["type"])
87-
self.add_additional_info(info_type)
88-
if info_type == "kayttotarkoituskohdistus":
89-
info_value_widget = QLineEdit()
90-
label = QLabel(get_additional_information_name(info_type))
91-
value = info.get("value")
92-
if value:
93-
info_value_widget.setText(value)
94-
self.form_layout.addRow(label, info_value_widget)
104+
self.add_additional_info(info_type, info.get("value"))
95105

96106
# TODO: Other saved information from PlanRegulationDefinition
97107

98-
def init_value_fields(self):
108+
def init_fields(self):
99109
value_type = self.config.value_type
100110
if value_type:
101111
self._add_value_input(value_type, self.config.unit)
102112

103-
def _add_value_input(self, value_type: ValueType, unit: Unit | None):
113+
@staticmethod
114+
def _check_number_or_none(value: str | Number | None, error_msg: str):
115+
if not isinstance(value, Number) and value is not None:
116+
raise ValueError(error_msg)
117+
118+
def _add_value_input(
119+
self, value_type: ValueType, unit: Unit | None, default_value: str | Number | list[int] | None = None
120+
):
121+
base_error_msg = f"Invalid type for default value {type(default_value)}."
104122
if value_type in [ValueType.DECIMAL, ValueType.POSITIVE_DECIMAL]:
105-
self.add_decimal_input(value_type, unit)
123+
if not isinstance(default_value, Number) and default_value is not None:
124+
raise ValueError(base_error_msg)
125+
self.add_decimal_input(value_type, unit, default_value)
106126
elif value_type == ValueType.POSITIVE_INTEGER:
107-
self.add_positive_integer_input(unit)
127+
if not isinstance(default_value, int) and default_value is not None:
128+
raise ValueError(base_error_msg)
129+
self.add_positive_integer_input(unit, default_value)
108130
elif value_type == ValueType.POSITIVE_INTEGER_RANGE:
109-
self.add_positive_integer_range_input(unit)
131+
if not isinstance(default_value, list) and default_value is not None:
132+
raise ValueError(base_error_msg)
133+
if isinstance(default_value, list) and len(default_value) != 2: # noqa: PLR2004
134+
error_msg = f"Invalid number of values in default value {type(default_value)}."
135+
raise ValueError(error_msg)
136+
self.add_positive_integer_range_input(unit, default_value)
110137
elif value_type == ValueType.VERSIONED_TEXT:
111-
self.add_versioned_text_input()
138+
if not isinstance(default_value, str) and default_value is not None:
139+
raise ValueError(base_error_msg)
140+
self.add_versioned_text_input(default_value)
112141
else:
113142
msg = f"Invalid input value type for plan regulation: {value_type}"
114143
raise ValueError(msg)
@@ -185,7 +214,7 @@ def _add_widgets_to_form(self, label: QLabel, widget: QWidget):
185214
if not self.expanded:
186215
self._on_expand_hide_btn_clicked()
187216

188-
def add_decimal_input(self, value_type: ValueType, unit: Unit | None):
217+
def add_decimal_input(self, value_type: ValueType, unit: Unit | None, default_value: Number | None = None):
189218
value_widget = QgsDoubleSpinBox()
190219
label = QLabel("Arvo")
191220
if value_type == ValueType.POSITIVE_DECIMAL:
@@ -197,19 +226,23 @@ def add_decimal_input(self, value_type: ValueType, unit: Unit | None):
197226
value_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
198227
if unit:
199228
value_widget.setSuffix(f" {unit.value}")
229+
if default_value:
230+
value_widget.setValue(default_value)
200231
self._add_widgets_to_form(label, value_widget)
201232

202-
def add_positive_integer_input(self, unit: Unit | None):
233+
def add_positive_integer_input(self, unit: Unit | None, default_value: int | None = None):
203234
value_widget = QgsSpinBox()
204235
value_widget.setMinimum(0)
205236
value_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
206237
if unit:
207238
value_widget.setSuffix(f" {unit.value}")
208239
label = QLabel("Arvo")
209240
label.setToolTip("Tyyppi: kokonaisluku (positiivinen)")
241+
if default_value:
242+
value_widget.setValue(default_value)
210243
self._add_widgets_to_form(label, value_widget)
211244

212-
def add_positive_integer_range_input(self, unit: Unit | None):
245+
def add_positive_integer_range_input(self, unit: Unit | None, default_values: list[int] | None = None):
213246
min_widget = QgsSpinBox()
214247
min_widget.setMinimum(0)
215248
min_label = QLabel("Arvo minimi")
@@ -222,21 +255,37 @@ def add_positive_integer_range_input(self, unit: Unit | None):
222255
if unit:
223256
min_widget.setSuffix(f" {unit.value}")
224257
max_widget.setSuffix(f" {unit.value}")
258+
if default_values:
259+
min_widget.setValue(default_values[0])
260+
max_widget.setValue(default_values[1])
225261
self._add_widgets_to_form(min_label, min_widget)
226262
self._add_widgets_to_form(max_label, max_widget)
227263

228-
def add_versioned_text_input(self):
264+
def add_versioned_text_input(self, default_value: str | None = None):
229265
text_widget = QTextEdit()
230266
label = QLabel("Arvo")
231267
label.setToolTip("Tyyppi: kieliversioitu teksti")
268+
if default_value:
269+
text_widget.setText(default_value)
232270
self._add_widgets_to_form(label, text_widget)
233271

234-
def add_additional_info(self, info_type: str):
235-
info_type_line = QLineEdit(get_additional_information_name(info_type))
272+
def add_additional_info(self, info_type: str, default_value: str | Number | None = None):
273+
# NOTE: Now info type is the name / readable version when this is triggered by user
274+
# Might need to refactor this later..
275+
name = get_additional_information_name(info_type)
276+
info_type_line = QLineEdit(name)
236277
info_type_line.setReadOnly(True)
237278
label = QLabel("Lisätiedonlaji")
238279
self._add_widgets_to_form(label, info_type_line)
239280

281+
if name == "Käyttötarkoituskohdistus":
282+
info_value_widget = QLineEdit()
283+
info_value_label = QLabel(name)
284+
self._add_widgets_to_form(info_value_label, info_value_widget)
285+
286+
if default_value:
287+
info_value_widget.setText(str(default_value))
288+
240289
def add_regulation_number(self):
241290
if not self.regulation_number_added:
242291
number_widget = QgsSpinBox()

0 commit comments

Comments
 (0)