diff --git a/arho_feature_template/gui/plan_regulation_widget.py b/arho_feature_template/gui/plan_regulation_widget.py
index 6f0fdbd..fcdbbb4 100644
--- a/arho_feature_template/gui/plan_regulation_widget.py
+++ b/arho_feature_template/gui/plan_regulation_widget.py
@@ -1,6 +1,5 @@
from __future__ import annotations
-from collections import defaultdict
from importlib import resources
from typing import TYPE_CHECKING, cast
@@ -10,21 +9,19 @@
from qgis.PyQt.QtCore import Qt, pyqtSignal
from qgis.PyQt.QtWidgets import (
QFormLayout,
- QHBoxLayout,
QLabel,
QLineEdit,
QMenu,
QSizePolicy,
QTextEdit,
+ QToolButton,
QWidget,
)
from arho_feature_template.core.plan_regulation_config import PlanRegulationConfig, Unit, ValueType
-from arho_feature_template.utils.misc_utils import get_additional_information_name
+from arho_feature_template.utils.misc_utils import get_additional_information_name, get_layer_by_name
if TYPE_CHECKING:
- from numbers import Number
-
from qgis.PyQt.QtWidgets import QPushButton
from arho_feature_template.core.plan_regulation_group_config import PlanRegulationDefinition
@@ -56,21 +53,23 @@ def __init__(self, config: PlanRegulationConfig, parent=None):
self.setupUi(self)
# TYPES
+ # self.spacer_layout: QBoxLayout
self.plan_regulation_name: QLineEdit
self.form_layout: QFormLayout
self.add_additional_information_btn: QPushButton
- self.add_regulation_number_btn: QPushButton
- self.add_file_btn: QPushButton
+ self.add_field_btn: QPushButton
self.del_btn: QPushButton
+ self.expand_hide_btn: QToolButton
+
+ self.code_label: QLabel
+ self.code: QLineEdit
# INIT
self.config = config
self.regulation_number_added = False
- # Key is related field name, value is 1) widget, 2) tuple of widget and default value
- # NOTE: Maybe this is not something needed? Instead, when user clicks Ok, write into a YAML
- # in a separate script?
- self.attribute_widgets: dict[str, QWidget | tuple[QWidget, str | Number]] = defaultdict(dict)
+ self.expanded = True
+ self.widgets: list[tuple[QLabel, QWidget]] = []
self.plan_regulation_name.setText(config.name)
self.plan_regulation_name.setReadOnly(True)
self.init_value_fields()
@@ -80,44 +79,35 @@ def populate_from_definition(self, definition: PlanRegulationDefinition):
# Additional information
for info in definition.additional_information:
info_type: str = cast("str", info["type"])
- layout = self.add_additional_info(info_type)
- if info_type in ADDITIONAL_INFORMATION_TYPES_WITH_INPUT:
+ self.add_additional_info(info_type)
+ if info_type == "kayttotarkoituskohdistus":
info_value_widget = QLineEdit()
- layout.addWidget(info_value_widget)
+ label = QLabel(get_additional_information_name(info_type))
value = info.get("value")
if value:
info_value_widget.setText(value)
+ self.form_layout.addRow(label, info_value_widget)
# TODO: Other saved information from PlanRegulationDefinition
def init_value_fields(self):
- layout = QHBoxLayout()
value_type = self.config.value_type
if value_type:
- self._add_value_input(value_type, layout)
-
- unit = self.config.unit
- if unit:
- self._add_value_unit(unit, layout)
+ self._add_value_input(value_type, self.config.unit)
- def _add_value_input(self, value_type: ValueType, layout: QHBoxLayout):
+ def _add_value_input(self, value_type: ValueType, unit: Unit | None):
if value_type in [ValueType.DECIMAL, ValueType.POSITIVE_DECIMAL]:
- self.add_decimal_input(layout, value_type)
+ self.add_decimal_input(value_type, unit)
elif value_type == ValueType.POSITIVE_INTEGER:
- self.add_positive_integer_input(layout)
+ self.add_positive_integer_input(unit)
elif value_type == ValueType.POSITIVE_INTEGER_RANGE:
- self.add_positive_integer_range_input(layout)
+ self.add_positive_integer_range_input(unit)
elif value_type == ValueType.VERSIONED_TEXT:
- self.add_versioned_text_input(layout)
+ self.add_versioned_text_input()
else:
msg = f"Invalid input value type for plan regulation: {value_type}"
raise ValueError(msg)
- def _add_value_unit(self, unit: Unit, layout: QHBoxLayout):
- # NOTE: Unit could also be suffix in the QgsSpinBox, could be clearer?
- unit_label = QLabel(unit.value)
- layout.addWidget(unit_label)
-
def init_buttons(self):
# DEL
self.del_btn.setIcon(QgsApplication.getThemeIcon("mActionDeleteSelected.svg"))
@@ -157,65 +147,122 @@ def init_buttons(self):
type_main_menu.addMenu(type_menu)
type_main_menu.addMenu(signifigance_menu)
self.add_additional_information_btn.setMenu(type_main_menu)
-
- # REGULATION NUMBER
- self.add_regulation_number_btn.clicked.connect(self.add_regulation_number)
-
- # ADD FILE
- self.add_file_btn.clicked.connect(self.add_file)
-
- def add_decimal_input(self, layout: QHBoxLayout, value_type: ValueType):
+ self.add_additional_information_btn.setIcon(QgsApplication.getThemeIcon("mActionPropertiesWidget.svg"))
+
+ # OTHER INFO / ADD FIELD
+ add_field_menu = QMenu(self)
+ add_field_menu.addAction("Määräysnumero").triggered.connect(self.add_regulation_number)
+ add_field_menu.addAction("Liiteasiakirja").triggered.connect(self.add_file)
+ add_field_menu.addAction("Aihetunniste").triggered.connect(self.add_topic_tag)
+
+ theme_menu = QMenu("Kaavoitusteema", self)
+ language = "fin"
+ for feature in get_layer_by_name("Kaavoitusteemat").getFeatures():
+ name = feature["name"][language]
+ action = theme_menu.addAction(name)
+ action.triggered.connect(lambda _, name=name: self.add_theme(name))
+ add_field_menu.addMenu(theme_menu)
+
+ self.add_field_btn.setMenu(add_field_menu)
+ self.add_field_btn.setIcon(QgsApplication.getThemeIcon("mActionAdd.svg"))
+
+ # EXPAND BTN
+ self.expand_hide_btn.clicked.connect(self._on_expand_hide_btn_clicked)
+
+ def _on_expand_hide_btn_clicked(self):
+ if self.expanded:
+ for label, value_widget in self.widgets:
+ self.form_layout.removeWidget(label)
+ label.hide()
+ self.form_layout.removeWidget(value_widget)
+ value_widget.hide()
+ self.expand_hide_btn.setArrowType(Qt.ArrowType.DownArrow)
+ self.expanded = False
+ else:
+ for label, value_widget in self.widgets:
+ self.form_layout.addRow(label, value_widget)
+ label.show()
+ value_widget.show()
+ self.expand_hide_btn.setArrowType(Qt.ArrowType.UpArrow)
+ self.expanded = True
+
+ def _add_widgets_to_form(self, label: QLabel, widget: QWidget):
+ self.form_layout.addRow(label, widget)
+ self.widgets.append((label, widget))
+ if not self.expanded:
+ self._on_expand_hide_btn_clicked()
+
+ def add_decimal_input(self, value_type: ValueType, unit: Unit | None):
value_widget = QgsDoubleSpinBox()
- label_text = "Desimaali"
+ label = QLabel("Arvo")
if value_type == ValueType.POSITIVE_DECIMAL:
value_widget.setMinimum(0.0)
- label_text += " (positiivinen)"
+ label.setToolTip("Tyyppi: desimaali (positiivinen)")
else:
value_widget.setMinimum(-9999.9)
+ label.setToolTip("Tyyppi: desimaali")
value_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
- layout.addWidget(value_widget)
- self.form_layout.addRow(label_text, layout)
+ if unit:
+ value_widget.setSuffix(f" {unit.value}")
+ self._add_widgets_to_form(label, value_widget)
- def add_positive_integer_input(self, layout: QHBoxLayout):
+ def add_positive_integer_input(self, unit: Unit | None):
value_widget = QgsSpinBox()
value_widget.setMinimum(0)
value_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
- layout.addWidget(value_widget)
- self.form_layout.addRow("Kokonaisluku (positiivinen)", layout)
+ if unit:
+ value_widget.setSuffix(f" {unit.value}")
+ label = QLabel("Arvo")
+ label.setToolTip("Tyyppi: kokonaisluku (positiivinen)")
+ self._add_widgets_to_form(label, value_widget)
- def add_positive_integer_range_input(self, layout: QHBoxLayout):
+ def add_positive_integer_range_input(self, unit: Unit | None):
min_widget = QgsSpinBox()
min_widget.setMinimum(0)
+ min_label = QLabel("Arvo minimi")
+ min_label.setToolTip("Tyyppi: kokonaisluku arvoväli (positiivinen)")
+
max_widget = QgsSpinBox()
max_widget.setMinimum(0)
- layout.addWidget(min_widget)
- dash_label = QLabel(" — ")
- dash_label.setAlignment(Qt.AlignCenter)
- dash_label.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
- layout.addWidget(dash_label)
- layout.addWidget(max_widget)
- self.form_layout.addRow("Kokonaisluku arvoväli (positiivinen)", layout)
-
- def add_versioned_text_input(self, layout: QHBoxLayout):
+ max_label = QLabel("Arvo maksimi")
+ max_label.setToolTip("Tyyppi: kokonaisluku arvoväli (positiivinen)")
+ if unit:
+ min_widget.setSuffix(f" {unit.value}")
+ max_widget.setSuffix(f" {unit.value}")
+ self._add_widgets_to_form(min_label, min_widget)
+ self._add_widgets_to_form(max_label, max_widget)
+
+ def add_versioned_text_input(self):
text_widget = QTextEdit()
- layout.addWidget(text_widget)
- self.form_layout.addRow("Kieliversioitu teksti", layout)
-
- def add_additional_info(self, info_type: str) -> QHBoxLayout:
- layout = QHBoxLayout()
- info_name = get_additional_information_name(info_type)
- info_type_label = QLineEdit(info_name)
- info_type_label.setReadOnly(True)
- layout.addWidget(info_type_label)
- self.form_layout.addRow("Lisätiedonlaji", layout)
- return layout
+ label = QLabel("Arvo")
+ label.setToolTip("Tyyppi: kieliversioitu teksti")
+ self._add_widgets_to_form(label, text_widget)
+
+ def add_additional_info(self, info_type: str):
+ info_type_line = QLineEdit(get_additional_information_name(info_type))
+ info_type_line.setReadOnly(True)
+ label = QLabel("Lisätiedonlaji")
+ self._add_widgets_to_form(label, info_type_line)
def add_regulation_number(self):
if not self.regulation_number_added:
number_widget = QgsSpinBox()
- self.form_layout.addRow("Määräysnumero", number_widget)
+ label = QLabel("Määräysnumero")
+ self._add_widgets_to_form(label, number_widget)
self.regulation_number_added = True
def add_file(self):
file_input = QgsFileWidget()
- self.form_layout.addRow("Liiteasiakirja", file_input)
+ label = QLabel("Liiteasiakirja")
+ self._add_widgets_to_form(label, file_input)
+
+ def add_topic_tag(self):
+ text_input = QLineEdit()
+ label = QLabel("Aihetunniste")
+ self._add_widgets_to_form(label, text_input)
+
+ def add_theme(self, theme_name: str):
+ theme_type_line = QLineEdit(theme_name)
+ theme_type_line.setReadOnly(True)
+ label = QLabel("Kaavoitusteema")
+ self._add_widgets_to_form(label, theme_type_line)
diff --git a/arho_feature_template/gui/plan_regulation_widget.ui b/arho_feature_template/gui/plan_regulation_widget.ui
index e6f5225..e767ec4 100644
--- a/arho_feature_template/gui/plan_regulation_widget.ui
+++ b/arho_feature_template/gui/plan_regulation_widget.ui
@@ -7,131 +7,166 @@
0
0
694
- 108
+ 131
+
+
+ 0
+ 0
+
+
Form
+
+
+
- -
-
-
-
-
-
- Kaavamääräyslaji
-
-
-
- -
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 30
- 16777215
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Lisätieto
+
+
+ Qt::Horizontal
-
+
+
+ 40
+ 20
+
+
+
-
-
+
- Määräysnumero
+ Lisätieto
-
-
+
- Liiteasiakirja
+ Muu tieto
-
-
-
- Qt::Horizontal
+
+
+
+ 0
+ 0
+
-
+
- 40
- 20
+ 16777215
+ 16777215
-
+
+ Poista
+
+
-
-
-
-
-
-
- Qt::Horizontal
-
-
- QSizePolicy::Fixed
-
-
-
- 40
- 20
-
+
+
-
+
+
+ Kaavamääräyslaji
-
+
+ -
+
+
-
+
+
+ -
+
+
+ Laajenna
+
+
+ false
+
+
+ Qt::UpArrow
+
+
+
+
+
+
+
+ -
+
-
-
-
-
- 0
- 20
-
-
-
- Qt::Horizontal
-
-
+
+
-
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Fixed
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Fixed
+
+
+
+ 40
+ 20
+
+
+
+
+
-
-
+
- Qt::Horizontal
+ Qt::Vertical
QSizePolicy::Fixed
- 40
- 20
+ 20
+ 15