Skip to content

Commit f6e37e6

Browse files
committed
Replace HRU calculation layer dropdowns with QgsMapLayerComboBox widgets
1 parent 36b6009 commit f6e37e6

File tree

2 files changed

+85
-134
lines changed

2 files changed

+85
-134
lines changed

QTalsim/qtalsim.py

Lines changed: 74 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
from qtalsim_soil_dialog import SoilPreprocessingDialog
4343
from qtalsim_landuse_dialog import LanduseAssignmentDialog
4444
import os.path
45-
from qgis.core import QgsProject, QgsField, QgsVectorLayer, QgsRasterLayer, QgsFeature, QgsGeometry, QgsSpatialIndex, Qgis, QgsMessageLog, QgsLayerTreeGroup, QgsLayerTreeLayer, QgsProcessingFeedback, QgsWkbTypes, QgsFeatureRequest, QgsMapLayer, QgsFields, QgsTask, QgsTaskManager, QgsApplication, QgsExpression
45+
from qgis.core import QgsProject, QgsField, QgsVectorLayer, QgsRasterLayer, QgsFeature, QgsGeometry, QgsSpatialIndex, Qgis, QgsMessageLog, QgsLayerTreeGroup, QgsLayerTreeLayer, QgsProcessingFeedback, QgsWkbTypes, QgsFeatureRequest, QgsMapLayer, QgsFields, QgsMapLayerProxyModel
4646
from qgis.analysis import QgsGeometrySnapper
4747
import processing
4848
import pandas as pd
@@ -386,40 +386,37 @@ def fillPolygonsCombobox(self):
386386
'''
387387
#Get Layers
388388
layers, rasterLayers = self.getAllLayers(QgsProject.instance().layerTreeRoot())
389-
current_text = self.dlg.comboboxEZGLayer.currentText()
390-
self.dlg.comboboxEZGLayer.clear() #clear combobox EZG from previous runs
391-
self.dlg.comboboxEZGLayer.addItem(self.noLayerSelected)
392-
self.dlg.comboboxEZGLayer.addItems([layer.name() for layer in layers])
393-
index = self.dlg.comboboxEZGLayer.findText(current_text)
394-
if index != -1:
395-
self.dlg.comboboxEZGLayer.setCurrentIndex(index)
396389

397-
self.safeConnect(self.dlg.comboboxEZGLayer.currentIndexChanged, self.on_ezg_changed)
390+
# Sub-basin layer
391+
self.dlg.comboboxSubBasinLayer.setFilters(
392+
QgsMapLayerProxyModel.PolygonLayer
393+
)
394+
self.dlg.comboboxSubBasinLayer.layerChanged.connect(self.on_ezg_changed)
398395

399396
#Soil Layer
400-
current_text = self.dlg.comboboxSoilLayer.currentText()
401-
self.dlg.comboboxSoilLayer.clear() #clear combobox soil from previous runs
402-
self.dlg.comboboxSoilLayer.addItems([layer.name() for layer in layers])
403-
index = self.dlg.comboboxSoilLayer.findText(current_text)
404-
if index != -1:
405-
self.dlg.comboboxSoilLayer.setCurrentIndex(index)
397+
self.dlg.comboboxSoilLayer.setFilters(
398+
QgsMapLayerProxyModel.PolygonLayer
399+
)
406400

407401
#Land use layer
408-
current_text = self.dlg.comboboxLanduseLayer.currentText()
409-
self.dlg.comboboxLanduseLayer.clear() #clear combobox Landuse from previous runs
410-
self.dlg.comboboxLanduseLayer.addItems([layer.name() for layer in layers])
411-
index = self.dlg.comboboxLanduseLayer.findText(current_text)
412-
if index != -1:
413-
self.dlg.comboboxLanduseLayer.setCurrentIndex(index)
402+
self.dlg.comboboxLanduseLayer.setFilters(
403+
QgsMapLayerProxyModel.PolygonLayer
404+
)
405+
414406

415407
#DEM Layer
416-
current_text = self.dlg.comboboxDEMLayer.currentText()
417-
self.dlg.comboboxDEMLayer.clear() #clear combobox Landuse from previous runs
418-
self.dlg.comboboxDEMLayer.addItem("Optional: Upload DEM Layer")
419-
self.dlg.comboboxDEMLayer.addItems([layer.name() for layer in rasterLayers])
420-
index = self.dlg.comboboxDEMLayer.findText(current_text)
421-
if index != -1:
422-
self.dlg.comboboxDEMLayer.setCurrentIndex(index)
408+
self.dlg.comboboxDEMLayer.setAllowEmptyLayer(True)
409+
self.dlg.comboboxDEMLayer.setPlaceholderText("Optional: Upload DEM Layer")
410+
self.dlg.comboboxDEMLayer.setFilters(
411+
QgsMapLayerProxyModel.RasterLayer
412+
)
413+
# current_text = self.dlg.comboboxDEMLayer.currentText()
414+
# self.dlg.comboboxDEMLayer.clear() #clear combobox Landuse from previous runs
415+
# self.dlg.comboboxDEMLayer.addItem("Optional: Upload DEM Layer")
416+
# self.dlg.comboboxDEMLayer.addItems([layer.name() for layer in rasterLayers])
417+
# index = self.dlg.comboboxDEMLayer.findText(current_text)
418+
# if index != -1:
419+
# self.dlg.comboboxDEMLayer.setCurrentIndex(index)
423420

424421
def update_layer_name(self, layer_name, function):
425422
'''
@@ -1083,31 +1080,23 @@ def on_ezg_changed(self):
10831080
If the user changes the sub-basin's layer, the field comboboxes to select UI and slope field are updated.
10841081
'''
10851082
try:
1086-
current_text = self.dlg.comboboxEZGLayer.currentText()
1087-
1083+
self.ezgLayerCombobox = self.dlg.comboboxSubBasinLayer.currentLayer()
10881084
current_text_comboboxui = self.dlg.comboboxUICatchment.currentText() #if the current field name exists in new layer - leave this field
10891085
index_ui = -1
1090-
1091-
layers = QgsProject.instance().mapLayersByName(current_text)
1092-
1093-
if not layers: #if the layer does not exist
1094-
return
1095-
1096-
if current_text is not None and current_text != self.noLayerSelected:
1097-
index = self.dlg.comboboxEZGLayer.findText(current_text)
1098-
if index == -1:
1099-
return
1100-
self.dlg.comboboxEZGLayer.setCurrentIndex(index)
1101-
self.ezgLayerCombobox = QgsProject.instance().mapLayersByName(current_text)[0]
1102-
1103-
self.dlg.comboboxUICatchment.clear() #clear combobox EZG from previous runs
1104-
self.dlg.comboboxUICatchment.addItems([field.name() for field in self.ezgLayerCombobox.fields()])
1105-
if current_text_comboboxui is not None:
1106-
index_ui = self.dlg.comboboxUICatchment.findText(current_text_comboboxui)
1107-
if index_ui != -1:
1108-
self.dlg.comboboxUICatchment.setCurrentIndex(index_ui)
1086+
1087+
self.dlg.comboboxUICatchment.clear()
11091088

1110-
except:
1089+
# Add new fields
1090+
self.dlg.comboboxUICatchment.addItems(
1091+
[field.name() for field in self.ezgLayerCombobox.fields()]
1092+
)
1093+
# Restore previously selected field if it still exists
1094+
index_ui = self.dlg.comboboxUICatchment.findText(current_text_comboboxui)
1095+
if index_ui != -1:
1096+
self.dlg.comboboxUICatchment.setCurrentIndex(index_ui)
1097+
1098+
except Exception as e:
1099+
self.log_to_qtalsim_tab(f"Error updating sub-basin layer fields: {e}", Qgis.Critical)
11111100
return
11121101

11131102
def on_input_db_changed(self):
@@ -1246,18 +1235,18 @@ def selectSoil(self):
12461235
#self.dlg.progressbar.setValue(0)
12471236
self.log_to_qtalsim_tab(f"Starting the clipping process of the Soil Layer.", Qgis.Info)
12481237
if self.clippingEZG is None:
1249-
selected_layer_soil = None
1238+
self.soilLayer = None
12501239
raise Exception("User has not selected a sub-basins layer.")
12511240

12521241
#Select Layer
1253-
selected_layer_soil = self.dlg.comboboxSoilLayer.currentText()
1254-
self.soilLayer = QgsProject.instance().mapLayersByName(selected_layer_soil)[0]
1255-
1242+
self.soilLayer = None
1243+
self.soilLayer = self.dlg.comboboxSoilLayer.currentLayer()
1244+
12561245
#Create field with the feature-id
12571246
self.soilFieldInputID = 'fid_qta'
12581247
existing_field_names = [field.name() for field in self.soilLayer.fields()]
12591248
if self.soilFieldInputID in existing_field_names:
1260-
self.log_to_qtalsim_tab(f"Please rename field {self.soilFieldInputID} of layer {selected_layer_soil} or delete the field.", Qgis.Critical)
1249+
self.log_to_qtalsim_tab(f"Please rename field {self.soilFieldInputID} of layer {self.soilLayer.name()} or delete the field.", Qgis.Critical)
12611250
return
12621251
#self.dlg.progressbar.setValue(10)
12631252
self.log_to_qtalsim_tab(f"Progress: 10.00% done", Qgis.Info)
@@ -1299,9 +1288,9 @@ def selectSoil(self):
12991288
#self.dlg.progressbar.setValue(0)
13001289

13011290
finally:
1302-
if selected_layer_soil:
1291+
if self.soilLayer:
13031292
#Remove the created soil-ID-field from the input layer
1304-
layer = QgsProject.instance().mapLayersByName(selected_layer_soil)[0]
1293+
layer = self.soilLayer
13051294
layer.startEditing()
13061295
field_index = layer.fields().indexFromName(self.soilFieldInputID)
13071296

@@ -1874,8 +1863,8 @@ def selectLanduse(self):
18741863
if self.clippingEZG is None:
18751864
selected_layer_name = None
18761865
raise Exception("User has not selected a sub-basins layer.")
1877-
selected_layer_name = self.dlg.comboboxLanduseLayer.currentText()
1878-
self.landuseLayer = QgsProject.instance().mapLayersByName(selected_layer_name)[0]
1866+
1867+
self.landuseLayer = self.dlg.comboboxLanduseLayer.currentLayer()
18791868

18801869
#Create field with the feature-id
18811870
self.landuseFieldInputID = 'fid_qta'
@@ -2630,8 +2619,9 @@ def calculateSlopeHRUs(self, hruLayer):
26302619
'''
26312620

26322621
#Get DEM Layer
2633-
selected_layer_name = self.dlg.comboboxDEMLayer.currentText()
2634-
self.demLayer = QgsProject.instance().mapLayersByName(selected_layer_name)[0]
2622+
self.demLayer = self.dlg.comboboxDEMLayer.currentLayer()
2623+
#selected_layer_name = self.dlg.comboboxDEMLayer.currentText()
2624+
#self.demLayer = QgsProject.instance().mapLayersByName(selected_layer_name)[0]
26352625

26362626
#Calculate Slope Layer
26372627
slope_layer_path = processing.run("native:slope", {'INPUT':self.demLayer, 'Z_FACTOR':1,'OUTPUT':'TEMPORARY_OUTPUT'})['OUTPUT']
@@ -3203,7 +3193,7 @@ def performIntersect(self):
32033193
self.eflLayer = processing.run("native:dissolve", {'INPUT': self.eflLayer,'FIELD': eflFieldList, 'SEPARATE_DISJOINT':False,'OUTPUT':'TEMPORARY_OUTPUT'}, feedback=None)['OUTPUT']
32043194

32053195
#Add Fields
3206-
if self.dlg.comboboxDEMLayer.currentText() != "Optional: Upload DEM Layer":
3196+
if self.dlg.comboboxDEMLayer.currentLayer():
32073197
self.log_to_qtalsim_tab(f"Calculating Slope...", Qgis.Info)
32083198
self.eflLayer = self.calculateSlopeHRUs(self.eflLayer)
32093199
else:
@@ -4356,7 +4346,26 @@ def run(self):
43564346
#Open help - documentation
43574347
self.connectButtontoFunction(self.dlg.finalButtonBox.button(QDialogButtonBox.Help), self.openDocumentation)
43584348

4359-
self.fillPolygonsCombobox()
4349+
# Layer comboboxes
4350+
# Sub-basin layer
4351+
self.dlg.comboboxSubBasinLayer.setFilters(
4352+
QgsMapLayerProxyModel.PolygonLayer
4353+
)
4354+
self.dlg.comboboxSubBasinLayer.layerChanged.connect(self.on_ezg_changed)
4355+
#Soil Layer
4356+
self.dlg.comboboxSoilLayer.setFilters(
4357+
QgsMapLayerProxyModel.PolygonLayer
4358+
)
4359+
#Land use layer
4360+
self.dlg.comboboxLanduseLayer.setFilters(
4361+
QgsMapLayerProxyModel.PolygonLayer
4362+
)
4363+
#DEM Layer
4364+
self.dlg.comboboxDEMLayer.setAllowEmptyLayer(True)
4365+
self.dlg.comboboxDEMLayer.setPlaceholderText("Optional: Upload DEM Layer")
4366+
self.dlg.comboboxDEMLayer.setFilters(
4367+
QgsMapLayerProxyModel.RasterLayer
4368+
)
43604369

43614370
self.feedback = self.CustomFeedback(self.log_to_qtalsim_tab)
43624371

@@ -4396,8 +4405,8 @@ def run(self):
43964405
#self.dlg.groupboxIntersect.setVisible(False)
43974406
self.connectButtontoFunction(self.dlg.onPerformIntersect, self.performIntersect)
43984407

4399-
QgsProject.instance().layersAdded.connect(self.layersAddedHandler)
4400-
QgsProject.instance().layersRemoved.connect(self.layersAddedHandler)
4408+
#QgsProject.instance().layersAdded.connect(self.layersAddedHandler)
4409+
#QgsProject.instance().layersRemoved.connect(self.layersAddedHandler)
44014410

44024411
self.dlg.comboboxEliminateModes.clear()
44034412
self.dlg.comboboxEliminateModes.addItems(['Largest Area', 'Smallest Area','Largest Common Boundary'])

QTalsim/qtalsim_dialog_base.ui

Lines changed: 11 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@
5959
<property name="geometry">
6060
<rect>
6161
<x>0</x>
62-
<y>-140</y>
62+
<y>-144</y>
6363
<width>877</width>
64-
<height>524</height>
64+
<height>528</height>
6565
</rect>
6666
</property>
6767
<layout class="QVBoxLayout" name="verticalLayout">
@@ -96,32 +96,7 @@
9696
</widget>
9797
</item>
9898
<item>
99-
<widget class="QComboBox" name="comboboxEZGLayer">
100-
<property name="sizePolicy">
101-
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
102-
<horstretch>10</horstretch>
103-
<verstretch>0</verstretch>
104-
</sizepolicy>
105-
</property>
106-
<property name="minimumSize">
107-
<size>
108-
<width>0</width>
109-
<height>0</height>
110-
</size>
111-
</property>
112-
<property name="sizeIncrement">
113-
<size>
114-
<width>500</width>
115-
<height>0</height>
116-
</size>
117-
</property>
118-
<property name="baseSize">
119-
<size>
120-
<width>500</width>
121-
<height>0</height>
122-
</size>
123-
</property>
124-
</widget>
99+
<widget class="QgsMapLayerComboBox" name="comboboxSubBasinLayer"/>
125100
</item>
126101
</layout>
127102
</item>
@@ -268,38 +243,7 @@
268243
</widget>
269244
</item>
270245
<item>
271-
<widget class="QComboBox" name="comboboxSoilLayer">
272-
<property name="sizePolicy">
273-
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
274-
<horstretch>10</horstretch>
275-
<verstretch>0</verstretch>
276-
</sizepolicy>
277-
</property>
278-
<property name="minimumSize">
279-
<size>
280-
<width>50</width>
281-
<height>0</height>
282-
</size>
283-
</property>
284-
<property name="maximumSize">
285-
<size>
286-
<width>1677215</width>
287-
<height>16777215</height>
288-
</size>
289-
</property>
290-
<property name="sizeIncrement">
291-
<size>
292-
<width>500</width>
293-
<height>0</height>
294-
</size>
295-
</property>
296-
<property name="baseSize">
297-
<size>
298-
<width>500</width>
299-
<height>0</height>
300-
</size>
301-
</property>
302-
</widget>
246+
<widget class="QgsMapLayerComboBox" name="comboboxSoilLayer"/>
303247
</item>
304248
<item>
305249
<widget class="QPushButton" name="onSoil">
@@ -530,14 +474,7 @@
530474
</widget>
531475
</item>
532476
<item>
533-
<widget class="QComboBox" name="comboboxLanduseLayer">
534-
<property name="sizePolicy">
535-
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
536-
<horstretch>0</horstretch>
537-
<verstretch>0</verstretch>
538-
</sizepolicy>
539-
</property>
540-
</widget>
477+
<widget class="QgsMapLayerComboBox" name="comboboxLanduseLayer"/>
541478
</item>
542479
<item>
543480
<widget class="QPushButton" name="onLanduseLayer">
@@ -686,7 +623,7 @@
686623
</widget>
687624
</item>
688625
<item>
689-
<widget class="QComboBox" name="comboboxDEMLayer"/>
626+
<widget class="QgsMapLayerComboBox" name="comboboxDEMLayer"/>
690627
</item>
691628
</layout>
692629
</item>
@@ -922,6 +859,11 @@ p, li { white-space: pre-wrap; }
922859
<header>qgscollapsiblegroupbox.h</header>
923860
<container>1</container>
924861
</customwidget>
862+
<customwidget>
863+
<class>QgsMapLayerComboBox</class>
864+
<extends>QComboBox</extends>
865+
<header>qgsmaplayercombobox.h</header>
866+
</customwidget>
925867
</customwidgets>
926868
<resources/>
927869
<connections>

0 commit comments

Comments
 (0)