1
1
from __future__ import annotations
2
2
3
3
from importlib import resources
4
+ from numbers import Number
4
5
from typing import TYPE_CHECKING , cast
5
6
6
7
from qgis .core import QgsApplication
@@ -73,42 +74,70 @@ def __init__(self, config: PlanRegulationConfig, parent=None):
73
74
self .widgets : list [tuple [QLabel , QWidget ]] = []
74
75
self .plan_regulation_name .setText (config .name )
75
76
self .plan_regulation_name .setReadOnly (True )
76
- self .init_value_fields ()
77
- self .init_additional_information_btn ()
78
- self .init_other_information_btn ()
79
77
self .del_btn .setIcon (QgsApplication .getThemeIcon ("mActionDeleteSelected.svg" ))
80
78
self .del_btn .clicked .connect (lambda : self .delete_signal .emit (self ))
81
79
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 )
82
100
83
- def populate_from_definition (self , definition : PlanRegulationDefinition ):
84
101
# Additional information
85
102
for info in definition .additional_information :
86
103
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" ))
95
105
96
106
# TODO: Other saved information from PlanRegulationDefinition
97
107
98
- def init_value_fields (self ):
108
+ def init_fields (self ):
99
109
value_type = self .config .value_type
100
110
if value_type :
101
111
self ._add_value_input (value_type , self .config .unit )
102
112
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 )} ."
104
122
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 )
106
126
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 )
108
130
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 )
110
137
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 )
112
141
else :
113
142
msg = f"Invalid input value type for plan regulation: { value_type } "
114
143
raise ValueError (msg )
@@ -185,7 +214,7 @@ def _add_widgets_to_form(self, label: QLabel, widget: QWidget):
185
214
if not self .expanded :
186
215
self ._on_expand_hide_btn_clicked ()
187
216
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 ):
189
218
value_widget = QgsDoubleSpinBox ()
190
219
label = QLabel ("Arvo" )
191
220
if value_type == ValueType .POSITIVE_DECIMAL :
@@ -197,19 +226,23 @@ def add_decimal_input(self, value_type: ValueType, unit: Unit | None):
197
226
value_widget .setSizePolicy (QSizePolicy .Expanding , QSizePolicy .Fixed )
198
227
if unit :
199
228
value_widget .setSuffix (f" { unit .value } " )
229
+ if default_value :
230
+ value_widget .setValue (default_value )
200
231
self ._add_widgets_to_form (label , value_widget )
201
232
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 ):
203
234
value_widget = QgsSpinBox ()
204
235
value_widget .setMinimum (0 )
205
236
value_widget .setSizePolicy (QSizePolicy .Expanding , QSizePolicy .Fixed )
206
237
if unit :
207
238
value_widget .setSuffix (f" { unit .value } " )
208
239
label = QLabel ("Arvo" )
209
240
label .setToolTip ("Tyyppi: kokonaisluku (positiivinen)" )
241
+ if default_value :
242
+ value_widget .setValue (default_value )
210
243
self ._add_widgets_to_form (label , value_widget )
211
244
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 ):
213
246
min_widget = QgsSpinBox ()
214
247
min_widget .setMinimum (0 )
215
248
min_label = QLabel ("Arvo minimi" )
@@ -222,21 +255,37 @@ def add_positive_integer_range_input(self, unit: Unit | None):
222
255
if unit :
223
256
min_widget .setSuffix (f" { unit .value } " )
224
257
max_widget .setSuffix (f" { unit .value } " )
258
+ if default_values :
259
+ min_widget .setValue (default_values [0 ])
260
+ max_widget .setValue (default_values [1 ])
225
261
self ._add_widgets_to_form (min_label , min_widget )
226
262
self ._add_widgets_to_form (max_label , max_widget )
227
263
228
- def add_versioned_text_input (self ):
264
+ def add_versioned_text_input (self , default_value : str | None = None ):
229
265
text_widget = QTextEdit ()
230
266
label = QLabel ("Arvo" )
231
267
label .setToolTip ("Tyyppi: kieliversioitu teksti" )
268
+ if default_value :
269
+ text_widget .setText (default_value )
232
270
self ._add_widgets_to_form (label , text_widget )
233
271
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 )
236
277
info_type_line .setReadOnly (True )
237
278
label = QLabel ("Lisätiedonlaji" )
238
279
self ._add_widgets_to_form (label , info_type_line )
239
280
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
+
240
289
def add_regulation_number (self ):
241
290
if not self .regulation_number_added :
242
291
number_widget = QgsSpinBox ()
0 commit comments