mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-10-31 00:06:02 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			279 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			279 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| """
 | |
| ***************************************************************************
 | |
|     ModelerParameterDefinitionDialog.py
 | |
|     ---------------------
 | |
|     Date                 : August 2012
 | |
|     Copyright            : (C) 2012 by Victor Olaya
 | |
|     Email                : volayaf at gmail dot com
 | |
| ***************************************************************************
 | |
| *                                                                         *
 | |
| *   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.                                   *
 | |
| *                                                                         *
 | |
| ***************************************************************************
 | |
| """
 | |
| 
 | |
| __author__ = 'Victor Olaya'
 | |
| __date__ = 'August 2012'
 | |
| __copyright__ = '(C) 2012, Victor Olaya'
 | |
| 
 | |
| import math
 | |
| 
 | |
| from qgis.PyQt.QtCore import (Qt,
 | |
|                               QByteArray,
 | |
|                               QCoreApplication)
 | |
| from qgis.PyQt.QtWidgets import (QDialog,
 | |
|                                  QVBoxLayout,
 | |
|                                  QLabel,
 | |
|                                  QLineEdit,
 | |
|                                  QComboBox,
 | |
|                                  QCheckBox,
 | |
|                                  QDialogButtonBox,
 | |
|                                  QMessageBox,
 | |
|                                  QTabWidget,
 | |
|                                  QWidget,
 | |
|                                  QTextEdit,
 | |
|                                  QHBoxLayout)
 | |
| from qgis.PyQt.QtGui import QColor
 | |
| 
 | |
| from qgis.gui import (QgsProcessingLayerOutputDestinationWidget,
 | |
|                       QgsColorButton)
 | |
| from qgis.core import (QgsApplication,
 | |
|                        QgsSettings,
 | |
|                        QgsProcessing,
 | |
|                        QgsProcessingParameterDefinition,
 | |
|                        QgsProcessingDestinationParameter,
 | |
|                        QgsProcessingParameterFeatureSink,
 | |
|                        QgsProcessingParameterFileDestination,
 | |
|                        QgsProcessingParameterFolderDestination,
 | |
|                        QgsProcessingParameterRasterDestination,
 | |
|                        QgsProcessingParameterVectorDestination)
 | |
| 
 | |
| from processing.core import parameters
 | |
| from processing.modeler.exceptions import UndefinedParameterException
 | |
| 
 | |
| 
 | |
| class ModelerParameterDefinitionDialog(QDialog):
 | |
| 
 | |
|     @staticmethod
 | |
|     def use_legacy_dialog(param=None, paramType=None):
 | |
|         if isinstance(param, QgsProcessingDestinationParameter):
 | |
|             return True
 | |
| 
 | |
|         # yay, use new API!
 | |
|         return False
 | |
| 
 | |
|     def __init__(self, alg, paramType=None, param=None):
 | |
|         self.alg = alg
 | |
|         self.paramType = paramType
 | |
|         self.param = param
 | |
|         QDialog.__init__(self)
 | |
|         self.setModal(True)
 | |
|         self.setupUi()
 | |
|         settings = QgsSettings()
 | |
|         self.restoreGeometry(settings.value("/Processing/modelParametersDefinitionDialogGeometry", QByteArray()))
 | |
| 
 | |
|     def closeEvent(self, event):
 | |
|         settings = QgsSettings()
 | |
|         settings.setValue("/Processing/modelParametersDefinitionDialogGeometry", self.saveGeometry())
 | |
|         super(ModelerParameterDefinitionDialog, self).closeEvent(event)
 | |
| 
 | |
|     def switchToCommentTab(self):
 | |
|         self.tab.setCurrentIndex(1)
 | |
|         self.commentEdit.setFocus()
 | |
|         self.commentEdit.selectAll()
 | |
| 
 | |
|     def setupUi(self):
 | |
|         type_metadata = QgsApplication.processingRegistry().parameterType(self.param.type() if self.param else self.paramType)
 | |
|         self.setWindowTitle(self.tr('{} Parameter Definition').format(type_metadata.name()))
 | |
| 
 | |
|         self.mainLayout = QVBoxLayout()
 | |
|         self.tab = QTabWidget()
 | |
|         self.mainLayout.addWidget(self.tab)
 | |
| 
 | |
|         self.setMinimumWidth(300)
 | |
| 
 | |
|         self.verticalLayout = QVBoxLayout()
 | |
| 
 | |
|         self.label = QLabel(self.tr('Parameter name'))
 | |
|         self.verticalLayout.addWidget(self.label)
 | |
|         self.nameTextBox = QLineEdit()
 | |
|         self.verticalLayout.addWidget(self.nameTextBox)
 | |
| 
 | |
|         if isinstance(self.param, QgsProcessingParameterDefinition):
 | |
|             self.nameTextBox.setText(self.param.description())
 | |
| 
 | |
|         if isinstance(self.param, QgsProcessingDestinationParameter):
 | |
|             self.verticalLayout.addWidget(QLabel(self.tr('Default value')))
 | |
|             self.defaultWidget = QgsProcessingLayerOutputDestinationWidget(self.param, defaultSelection=True)
 | |
|             self.verticalLayout.addWidget(self.defaultWidget)
 | |
| 
 | |
|         self.verticalLayout.addSpacing(20)
 | |
|         self.requiredCheck = QCheckBox()
 | |
|         self.requiredCheck.setText(self.tr('Mandatory'))
 | |
|         self.requiredCheck.setChecked(True)
 | |
|         if self.param is not None:
 | |
|             self.requiredCheck.setChecked(not self.param.flags() & QgsProcessingParameterDefinition.FlagOptional)
 | |
|         self.verticalLayout.addWidget(self.requiredCheck)
 | |
| 
 | |
|         self.advancedCheck = QCheckBox()
 | |
|         self.advancedCheck.setText(self.tr('Advanced'))
 | |
|         self.advancedCheck.setChecked(False)
 | |
|         if self.param is not None:
 | |
|             self.advancedCheck.setChecked(self.param.flags() & QgsProcessingParameterDefinition.FlagAdvanced)
 | |
|         self.verticalLayout.addWidget(self.advancedCheck)
 | |
| 
 | |
|         # If child algorithm output is mandatory, disable checkbox
 | |
|         if isinstance(self.param, QgsProcessingDestinationParameter):
 | |
|             provider_name, child_name, output_name = self.param.name().split(':')
 | |
|             child = self.alg.childAlgorithms()['{}:{}'.format(provider_name, child_name)]
 | |
|             model_output = child.modelOutput(output_name)
 | |
|             param_def = child.algorithm().parameterDefinition(model_output.childOutputName())
 | |
|             if not (param_def.flags() & QgsProcessingParameterDefinition.FlagOptional):
 | |
|                 self.requiredCheck.setEnabled(False)
 | |
|                 self.requiredCheck.setChecked(True)
 | |
| 
 | |
|             self.advancedCheck.setEnabled(False)
 | |
|             self.advancedCheck.setChecked(False)
 | |
| 
 | |
|         self.verticalLayout.addStretch()
 | |
| 
 | |
|         w = QWidget()
 | |
|         w.setLayout(self.verticalLayout)
 | |
|         self.tab.addTab(w, self.tr('Properties'))
 | |
| 
 | |
|         self.commentLayout = QVBoxLayout()
 | |
|         self.commentEdit = QTextEdit()
 | |
|         self.commentEdit.setAcceptRichText(False)
 | |
|         self.commentLayout.addWidget(self.commentEdit, 1)
 | |
| 
 | |
|         hl = QHBoxLayout()
 | |
|         hl.setContentsMargins(0, 0, 0, 0)
 | |
|         hl.addWidget(QLabel(self.tr('Color')))
 | |
|         self.comment_color_button = QgsColorButton()
 | |
|         self.comment_color_button.setAllowOpacity(True)
 | |
|         self.comment_color_button.setWindowTitle(self.tr('Comment Color'))
 | |
|         self.comment_color_button.setShowNull(True, self.tr('Default'))
 | |
|         hl.addWidget(self.comment_color_button)
 | |
|         self.commentLayout.addLayout(hl)
 | |
| 
 | |
|         w2 = QWidget()
 | |
|         w2.setLayout(self.commentLayout)
 | |
|         self.tab.addTab(w2, self.tr('Comments'))
 | |
| 
 | |
|         self.buttonBox = QDialogButtonBox(self)
 | |
|         self.buttonBox.setOrientation(Qt.Horizontal)
 | |
|         self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel |
 | |
|                                           QDialogButtonBox.Ok)
 | |
|         self.buttonBox.setObjectName('buttonBox')
 | |
|         self.buttonBox.accepted.connect(self.accept)
 | |
|         self.buttonBox.rejected.connect(self.reject)
 | |
| 
 | |
|         self.mainLayout.addWidget(self.buttonBox)
 | |
| 
 | |
|         self.setLayout(self.mainLayout)
 | |
| 
 | |
|     def setComments(self, text):
 | |
|         self.commentEdit.setPlainText(text)
 | |
| 
 | |
|     def comments(self):
 | |
|         return self.commentEdit.toPlainText()
 | |
| 
 | |
|     def setCommentColor(self, color):
 | |
|         if color.isValid():
 | |
|             self.comment_color_button.setColor(color)
 | |
|         else:
 | |
|             self.comment_color_button.setToNull()
 | |
| 
 | |
|     def commentColor(self):
 | |
|         return self.comment_color_button.color() if not self.comment_color_button.isNull() else QColor()
 | |
| 
 | |
|     def accept(self):
 | |
|         description = self.nameTextBox.text()
 | |
|         if description.strip() == '':
 | |
|             QMessageBox.warning(self, self.tr('Unable to define parameter'),
 | |
|                                 self.tr('Invalid parameter name'))
 | |
|             return
 | |
|         if self.param is None:
 | |
|             validChars = \
 | |
|                 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
 | |
|             safeName = ''.join(c for c in description if c in validChars)
 | |
|             name = safeName.lower()
 | |
|             i = 2
 | |
|             while self.alg.parameterDefinition(name):
 | |
|                 name = safeName.lower() + str(i)
 | |
|                 i += 1
 | |
|         else:
 | |
|             name = self.param.name()
 | |
| 
 | |
|         # Destination parameter
 | |
|         if (isinstance(self.param, QgsProcessingParameterFeatureSink)):
 | |
|             self.param = QgsProcessingParameterFeatureSink(
 | |
|                 name=name,
 | |
|                 description=self.param.description(),
 | |
|                 type=self.param.dataType(),
 | |
|                 defaultValue=self.defaultWidget.value())
 | |
|         elif (isinstance(self.param, QgsProcessingParameterFileDestination)):
 | |
|             self.param = QgsProcessingParameterFileDestination(
 | |
|                 name=name,
 | |
|                 description=self.param.description(),
 | |
|                 fileFilter=self.param.fileFilter(),
 | |
|                 defaultValue=self.defaultWidget.value())
 | |
|         elif (isinstance(self.param, QgsProcessingParameterFolderDestination)):
 | |
|             self.param = QgsProcessingParameterFolderDestination(
 | |
|                 name=name,
 | |
|                 description=self.param.description(),
 | |
|                 defaultValue=self.defaultWidget.value())
 | |
|         elif (isinstance(self.param, QgsProcessingParameterRasterDestination)):
 | |
|             self.param = QgsProcessingParameterRasterDestination(
 | |
|                 name=name,
 | |
|                 description=self.param.description(),
 | |
|                 defaultValue=self.defaultWidget.value())
 | |
|         elif (isinstance(self.param, QgsProcessingParameterVectorDestination)):
 | |
|             self.param = QgsProcessingParameterVectorDestination(
 | |
|                 name=name,
 | |
|                 description=self.param.description(),
 | |
|                 type=self.param.dataType(),
 | |
|                 defaultValue=self.defaultWidget.value())
 | |
| 
 | |
|         else:
 | |
|             if self.paramType:
 | |
|                 typeId = self.paramType
 | |
|             else:
 | |
|                 typeId = self.param.type()
 | |
| 
 | |
|             paramTypeDef = QgsApplication.instance().processingRegistry().parameterType(typeId)
 | |
|             if not paramTypeDef:
 | |
|                 msg = self.tr('The parameter `{}` is not registered, are you missing a required plugin?'.format(typeId))
 | |
|                 raise UndefinedParameterException(msg)
 | |
|             self.param = paramTypeDef.create(name)
 | |
|             self.param.setDescription(description)
 | |
|             self.param.setMetadata(paramTypeDef.metadata())
 | |
| 
 | |
|         if not self.requiredCheck.isChecked():
 | |
|             self.param.setFlags(self.param.flags() | QgsProcessingParameterDefinition.FlagOptional)
 | |
|         else:
 | |
|             self.param.setFlags(self.param.flags() & ~QgsProcessingParameterDefinition.FlagOptional)
 | |
| 
 | |
|         if self.advancedCheck.isChecked():
 | |
|             self.param.setFlags(self.param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
 | |
|         else:
 | |
|             self.param.setFlags(self.param.flags() & ~QgsProcessingParameterDefinition.FlagAdvanced)
 | |
| 
 | |
|         settings = QgsSettings()
 | |
|         settings.setValue("/Processing/modelParametersDefinitionDialogGeometry", self.saveGeometry())
 | |
| 
 | |
|         QDialog.accept(self)
 | |
| 
 | |
|     def reject(self):
 | |
|         self.param = None
 | |
| 
 | |
|         settings = QgsSettings()
 | |
|         settings.setValue("/Processing/modelParametersDefinitionDialogGeometry", self.saveGeometry())
 | |
| 
 | |
|         QDialog.reject(self)
 |