Skip to content

Commit 7d52c7d

Browse files
committed
feat: add feature template form draft version
1 parent ae4c791 commit 7d52c7d

8 files changed

+568
-3
lines changed

arho_feature_template/core/feature_template_library.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
TemplateSyntaxError,
1616
parse_template_library_config,
1717
)
18-
from arho_feature_template.gui.feature_attribute_form import FeatureAttributeForm
18+
from arho_feature_template.gui.template_attribute_form import TemplateAttributeForm
1919
from arho_feature_template.gui.template_dock import TemplateLibraryDock
2020
from arho_feature_template.resources.template_libraries import library_config_files
2121

@@ -141,7 +141,7 @@ def ask_for_feature_attributes(self, feature: QgsFeature) -> None:
141141
if not self.active_template:
142142
return
143143

144-
attribute_form = FeatureAttributeForm(self.active_template.config.feature)
144+
attribute_form = TemplateAttributeForm(self.active_template.config)
145145

146146
if attribute_form.exec_():
147147
layer = get_layer_from_project(self.active_template.config.feature.layer)

arho_feature_template/core/template_library_config.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,19 @@ class Attribute:
105105

106106
attribute: str
107107
default: str | None
108+
description: str | None
108109

109110
@classmethod
110111
def from_dict(cls, data: dict) -> Attribute:
111-
return cls(attribute=data["attribute"], default=data.get("default"))
112+
return cls(attribute=data["attribute"], default=data.get("default"), description=data.get("description"))
113+
114+
def display(self) -> str:
115+
if self.description is not None:
116+
return self.description
117+
elif self.default is not None:
118+
return self.default
119+
else:
120+
return ""
112121

113122

114123
def parse_template_library_config(template_library_config: Path) -> TemplateLibraryConfig:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
from __future__ import annotations
2+
3+
from collections import defaultdict
4+
from importlib import resources
5+
from typing import TYPE_CHECKING
6+
7+
from qgis.core import QgsApplication
8+
from qgis.PyQt import uic
9+
from qgis.PyQt.QtGui import QFont, QIcon
10+
from qgis.PyQt.QtWidgets import QLabel, QLineEdit, QWidget
11+
12+
from arho_feature_template.qgis_plugin_tools.tools.resources import plugin_path
13+
14+
if TYPE_CHECKING:
15+
from qgis.gui import QgsCollapsibleGroupBox
16+
from qgis.PyQt.QtWidgets import QGridLayout, QPushButton
17+
18+
from arho_feature_template.core.template_library_config import Feature
19+
20+
ui_path = resources.files(__package__) / "plan_regulation_group_widget.ui"
21+
FormClass, _ = uic.loadUiType(ui_path)
22+
23+
24+
class PlanRegulationGroupWidget(QWidget, FormClass): # type: ignore
25+
"""A widget representation of a plan regulation group."""
26+
27+
def __init__(self, feature: Feature):
28+
super().__init__()
29+
self.setupUi(self)
30+
31+
# TYPES
32+
self.heading: QLineEdit
33+
self.conf_btn: QPushButton
34+
self.del_btn: QPushButton
35+
36+
self.plan_regulation_groupbox: QgsCollapsibleGroupBox
37+
self.plan_regulation_grid_layout: QGridLayout
38+
39+
# INIT
40+
self.feature = feature
41+
self.layer = self.feature.layer # Should be plan_regulation_group layer
42+
43+
self.input_value_header = None
44+
self.input_value_col = None
45+
46+
self.additional_information_header = None
47+
self.additional_information_col = None
48+
49+
self.bold_font = QFont()
50+
self.bold_font.setBold(True)
51+
52+
self.init_buttons()
53+
54+
self.attribute_widgets: dict[str, dict[str, QWidget]] = defaultdict(dict)
55+
56+
for attribute_config in feature.attributes:
57+
if attribute_config.attribute == "name":
58+
self.heading.setText(attribute_config.display())
59+
60+
if feature.child_features is not None:
61+
for child in feature.child_features:
62+
if child.layer == "plan_requlation":
63+
self.create_widgets_for_plan_regulation(child)
64+
65+
def init_buttons(self):
66+
self.conf_btn.setIcon(QIcon(plugin_path("resources", "icons", "settings.svg")))
67+
self.del_btn.setIcon(QgsApplication.getThemeIcon("mActionDeleteSelected.svg"))
68+
69+
def create_widgets_for_plan_regulation(self, plan_regulation_feature: Feature):
70+
row = self.plan_regulation_grid_layout.rowCount() + 1
71+
for plan_regulation_config in plan_regulation_feature.attributes:
72+
if plan_regulation_config.attribute == "type_of_plan_regulation_id":
73+
id_label = QLabel(plan_regulation_config.display())
74+
print(plan_regulation_config)
75+
self.plan_regulation_grid_layout.addWidget(id_label, row, 0)
76+
elif plan_regulation_config.attribute == "numeric_default":
77+
if not self.input_value_header:
78+
self.input_value_header = QLabel("Arvo")
79+
self.input_value_header.setFont(self.bold_font)
80+
self.input_value_col = self.plan_regulation_grid_layout.columnCount() + 1
81+
self.plan_regulation_grid_layout.addWidget(self.input_value_header, 0, self.input_value_col)
82+
83+
input_field = QLineEdit()
84+
self.plan_regulation_grid_layout.addWidget(input_field, row, self.input_value_col)
85+
86+
if plan_regulation_feature.child_features is None:
87+
return
88+
for child in plan_regulation_feature.child_features:
89+
# Additional information here, what else?
90+
# Assume attribute is "additional_information_of_plan_regulation"
91+
# NOTE: Could additional information be attribute of plan regulation instead of child feature?
92+
93+
# Add header if not added yet
94+
if not self.additional_information_header:
95+
self.additional_information_header = QLabel("Lisätiedot")
96+
self.additional_information_header.setFont(self.bold_font)
97+
self.additonal_information_col = self.plan_regulation_grid_layout.columnCount() + 1
98+
self.plan_regulation_grid_layout.addWidget(
99+
self.additional_information_header, 0, self.additonal_information_col
100+
)
101+
102+
# TBD: Multiple additional feature per plan regulation
103+
for attribute in child.attributes:
104+
# Assume "type_of_additional_information_id"
105+
additional_information_label = QLabel(attribute.display())
106+
self.plan_regulation_grid_layout.addWidget(
107+
additional_information_label, row, self.additonal_information_col
108+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>plan_regulation_group_form</class>
4+
<widget class="QWidget" name="plan_regulation_group_form">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>582</width>
10+
<height>195</height>
11+
</rect>
12+
</property>
13+
<property name="windowTitle">
14+
<string>Form</string>
15+
</property>
16+
<layout class="QVBoxLayout" name="verticalLayout">
17+
<item>
18+
<layout class="QHBoxLayout" name="plan_regulation_group_heading_layout">
19+
<item>
20+
<widget class="QLabel" name="heading_label">
21+
<property name="sizePolicy">
22+
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
23+
<horstretch>0</horstretch>
24+
<verstretch>0</verstretch>
25+
</sizepolicy>
26+
</property>
27+
<property name="text">
28+
<string>Otsikko:</string>
29+
</property>
30+
</widget>
31+
</item>
32+
<item>
33+
<widget class="QLineEdit" name="heading">
34+
<property name="sizePolicy">
35+
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
36+
<horstretch>0</horstretch>
37+
<verstretch>0</verstretch>
38+
</sizepolicy>
39+
</property>
40+
<property name="text">
41+
<string/>
42+
</property>
43+
</widget>
44+
</item>
45+
<item>
46+
<widget class="QPushButton" name="conf_btn">
47+
<property name="sizePolicy">
48+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
49+
<horstretch>0</horstretch>
50+
<verstretch>0</verstretch>
51+
</sizepolicy>
52+
</property>
53+
<property name="maximumSize">
54+
<size>
55+
<width>30</width>
56+
<height>16777215</height>
57+
</size>
58+
</property>
59+
<property name="text">
60+
<string/>
61+
</property>
62+
</widget>
63+
</item>
64+
<item>
65+
<widget class="QPushButton" name="del_btn">
66+
<property name="sizePolicy">
67+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
68+
<horstretch>0</horstretch>
69+
<verstretch>0</verstretch>
70+
</sizepolicy>
71+
</property>
72+
<property name="maximumSize">
73+
<size>
74+
<width>30</width>
75+
<height>16777215</height>
76+
</size>
77+
</property>
78+
<property name="text">
79+
<string/>
80+
</property>
81+
</widget>
82+
</item>
83+
<item>
84+
<spacer name="plan_regulation_group_heading_spacer">
85+
<property name="orientation">
86+
<enum>Qt::Horizontal</enum>
87+
</property>
88+
<property name="sizeType">
89+
<enum>QSizePolicy::Maximum</enum>
90+
</property>
91+
<property name="sizeHint" stdset="0">
92+
<size>
93+
<width>40</width>
94+
<height>20</height>
95+
</size>
96+
</property>
97+
</spacer>
98+
</item>
99+
</layout>
100+
</item>
101+
<item>
102+
<layout class="QHBoxLayout" name="plan_regulation_group_contents_layout">
103+
<item>
104+
<spacer name="plan_regulation_groupbox_spacer1">
105+
<property name="orientation">
106+
<enum>Qt::Horizontal</enum>
107+
</property>
108+
<property name="sizeType">
109+
<enum>QSizePolicy::Fixed</enum>
110+
</property>
111+
<property name="sizeHint" stdset="0">
112+
<size>
113+
<width>20</width>
114+
<height>20</height>
115+
</size>
116+
</property>
117+
</spacer>
118+
</item>
119+
<item>
120+
<widget class="QgsCollapsibleGroupBox" name="plan_regulation_groupbox">
121+
<property name="title">
122+
<string/>
123+
</property>
124+
<property name="flat">
125+
<bool>false</bool>
126+
</property>
127+
<property name="checkable">
128+
<bool>false</bool>
129+
</property>
130+
<layout class="QHBoxLayout" name="horizontalLayout_4">
131+
<item>
132+
<layout class="QGridLayout" name="plan_regulation_grid_layout">
133+
<item row="0" column="0">
134+
<widget class="QLabel" name="plan_regulation_label">
135+
<property name="sizePolicy">
136+
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
137+
<horstretch>0</horstretch>
138+
<verstretch>0</verstretch>
139+
</sizepolicy>
140+
</property>
141+
<property name="minimumSize">
142+
<size>
143+
<width>175</width>
144+
<height>0</height>
145+
</size>
146+
</property>
147+
<property name="maximumSize">
148+
<size>
149+
<width>175</width>
150+
<height>16777215</height>
151+
</size>
152+
</property>
153+
<property name="font">
154+
<font>
155+
<weight>75</weight>
156+
<bold>true</bold>
157+
</font>
158+
</property>
159+
<property name="text">
160+
<string>Kaavamääräyslaji</string>
161+
</property>
162+
</widget>
163+
</item>
164+
</layout>
165+
</item>
166+
<item>
167+
<spacer name="plan_regulation_groupbox_spacer2">
168+
<property name="orientation">
169+
<enum>Qt::Horizontal</enum>
170+
</property>
171+
<property name="sizeHint" stdset="0">
172+
<size>
173+
<width>0</width>
174+
<height>20</height>
175+
</size>
176+
</property>
177+
</spacer>
178+
</item>
179+
</layout>
180+
</widget>
181+
</item>
182+
</layout>
183+
</item>
184+
</layout>
185+
</widget>
186+
<customwidgets>
187+
<customwidget>
188+
<class>QgsCollapsibleGroupBox</class>
189+
<extends>QGroupBox</extends>
190+
<header>qgscollapsiblegroupbox.h</header>
191+
<container>1</container>
192+
</customwidget>
193+
</customwidgets>
194+
<resources/>
195+
<connections/>
196+
</ui>

0 commit comments

Comments
 (0)