Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Yleismääräyksien lisääminen kaavan lomakkeessa #98

Merged
merged 1 commit into from
Dec 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 77 additions & 4 deletions arho_feature_template/gui/plan_attribure_form.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,35 @@
from __future__ import annotations

import os
from importlib import resources
from pathlib import Path
from typing import TYPE_CHECKING

from qgis.PyQt import uic
from qgis.PyQt.QtWidgets import QDialog, QDialogButtonBox
from qgis.PyQt.QtCore import Qt
from qgis.PyQt.QtWidgets import (
QComboBox,
QDialog,
QDialogButtonBox,
QLineEdit,
QSizePolicy,
QSpacerItem,
QTextEdit,
QTreeWidget,
QTreeWidgetItem,
)

from arho_feature_template.core.models import Plan
from arho_feature_template.core.models import Plan, RegulationGroup, RegulationGroupLibrary
from arho_feature_template.gui.plan_regulation_group_widget import RegulationGroupWidget
from arho_feature_template.project.layers.code_layers import (
LifeCycleStatusLayer,
OrganisationLayer,
PlanTypeLayer,
)
from arho_feature_template.qgis_plugin_tools.tools.resources import resources_path

if TYPE_CHECKING:
from qgis.PyQt.QtWidgets import QLineEdit, QTextEdit
from qgis.PyQt.QtWidgets import QComboBox, QLineEdit, QTextEdit, QTreeWidget, QWidget

from arho_feature_template.gui.code_combobox import CodeComboBox, HierarchicalCodeComboBox

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

plan_regulation_group_scrollarea_contents: QWidget
plan_regulation_group_libraries_combobox: QComboBox
plan_regulation_groups_tree: QTreeWidget

button_box: QDialogButtonBox

def __init__(self, parent=None):
Expand All @@ -49,6 +68,11 @@ def __init__(self, parent=None):
self.plan_type_combo_box.currentIndexChanged.connect(self._check_required_fields)
self.lifecycle_status_combo_box.currentIndexChanged.connect(self._check_required_fields)

self.scroll_area_spacer = None
self.regulation_group_widgets: list[RegulationGroupWidget] = []
self.init_plan_regulation_group_libraries()
self.plan_regulation_groups_tree.itemDoubleClicked.connect(self.add_selected_plan_regulation_group)

self.button_box.button(QDialogButtonBox.Ok).setEnabled(False)

def _check_required_fields(self) -> None:
Expand All @@ -63,6 +87,55 @@ def _check_required_fields(self) -> None:
else:
ok_button.setEnabled(False)

# --- COPIED FROM TEMPLATE ATTRIBUTE FORM ---

def _add_spacer(self):
self.scroll_area_spacer = QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding)
self.plan_regulation_group_scrollarea_contents.layout().addItem(self.scroll_area_spacer)

def _remove_spacer(self):
if self.scroll_area_spacer is not None:
self.plan_regulation_group_scrollarea_contents.layout().removeItem(self.scroll_area_spacer)
self.scroll_area_spacer = None

def add_selected_plan_regulation_group(self, item: QTreeWidgetItem, column: int):
if not item.parent():
return
regulation_group: RegulationGroup = item.data(column, Qt.UserRole)
self.add_plan_regulation_group(regulation_group)

def add_plan_regulation_group(self, regulation_group: RegulationGroup):
regulation_group_widget = RegulationGroupWidget(regulation_group, general_regulation=True)
regulation_group_widget.delete_signal.connect(self.remove_plan_regulation_group)
self._remove_spacer()
self.plan_regulation_group_scrollarea_contents.layout().addWidget(regulation_group_widget)
self.regulation_group_widgets.append(regulation_group_widget)
self._add_spacer()

def remove_plan_regulation_group(self, regulation_group_widget: RegulationGroupWidget):
self.plan_regulation_group_scrollarea_contents.layout().removeWidget(regulation_group_widget)
self.regulation_group_widgets.remove(regulation_group_widget)
regulation_group_widget.deleteLater()

def init_plan_regulation_group_libraries(self):
katja_asemakaava_path = Path(os.path.join(resources_path(), "katja_asemakaava.yaml"))
libraries = [RegulationGroupLibrary.from_config_file(katja_asemakaava_path)]
for library in libraries:
self.init_plan_regulation_group_library(library)

def init_plan_regulation_group_library(self, library: RegulationGroupLibrary):
self.plan_regulation_group_libraries_combobox.addItem(library.name)
for category in library.regulation_group_categories:
category_item = QTreeWidgetItem()
category_item.setText(0, category.name)
self.plan_regulation_groups_tree.addTopLevelItem(category_item)
for group_definition in category.regulation_groups:
regulation_group_item = QTreeWidgetItem(category_item)
regulation_group_item.setText(0, group_definition.name)
regulation_group_item.setData(0, Qt.UserRole, group_definition)

# ---

def get_plan_attributes(self) -> Plan:
return Plan(
id_=None,
Expand All @@ -75,5 +148,5 @@ def get_plan_attributes(self) -> Plan:
producers_plan_identifier=self.producers_plan_identifier_line_edit.text() or None,
matter_management_identifier=self.matter_management_identifier_line_edit.text() or None,
lifecycle_status_id=self.lifecycle_status_combo_box.value(),
general_regulations=[],
general_regulations=[reg_group_widget.into_model() for reg_group_widget in self.regulation_group_widgets],
)
164 changes: 125 additions & 39 deletions arho_feature_template/gui/plan_attribute_form.ui
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>535</width>
<height>343</height>
<width>873</width>
<height>662</height>
</rect>
</property>
<property name="windowTitle">
Expand All @@ -34,16 +34,16 @@
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="leftMargin">
<number>0</number>
<number>9</number>
</property>
<property name="topMargin">
<number>0</number>
<number>9</number>
</property>
<property name="rightMargin">
<number>0</number>
<number>9</number>
</property>
<property name="bottomMargin">
<number>0</number>
<number>9</number>
</property>
<item>
<widget class="QScrollArea" name="general_info_scroll_area">
Expand All @@ -61,19 +61,19 @@
<rect>
<x>0</x>
<y>0</y>
<width>505</width>
<height>264</height>
<width>831</width>
<height>562</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="leftMargin">
<number>0</number>
<number>9</number>
</property>
<property name="rightMargin">
<number>0</number>
<number>9</number>
</property>
<property name="bottomMargin">
<number>0</number>
<number>9</number>
</property>
<item>
<layout class="QFormLayout" name="formLayout">
Expand Down Expand Up @@ -235,34 +235,115 @@
<attribute name="title">
<string>Yleismääräykset</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QScrollArea" name="general_regulations_scroll_area">
<property name="widgetResizable">
<bool>true</bool>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Yleismääräykset</string>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents_2">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>505</width>
<height>264</height>
</rect>
</property>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Kaavamääräysryhmäkirjastot</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="plan_regulation_group_libraries_combobox"/>
</item>
<item>
<widget class="QgsFilterLineEdit" name="mLineEdit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="placeholderText">
<string>Suodata kaavamääräysryhmiä</string>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="showSearchIcon">
<bool>true</bool>
</property>
<property name="qgisRelation" stdset="0">
<string notr="true"/>
</property>
</widget>
</item>
<item>
<widget class="QTreeWidget" name="plan_regulation_groups_tree">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::NoDragDrop</enum>
</property>
<property name="alternatingRowColors">
<bool>false</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string/>
</property>
</column>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_7">
<property name="text">
<string>Valitut yleismääräysryhmät</string>
</property>
</widget>
</item>
<item>
<widget class="QScrollArea" name="plan_regulation_group_scrollarea">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="plan_regulation_group_scrollarea_contents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>541</width>
<height>493</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6"/>
</widget>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
Expand All @@ -289,12 +370,17 @@
<container>1</container>
</customwidget>
<customwidget>
<class>HierarchicalCodeComboBox</class>
<class>QgsFilterLineEdit</class>
<extends>QLineEdit</extends>
<header>qgsfilterlineedit.h</header>
</customwidget>
<customwidget>
<class>CodeComboBox</class>
<extends>QComboBox</extends>
<header>arho_feature_template.gui.code_combobox</header>
</customwidget>
<customwidget>
<class>CodeComboBox</class>
<class>HierarchicalCodeComboBox</class>
<extends>QComboBox</extends>
<header>arho_feature_template.gui.code_combobox</header>
</customwidget>
Expand Down
21 changes: 19 additions & 2 deletions arho_feature_template/gui/plan_regulation_group_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,19 @@ class RegulationGroupWidget(QWidget, FormClass): # type: ignore

delete_signal = pyqtSignal(QWidget)

def __init__(self, regulation_group_data: RegulationGroup):
def __init__(
self,
regulation_group_data: RegulationGroup,
general_regulation: bool = False, # noqa: FBT001, FBT002
):
super().__init__()
self.setupUi(self)

# TYPES
self.frame: QFrame
self.name: QLineEdit
self.short_name: QLineEdit
self.short_name_label: QLabel
self.del_btn: QPushButton
self.type_of_regulation_group_label: QLabel
self.type_of_regulation_group: CodeComboBox
Expand All @@ -42,13 +47,25 @@ def __init__(self, regulation_group_data: RegulationGroup):
# by the plan feature directly (and hidden from user)

# INIT
self.is_general_regulation = general_regulation
self.regulation_group_data = regulation_group_data
self.regulation_widgets: list[RegulationWidget] = [
self.add_regulation_widget(regulation) for regulation in self.regulation_group_data.regulations
]

# If regulation group type code is defined, delete selection for user
if self.is_general_regulation:
regulation_group_data.type_code_id = PlanRegulationGroupTypeLayer.get_id_of_regulation_type(
"generalRegulations"
)
# Remove short name row
self.regulation_group_details_layout.removeWidget(self.short_name_label)
self.regulation_group_details_layout.removeWidget(self.short_name)
self.short_name_label.deleteLater()
self.short_name.deleteLater()

if regulation_group_data.type_code_id:
# Remove type of plan regulation group row
self.regulation_group_details_layout.removeWidget(self.type_of_regulation_group_label)
self.regulation_group_details_layout.removeWidget(self.type_of_regulation_group)
self.type_of_regulation_group_label.deleteLater()
Expand Down Expand Up @@ -79,7 +96,7 @@ def into_model(self) -> RegulationGroup:
if self.regulation_group_data.type_code_id
else self.type_of_regulation_group.value(),
name=self.name.text(),
short_name=self.short_name.text(),
short_name=None if self.is_general_regulation else self.short_name.text(),
color_code=self.regulation_group_data.color_code,
regulations=[widget.into_model() for widget in self.regulation_widgets],
id_=self.regulation_group_data.id_,
Expand Down
Loading
Loading