Skip to content

Commit bc6c48b

Browse files
committed
add plan theme and proposition number for plan propositions
- add button for adding proposition number or plan theme widget in plan proposition widget - add hide/expand button and functionality to plan proposition widget - add proposition number and plan theme in plan proposition model - add PlanThemeLayer code layer model - remove spacer and horizontal line layout items from plan regulation widget
1 parent 8874829 commit bc6c48b

File tree

7 files changed

+114
-86
lines changed

7 files changed

+114
-86
lines changed

arho_feature_template/core/models.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,8 @@ class Regulation:
269269
class Proposition:
270270
name: str
271271
value: str
272-
theme: str | None = None
273-
# ordering:
272+
theme_id: str | None = None
273+
proposition_number: int | None = None
274274
regulation_group_id_: int | None = None
275275
id_: int | None = None
276276

arho_feature_template/gui/components/code_combobox.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def set_value(self, value: str | None) -> None:
4848
if index != -1:
4949
self.setCurrentIndex(index)
5050
else:
51-
self.setCurrentIndex(0) # Set NULL if not found
51+
self.setCurrentIndex(0) # NULL if not found
5252

5353

5454
class HierarchicalCodeComboBox(QComboBox):

arho_feature_template/gui/components/plan_proposition_widget.py

+69-7
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,23 @@
55

66
from qgis.core import QgsApplication
77
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
1010

1111
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
1215

1316
if TYPE_CHECKING:
1417
from qgis.PyQt.QtWidgets import QLineEdit, QPushButton
1518

1619
ui_path = resources.files(__package__) / "plan_proposition_widget.ui"
1720
FormClass, _ = uic.loadUiType(ui_path)
1821

22+
# TO BE REPLACED
23+
LANGUAGE = "fin"
24+
1925

2026
class PropositionWidget(QWidget, FormClass): # type: ignore
2127
"""A widget representation of a plan proposition."""
@@ -28,23 +34,79 @@ def __init__(self, proposition: Proposition, parent=None):
2834

2935
# TYPES
3036
self.name: QLineEdit
37+
self.value_label: QLabel
3138
self.text_input: QTextEdit
39+
self.add_field_btn: QPushButton
3240
self.del_btn: QPushButton
33-
# Theme
34-
# Ordering
41+
self.form_layout: QFormLayout
42+
self.expand_hide_btn: QToolButton
3543

3644
# INIT
3745
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"))
4057

4158
self.del_btn.setIcon(QgsApplication.getThemeIcon("mActionDeleteSelected.svg"))
4259
self.del_btn.clicked.connect(lambda: self.delete_signal.emit(self))
4360

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+
44105
def into_model(self) -> Proposition:
45106
return Proposition(
46107
name=self.name.text(),
47108
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,
49111
id_=self.proposition.id_,
50112
)

arho_feature_template/gui/components/plan_proposition_widget.ui

+34-7
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<x>0</x>
88
<y>0</y>
99
<width>441</width>
10-
<height>167</height>
10+
<height>207</height>
1111
</rect>
1212
</property>
1313
<property name="sizePolicy">
@@ -58,6 +58,16 @@
5858
</property>
5959
</spacer>
6060
</item>
61+
<item>
62+
<widget class="QPushButton" name="add_field_btn">
63+
<property name="toolTip">
64+
<string>Muu tieto</string>
65+
</property>
66+
<property name="text">
67+
<string/>
68+
</property>
69+
</widget>
70+
</item>
6171
<item>
6272
<widget class="QPushButton" name="del_btn">
6373
<property name="sizePolicy">
@@ -80,7 +90,7 @@
8090
</layout>
8191
</item>
8292
<item>
83-
<layout class="QFormLayout" name="formLayout">
93+
<layout class="QFormLayout" name="form_layout">
8494
<item row="0" column="0">
8595
<widget class="QLabel" name="name_label">
8696
<property name="text">
@@ -89,11 +99,28 @@
8999
</widget>
90100
</item>
91101
<item row="0" column="1">
92-
<widget class="QLineEdit" name="name">
93-
<property name="clearButtonEnabled">
94-
<bool>false</bool>
95-
</property>
96-
</widget>
102+
<layout class="QHBoxLayout" name="horizontalLayout_2">
103+
<item>
104+
<widget class="QLineEdit" name="name">
105+
<property name="clearButtonEnabled">
106+
<bool>false</bool>
107+
</property>
108+
</widget>
109+
</item>
110+
<item>
111+
<widget class="QToolButton" name="expand_hide_btn">
112+
<property name="text">
113+
<string>Laajenna</string>
114+
</property>
115+
<property name="autoRaise">
116+
<bool>false</bool>
117+
</property>
118+
<property name="arrowType">
119+
<enum>Qt::UpArrow</enum>
120+
</property>
121+
</widget>
122+
</item>
123+
</layout>
97124
</item>
98125
<item row="1" column="0">
99126
<widget class="QLabel" name="value_label">

arho_feature_template/gui/components/plan_regulation_widget.ui

-69
Original file line numberDiff line numberDiff line change
@@ -127,75 +127,6 @@
127127
</item>
128128
</layout>
129129
</item>
130-
<item>
131-
<layout class="QVBoxLayout" name="spacer_layout">
132-
<item>
133-
<layout class="QHBoxLayout" name="horizontalLayout_4">
134-
<item>
135-
<spacer name="horizontalSpacer_4">
136-
<property name="orientation">
137-
<enum>Qt::Horizontal</enum>
138-
</property>
139-
<property name="sizeType">
140-
<enum>QSizePolicy::Fixed</enum>
141-
</property>
142-
<property name="sizeHint" stdset="0">
143-
<size>
144-
<width>40</width>
145-
<height>20</height>
146-
</size>
147-
</property>
148-
</spacer>
149-
</item>
150-
<item>
151-
<widget class="Line" name="line">
152-
<property name="minimumSize">
153-
<size>
154-
<width>0</width>
155-
<height>20</height>
156-
</size>
157-
</property>
158-
<property name="orientation">
159-
<enum>Qt::Horizontal</enum>
160-
</property>
161-
</widget>
162-
</item>
163-
<item>
164-
<spacer name="horizontalSpacer_5">
165-
<property name="orientation">
166-
<enum>Qt::Horizontal</enum>
167-
</property>
168-
<property name="sizeType">
169-
<enum>QSizePolicy::Fixed</enum>
170-
</property>
171-
<property name="sizeHint" stdset="0">
172-
<size>
173-
<width>40</width>
174-
<height>20</height>
175-
</size>
176-
</property>
177-
</spacer>
178-
</item>
179-
</layout>
180-
</item>
181-
<item>
182-
<spacer name="verticalSpacer">
183-
<property name="orientation">
184-
<enum>Qt::Vertical</enum>
185-
</property>
186-
<property name="sizeType">
187-
<enum>QSizePolicy::Fixed</enum>
188-
</property>
189-
<property name="sizeHint" stdset="0">
190-
<size>
191-
<width>20</width>
192-
<height>15</height>
193-
</size>
194-
</property>
195-
</spacer>
196-
</item>
197-
</layout>
198-
</item>
199130
</layout>
200131
</widget>
201132
<resources/>

arho_feature_template/project/layers/code_layers.py

+4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ class UndergroundTypeLayer(AbstractCodeLayer):
2626
name = "Maanalaisuuden tyyppi"
2727

2828

29+
class PlanThemeLayer(AbstractCodeLayer):
30+
name = "Kaavoitusteemat"
31+
32+
2933
class PlanRegulationGroupTypeLayer(AbstractCodeLayer):
3034
name = "Kaavamääräysryhmän tyyppi"
3135

arho_feature_template/project/layers/plan_layers.py

+4
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,8 @@ def feature_from_model(cls, model: Proposition) -> QgsFeature:
348348
feature["name"] = {"fin": model.name}
349349
feature["text_value"] = {"fin": model.value}
350350
feature["plan_regulation_group_id"] = model.regulation_group_id_
351+
feature["ordering"] = model.proposition_number
352+
feature["plan_theme_id"] = model.theme_id
351353
feature["id"] = model.id_ if model.id_ else feature["id"]
352354

353355
return feature
@@ -358,6 +360,8 @@ def model_from_feature(cls, feature: QgsFeature) -> Proposition:
358360
name=feature["name"]["fin"],
359361
value=feature["text_value"]["fin"],
360362
regulation_group_id_=feature["plan_regulation_group_id"],
363+
proposition_number=feature["ordering"],
364+
theme_id=feature["plan_theme_id"],
361365
id_=feature["id"],
362366
)
363367

0 commit comments

Comments
 (0)