Skip to content

Commit 9130c8c

Browse files
committed
redesign general regulations UI, add propositions for plan
1 parent d504a46 commit 9130c8c

5 files changed

+374
-107
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
from __future__ import annotations
2+
3+
from importlib import resources
4+
from typing import TYPE_CHECKING
5+
6+
from qgis.core import QgsApplication
7+
from qgis.PyQt import uic
8+
from qgis.PyQt.QtCore import pyqtSignal
9+
from qgis.PyQt.QtWidgets import QMenu, QWidget
10+
11+
from arho_feature_template.core.models import Proposition, Regulation, RegulationGroup, RegulationLibrary
12+
from arho_feature_template.gui.components.plan_proposition_widget import PropositionWidget
13+
from arho_feature_template.gui.components.plan_regulation_widget import RegulationWidget
14+
from arho_feature_template.project.layers.code_layers import PlanRegulationGroupTypeLayer
15+
16+
if TYPE_CHECKING:
17+
from qgis.PyQt.QtWidgets import QFormLayout, QFrame, QLineEdit, QPushButton
18+
19+
ui_path = resources.files(__package__) / "general_regulation_group_widget.ui"
20+
FormClass, _ = uic.loadUiType(ui_path)
21+
22+
23+
class GeneralRegulationGroupWidget(QWidget, FormClass): # type: ignore
24+
"""A widget representation of a general regulation group."""
25+
26+
# open_as_form_signal = pyqtSignal(QWidget)
27+
delete_signal = pyqtSignal(QWidget)
28+
29+
def __init__(self, regulation_group: RegulationGroup, layer_name: str):
30+
super().__init__()
31+
self.setupUi(self)
32+
33+
# TYPES
34+
self.frame: QFrame
35+
self.name: QLineEdit
36+
# self.edit_btn: QPushButton
37+
self.add_field_btn: QPushButton
38+
self.del_btn: QPushButton
39+
self.regulation_group_details_layout: QFormLayout
40+
41+
# INIT
42+
self.regulation_widgets: list[RegulationWidget] = []
43+
self.proposition_widgets: list[PropositionWidget] = []
44+
45+
regulation_group.type_code_id = PlanRegulationGroupTypeLayer.get_id_by_feature_layer_name(layer_name)
46+
self.from_model(regulation_group)
47+
48+
self.verbal_regulation_config = RegulationLibrary.get_regulation_by_code("sanallinenMaarays")
49+
50+
# self.edit_btn.setIcon(QIcon(resources_path("icons", "settings.svg")))
51+
# self.edit_btn.clicked.connect(lambda: self.open_as_form_signal.emit(self))
52+
add_field_menu = QMenu()
53+
add_field_menu.addAction("Lisää kaavamääräys").triggered.connect(self.add_new_regulation)
54+
add_field_menu.addAction("Lisää kaavasuositus").triggered.connect(self.add_new_proposition)
55+
self.add_field_btn.setMenu(add_field_menu)
56+
self.add_field_btn.setIcon(QgsApplication.getThemeIcon("mActionAdd.svg"))
57+
58+
self.del_btn.setIcon(QgsApplication.getThemeIcon("mActionDeleteSelected.svg"))
59+
self.del_btn.clicked.connect(lambda: self.delete_signal.emit(self))
60+
61+
def from_model(self, regulation_group: RegulationGroup):
62+
self.regulation_group = regulation_group
63+
64+
self.name.setText(regulation_group.name if regulation_group.name else "")
65+
66+
# Remove existing child widgets if reinitializing
67+
for widget in self.regulation_widgets:
68+
self.delete_regulation_widget(widget)
69+
for widget in self.proposition_widgets:
70+
self.delete_proposition_widget(widget)
71+
for regulation in regulation_group.regulations:
72+
self.add_regulation_widget(regulation)
73+
for proposition in regulation_group.propositions:
74+
self.add_proposition_widget(proposition)
75+
76+
def add_new_regulation(self):
77+
regulation = Regulation(self.verbal_regulation_config)
78+
self.add_regulation_widget(regulation)
79+
80+
def add_regulation_widget(self, regulation: Regulation) -> RegulationWidget:
81+
widget = RegulationWidget(regulation=regulation, parent=self.frame)
82+
widget.delete_signal.connect(self.delete_regulation_widget)
83+
self.frame.layout().addWidget(widget)
84+
self.regulation_widgets.append(widget)
85+
return widget
86+
87+
def delete_regulation_widget(self, regulation_widget: RegulationWidget):
88+
self.frame.layout().removeWidget(regulation_widget)
89+
self.regulation_widgets.remove(regulation_widget)
90+
regulation_widget.deleteLater()
91+
92+
def add_new_proposition(self):
93+
proposition = Proposition(value="")
94+
self.add_proposition_widget(proposition)
95+
96+
def add_proposition_widget(self, proposition: Proposition) -> PropositionWidget:
97+
widget = PropositionWidget(proposition=proposition, parent=self.frame)
98+
widget.delete_signal.connect(self.delete_proposition_widget)
99+
self.frame.layout().addWidget(widget)
100+
self.proposition_widgets.append(widget)
101+
return widget
102+
103+
def delete_proposition_widget(self, proposition_widget: RegulationWidget):
104+
self.frame.layout().removeWidget(proposition_widget)
105+
self.proposition_widgets.remove(proposition_widget)
106+
proposition_widget.deleteLater()
107+
108+
def into_model(self) -> RegulationGroup:
109+
return RegulationGroup(
110+
type_code_id=self.regulation_group.type_code_id,
111+
name=self.name.text(),
112+
short_name=None,
113+
color_code=None,
114+
regulations=[widget.into_model() for widget in self.regulation_widgets],
115+
propositions=[widget.into_model() for widget in self.proposition_widgets],
116+
id_=self.regulation_group.id_,
117+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>general_regulation_group_form</class>
4+
<widget class="QWidget" name="general_regulation_group_form">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>420</width>
10+
<height>98</height>
11+
</rect>
12+
</property>
13+
<property name="sizePolicy">
14+
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
15+
<horstretch>0</horstretch>
16+
<verstretch>0</verstretch>
17+
</sizepolicy>
18+
</property>
19+
<property name="windowTitle">
20+
<string>Form</string>
21+
</property>
22+
<layout class="QVBoxLayout" name="verticalLayout_2">
23+
<item>
24+
<widget class="QFrame" name="frame">
25+
<property name="sizePolicy">
26+
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
27+
<horstretch>0</horstretch>
28+
<verstretch>0</verstretch>
29+
</sizepolicy>
30+
</property>
31+
<property name="frameShape">
32+
<enum>QFrame::StyledPanel</enum>
33+
</property>
34+
<property name="frameShadow">
35+
<enum>QFrame::Raised</enum>
36+
</property>
37+
<property name="lineWidth">
38+
<number>2</number>
39+
</property>
40+
<layout class="QVBoxLayout" name="verticalLayout">
41+
<item>
42+
<layout class="QHBoxLayout" name="horizontalLayout">
43+
<item>
44+
<widget class="QLabel" name="label_2">
45+
<property name="font">
46+
<font>
47+
<pointsize>13</pointsize>
48+
<weight>75</weight>
49+
<italic>false</italic>
50+
<bold>true</bold>
51+
</font>
52+
</property>
53+
<property name="text">
54+
<string>Yleismääräysryhmä</string>
55+
</property>
56+
</widget>
57+
</item>
58+
<item>
59+
<spacer name="horizontalSpacer">
60+
<property name="orientation">
61+
<enum>Qt::Horizontal</enum>
62+
</property>
63+
<property name="sizeHint" stdset="0">
64+
<size>
65+
<width>40</width>
66+
<height>20</height>
67+
</size>
68+
</property>
69+
</spacer>
70+
</item>
71+
<item>
72+
<widget class="QPushButton" name="add_field_btn">
73+
<property name="maximumSize">
74+
<size>
75+
<width>30</width>
76+
<height>16777215</height>
77+
</size>
78+
</property>
79+
<property name="text">
80+
<string/>
81+
</property>
82+
</widget>
83+
</item>
84+
<item>
85+
<widget class="QPushButton" name="del_btn">
86+
<property name="sizePolicy">
87+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
88+
<horstretch>0</horstretch>
89+
<verstretch>0</verstretch>
90+
</sizepolicy>
91+
</property>
92+
<property name="maximumSize">
93+
<size>
94+
<width>30</width>
95+
<height>16777215</height>
96+
</size>
97+
</property>
98+
<property name="toolTip">
99+
<string>Poista kaavamääräysryhmä</string>
100+
</property>
101+
<property name="text">
102+
<string/>
103+
</property>
104+
</widget>
105+
</item>
106+
</layout>
107+
</item>
108+
<item>
109+
<layout class="QFormLayout" name="regulation_group_details_layout">
110+
<item row="0" column="0">
111+
<widget class="QLabel" name="label">
112+
<property name="sizePolicy">
113+
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
114+
<horstretch>0</horstretch>
115+
<verstretch>0</verstretch>
116+
</sizepolicy>
117+
</property>
118+
<property name="minimumSize">
119+
<size>
120+
<width>0</width>
121+
<height>0</height>
122+
</size>
123+
</property>
124+
<property name="maximumSize">
125+
<size>
126+
<width>16777215</width>
127+
<height>16777215</height>
128+
</size>
129+
</property>
130+
<property name="font">
131+
<font>
132+
<weight>50</weight>
133+
<bold>false</bold>
134+
</font>
135+
</property>
136+
<property name="text">
137+
<string>Nimi</string>
138+
</property>
139+
</widget>
140+
</item>
141+
<item row="0" column="1">
142+
<widget class="QLineEdit" name="name">
143+
<property name="sizePolicy">
144+
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
145+
<horstretch>0</horstretch>
146+
<verstretch>0</verstretch>
147+
</sizepolicy>
148+
</property>
149+
<property name="text">
150+
<string/>
151+
</property>
152+
</widget>
153+
</item>
154+
</layout>
155+
</item>
156+
</layout>
157+
</widget>
158+
</item>
159+
</layout>
160+
</widget>
161+
<resources/>
162+
<connections/>
163+
</ui>

arho_feature_template/gui/components/plan_regulation_group_widget.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,16 @@ def from_model(self, regulation_group: RegulationGroup):
6464
self.delete_regulation_widget(widget)
6565
for widget in self.proposition_widgets:
6666
self.delete_proposition_widget(widget)
67-
self.regulation_widgets = [self.add_regulation_widget(reg) for reg in regulation_group.regulations]
68-
self.proposition_widgets = [self.add_proposition_widget(prop) for prop in regulation_group.propositions]
67+
for regulation in regulation_group.regulations:
68+
self.add_regulation_widget(regulation)
69+
for proposition in regulation_group.propositions:
70+
self.add_proposition_widget(proposition)
6971

7072
def add_regulation_widget(self, regulation: Regulation) -> RegulationWidget:
7173
widget = RegulationWidget(regulation=regulation, parent=self.frame)
7274
widget.delete_signal.connect(self.delete_regulation_widget)
7375
self.frame.layout().addWidget(widget)
76+
self.regulation_widgets.append(widget)
7477
return widget
7578

7679
def delete_regulation_widget(self, regulation_widget: RegulationWidget):
@@ -82,6 +85,7 @@ def add_proposition_widget(self, proposition: Proposition) -> PropositionWidget:
8285
widget = PropositionWidget(proposition=proposition, parent=self.frame)
8386
widget.delete_signal.connect(self.delete_proposition_widget)
8487
self.frame.layout().addWidget(widget)
88+
self.proposition_widgets.append(widget)
8589
return widget
8690

8791
def delete_proposition_widget(self, proposition_widget: RegulationWidget):

0 commit comments

Comments
 (0)