5
5
6
6
from qgis .core import QgsApplication
7
7
from qgis .PyQt import uic
8
- from qgis .PyQt .QtCore import pyqtSignal
9
- from qgis .PyQt .QtWidgets import QTextEdit , QWidget
8
+ from qgis .PyQt .QtCore import Qt , pyqtSignal
9
+ from qgis .PyQt .QtWidgets import QFormLayout , QLabel , QMenu , QTextEdit , QToolButton , QWidget
10
10
11
11
from arho_feature_template .core .models import Proposition
12
+ from arho_feature_template .gui .components .code_combobox import CodeComboBox
13
+ from arho_feature_template .gui .components .plan_regulation_input_widgets import IntegerInputWidget
14
+ from arho_feature_template .project .layers .code_layers import PlanThemeLayer
12
15
13
16
if TYPE_CHECKING :
14
17
from qgis .PyQt .QtWidgets import QLineEdit , QPushButton
15
18
16
19
ui_path = resources .files (__package__ ) / "plan_proposition_widget.ui"
17
20
FormClass , _ = uic .loadUiType (ui_path )
18
21
22
+ # TO BE REPLACED
23
+ LANGUAGE = "fin"
24
+
19
25
20
26
class PropositionWidget (QWidget , FormClass ): # type: ignore
21
27
"""A widget representation of a plan proposition."""
@@ -28,23 +34,79 @@ def __init__(self, proposition: Proposition, parent=None):
28
34
29
35
# TYPES
30
36
self .name : QLineEdit
37
+ self .value_label : QLabel
31
38
self .text_input : QTextEdit
39
+ self .add_field_btn : QPushButton
32
40
self .del_btn : QPushButton
33
- # Theme
34
- # Ordering
41
+ self . form_layout : QFormLayout
42
+ self . expand_hide_btn : QToolButton
35
43
36
44
# INIT
37
45
self .proposition = proposition
38
- self .name .setText (proposition .name )
39
- self .text_input .setText (proposition .value )
46
+ self .proposition_number_widget : IntegerInputWidget | None = None
47
+ self .theme_widget : CodeComboBox | None = None
48
+
49
+ # List of widgets for hiding / showing
50
+ self .widgets : list [tuple [QLabel , QWidget ]] = [(self .value_label , self .text_input )]
51
+
52
+ add_field_menu = QMenu (self )
53
+ add_field_menu .addAction ("Suositusnumero" ).triggered .connect (self ._add_proposition_number )
54
+ add_field_menu .addAction ("Kaavoitusteema" ).triggered .connect (self ._add_theme )
55
+ self .add_field_btn .setMenu (add_field_menu )
56
+ self .add_field_btn .setIcon (QgsApplication .getThemeIcon ("mActionAdd.svg" ))
40
57
41
58
self .del_btn .setIcon (QgsApplication .getThemeIcon ("mActionDeleteSelected.svg" ))
42
59
self .del_btn .clicked .connect (lambda : self .delete_signal .emit (self ))
43
60
61
+ self .expanded = True
62
+ self .expand_hide_btn .clicked .connect (self ._on_expand_hide_btn_clicked )
63
+
64
+ self .name .setText (proposition .name )
65
+ self .text_input .setText (proposition .value )
66
+ self ._add_theme (proposition .theme_id )
67
+ self ._add_proposition_number (proposition .proposition_number )
68
+
69
+ def _add_widgets (self , label : QLabel , widget : QWidget ):
70
+ self .form_layout .addRow (label , widget )
71
+ self .widgets .append ((label , widget ))
72
+ if not self .expanded :
73
+ self ._on_expand_hide_btn_clicked ()
74
+
75
+ def _add_proposition_number (self , default_value : int | None = None ):
76
+ if not self .proposition_number_widget :
77
+ self .proposition_number_widget = IntegerInputWidget (default_value , None , True )
78
+ self ._add_widgets (QLabel ("Suositusnumero" ), self .proposition_number_widget )
79
+
80
+ def _add_theme (self , default_value : str | None = None ):
81
+ if not self .theme_widget :
82
+ self .theme_widget = CodeComboBox ()
83
+ self .theme_widget .populate_from_code_layer (PlanThemeLayer )
84
+ if default_value :
85
+ self .theme_widget .set_value (default_value )
86
+ self ._add_widgets (QLabel ("Kaavoitusteema" ), self .theme_widget )
87
+
88
+ def _on_expand_hide_btn_clicked (self ):
89
+ if self .expanded :
90
+ for label , value_widget in self .widgets :
91
+ self .form_layout .removeWidget (label )
92
+ label .hide ()
93
+ self .form_layout .removeWidget (value_widget )
94
+ value_widget .hide ()
95
+ self .expand_hide_btn .setArrowType (Qt .ArrowType .DownArrow )
96
+ self .expanded = False
97
+ else :
98
+ for label , value_widget in self .widgets :
99
+ self .form_layout .addRow (label , value_widget )
100
+ label .show ()
101
+ value_widget .show ()
102
+ self .expand_hide_btn .setArrowType (Qt .ArrowType .UpArrow )
103
+ self .expanded = True
104
+
44
105
def into_model (self ) -> Proposition :
45
106
return Proposition (
46
107
name = self .name .text (),
47
108
value = self .text_input .toPlainText (),
48
- theme = None , # TODO: Implement themes for propositions
109
+ theme_id = self .theme_widget .value () if self .theme_widget else None ,
110
+ proposition_number = self .proposition_number_widget .get_value () if self .proposition_number_widget else None ,
49
111
id_ = self .proposition .id_ ,
50
112
)
0 commit comments