2016-08-23 10:46:22 +02:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
"""
|
|
|
|
***************************************************************************
|
2016-09-16 12:04:12 +02:00
|
|
|
wrappers.py
|
2016-08-23 10:46:22 +02:00
|
|
|
---------------------
|
|
|
|
Date : May 2016
|
2016-09-07 14:30:20 +02:00
|
|
|
Copyright : (C) 2016 by Arnaud Morvan, Victor Olaya
|
2016-08-23 10:46:22 +02:00
|
|
|
Email : arnaud dot morvan at camptocamp dot com
|
2016-09-07 14:30:20 +02:00
|
|
|
volayaf at gmail dot com
|
2016-08-23 10:46:22 +02:00
|
|
|
***************************************************************************
|
|
|
|
* *
|
|
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
|
|
* it under the terms of the GNU General Public License as published by *
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
|
|
* (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
***************************************************************************
|
|
|
|
"""
|
2016-09-27 19:51:06 +02:00
|
|
|
from builtins import str
|
|
|
|
from builtins import range
|
2016-08-23 10:46:22 +02:00
|
|
|
|
2016-09-18 23:25:25 +02:00
|
|
|
|
2016-08-23 10:46:22 +02:00
|
|
|
__author__ = 'Arnaud Morvan'
|
|
|
|
__date__ = 'May 2016'
|
|
|
|
__copyright__ = '(C) 2016, Arnaud Morvan'
|
|
|
|
|
|
|
|
# This will get replaced with a git SHA1 when you do a git archive
|
|
|
|
|
|
|
|
__revision__ = '$Format:%H$'
|
|
|
|
|
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
import locale
|
2016-09-18 23:25:25 +02:00
|
|
|
import os
|
2016-09-19 14:35:33 +02:00
|
|
|
from functools import cmp_to_key
|
2016-08-23 10:46:22 +02:00
|
|
|
|
2016-11-13 19:05:28 +10:00
|
|
|
from qgis.core import QgsCoordinateReferenceSystem, QgsVectorLayer, QgsApplication
|
|
|
|
from qgis.PyQt.QtWidgets import QCheckBox, QComboBox, QLineEdit, QPlainTextEdit, QWidget, QHBoxLayout, QToolButton
|
2016-11-14 12:36:12 +10:00
|
|
|
from qgis.gui import (QgsFieldExpressionWidget,
|
|
|
|
QgsExpressionLineEdit,
|
|
|
|
QgsProjectionSelectionWidget,
|
|
|
|
QgsGenericProjectionSelector,
|
|
|
|
QgsFieldComboBox,
|
|
|
|
QgsFieldProxyModel)
|
2016-09-07 14:30:20 +02:00
|
|
|
from qgis.PyQt.QtCore import pyqtSignal, QObject, QVariant
|
2016-08-23 10:46:22 +02:00
|
|
|
|
2016-11-11 11:02:42 +10:00
|
|
|
from processing.gui.NumberInputPanel import NumberInputPanel, ModellerNumberInputPanel
|
2016-09-07 14:30:20 +02:00
|
|
|
from processing.gui.InputLayerSelectorPanel import InputLayerSelectorPanel
|
|
|
|
from processing.modeler.MultilineTextPanel import MultilineTextPanel
|
|
|
|
from processing.gui.PointSelectionPanel import PointSelectionPanel
|
2016-11-03 16:37:00 +10:00
|
|
|
from processing.core.parameters import (ParameterBoolean,
|
|
|
|
ParameterPoint,
|
|
|
|
ParameterFile,
|
|
|
|
ParameterRaster,
|
|
|
|
ParameterVector,
|
|
|
|
ParameterNumber,
|
|
|
|
ParameterString,
|
|
|
|
ParameterExpression,
|
|
|
|
ParameterTable,
|
|
|
|
ParameterTableField,
|
|
|
|
ParameterExtent,
|
|
|
|
ParameterFixedTable,
|
|
|
|
ParameterCrs,
|
|
|
|
_resolveLayers)
|
2016-09-07 14:30:20 +02:00
|
|
|
from processing.core.ProcessingConfig import ProcessingConfig
|
|
|
|
from processing.gui.FileSelectionPanel import FileSelectionPanel
|
2016-09-16 12:04:12 +02:00
|
|
|
from processing.core.outputs import (OutputFile, OutputRaster, OutputVector, OutputNumber,
|
2016-09-19 11:52:31 +03:00
|
|
|
OutputString, OutputTable, OutputExtent)
|
2016-09-07 14:30:20 +02:00
|
|
|
from processing.tools import dataobjects
|
|
|
|
from processing.gui.MultipleInputPanel import MultipleInputPanel
|
|
|
|
from processing.gui.BatchInputSelectionPanel import BatchInputSelectionPanel
|
|
|
|
from processing.gui.FixedTablePanel import FixedTablePanel
|
|
|
|
from processing.gui.ExtentSelectionPanel import ExtentSelectionPanel
|
2016-09-09 07:02:54 +02:00
|
|
|
from processing.gui.StringInputPanel import StringInputPanel
|
2016-09-09 10:48:51 +02:00
|
|
|
from processing.gui.GeometryPredicateSelectionPanel import GeometryPredicateSelectionPanel
|
2016-09-07 14:30:20 +02:00
|
|
|
|
2016-08-24 15:23:25 +02:00
|
|
|
|
2016-08-23 10:46:22 +02:00
|
|
|
DIALOG_STANDARD = 'standard'
|
|
|
|
DIALOG_BATCH = 'batch'
|
|
|
|
DIALOG_MODELER = 'modeler'
|
|
|
|
|
2016-09-19 11:52:31 +03:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
class InvalidParameterValue(Exception):
|
|
|
|
pass
|
2016-08-23 10:46:22 +02:00
|
|
|
|
|
|
|
|
2016-09-19 11:52:31 +03:00
|
|
|
dialogTypes = {"AlgorithmDialog": DIALOG_STANDARD,
|
|
|
|
"ModelerParametersDialog": DIALOG_MODELER,
|
2016-09-07 14:30:20 +02:00
|
|
|
"BatchAlgorithmDialog": DIALOG_BATCH}
|
2016-08-23 10:46:22 +02:00
|
|
|
|
2016-09-19 11:52:31 +03:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def getExtendedLayerName(layer):
|
|
|
|
authid = layer.crs().authid()
|
|
|
|
if ProcessingConfig.getSetting(ProcessingConfig.SHOW_CRS_DEF) and authid is not None:
|
|
|
|
return u'{} [{}]'.format(layer.name(), authid)
|
|
|
|
else:
|
|
|
|
return layer.name()
|
|
|
|
|
2016-09-19 11:52:31 +03:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
class WidgetWrapper(QObject):
|
2016-08-23 10:46:22 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
widgetValueHasChanged = pyqtSignal(object)
|
2016-08-23 10:46:22 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def __init__(self, param, dialog, row=0, col=0):
|
|
|
|
QObject.__init__(self)
|
2016-08-23 10:46:22 +02:00
|
|
|
self.param = param
|
|
|
|
self.dialog = dialog
|
2016-09-07 14:30:20 +02:00
|
|
|
self.row = row
|
|
|
|
self.col = col
|
2016-09-14 07:26:45 +02:00
|
|
|
self.dialogType = dialogTypes.get(dialog.__class__.__name__, DIALOG_STANDARD)
|
2016-09-03 02:25:30 +02:00
|
|
|
self.widget = self.createWidget()
|
2016-09-07 14:30:20 +02:00
|
|
|
if param.default is not None:
|
|
|
|
self.setValue(param.default)
|
|
|
|
|
2016-11-13 19:05:28 +10:00
|
|
|
def comboValue(self, validator=None, combobox=None):
|
|
|
|
if not combobox:
|
|
|
|
combobox = self.widget
|
|
|
|
idx = combobox.findText(combobox.currentText())
|
2016-09-07 14:30:20 +02:00
|
|
|
if idx < 0:
|
2016-11-13 19:05:28 +10:00
|
|
|
v = combobox.currentText().strip()
|
2016-09-07 14:30:20 +02:00
|
|
|
if validator is not None and not validator(v):
|
|
|
|
raise InvalidParameterValue()
|
|
|
|
return v
|
2016-11-13 19:05:28 +10:00
|
|
|
return combobox.itemData(combobox.currentIndex())
|
2016-09-03 02:25:30 +02:00
|
|
|
|
|
|
|
def createWidget(self):
|
2016-08-23 10:46:22 +02:00
|
|
|
pass
|
|
|
|
|
|
|
|
def setValue(self, value):
|
|
|
|
pass
|
|
|
|
|
2016-11-13 19:05:28 +10:00
|
|
|
def setComboValue(self, value, combobox=None):
|
|
|
|
if not combobox:
|
|
|
|
combobox = self.widget
|
2016-09-07 14:30:20 +02:00
|
|
|
if isinstance(value, list):
|
|
|
|
value = value[0]
|
2016-11-13 19:05:28 +10:00
|
|
|
values = [combobox.itemData(i) for i in range(combobox.count())]
|
2016-09-03 02:25:30 +02:00
|
|
|
try:
|
|
|
|
idx = values.index(value)
|
2016-11-13 19:05:28 +10:00
|
|
|
combobox.setCurrentIndex(idx)
|
2016-09-08 09:57:18 +02:00
|
|
|
return
|
2016-09-03 02:25:30 +02:00
|
|
|
except ValueError:
|
|
|
|
pass
|
2016-11-13 19:05:28 +10:00
|
|
|
if combobox.isEditable():
|
2016-09-07 14:30:20 +02:00
|
|
|
if value is not None:
|
2016-11-13 19:05:28 +10:00
|
|
|
combobox.setEditText(str(value))
|
2016-09-08 09:57:18 +02:00
|
|
|
else:
|
2016-11-13 19:05:28 +10:00
|
|
|
combobox.setCurrentIndex(0)
|
2016-09-03 02:25:30 +02:00
|
|
|
|
2016-08-23 10:46:22 +02:00
|
|
|
def value(self):
|
|
|
|
pass
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def postInitialize(self, wrappers):
|
|
|
|
pass
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def refresh(self):
|
|
|
|
pass
|
2016-08-23 10:46:22 +02:00
|
|
|
|
2016-09-19 11:52:31 +03:00
|
|
|
|
2016-09-09 08:25:03 +02:00
|
|
|
class BasicWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
def createWidget(self):
|
|
|
|
return QLineEdit()
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-09 08:25:03 +02:00
|
|
|
def setValue(self, value):
|
|
|
|
self.widget.setText(value)
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
return self.widget.text()
|
|
|
|
|
2016-08-23 10:46:22 +02:00
|
|
|
|
|
|
|
class BooleanWidgetWrapper(WidgetWrapper):
|
|
|
|
|
2016-09-03 02:25:30 +02:00
|
|
|
def createWidget(self):
|
2016-09-07 14:30:20 +02:00
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
2016-08-23 10:46:22 +02:00
|
|
|
return QCheckBox()
|
2016-09-07 14:30:20 +02:00
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
|
|
|
widget = QComboBox()
|
|
|
|
widget.addItem(self.tr('Yes'))
|
|
|
|
widget.addItem(self.tr('No'))
|
|
|
|
if self.param.default:
|
|
|
|
widget.setCurrentIndex(0)
|
|
|
|
else:
|
|
|
|
widget.setCurrentIndex(1)
|
|
|
|
return widget
|
|
|
|
else:
|
2016-08-23 10:46:22 +02:00
|
|
|
widget = QComboBox()
|
2016-09-07 14:30:20 +02:00
|
|
|
widget.addItem('Yes', True)
|
|
|
|
widget.addItem('No', False)
|
|
|
|
bools = self.dialog.getAvailableValuesOfType(ParameterBoolean, None)
|
|
|
|
for b in bools:
|
|
|
|
widget.addItem(self.dialog.resolveValueDescription(b), b)
|
|
|
|
if self.param.default:
|
|
|
|
widget.setCurrentIndex(0)
|
|
|
|
else:
|
|
|
|
widget.setCurrentIndex(1)
|
2016-08-23 10:46:22 +02:00
|
|
|
return widget
|
|
|
|
|
|
|
|
def setValue(self, value):
|
2016-09-07 14:30:20 +02:00
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
2016-08-23 10:46:22 +02:00
|
|
|
self.widget.setChecked(value)
|
2016-09-07 14:30:20 +02:00
|
|
|
else:
|
2016-09-03 02:25:30 +02:00
|
|
|
self.setComboValue(value)
|
2016-08-23 10:46:22 +02:00
|
|
|
|
|
|
|
def value(self):
|
2016-09-07 14:30:20 +02:00
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
2016-08-23 10:46:22 +02:00
|
|
|
return self.widget.isChecked()
|
2016-09-08 09:57:18 +02:00
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
|
|
|
return self.widget.currentIndex == 0
|
2016-09-07 14:30:20 +02:00
|
|
|
else:
|
2016-09-03 02:25:30 +02:00
|
|
|
return self.comboValue()
|
2016-08-24 15:23:25 +02:00
|
|
|
|
|
|
|
|
|
|
|
class CrsWidgetWrapper(WidgetWrapper):
|
|
|
|
|
2016-09-03 02:25:30 +02:00
|
|
|
def createWidget(self):
|
2016-09-08 09:57:18 +02:00
|
|
|
if self.dialogType == DIALOG_MODELER:
|
2016-11-13 19:05:28 +10:00
|
|
|
self.combo = QComboBox()
|
|
|
|
widget = QWidget()
|
|
|
|
layout = QHBoxLayout()
|
|
|
|
layout.setMargin(0)
|
|
|
|
layout.setContentsMargins(0, 0, 0, 0)
|
|
|
|
layout.setSpacing(1)
|
|
|
|
layout.addWidget(self.combo)
|
|
|
|
btn = QToolButton()
|
|
|
|
btn.setIcon(QgsApplication.getThemeIcon("mActionSetProjection.svg"))
|
|
|
|
btn.setToolTip(self.tr("Select CRS"))
|
|
|
|
btn.clicked.connect(self.selectProjection)
|
|
|
|
layout.addWidget(btn)
|
|
|
|
|
|
|
|
widget.setLayout(layout)
|
|
|
|
self.combo.setEditable(True)
|
2016-09-08 09:57:18 +02:00
|
|
|
crss = self.dialog.getAvailableValuesOfType(ParameterCrs)
|
|
|
|
for crs in crss:
|
2016-11-13 19:05:28 +10:00
|
|
|
self.combo.addItem(self.dialog.resolveValueDescription(crs), crs)
|
2016-09-08 09:57:18 +02:00
|
|
|
raster = self.dialog.getAvailableValuesOfType(ParameterRaster, OutputRaster)
|
|
|
|
vector = self.dialog.getAvailableValuesOfType(ParameterVector, OutputVector)
|
|
|
|
for r in raster:
|
2016-11-13 19:05:28 +10:00
|
|
|
self.combo.addItem("Crs of layer " + self.dialog.resolveValueDescription(r), r)
|
2016-09-08 09:57:18 +02:00
|
|
|
for v in vector:
|
2016-11-13 19:05:28 +10:00
|
|
|
self.combo.addItem("Crs of layer " + self.dialog.resolveValueDescription(v), v)
|
2016-09-08 09:57:18 +02:00
|
|
|
if not self.param.default:
|
2016-11-13 19:05:28 +10:00
|
|
|
self.combo.setEditText(self.param.default)
|
2016-09-08 09:57:18 +02:00
|
|
|
return widget
|
|
|
|
else:
|
2016-11-11 19:46:42 +10:00
|
|
|
|
|
|
|
widget = QgsProjectionSelectionWidget()
|
|
|
|
if self.param.optional:
|
|
|
|
widget.setOptionVisible(QgsProjectionSelectionWidget.CrsNotSet, True)
|
|
|
|
|
|
|
|
if self.param.default:
|
|
|
|
crs = QgsCoordinateReferenceSystem(self.param.default)
|
|
|
|
widget.setCrs(crs)
|
|
|
|
|
|
|
|
return widget
|
2016-08-24 15:23:25 +02:00
|
|
|
|
2016-11-13 19:05:28 +10:00
|
|
|
def selectProjection(self):
|
|
|
|
dialog = QgsGenericProjectionSelector(self.widget)
|
|
|
|
current_crs = QgsCoordinateReferenceSystem(self.combo.currentText())
|
|
|
|
if current_crs.isValid():
|
|
|
|
dialog.setSelectedCrsId(current_crs.srsid())
|
|
|
|
|
|
|
|
if dialog.exec_():
|
|
|
|
self.setValue(dialog.selectedAuthId())
|
|
|
|
|
2016-08-24 15:23:25 +02:00
|
|
|
def setValue(self, value):
|
2016-09-08 09:57:18 +02:00
|
|
|
if self.dialogType == DIALOG_MODELER:
|
2016-11-13 19:05:28 +10:00
|
|
|
self.setComboValue(value, self.combo)
|
2016-08-24 15:23:25 +02:00
|
|
|
else:
|
2016-11-11 19:46:42 +10:00
|
|
|
self.widget.setCrs(QgsCoordinateReferenceSystem(value))
|
2016-08-24 15:23:25 +02:00
|
|
|
|
|
|
|
def value(self):
|
2016-09-08 09:57:18 +02:00
|
|
|
if self.dialogType == DIALOG_MODELER:
|
2016-11-13 19:05:28 +10:00
|
|
|
return self.comboValue(combobox=self.combo)
|
2016-09-08 09:57:18 +02:00
|
|
|
else:
|
2016-11-11 19:46:42 +10:00
|
|
|
crs = self.widget.crs()
|
|
|
|
if crs.isValid():
|
|
|
|
return self.widget.crs().authid()
|
|
|
|
else:
|
|
|
|
return None
|
2016-09-07 14:30:20 +02:00
|
|
|
|
2016-09-19 11:52:31 +03:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
class ExtentWidgetWrapper(WidgetWrapper):
|
|
|
|
|
2016-09-08 09:57:18 +02:00
|
|
|
USE_MIN_COVERING_EXTENT = "[Use min covering extent]"
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def createWidget(self):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
return ExtentSelectionPanel(self.dialog, self.param)
|
|
|
|
else:
|
|
|
|
widget = QComboBox()
|
|
|
|
widget.setEditable(True)
|
2016-09-08 09:57:18 +02:00
|
|
|
extents = self.dialog.getAvailableValuesOfType(ParameterExtent, OutputExtent)
|
2016-09-07 14:30:20 +02:00
|
|
|
if self.param.optional:
|
|
|
|
widget.addItem(self.USE_MIN_COVERING_EXTENT, None)
|
2016-09-08 09:57:18 +02:00
|
|
|
raster = self.dialog.getAvailableValuesOfType(ParameterRaster, OutputRaster)
|
|
|
|
vector = self.dialog.getAvailableValuesOfType(ParameterVector, OutputVector)
|
2016-09-07 14:30:20 +02:00
|
|
|
for ex in extents:
|
|
|
|
widget.addItem(self.dialog.resolveValueDescription(ex), ex)
|
2016-09-08 09:57:18 +02:00
|
|
|
for r in raster:
|
|
|
|
widget.addItem("Extent of " + self.dialog.resolveValueDescription(r), r)
|
|
|
|
for v in vector:
|
|
|
|
widget.addItem("Extent of " + self.dialog.resolveValueDescription(v), v)
|
2016-09-07 14:30:20 +02:00
|
|
|
if not self.param.default:
|
|
|
|
widget.setEditText(self.param.default)
|
|
|
|
return widget
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def setValue(self, value):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
self.widget.setExtentFromString(value)
|
|
|
|
else:
|
|
|
|
self.setComboValue(value)
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
return self.widget.getValue()
|
|
|
|
else:
|
|
|
|
idx = self.widget.findText(self.widget.currentText())
|
|
|
|
if idx < 0:
|
2016-09-27 19:51:06 +02:00
|
|
|
s = str(self.widget.currentText()).strip()
|
2016-09-07 14:30:20 +02:00
|
|
|
if s:
|
|
|
|
try:
|
|
|
|
tokens = s.split(',')
|
|
|
|
if len(tokens) != 4:
|
|
|
|
raise InvalidParameterValue()
|
|
|
|
for token in tokens:
|
|
|
|
float(token)
|
|
|
|
except:
|
|
|
|
raise InvalidParameterValue()
|
|
|
|
elif self.param.optional:
|
|
|
|
s = None
|
|
|
|
else:
|
|
|
|
raise InvalidParameterValue()
|
|
|
|
return s
|
|
|
|
else:
|
|
|
|
return self.widget.itemData(self.widget.currentIndex())
|
|
|
|
|
|
|
|
|
|
|
|
class PointWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
def createWidget(self):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
return PointSelectionPanel(self.dialog, self.param.default)
|
|
|
|
else:
|
|
|
|
item = QComboBox()
|
|
|
|
item.setEditable(True)
|
|
|
|
points = self.dialog.getAvailableValuesOfType(ParameterPoint)
|
|
|
|
for p in points:
|
|
|
|
item.addItem(self.dialog.resolveValueDescription(p), p)
|
2016-09-27 19:51:06 +02:00
|
|
|
item.setEditText(str(self.param.default))
|
2016-09-18 13:24:38 +02:00
|
|
|
return item
|
2016-09-07 14:30:20 +02:00
|
|
|
|
|
|
|
def setValue(self, value):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
self.widget.setPointFromString(value)
|
|
|
|
else:
|
|
|
|
self.setComboValue(value)
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
return self.widget.getValue()
|
|
|
|
else:
|
|
|
|
idx = self.widget.findText(self.widget.currentText())
|
|
|
|
if idx < 0:
|
2016-09-27 19:51:06 +02:00
|
|
|
s = str(self.widget.currentText()).strip()
|
2016-09-07 14:30:20 +02:00
|
|
|
if s:
|
|
|
|
try:
|
|
|
|
tokens = s.split(',')
|
|
|
|
if len(tokens) != 2:
|
|
|
|
raise InvalidParameterValue()
|
|
|
|
for token in tokens:
|
|
|
|
float(token)
|
|
|
|
except:
|
|
|
|
raise InvalidParameterValue()
|
|
|
|
elif self.param.optional:
|
|
|
|
s = None
|
|
|
|
else:
|
|
|
|
raise InvalidParameterValue()
|
|
|
|
return s
|
|
|
|
else:
|
|
|
|
return self.widget.itemData(self.widget.currentIndex())
|
|
|
|
|
|
|
|
|
|
|
|
class FileWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
def createWidget(self):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
return FileSelectionPanel(self.param.isFolder, self.param.ext)
|
|
|
|
else:
|
|
|
|
widget = QComboBox()
|
|
|
|
widget.setEditable(True)
|
|
|
|
files = self.dialog.getAvailableValuesOfType(ParameterFile, OutputFile)
|
|
|
|
for f in files:
|
|
|
|
widget.addItem(self.dialog.resolveValueDescription(f), f)
|
|
|
|
return widget
|
|
|
|
|
|
|
|
def setValue(self, value):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
self.widget.setText(value)
|
|
|
|
else:
|
|
|
|
self.setComboValue(value)
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
return self.widget.getValue()
|
|
|
|
else:
|
|
|
|
return self.comboValue()
|
|
|
|
|
2016-09-19 11:52:31 +03:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
class FixedTableWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
def createWidget(self):
|
|
|
|
return FixedTablePanel(self.param)
|
|
|
|
|
|
|
|
def setValue(self, value):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
if self.dialogType == DIALOG_MODELER:
|
|
|
|
table = self.widget.table
|
|
|
|
if not bool(table) and not self.param.optional:
|
|
|
|
raise InvalidParameterValue()
|
|
|
|
return ParameterFixedTable.tableToString(table)
|
|
|
|
else:
|
|
|
|
return self.widget.table
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
|
|
|
|
class MultipleInputWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
def _getOptions(self):
|
|
|
|
if self.param.datatype == dataobjects.TYPE_VECTOR_ANY:
|
|
|
|
options = self.dialog.getAvailableValuesOfType(ParameterVector, OutputVector)
|
|
|
|
elif self.param.datatype == dataobjects.TYPE_VECTOR_POINT:
|
|
|
|
options = self.dialog.getAvailableValuesOfType(ParameterVector, OutputVector,
|
|
|
|
[dataobjects.TYPE_VECTOR_POINT, dataobjects.TYPE_VECTOR_ANY])
|
|
|
|
elif self.param.datatype == dataobjects.TYPE_VECTOR_LINE:
|
|
|
|
options = self.dialog.getAvailableValuesOfType(ParameterVector, OutputVector,
|
|
|
|
[dataobjects.TYPE_VECTOR_LINE, dataobjects.TYPE_VECTOR_ANY])
|
|
|
|
elif self.param.datatype == dataobjects.TYPE_VECTOR_POLYGON:
|
|
|
|
options = self.dialog.getAvailableValuesOfType(ParameterVector, OutputVector,
|
|
|
|
[dataobjects.TYPE_VECTOR_POLYGON, dataobjects.TYPE_VECTOR_ANY])
|
|
|
|
elif self.param.datatype == dataobjects.TYPE_RASTER:
|
|
|
|
options = self.dialog.getAvailableValuesOfType(ParameterRaster, OutputRaster)
|
|
|
|
else:
|
|
|
|
options = self.dialog.getAvailableValuesOfType(ParameterFile, OutputFile)
|
2016-09-21 11:27:08 +02:00
|
|
|
options = sorted(options, key=lambda opt: self.dialog.resolveValueDescription(opt))
|
2016-09-07 14:30:20 +02:00
|
|
|
return options
|
|
|
|
|
|
|
|
def createWidget(self):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
if self.param.datatype == dataobjects.TYPE_FILE:
|
|
|
|
return MultipleInputPanel(datatype=dataobjects.TYPE_FILE)
|
|
|
|
else:
|
|
|
|
if self.param.datatype == dataobjects.TYPE_RASTER:
|
|
|
|
options = dataobjects.getRasterLayers(sorting=False)
|
|
|
|
elif self.param.datatype == dataobjects.TYPE_VECTOR_ANY:
|
|
|
|
options = dataobjects.getVectorLayers(sorting=False)
|
|
|
|
else:
|
|
|
|
options = dataobjects.getVectorLayers([self.param.datatype], sorting=False)
|
|
|
|
opts = [getExtendedLayerName(opt) for opt in options]
|
|
|
|
return MultipleInputPanel(opts)
|
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
2016-09-19 21:52:59 +02:00
|
|
|
widget = BatchInputSelectionPanel(self.param, self.row, self.col, self.dialog)
|
|
|
|
widget.valueChanged.connect(lambda: self.widgetValueHasChanged.emit(self))
|
|
|
|
return widget
|
2016-09-07 14:30:20 +02:00
|
|
|
else:
|
|
|
|
options = [self.dialog.resolveValueDescription(opt) for opt in self._getOptions()]
|
|
|
|
return MultipleInputPanel(options)
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def refresh(self):
|
|
|
|
if self.param.datatype != dataobjects.TYPE_FILE:
|
|
|
|
if self.param.datatype == dataobjects.TYPE_RASTER:
|
|
|
|
options = dataobjects.getRasterLayers(sorting=False)
|
|
|
|
elif self.param.datatype == dataobjects.TYPE_VECTOR_ANY:
|
|
|
|
options = dataobjects.getVectorLayers(sorting=False)
|
|
|
|
else:
|
|
|
|
options = dataobjects.getVectorLayers([self.param.datatype], sorting=False)
|
|
|
|
opts = [self.getExtendedLayerName(opt) for opt in options]
|
|
|
|
self.widget.updateForOptions(opts)
|
|
|
|
|
|
|
|
def setValue(self, value):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
pass # TODO
|
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
|
|
|
return self.widget.setText(value)
|
|
|
|
else:
|
|
|
|
options = self._getOptions()
|
|
|
|
selected = []
|
|
|
|
for i, opt in enumerate(options):
|
|
|
|
if opt in value:
|
|
|
|
selected.append(i)
|
|
|
|
self.widget.setSelectedItems(selected)
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
if self.param.datatype == dataobjects.TYPE_FILE:
|
|
|
|
return self.param.setValue(self.widget.selectedoptions)
|
|
|
|
else:
|
|
|
|
if self.param.datatype == dataobjects.TYPE_RASTER:
|
|
|
|
options = dataobjects.getRasterLayers(sorting=False)
|
|
|
|
elif self.param.datatype == dataobjects.TYPE_VECTOR_ANY:
|
|
|
|
options = dataobjects.getVectorLayers(sorting=False)
|
|
|
|
else:
|
|
|
|
options = dataobjects.getVectorLayers([self.param.datatype], sorting=False)
|
2016-09-09 10:48:51 +02:00
|
|
|
return [options[i] for i in self.widget.selectedoptions]
|
2016-09-07 14:30:20 +02:00
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
|
|
|
return self.widget.getText()
|
|
|
|
else:
|
|
|
|
options = self._getOptions()
|
|
|
|
values = [options[i] for i in self.widget.selectedoptions]
|
|
|
|
if len(values) == 0 and not self.param.optional:
|
|
|
|
raise InvalidParameterValue()
|
|
|
|
return values
|
|
|
|
|
|
|
|
|
|
|
|
class NumberWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
def createWidget(self):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
2016-11-11 11:02:42 +10:00
|
|
|
return NumberInputPanel(self.param)
|
2016-09-07 14:30:20 +02:00
|
|
|
else:
|
2016-11-11 11:02:42 +10:00
|
|
|
return ModellerNumberInputPanel(self.param, self.dialog)
|
2016-09-07 14:30:20 +02:00
|
|
|
|
|
|
|
def setValue(self, value):
|
2016-09-12 06:17:23 +02:00
|
|
|
self.widget.setValue(value)
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def value(self):
|
2016-09-12 06:17:23 +02:00
|
|
|
return self.widget.getValue()
|
2016-09-07 14:30:20 +02:00
|
|
|
|
2016-09-19 11:52:31 +03:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
class RasterWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
NOT_SELECTED = '[Not selected]'
|
|
|
|
|
|
|
|
def createWidget(self):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
layers = dataobjects.getRasterLayers()
|
|
|
|
items = []
|
|
|
|
if self.param.optional:
|
|
|
|
items.append((self.NOT_SELECTED, None))
|
|
|
|
for layer in layers:
|
|
|
|
items.append((getExtendedLayerName(layer), layer))
|
|
|
|
return InputLayerSelectorPanel(items, self.param)
|
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
|
|
|
return BatchInputSelectionPanel(self.param, self.row, self.col, self.dialog)
|
|
|
|
else:
|
|
|
|
widget = QComboBox()
|
|
|
|
widget.setEditable(True)
|
|
|
|
files = self.dialog.getAvailableValuesOfType(ParameterRaster, OutputRaster)
|
|
|
|
for f in files:
|
|
|
|
widget.addItem(self.dialog.resolveValueDescription(f), f)
|
2016-09-18 23:25:25 +02:00
|
|
|
if self.param.optional:
|
|
|
|
widget.setEditText("")
|
2016-09-07 14:30:20 +02:00
|
|
|
return widget
|
|
|
|
|
|
|
|
def refresh(self):
|
2016-09-19 14:12:11 +02:00
|
|
|
items = []
|
|
|
|
layers = dataobjects.getRasterLayers()
|
2016-09-07 14:30:20 +02:00
|
|
|
if self.param.optional:
|
2016-09-19 14:12:11 +02:00
|
|
|
items.append((self.NOT_SELECTED, None))
|
2016-09-07 14:30:20 +02:00
|
|
|
for layer in layers:
|
2016-09-19 14:12:11 +02:00
|
|
|
items.append((getExtendedLayerName(layer), layer))
|
|
|
|
self.widget.update(items)
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def setValue(self, value):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
pass # TODO
|
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
2016-09-12 07:54:55 +02:00
|
|
|
self.widget.setText(value)
|
2016-09-07 14:30:20 +02:00
|
|
|
else:
|
|
|
|
self.setComboValue(value)
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
return self.widget.getValue()
|
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
|
|
|
return self.widget.getText()
|
|
|
|
else:
|
2016-09-12 07:54:55 +02:00
|
|
|
def validator(v):
|
2016-09-18 23:25:25 +02:00
|
|
|
if not bool(v):
|
|
|
|
return self.param.optional
|
|
|
|
else:
|
|
|
|
return os.path.exists(v)
|
2016-09-12 07:54:55 +02:00
|
|
|
return self.comboValue(validator)
|
2016-09-07 14:30:20 +02:00
|
|
|
|
|
|
|
|
|
|
|
class SelectionWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
def createWidget(self):
|
2016-09-16 12:04:12 +02:00
|
|
|
if self.param.multiple:
|
|
|
|
return MultipleInputPanel(options=self.param.options)
|
|
|
|
else:
|
|
|
|
widget = QComboBox()
|
|
|
|
widget.addItems(self.param.options)
|
|
|
|
if self.param.default:
|
|
|
|
widget.setCurrentIndex(self.param.default)
|
|
|
|
return widget
|
2016-09-07 14:30:20 +02:00
|
|
|
|
|
|
|
def setValue(self, value):
|
2016-09-16 12:04:12 +02:00
|
|
|
if self.param.multiple:
|
|
|
|
self.widget.setSelectedItems(value)
|
|
|
|
else:
|
|
|
|
self.widget.setCurrentIndex(int(value))
|
2016-09-07 14:30:20 +02:00
|
|
|
|
|
|
|
def value(self):
|
2016-09-16 12:04:12 +02:00
|
|
|
if self.param.multiple:
|
2016-09-19 11:52:31 +03:00
|
|
|
return self.widget.selectedoptions
|
2016-09-16 12:04:12 +02:00
|
|
|
else:
|
|
|
|
return self.widget.currentIndex()
|
2016-09-07 14:30:20 +02:00
|
|
|
|
|
|
|
|
|
|
|
class VectorWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
NOT_SELECTED = '[Not selected]'
|
|
|
|
|
|
|
|
def createWidget(self):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
2016-09-19 14:12:11 +02:00
|
|
|
layers = dataobjects.getVectorLayers(self.param.datatype)
|
|
|
|
items = []
|
|
|
|
if self.param.optional:
|
|
|
|
items.append((self.NOT_SELECTED, None))
|
|
|
|
for layer in layers:
|
|
|
|
items.append((getExtendedLayerName(layer), layer))
|
|
|
|
widget = InputLayerSelectorPanel(items, self.param)
|
|
|
|
widget.name = self.param.name
|
|
|
|
widget.valueChanged.connect(lambda: self.widgetValueHasChanged.emit(self))
|
2016-09-07 14:30:20 +02:00
|
|
|
return widget
|
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
2016-09-18 16:07:32 +02:00
|
|
|
widget = BatchInputSelectionPanel(self.param, self.row, self.col, self.dialog)
|
|
|
|
widget.valueChanged.connect(lambda: self.widgetValueHasChanged.emit(self))
|
|
|
|
return widget
|
2016-09-07 14:30:20 +02:00
|
|
|
else:
|
|
|
|
widget = QComboBox()
|
|
|
|
layers = self.dialog.getAvailableValuesOfType(ParameterVector, OutputVector)
|
2016-09-18 23:25:25 +02:00
|
|
|
widget.setEditable(True)
|
2016-09-07 14:30:20 +02:00
|
|
|
for layer in layers:
|
|
|
|
widget.addItem(self.dialog.resolveValueDescription(layer), layer)
|
2016-09-18 23:25:25 +02:00
|
|
|
if self.param.optional:
|
|
|
|
widget.setEditText("")
|
2016-09-07 14:30:20 +02:00
|
|
|
return widget
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def _populate(self, widget):
|
2016-09-19 14:12:11 +02:00
|
|
|
items = []
|
2016-09-07 14:30:20 +02:00
|
|
|
layers = dataobjects.getVectorLayers(self.param.datatype)
|
|
|
|
layers.sort(key=lambda lay: lay.name())
|
|
|
|
if self.param.optional:
|
2016-09-19 14:12:11 +02:00
|
|
|
items.append((self.NOT_SELECTED, None))
|
2016-09-07 14:30:20 +02:00
|
|
|
for layer in layers:
|
2016-09-19 14:12:11 +02:00
|
|
|
items.append((getExtendedLayerName(layer), layer))
|
|
|
|
self.widget.update(items)
|
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def refresh(self):
|
|
|
|
self._populate(self.widget)
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def setValue(self, value):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
pass # TODO
|
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
2016-09-18 16:07:32 +02:00
|
|
|
self.widget.setValue(value)
|
2016-09-07 14:30:20 +02:00
|
|
|
else:
|
|
|
|
self.setComboValue(value)
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
try:
|
|
|
|
return self.widget.itemData(self.widget.currentIndex())
|
|
|
|
except:
|
|
|
|
return self.widget.getValue()
|
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
2016-09-18 16:07:32 +02:00
|
|
|
return self.widget.value()
|
2016-09-07 14:30:20 +02:00
|
|
|
else:
|
2016-09-12 07:54:55 +02:00
|
|
|
def validator(v):
|
2016-09-18 23:25:25 +02:00
|
|
|
if not bool(v):
|
|
|
|
return self.param.optional
|
|
|
|
else:
|
|
|
|
return os.path.exists(v)
|
2016-09-12 07:54:55 +02:00
|
|
|
return self.comboValue(validator)
|
2016-09-07 14:30:20 +02:00
|
|
|
|
2016-09-19 11:52:31 +03:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
class StringWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
def createWidget(self):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
if self.param.multiline:
|
|
|
|
widget = QPlainTextEdit()
|
|
|
|
if self.param.default:
|
|
|
|
widget.setPlainText(self.param.default)
|
|
|
|
else:
|
2016-09-09 07:02:54 +02:00
|
|
|
widget = StringInputPanel(self.param)
|
2016-09-07 14:30:20 +02:00
|
|
|
if self.param.default:
|
2016-09-09 07:02:54 +02:00
|
|
|
widget.setValue(self.param.default)
|
2016-09-07 14:30:20 +02:00
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
2016-09-19 11:52:31 +03:00
|
|
|
widget = QLineEdit()
|
|
|
|
if self.param.default:
|
|
|
|
widget.setText(self.param.default)
|
2016-09-07 14:30:20 +02:00
|
|
|
else:
|
2016-11-09 13:45:08 +10:00
|
|
|
# strings, numbers, files and table fields are all allowed input types
|
|
|
|
strings = self.dialog.getAvailableValuesOfType([ParameterString, ParameterNumber, ParameterFile,
|
2016-11-03 16:37:00 +10:00
|
|
|
ParameterTableField, ParameterExpression], OutputString)
|
2016-09-07 14:30:20 +02:00
|
|
|
options = [(self.dialog.resolveValueDescription(s), s) for s in strings]
|
|
|
|
if self.param.multiline:
|
|
|
|
widget = MultilineTextPanel(options)
|
|
|
|
widget.setText(self.param.default or "")
|
|
|
|
else:
|
|
|
|
widget = QComboBox()
|
|
|
|
widget.setEditable(True)
|
|
|
|
for desc, val in options:
|
|
|
|
widget.addItem(desc, val)
|
|
|
|
widget.setEditText(self.param.default or "")
|
|
|
|
return widget
|
|
|
|
|
|
|
|
def setValue(self, value):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
pass # TODO
|
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
|
|
|
self.widget.setText(value)
|
|
|
|
else:
|
|
|
|
if self.param.multiline:
|
|
|
|
self.widget.setValue(value)
|
|
|
|
else:
|
|
|
|
self.setComboValue(value)
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
if self.dialogType in DIALOG_STANDARD:
|
|
|
|
if self.param.multiline:
|
|
|
|
text = self.widget.toPlainText()
|
|
|
|
else:
|
2016-09-09 07:02:54 +02:00
|
|
|
text = self.widget.getValue()
|
2016-09-07 14:30:20 +02:00
|
|
|
return text
|
|
|
|
if self.dialogType == DIALOG_BATCH:
|
2016-09-18 17:14:50 +02:00
|
|
|
return self.widget.text()
|
2016-09-07 14:30:20 +02:00
|
|
|
else:
|
|
|
|
if self.param.multiline:
|
|
|
|
value = self.widget.getValue()
|
|
|
|
option = self.widget.getOption()
|
|
|
|
if option == MultilineTextPanel.USE_TEXT:
|
|
|
|
if value == '':
|
|
|
|
if self.param.optional:
|
|
|
|
return None
|
|
|
|
else:
|
|
|
|
raise InvalidParameterValue()
|
|
|
|
else:
|
|
|
|
return value
|
|
|
|
else:
|
|
|
|
return value
|
|
|
|
else:
|
|
|
|
def validator(v):
|
|
|
|
return bool(v) or self.param.optional
|
|
|
|
return self.comboValue(validator)
|
|
|
|
|
|
|
|
|
2016-11-03 16:37:00 +10:00
|
|
|
class ExpressionWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
def createWidget(self):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
2016-11-11 12:03:33 +10:00
|
|
|
if self.param.parent_layer:
|
|
|
|
widget = QgsFieldExpressionWidget()
|
|
|
|
else:
|
|
|
|
widget = QgsExpressionLineEdit()
|
2016-11-03 16:37:00 +10:00
|
|
|
if self.param.default:
|
|
|
|
widget.setExpression(self.param.default)
|
|
|
|
else:
|
|
|
|
strings = self.dialog.getAvailableValuesOfType([ParameterExpression, ParameterString, ParameterNumber], OutputString)
|
|
|
|
options = [(self.dialog.resolveValueDescription(s), s) for s in strings]
|
|
|
|
widget = QComboBox()
|
|
|
|
widget.setEditable(True)
|
|
|
|
for desc, val in options:
|
|
|
|
widget.addItem(desc, val)
|
|
|
|
widget.setEditText(self.param.default or "")
|
|
|
|
return widget
|
|
|
|
|
|
|
|
def postInitialize(self, wrappers):
|
|
|
|
for wrapper in wrappers:
|
|
|
|
if wrapper.param.name == self.param.parent_layer:
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
self.setLayer(wrapper.value())
|
|
|
|
wrapper.widgetValueHasChanged.connect(self.parentLayerChanged)
|
|
|
|
break
|
|
|
|
|
|
|
|
def parentLayerChanged(self, wrapper):
|
|
|
|
self.setLayer(wrapper.value())
|
|
|
|
|
|
|
|
def setLayer(self, layer):
|
|
|
|
if isinstance(layer, str):
|
|
|
|
layer = dataobjects.getObjectFromUri(_resolveLayers(layer))
|
|
|
|
self.widget.setLayer(layer)
|
|
|
|
|
|
|
|
def setValue(self, value):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
self.widget.setExpression(value)
|
|
|
|
else:
|
|
|
|
self.setComboValue(value)
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
2016-11-11 20:12:58 +10:00
|
|
|
try:
|
|
|
|
return self.widget.asExpression()
|
|
|
|
except:
|
|
|
|
return self.widget.expression()
|
2016-11-03 16:37:00 +10:00
|
|
|
else:
|
|
|
|
def validator(v):
|
|
|
|
return bool(v) or self.param.optional
|
|
|
|
return self.comboValue(validator)
|
|
|
|
|
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
class TableWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
NOT_SELECTED = '[Not selected]'
|
|
|
|
|
|
|
|
def createWidget(self):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
widget = QComboBox()
|
|
|
|
layers = dataobjects.getTables()
|
|
|
|
layers.sort(key=lambda lay: lay.name())
|
|
|
|
if self.param.optional:
|
|
|
|
widget.addItem(self.NOT_SELECTED, None)
|
|
|
|
for layer in layers:
|
|
|
|
widget.addItem(layer.name(), layer)
|
|
|
|
widget.currentIndexChanged.connect(lambda: self.widgetValueHasChanged.emit(self))
|
|
|
|
widget.name = self.param.name
|
|
|
|
return widget
|
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
|
|
|
return BatchInputSelectionPanel(self.param, self.row, self.col, self.dialog)
|
|
|
|
else:
|
|
|
|
widget = QComboBox()
|
2016-09-08 09:57:18 +02:00
|
|
|
tables = self.dialog.getAvailableValuesOfType(ParameterTable, OutputTable)
|
|
|
|
layers = self.dialog.getAvailableValuesOfType(ParameterVector, OutputVector)
|
2016-09-07 14:30:20 +02:00
|
|
|
if self.param.optional:
|
|
|
|
widget.addItem(self.NOT_SELECTED, None)
|
|
|
|
for table in tables:
|
|
|
|
widget.addItem(self.dialog.resolveValueDescription(table), table)
|
|
|
|
for layer in layers:
|
|
|
|
widget.addItem(self.dialog.resolveValueDescription(layer), layer)
|
|
|
|
return widget
|
|
|
|
|
|
|
|
def setValue(self, value):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
pass # TODO
|
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
|
|
|
return self.widget.setText(value)
|
|
|
|
else:
|
|
|
|
self.setComboValue(value)
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
if self.dialogType == DIALOG_STANDARD:
|
|
|
|
try:
|
|
|
|
return self.widget.itemData(self.widget.currentIndex())
|
|
|
|
except:
|
|
|
|
return self.widget.getValue()
|
|
|
|
elif self.dialogType == DIALOG_BATCH:
|
2016-11-06 13:05:32 +01:00
|
|
|
return self.widget.value()
|
2016-09-07 14:30:20 +02:00
|
|
|
else:
|
2016-09-12 07:54:55 +02:00
|
|
|
def validator(v):
|
|
|
|
return bool(v) or self.param.optional
|
|
|
|
return self.comboValue(validator)
|
|
|
|
|
2016-09-19 11:52:31 +03:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
class TableFieldWidgetWrapper(WidgetWrapper):
|
|
|
|
|
|
|
|
NOT_SET = '[Not set]'
|
|
|
|
|
|
|
|
def createWidget(self):
|
2016-09-18 16:07:32 +02:00
|
|
|
self._layer = None
|
|
|
|
|
2016-10-31 11:41:40 +10:00
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
if self.param.multiple:
|
2016-09-18 16:07:32 +02:00
|
|
|
return MultipleInputPanel(options=[])
|
2016-09-09 10:48:51 +02:00
|
|
|
else:
|
2016-11-14 12:36:12 +10:00
|
|
|
widget = QgsFieldComboBox()
|
|
|
|
widget.setAllowEmptyFieldName(self.param.optional)
|
|
|
|
if self.param.datatype == ParameterTableField.DATA_TYPE_NUMBER:
|
|
|
|
widget.setFilters(QgsFieldProxyModel.Numeric)
|
|
|
|
elif self.param.datatype == ParameterTableField.DATA_TYPE_STRING:
|
|
|
|
widget.setFilters(QgsFieldProxyModel.String)
|
|
|
|
|
2016-09-09 10:48:51 +02:00
|
|
|
return widget
|
2016-10-31 11:41:40 +10:00
|
|
|
else:
|
|
|
|
widget = QComboBox()
|
|
|
|
widget.setEditable(True)
|
|
|
|
fields = self.dialog.getAvailableValuesOfType(ParameterTableField, None)
|
|
|
|
if self.param.optional:
|
|
|
|
widget.addItem(self.NOT_SET, None)
|
|
|
|
for f in fields:
|
|
|
|
widget.addItem(self.dialog.resolveValueDescription(f), f)
|
|
|
|
return widget
|
2016-09-07 14:30:20 +02:00
|
|
|
|
|
|
|
def postInitialize(self, wrappers):
|
|
|
|
for wrapper in wrappers:
|
|
|
|
if wrapper.param.name == self.param.parent:
|
2016-09-18 16:07:32 +02:00
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
self.setLayer(wrapper.value())
|
|
|
|
wrapper.widgetValueHasChanged.connect(self.parentValueChanged)
|
2016-09-07 14:30:20 +02:00
|
|
|
break
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-18 16:07:32 +02:00
|
|
|
def parentValueChanged(self, wrapper):
|
|
|
|
self.setLayer(wrapper.value())
|
|
|
|
|
|
|
|
def setLayer(self, layer):
|
2016-09-27 19:51:06 +02:00
|
|
|
if isinstance(layer, str):
|
2016-09-18 16:07:32 +02:00
|
|
|
layer = dataobjects.getObjectFromUri(_resolveLayers(layer))
|
|
|
|
self._layer = layer
|
|
|
|
self.refreshItems()
|
|
|
|
|
|
|
|
def refreshItems(self):
|
|
|
|
if self.param.multiple:
|
|
|
|
self.widget.updateForOptions(self.getFields())
|
|
|
|
else:
|
2016-11-14 12:36:12 +10:00
|
|
|
self.widget.setLayer(self._layer)
|
|
|
|
self.widget.setCurrentIndex(0)
|
2016-09-18 16:07:32 +02:00
|
|
|
|
|
|
|
def getFields(self):
|
|
|
|
if self._layer is None:
|
|
|
|
return []
|
2016-09-07 14:30:20 +02:00
|
|
|
fieldTypes = []
|
2016-09-18 16:07:32 +02:00
|
|
|
if self.param.datatype == ParameterTableField.DATA_TYPE_STRING:
|
2016-09-07 14:30:20 +02:00
|
|
|
fieldTypes = [QVariant.String]
|
2016-09-18 16:07:32 +02:00
|
|
|
elif self.param.datatype == ParameterTableField.DATA_TYPE_NUMBER:
|
2016-09-07 14:30:20 +02:00
|
|
|
fieldTypes = [QVariant.Int, QVariant.Double, QVariant.LongLong,
|
|
|
|
QVariant.UInt, QVariant.ULongLong]
|
|
|
|
|
|
|
|
fieldNames = set()
|
2016-09-18 16:07:32 +02:00
|
|
|
for field in self._layer.fields():
|
2016-09-07 14:30:20 +02:00
|
|
|
if not fieldTypes or field.type() in fieldTypes:
|
2016-09-27 19:51:06 +02:00
|
|
|
fieldNames.add(str(field.name()))
|
2016-09-19 14:35:33 +02:00
|
|
|
return sorted(list(fieldNames), key=cmp_to_key(locale.strcoll))
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-07 14:30:20 +02:00
|
|
|
def setValue(self, value):
|
2016-11-14 12:36:12 +10:00
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
2016-10-31 11:41:40 +10:00
|
|
|
if self.param.multiple:
|
2016-09-09 10:48:51 +02:00
|
|
|
options = self.widget.options
|
|
|
|
selected = []
|
|
|
|
for i, opt in enumerate(options):
|
|
|
|
if opt in value:
|
|
|
|
selected.append(i)
|
|
|
|
self.widget.setSelectedItems(selected)
|
|
|
|
else:
|
2016-11-14 12:36:12 +10:00
|
|
|
self.widget.setField(value)
|
2016-10-31 11:41:40 +10:00
|
|
|
else:
|
|
|
|
self.setComboValue(value)
|
2016-09-07 14:30:20 +02:00
|
|
|
|
|
|
|
def value(self):
|
2016-10-31 11:41:40 +10:00
|
|
|
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
|
|
|
|
if self.param.multiple:
|
2016-09-19 11:52:31 +03:00
|
|
|
return [self.widget.options[i] for i in self.widget.selectedoptions]
|
2016-09-09 10:48:51 +02:00
|
|
|
else:
|
2016-11-14 12:36:12 +10:00
|
|
|
f = self.widget.field()
|
|
|
|
if self.param.optional and not f:
|
2016-09-09 10:48:51 +02:00
|
|
|
return None
|
2016-11-14 12:36:12 +10:00
|
|
|
return f
|
2016-10-31 11:41:40 +10:00
|
|
|
else:
|
|
|
|
def validator(v):
|
|
|
|
return bool(v) or self.param.optional
|
|
|
|
return self.comboValue(validator)
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-09 08:25:03 +02:00
|
|
|
|
|
|
|
def GeometryPredicateWidgetWrapper(WidgetWrapper):
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-09 08:25:03 +02:00
|
|
|
def createWidget(self):
|
|
|
|
return GeometryPredicateSelectionPanel()
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-09 08:25:03 +02:00
|
|
|
def setValue(self, value):
|
|
|
|
self.widget.setValue(value)
|
2016-09-16 12:04:12 +02:00
|
|
|
|
2016-09-09 08:25:03 +02:00
|
|
|
def value(self):
|
2016-09-16 12:04:12 +02:00
|
|
|
return self.widget.value()
|