Skip to content

Commit ffa4b04

Browse files
alexbruynyalldawson
authored andcommittedMay 11, 2018
[processing] add modeler GUI for enum parameter
1 parent 213fc55 commit ffa4b04

File tree

3 files changed

+235
-12
lines changed

3 files changed

+235
-12
lines changed
 
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
***************************************************************************
5+
EnumModelerWidget.py
6+
---------------------
7+
Date : May 2018
8+
Copyright : (C) 2018 by Alexander Bruy
9+
Email : alexander dot bruy at gmail dot com
10+
***************************************************************************
11+
* *
12+
* This program is free software; you can redistribute it and/or modify *
13+
* it under the terms of the GNU General Public License as published by *
14+
* the Free Software Foundation; either version 2 of the License, or *
15+
* (at your option) any later version. *
16+
* *
17+
***************************************************************************
18+
"""
19+
20+
__author__ = 'Alexander Bruy'
21+
__date__ = 'May 2018'
22+
__copyright__ = '(C) 2018, Alexander Bruy'
23+
24+
# This will get replaced with a git SHA1 when you do a git archive
25+
26+
__revision__ = '$Format:%H$'
27+
28+
import os
29+
30+
from qgis.PyQt import uic
31+
from qgis.PyQt.QtCore import Qt
32+
from qgis.PyQt.QtGui import QStandardItemModel, QStandardItem
33+
34+
from qgis.core import QgsApplication
35+
36+
pluginPath = os.path.split(os.path.dirname(__file__))[0]
37+
WIDGET, BASE = uic.loadUiType(
38+
os.path.join(pluginPath, 'ui', 'enummodelerwidgetbase.ui'))
39+
40+
41+
class EnumModelerWidget(BASE, WIDGET):
42+
43+
def __init__(self, parent=None):
44+
super(EnumModelerWidget, self).__init__(parent)
45+
self.setupUi(self)
46+
47+
self.btnAdd.setIcon(QgsApplication.getThemeIcon('/symbologyAdd.svg'))
48+
self.btnRemove.setIcon(QgsApplication.getThemeIcon('/symbologyRemove.svg'))
49+
self.btnClear.setIcon(QgsApplication.getThemeIcon('/mIconClearText.svg'))
50+
51+
self.btnAdd.clicked.connect(self.addItem)
52+
self.btnRemove.clicked.connect(lambda: self.removeItems())
53+
self.btnClear.clicked.connect(lambda: self.removeItems(True))
54+
55+
self.lstItems.setModel(QStandardItemModel())
56+
57+
def addItem(self):
58+
model = self.lstItems.model()
59+
60+
item = QStandardItem('new item')
61+
item.setCheckable(True)
62+
item.setCheckState(Qt.Unchecked)
63+
item.setDropEnabled(False)
64+
65+
model.appendRow(item)
66+
67+
def removeItems(self, removeAll=False):
68+
if removeAll:
69+
self.lstItems.model().clear()
70+
else:
71+
self.lstItems.setUpdatesEnabled(False)
72+
indexes = sorted(self.lstItems.selectionModel().selectedIndexes())
73+
for i in reversed(indexes):
74+
self.lstItems.model().removeRow(i.row())
75+
self.lstItems.setUpdatesEnabled(True)
76+
77+
def options(self):
78+
items = []
79+
model = self.lstItems.model()
80+
for i in range(model.rowCount()):
81+
item = model.item(i)
82+
items.append(item.text())
83+
84+
return items
85+
86+
def defaultOption(self):
87+
model = self.lstItems.model()
88+
for i in range(model.rowCount()):
89+
item = model.item(i)
90+
if item.checkState() == Qt.Checked:
91+
return i
92+
return None
93+
94+
def allowMultiple(self):
95+
return self.chkAllowMultiple.isChecked()
96+
97+
def setOptions(self, options):
98+
model = self.lstItems.model()
99+
for i in options:
100+
item = QStandardItem()
101+
item.setCheckable(True)
102+
item.setCheckState(Qt.Unchecked)
103+
item.setDropEnabled(False)
104+
105+
model.appendRow(item)
106+
107+
def setDefault(self, index):
108+
model = self.lstItems.model()
109+
item = model.item(index, 0)
110+
if item:
111+
item.setCheckState(Qt.Checked)
112+
113+
def setAllowMultiple(self):
114+
self.chkAllowMultiple.setChecked(True)

‎python/plugins/processing/modeler/ModelerParameterDefinitionDialog.py

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
* *
1717
***************************************************************************
1818
"""
19-
from processing.modeler.exceptions import UndefinedParameterException
2019

2120
__author__ = 'Victor Olaya'
2221
__date__ = 'August 2012'
@@ -28,6 +27,18 @@
2827

2928
import math
3029

30+
from qgis.PyQt.QtCore import (Qt,
31+
QByteArray,
32+
QCoreApplication)
33+
from qgis.PyQt.QtWidgets import (QDialog,
34+
QVBoxLayout,
35+
QLabel,
36+
QLineEdit,
37+
QComboBox,
38+
QCheckBox,
39+
QDialogButtonBox,
40+
QMessageBox)
41+
3142
from qgis.gui import QgsExpressionLineEdit, QgsProjectionSelectionWidget
3243
from qgis.core import (QgsApplication,
3344
QgsSettings,
@@ -54,19 +65,10 @@
5465
QgsProcessingParameterFeatureSource,
5566
QgsProcessingParameterBand
5667
)
57-
from qgis.PyQt.QtCore import (Qt,
58-
QByteArray,
59-
QCoreApplication)
60-
from qgis.PyQt.QtWidgets import (QDialog,
61-
QVBoxLayout,
62-
QLabel,
63-
QLineEdit,
64-
QComboBox,
65-
QCheckBox,
66-
QDialogButtonBox,
67-
QMessageBox)
6868

69+
from processing.gui.enummodelerwidget import EnumModelerWidget
6970
from processing.core import parameters
71+
from processing.modeler.exceptions import UndefinedParameterException
7072

7173

7274
class ModelerParameterDefinitionDialog(QDialog):
@@ -273,6 +275,14 @@ def setupUi(self):
273275
else:
274276
self.selector.setCrs(QgsCoordinateReferenceSystem('EPSG:4326'))
275277
self.verticalLayout.addWidget(self.selector)
278+
elif self.paramType == parameters.PARAMETER_ENUM or \
279+
isinstance(self.param, QgsProcessingParameterEnum):
280+
self.widget = EnumModelerWidget(self)
281+
if self.param is not None:
282+
self.widget.setOptions(self.param.options())
283+
self.widget.setDefault(int(self.param.defaultValue()))
284+
self.widget.setAllowMultiple(bool(self.param.allowMultiple()))
285+
self.verticalLayout.addWidget(self.widget)
276286

277287
self.verticalLayout.addSpacing(20)
278288
self.requiredCheck = QCheckBox()
@@ -400,6 +410,9 @@ def accept(self):
400410
elif (self.paramType == parameters.PARAMETER_CRS or
401411
isinstance(self.param, QgsProcessingParameterCrs)):
402412
self.param = QgsProcessingParameterCrs(name, description, self.selector.crs().authid())
413+
if (self.paramType == parameters.PARAMETER_ENUM or
414+
isinstance(self.param, QgsProcessingParameterEnum)):
415+
self.param = QgsProcessingParameterEnum(name, description, self.widget.options(), self.widget.allowMultiple(), self.widget.defaultOption())
403416
else:
404417
if self.paramType:
405418
typeId = self.paramType
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>Form</class>
4+
<widget class="QWidget" name="Form">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>400</width>
10+
<height>300</height>
11+
</rect>
12+
</property>
13+
<property name="windowTitle">
14+
<string>Form</string>
15+
</property>
16+
<layout class="QGridLayout" name="gridLayout">
17+
<property name="leftMargin">
18+
<number>0</number>
19+
</property>
20+
<property name="topMargin">
21+
<number>0</number>
22+
</property>
23+
<property name="rightMargin">
24+
<number>0</number>
25+
</property>
26+
<property name="bottomMargin">
27+
<number>0</number>
28+
</property>
29+
<item row="1" column="1">
30+
<widget class="QToolButton" name="btnRemove">
31+
<property name="toolTip">
32+
<string>Remove item</string>
33+
</property>
34+
<property name="text">
35+
<string>...</string>
36+
</property>
37+
</widget>
38+
</item>
39+
<item row="3" column="1">
40+
<spacer name="verticalSpacer">
41+
<property name="orientation">
42+
<enum>Qt::Vertical</enum>
43+
</property>
44+
<property name="sizeHint" stdset="0">
45+
<size>
46+
<width>20</width>
47+
<height>190</height>
48+
</size>
49+
</property>
50+
</spacer>
51+
</item>
52+
<item row="0" column="1">
53+
<widget class="QToolButton" name="btnAdd">
54+
<property name="toolTip">
55+
<string>Add item</string>
56+
</property>
57+
<property name="text">
58+
<string>...</string>
59+
</property>
60+
</widget>
61+
</item>
62+
<item row="2" column="1">
63+
<widget class="QToolButton" name="btnClear">
64+
<property name="toolTip">
65+
<string>Clear all</string>
66+
</property>
67+
<property name="text">
68+
<string>...</string>
69+
</property>
70+
</widget>
71+
</item>
72+
<item row="0" column="0" rowspan="4">
73+
<widget class="QListView" name="lstItems">
74+
<property name="dragDropMode">
75+
<enum>QAbstractItemView::InternalMove</enum>
76+
</property>
77+
<property name="alternatingRowColors">
78+
<bool>true</bool>
79+
</property>
80+
<property name="selectionMode">
81+
<enum>QAbstractItemView::ExtendedSelection</enum>
82+
</property>
83+
</widget>
84+
</item>
85+
<item row="4" column="0" colspan="2">
86+
<widget class="QCheckBox" name="chkAllowMultiple">
87+
<property name="text">
88+
<string>Allow multiple selection</string>
89+
</property>
90+
</widget>
91+
</item>
92+
</layout>
93+
</widget>
94+
<resources/>
95+
<connections/>
96+
</ui>

0 commit comments

Comments
 (0)
Please sign in to comment.