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

Kaavasuositukset kaavalle, yleismääräyksien lisäämiseen muutos #138

Merged
merged 2 commits into from
Jan 30, 2025
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
34 changes: 25 additions & 9 deletions arho_feature_template/core/plan_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -573,20 +573,36 @@ def save_regulation_group(regulation_group: RegulationGroup, plan_id: str | None
feature = RegulationGroupLayer.feature_from_model(regulation_group, plan_id)
layer = RegulationGroupLayer.get_from_project()

editing = regulation_group.id_ is not None
_save_feature(
feature=feature,
layer=layer,
id_=regulation_group.id_,
edit_text="Kaavamääräysryhmän lisäys" if regulation_group.id_ is None else "Kaavamääräysryhmän muokkaus",
edit_text="Kaavamääräysryhmän muokkaus" if editing else "Kaavamääräysryhmän lisäys",
)

# Handle regulations
if editing:
# Check for regulations to be deleted
regulation_layer = PlanRegulationLayer.get_from_project()
for reg_feature in PlanRegulationLayer.get_regulations_to_delete(
regulation_group.regulations, regulation_group
):
_delete_feature(reg_feature, regulation_layer, "Kaavamääräyksen poisto")

# Check for propositions to be deleted
proposition_layer = PlanPropositionLayer.get_from_project()
for prop_feature in PlanPropositionLayer.get_propositions_to_delete(
regulation_group.propositions, regulation_group
):
_delete_feature(prop_feature, proposition_layer, "Kaavasuosituksen poisto")

# Save regulations
if regulation_group.regulations:
for regulation in regulation_group.regulations:
regulation.regulation_group_id_ = feature["id"] # Updating regulation group ID
save_regulation(regulation)

# Handle propositions
# Save propositions
if regulation_group.propositions:
for proposition in regulation_group.propositions:
proposition.regulation_group_id_ = feature["id"] # Updating regulation group ID
Expand All @@ -602,13 +618,13 @@ def delete_regulation_group(regulation_group: RegulationGroup, plan_id: str | No
feature = RegulationGroupLayer.feature_from_model(regulation_group, plan_id)
layer = RegulationGroupLayer.get_from_project()

# # Handle regulations
# for regulation in regulation_group.regulations:
# delete_regulation(regulation)
# Delete regulations
for regulation in regulation_group.regulations:
delete_regulation(regulation)

# # Handle propositions
# for proposition in regulation_group.propositions:
# delete_proposition(proposition)
# Delete propositions
for proposition in regulation_group.propositions:
delete_proposition(proposition)

_delete_feature(feature, layer, "Kaavamääräysryhmän poisto")

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
from __future__ import annotations

from importlib import resources
from typing import TYPE_CHECKING

from qgis.core import QgsApplication
from qgis.PyQt import uic
from qgis.PyQt.QtCore import pyqtSignal
from qgis.PyQt.QtWidgets import QMenu, QWidget

from arho_feature_template.core.models import Proposition, Regulation, RegulationGroup, RegulationLibrary
from arho_feature_template.gui.components.plan_proposition_widget import PropositionWidget
from arho_feature_template.gui.components.plan_regulation_widget import RegulationWidget
from arho_feature_template.project.layers.code_layers import PlanRegulationGroupTypeLayer

if TYPE_CHECKING:
from qgis.PyQt.QtWidgets import QFormLayout, QFrame, QLineEdit, QPushButton

ui_path = resources.files(__package__) / "general_regulation_group_widget.ui"
FormClass, _ = uic.loadUiType(ui_path)


class GeneralRegulationGroupWidget(QWidget, FormClass): # type: ignore
"""A widget representation of a general regulation group."""

# open_as_form_signal = pyqtSignal(QWidget)
delete_signal = pyqtSignal(QWidget)

def __init__(self, regulation_group: RegulationGroup, layer_name: str):
super().__init__()
self.setupUi(self)

# TYPES
self.frame: QFrame
self.name: QLineEdit
# self.edit_btn: QPushButton
self.add_field_btn: QPushButton
self.del_btn: QPushButton
self.regulation_group_details_layout: QFormLayout

# INIT
self.regulation_widgets: list[RegulationWidget] = []
self.proposition_widgets: list[PropositionWidget] = []

regulation_group.type_code_id = PlanRegulationGroupTypeLayer.get_id_by_feature_layer_name(layer_name)
self.from_model(regulation_group)

self.verbal_regulation_config = RegulationLibrary.get_regulation_by_code("sanallinenMaarays")

# self.edit_btn.setIcon(QIcon(resources_path("icons", "settings.svg")))
# self.edit_btn.clicked.connect(lambda: self.open_as_form_signal.emit(self))
add_field_menu = QMenu()
add_field_menu.addAction("Lisää kaavamääräys").triggered.connect(self.add_new_regulation)
add_field_menu.addAction("Lisää kaavasuositus").triggered.connect(self.add_new_proposition)
self.add_field_btn.setMenu(add_field_menu)
self.add_field_btn.setIcon(QgsApplication.getThemeIcon("mActionAdd.svg"))

self.del_btn.setIcon(QgsApplication.getThemeIcon("mActionDeleteSelected.svg"))
self.del_btn.clicked.connect(lambda: self.delete_signal.emit(self))

def from_model(self, regulation_group: RegulationGroup):
self.regulation_group = regulation_group

self.name.setText(regulation_group.name if regulation_group.name else "")

# Remove existing child widgets if reinitializing
for widget in self.regulation_widgets:
self.delete_regulation_widget(widget)
for widget in self.proposition_widgets:
self.delete_proposition_widget(widget)
for regulation in regulation_group.regulations:
self.add_regulation_widget(regulation)
for proposition in regulation_group.propositions:
self.add_proposition_widget(proposition)

def add_new_regulation(self):
regulation = Regulation(self.verbal_regulation_config)
self.add_regulation_widget(regulation)

def add_regulation_widget(self, regulation: Regulation) -> RegulationWidget:
widget = RegulationWidget(regulation=regulation, parent=self.frame)
widget.delete_signal.connect(self.delete_regulation_widget)
self.frame.layout().addWidget(widget)
self.regulation_widgets.append(widget)
return widget

def delete_regulation_widget(self, regulation_widget: RegulationWidget):
self.frame.layout().removeWidget(regulation_widget)
self.regulation_widgets.remove(regulation_widget)
regulation_widget.deleteLater()

def add_new_proposition(self):
proposition = Proposition(value="")
self.add_proposition_widget(proposition)

def add_proposition_widget(self, proposition: Proposition) -> PropositionWidget:
widget = PropositionWidget(proposition=proposition, parent=self.frame)
widget.delete_signal.connect(self.delete_proposition_widget)
self.frame.layout().addWidget(widget)
self.proposition_widgets.append(widget)
return widget

def delete_proposition_widget(self, proposition_widget: RegulationWidget):
self.frame.layout().removeWidget(proposition_widget)
self.proposition_widgets.remove(proposition_widget)
proposition_widget.deleteLater()

def into_model(self) -> RegulationGroup:
return RegulationGroup(
type_code_id=self.regulation_group.type_code_id,
name=self.name.text(),
short_name=None,
color_code=None,
regulations=[widget.into_model() for widget in self.regulation_widgets],
propositions=[widget.into_model() for widget in self.proposition_widgets],
id_=self.regulation_group.id_,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>general_regulation_group_form</class>
<widget class="QWidget" name="general_regulation_group_form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>420</width>
<height>98</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QFrame" name="frame">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="lineWidth">
<number>2</number>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<pointsize>13</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Yleismääräysryhmä</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="add_field_btn">
<property name="maximumSize">
<size>
<width>30</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="del_btn">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>30</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Poista kaavamääräysryhmä</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QFormLayout" name="regulation_group_details_layout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Nimi</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="name">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,16 @@ def from_model(self, regulation_group: RegulationGroup):
self.delete_regulation_widget(widget)
for widget in self.proposition_widgets:
self.delete_proposition_widget(widget)
self.regulation_widgets = [self.add_regulation_widget(reg) for reg in regulation_group.regulations]
self.proposition_widgets = [self.add_proposition_widget(prop) for prop in regulation_group.propositions]
for regulation in regulation_group.regulations:
self.add_regulation_widget(regulation)
for proposition in regulation_group.propositions:
self.add_proposition_widget(proposition)

def add_regulation_widget(self, regulation: Regulation) -> RegulationWidget:
widget = RegulationWidget(regulation=regulation, parent=self.frame)
widget.delete_signal.connect(self.delete_regulation_widget)
self.frame.layout().addWidget(widget)
self.regulation_widgets.append(widget)
return widget

def delete_regulation_widget(self, regulation_widget: RegulationWidget):
Expand All @@ -82,6 +85,7 @@ def add_proposition_widget(self, proposition: Proposition) -> PropositionWidget:
widget = PropositionWidget(proposition=proposition, parent=self.frame)
widget.delete_signal.connect(self.delete_proposition_widget)
self.frame.layout().addWidget(widget)
self.proposition_widgets.append(widget)
return widget

def delete_proposition_widget(self, proposition_widget: RegulationWidget):
Expand Down
Loading
Loading