Skip to content

Commit 6536779

Browse files
committed
add general regulations to plan attribute form
1 parent d5329d1 commit 6536779

4 files changed

+222
-46
lines changed

arho_feature_template/gui/plan_attribure_form.py

+77-4
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,35 @@
11
from __future__ import annotations
22

3+
import os
34
from importlib import resources
5+
from pathlib import Path
46
from typing import TYPE_CHECKING
57

68
from qgis.PyQt import uic
7-
from qgis.PyQt.QtWidgets import QDialog, QDialogButtonBox
9+
from qgis.PyQt.QtCore import Qt
10+
from qgis.PyQt.QtWidgets import (
11+
QComboBox,
12+
QDialog,
13+
QDialogButtonBox,
14+
QLineEdit,
15+
QSizePolicy,
16+
QSpacerItem,
17+
QTextEdit,
18+
QTreeWidget,
19+
QTreeWidgetItem,
20+
)
821

9-
from arho_feature_template.core.models import Plan
22+
from arho_feature_template.core.models import Plan, RegulationGroup, RegulationGroupLibrary
23+
from arho_feature_template.gui.plan_regulation_group_widget import RegulationGroupWidget
1024
from arho_feature_template.project.layers.code_layers import (
1125
LifeCycleStatusLayer,
1226
OrganisationLayer,
1327
PlanTypeLayer,
1428
)
29+
from arho_feature_template.qgis_plugin_tools.tools.resources import resources_path
1530

1631
if TYPE_CHECKING:
17-
from qgis.PyQt.QtWidgets import QLineEdit, QTextEdit
32+
from qgis.PyQt.QtWidgets import QComboBox, QLineEdit, QTextEdit, QTreeWidget, QWidget
1833

1934
from arho_feature_template.gui.code_combobox import CodeComboBox, HierarchicalCodeComboBox
2035

@@ -33,6 +48,10 @@ class PlanAttributeForm(QDialog, FormClass): # type: ignore
3348
producers_plan_identifier_line_edit: QLineEdit
3449
matter_management_identifier_line_edit: QLineEdit
3550

51+
plan_regulation_group_scrollarea_contents: QWidget
52+
plan_regulation_group_libraries_combobox: QComboBox
53+
plan_regulation_groups_tree: QTreeWidget
54+
3655
button_box: QDialogButtonBox
3756

3857
def __init__(self, parent=None):
@@ -49,6 +68,11 @@ def __init__(self, parent=None):
4968
self.plan_type_combo_box.currentIndexChanged.connect(self._check_required_fields)
5069
self.lifecycle_status_combo_box.currentIndexChanged.connect(self._check_required_fields)
5170

71+
self.scroll_area_spacer = None
72+
self.regulation_group_widgets: list[RegulationGroupWidget] = []
73+
self.init_plan_regulation_group_libraries()
74+
self.plan_regulation_groups_tree.itemDoubleClicked.connect(self.add_selected_plan_regulation_group)
75+
5276
self.button_box.button(QDialogButtonBox.Ok).setEnabled(False)
5377

5478
def _check_required_fields(self) -> None:
@@ -63,6 +87,55 @@ def _check_required_fields(self) -> None:
6387
else:
6488
ok_button.setEnabled(False)
6589

90+
# --- COPIED FROM TEMPLATE ATTRIBUTE FORM ---
91+
92+
def _add_spacer(self):
93+
self.scroll_area_spacer = QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding)
94+
self.plan_regulation_group_scrollarea_contents.layout().addItem(self.scroll_area_spacer)
95+
96+
def _remove_spacer(self):
97+
if self.scroll_area_spacer is not None:
98+
self.plan_regulation_group_scrollarea_contents.layout().removeItem(self.scroll_area_spacer)
99+
self.scroll_area_spacer = None
100+
101+
def add_selected_plan_regulation_group(self, item: QTreeWidgetItem, column: int):
102+
if not item.parent():
103+
return
104+
regulation_group: RegulationGroup = item.data(column, Qt.UserRole)
105+
self.add_plan_regulation_group(regulation_group)
106+
107+
def add_plan_regulation_group(self, regulation_group: RegulationGroup):
108+
regulation_group_widget = RegulationGroupWidget(regulation_group, general_regulation=True)
109+
regulation_group_widget.delete_signal.connect(self.remove_plan_regulation_group)
110+
self._remove_spacer()
111+
self.plan_regulation_group_scrollarea_contents.layout().addWidget(regulation_group_widget)
112+
self.regulation_group_widgets.append(regulation_group_widget)
113+
self._add_spacer()
114+
115+
def remove_plan_regulation_group(self, regulation_group_widget: RegulationGroupWidget):
116+
self.plan_regulation_group_scrollarea_contents.layout().removeWidget(regulation_group_widget)
117+
self.regulation_group_widgets.remove(regulation_group_widget)
118+
regulation_group_widget.deleteLater()
119+
120+
def init_plan_regulation_group_libraries(self):
121+
katja_asemakaava_path = Path(os.path.join(resources_path(), "katja_asemakaava.yaml"))
122+
libraries = [RegulationGroupLibrary.from_config_file(katja_asemakaava_path)]
123+
for library in libraries:
124+
self.init_plan_regulation_group_library(library)
125+
126+
def init_plan_regulation_group_library(self, library: RegulationGroupLibrary):
127+
self.plan_regulation_group_libraries_combobox.addItem(library.name)
128+
for category in library.regulation_group_categories:
129+
category_item = QTreeWidgetItem()
130+
category_item.setText(0, category.name)
131+
self.plan_regulation_groups_tree.addTopLevelItem(category_item)
132+
for group_definition in category.regulation_groups:
133+
regulation_group_item = QTreeWidgetItem(category_item)
134+
regulation_group_item.setText(0, group_definition.name)
135+
regulation_group_item.setData(0, Qt.UserRole, group_definition)
136+
137+
# ---
138+
66139
def get_plan_attributes(self) -> Plan:
67140
return Plan(
68141
id_=None,
@@ -75,5 +148,5 @@ def get_plan_attributes(self) -> Plan:
75148
producers_plan_identifier=self.producers_plan_identifier_line_edit.text() or None,
76149
matter_management_identifier=self.matter_management_identifier_line_edit.text() or None,
77150
lifecycle_status_id=self.lifecycle_status_combo_box.value(),
78-
general_regulations=[],
151+
general_regulations=[reg_group_widget.into_model() for reg_group_widget in self.regulation_group_widgets],
79152
)

arho_feature_template/gui/plan_attribute_form.ui

+125-39
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
<rect>
1010
<x>0</x>
1111
<y>0</y>
12-
<width>535</width>
13-
<height>343</height>
12+
<width>873</width>
13+
<height>662</height>
1414
</rect>
1515
</property>
1616
<property name="windowTitle">
@@ -34,16 +34,16 @@
3434
</attribute>
3535
<layout class="QVBoxLayout" name="verticalLayout_3">
3636
<property name="leftMargin">
37-
<number>0</number>
37+
<number>9</number>
3838
</property>
3939
<property name="topMargin">
40-
<number>0</number>
40+
<number>9</number>
4141
</property>
4242
<property name="rightMargin">
43-
<number>0</number>
43+
<number>9</number>
4444
</property>
4545
<property name="bottomMargin">
46-
<number>0</number>
46+
<number>9</number>
4747
</property>
4848
<item>
4949
<widget class="QScrollArea" name="general_info_scroll_area">
@@ -61,19 +61,19 @@
6161
<rect>
6262
<x>0</x>
6363
<y>0</y>
64-
<width>505</width>
65-
<height>264</height>
64+
<width>831</width>
65+
<height>562</height>
6666
</rect>
6767
</property>
6868
<layout class="QVBoxLayout" name="verticalLayout_4">
6969
<property name="leftMargin">
70-
<number>0</number>
70+
<number>9</number>
7171
</property>
7272
<property name="rightMargin">
73-
<number>0</number>
73+
<number>9</number>
7474
</property>
7575
<property name="bottomMargin">
76-
<number>0</number>
76+
<number>9</number>
7777
</property>
7878
<item>
7979
<layout class="QFormLayout" name="formLayout">
@@ -235,34 +235,115 @@
235235
<attribute name="title">
236236
<string>Yleismääräykset</string>
237237
</attribute>
238-
<layout class="QVBoxLayout" name="verticalLayout_2">
239-
<property name="leftMargin">
240-
<number>0</number>
241-
</property>
242-
<property name="topMargin">
243-
<number>0</number>
244-
</property>
245-
<property name="rightMargin">
246-
<number>0</number>
247-
</property>
248-
<property name="bottomMargin">
249-
<number>0</number>
250-
</property>
238+
<layout class="QVBoxLayout" name="verticalLayout_7">
251239
<item>
252-
<widget class="QScrollArea" name="general_regulations_scroll_area">
253-
<property name="widgetResizable">
254-
<bool>true</bool>
240+
<widget class="QGroupBox" name="groupBox">
241+
<property name="title">
242+
<string>Yleismääräykset</string>
255243
</property>
256-
<widget class="QWidget" name="scrollAreaWidgetContents_2">
257-
<property name="geometry">
258-
<rect>
259-
<x>0</x>
260-
<y>0</y>
261-
<width>505</width>
262-
<height>264</height>
263-
</rect>
264-
</property>
265-
</widget>
244+
<layout class="QHBoxLayout" name="horizontalLayout">
245+
<item>
246+
<layout class="QVBoxLayout" name="verticalLayout_5">
247+
<item>
248+
<widget class="QLabel" name="label_6">
249+
<property name="text">
250+
<string>Kaavamääräysryhmäkirjastot</string>
251+
</property>
252+
</widget>
253+
</item>
254+
<item>
255+
<widget class="QComboBox" name="plan_regulation_group_libraries_combobox"/>
256+
</item>
257+
<item>
258+
<widget class="QgsFilterLineEdit" name="mLineEdit">
259+
<property name="enabled">
260+
<bool>false</bool>
261+
</property>
262+
<property name="sizePolicy">
263+
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
264+
<horstretch>0</horstretch>
265+
<verstretch>0</verstretch>
266+
</sizepolicy>
267+
</property>
268+
<property name="placeholderText">
269+
<string>Suodata kaavamääräysryhmiä</string>
270+
</property>
271+
<property name="clearButtonEnabled">
272+
<bool>false</bool>
273+
</property>
274+
<property name="showSearchIcon">
275+
<bool>true</bool>
276+
</property>
277+
<property name="qgisRelation" stdset="0">
278+
<string notr="true"/>
279+
</property>
280+
</widget>
281+
</item>
282+
<item>
283+
<widget class="QTreeWidget" name="plan_regulation_groups_tree">
284+
<property name="sizePolicy">
285+
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
286+
<horstretch>0</horstretch>
287+
<verstretch>0</verstretch>
288+
</sizepolicy>
289+
</property>
290+
<property name="frameShape">
291+
<enum>QFrame::StyledPanel</enum>
292+
</property>
293+
<property name="frameShadow">
294+
<enum>QFrame::Sunken</enum>
295+
</property>
296+
<property name="editTriggers">
297+
<set>QAbstractItemView::NoEditTriggers</set>
298+
</property>
299+
<property name="dragDropMode">
300+
<enum>QAbstractItemView::NoDragDrop</enum>
301+
</property>
302+
<property name="alternatingRowColors">
303+
<bool>false</bool>
304+
</property>
305+
<attribute name="headerVisible">
306+
<bool>false</bool>
307+
</attribute>
308+
<column>
309+
<property name="text">
310+
<string/>
311+
</property>
312+
</column>
313+
</widget>
314+
</item>
315+
</layout>
316+
</item>
317+
<item>
318+
<layout class="QVBoxLayout" name="verticalLayout_2">
319+
<item>
320+
<widget class="QLabel" name="label_7">
321+
<property name="text">
322+
<string>Valitut yleismääräysryhmät</string>
323+
</property>
324+
</widget>
325+
</item>
326+
<item>
327+
<widget class="QScrollArea" name="plan_regulation_group_scrollarea">
328+
<property name="widgetResizable">
329+
<bool>true</bool>
330+
</property>
331+
<widget class="QWidget" name="plan_regulation_group_scrollarea_contents">
332+
<property name="geometry">
333+
<rect>
334+
<x>0</x>
335+
<y>0</y>
336+
<width>541</width>
337+
<height>493</height>
338+
</rect>
339+
</property>
340+
<layout class="QVBoxLayout" name="verticalLayout_6"/>
341+
</widget>
342+
</widget>
343+
</item>
344+
</layout>
345+
</item>
346+
</layout>
266347
</widget>
267348
</item>
268349
</layout>
@@ -289,12 +370,17 @@
289370
<container>1</container>
290371
</customwidget>
291372
<customwidget>
292-
<class>HierarchicalCodeComboBox</class>
373+
<class>QgsFilterLineEdit</class>
374+
<extends>QLineEdit</extends>
375+
<header>qgsfilterlineedit.h</header>
376+
</customwidget>
377+
<customwidget>
378+
<class>CodeComboBox</class>
293379
<extends>QComboBox</extends>
294380
<header>arho_feature_template.gui.code_combobox</header>
295381
</customwidget>
296382
<customwidget>
297-
<class>CodeComboBox</class>
383+
<class>HierarchicalCodeComboBox</class>
298384
<extends>QComboBox</extends>
299385
<header>arho_feature_template.gui.code_combobox</header>
300386
</customwidget>

arho_feature_template/gui/plan_regulation_group_widget.py

+19-2
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,19 @@ class RegulationGroupWidget(QWidget, FormClass): # type: ignore
2626

2727
delete_signal = pyqtSignal(QWidget)
2828

29-
def __init__(self, regulation_group_data: RegulationGroup):
29+
def __init__(
30+
self,
31+
regulation_group_data: RegulationGroup,
32+
general_regulation: bool = False, # noqa: FBT001, FBT002
33+
):
3034
super().__init__()
3135
self.setupUi(self)
3236

3337
# TYPES
3438
self.frame: QFrame
3539
self.name: QLineEdit
3640
self.short_name: QLineEdit
41+
self.short_name_label: QLabel
3742
self.del_btn: QPushButton
3843
self.type_of_regulation_group_label: QLabel
3944
self.type_of_regulation_group: CodeComboBox
@@ -42,13 +47,25 @@ def __init__(self, regulation_group_data: RegulationGroup):
4247
# by the plan feature directly (and hidden from user)
4348

4449
# INIT
50+
self.is_general_regulation = general_regulation
4551
self.regulation_group_data = regulation_group_data
4652
self.regulation_widgets: list[RegulationWidget] = [
4753
self.add_regulation_widget(regulation) for regulation in self.regulation_group_data.regulations
4854
]
4955

5056
# If regulation group type code is defined, delete selection for user
57+
if self.is_general_regulation:
58+
regulation_group_data.type_code_id = PlanRegulationGroupTypeLayer.get_id_of_regulation_type(
59+
"generalRegulations"
60+
)
61+
# Remove short name row
62+
self.regulation_group_details_layout.removeWidget(self.short_name_label)
63+
self.regulation_group_details_layout.removeWidget(self.short_name)
64+
self.short_name_label.deleteLater()
65+
self.short_name.deleteLater()
66+
5167
if regulation_group_data.type_code_id:
68+
# Remove type of plan regulation group row
5269
self.regulation_group_details_layout.removeWidget(self.type_of_regulation_group_label)
5370
self.regulation_group_details_layout.removeWidget(self.type_of_regulation_group)
5471
self.type_of_regulation_group_label.deleteLater()
@@ -79,7 +96,7 @@ def into_model(self) -> RegulationGroup:
7996
if self.regulation_group_data.type_code_id
8097
else self.type_of_regulation_group.value(),
8198
name=self.name.text(),
82-
short_name=self.short_name.text(),
99+
short_name=None if self.is_general_regulation else self.short_name.text(),
83100
color_code=self.regulation_group_data.color_code,
84101
regulations=[widget.into_model() for widget in self.regulation_widgets],
85102
id_=self.regulation_group_data.id_,

0 commit comments

Comments
 (0)