mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-27 00:33:48 -05:00
186 lines
7.9 KiB
Python
186 lines
7.9 KiB
Python
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
***************************************************************************
|
||
ParametersPanel.py
|
||
---------------------
|
||
Date : August 2012
|
||
Copyright : (C) 2012 by Victor Olaya
|
||
(C) 2013 by CS Systemes d'information (CS SI)
|
||
Email : volayaf at gmail dot com
|
||
otb at c-s dot fr (CS SI)
|
||
Contributors : Victor Olaya
|
||
|
||
***************************************************************************
|
||
* *
|
||
* 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'
|
||
|
||
# This will get replaced with a git SHA1 when you do a git archive
|
||
|
||
__revision__ = '$Format:%H$'
|
||
|
||
import os
|
||
|
||
from qgis.core import (QgsProcessingParameterDefinition,
|
||
QgsProcessingParameterExtent,
|
||
QgsProcessingParameterPoint,
|
||
QgsProcessingParameterFeatureSource,
|
||
QgsProcessingOutputVectorLayer,
|
||
QgsProcessingOutputRasterLayer,
|
||
QgsProcessingParameterRasterDestination,
|
||
QgsProcessingParameterFeatureSink,
|
||
QgsProcessingParameterVectorDestination)
|
||
from qgis.PyQt import uic
|
||
from qgis.PyQt.QtCore import QCoreApplication, Qt
|
||
from qgis.PyQt.QtWidgets import (QWidget, QHBoxLayout, QToolButton,
|
||
QLabel, QCheckBox)
|
||
from qgis.PyQt.QtGui import QIcon
|
||
|
||
from processing.gui.DestinationSelectionPanel import DestinationSelectionPanel
|
||
from processing.gui.wrappers import WidgetWrapperFactory
|
||
|
||
|
||
pluginPath = os.path.split(os.path.dirname(__file__))[0]
|
||
WIDGET, BASE = uic.loadUiType(
|
||
os.path.join(pluginPath, 'ui', 'widgetParametersPanel.ui'))
|
||
|
||
|
||
class ParametersPanel(BASE, WIDGET):
|
||
|
||
NOT_SELECTED = QCoreApplication.translate('ParametersPanel', '[Not selected]')
|
||
|
||
def __init__(self, parent, alg):
|
||
super(ParametersPanel, self).__init__(None)
|
||
self.setupUi(self)
|
||
|
||
self.grpAdvanced.hide()
|
||
|
||
self.layoutMain = self.scrollAreaWidgetContents.layout()
|
||
self.layoutAdvanced = self.grpAdvanced.layout()
|
||
|
||
self.parent = parent
|
||
self.alg = alg
|
||
self.wrappers = {}
|
||
self.outputWidgets = {}
|
||
self.labels = {}
|
||
self.checkBoxes = {}
|
||
self.dependentItems = {}
|
||
self.iterateButtons = {}
|
||
|
||
self.initWidgets()
|
||
|
||
def layerRegistryChanged(self, layers):
|
||
for wrapper in list(self.wrappers.values()):
|
||
wrapper.refresh()
|
||
|
||
def formatParameterTooltip(self, parameter):
|
||
return '<p><b>{}</b></p><p>{}</p>'.format(
|
||
parameter.description(),
|
||
QCoreApplication.translate('ParametersPanel', 'Python identifier: ‘{}’').format('<i>{}</i>'.format(parameter.name()))
|
||
)
|
||
|
||
def initWidgets(self):
|
||
# If there are advanced parameters — show corresponding groupbox
|
||
for param in self.alg.parameterDefinitions():
|
||
if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
|
||
self.grpAdvanced.show()
|
||
break
|
||
# Create widgets and put them in layouts
|
||
for param in self.alg.parameterDefinitions():
|
||
if param.flags() & QgsProcessingParameterDefinition.FlagHidden:
|
||
continue
|
||
|
||
if param.isDestination():
|
||
continue
|
||
else:
|
||
desc = param.description()
|
||
if isinstance(param, QgsProcessingParameterExtent):
|
||
desc += self.tr(' (xmin, xmax, ymin, ymax)')
|
||
if isinstance(param, QgsProcessingParameterPoint):
|
||
desc += self.tr(' (x, y)')
|
||
if param.flags() & QgsProcessingParameterDefinition.FlagOptional:
|
||
desc += self.tr(' [optional]')
|
||
|
||
wrapper = WidgetWrapperFactory.create_wrapper(param, self.parent)
|
||
self.wrappers[param.name()] = wrapper
|
||
widget = wrapper.widget
|
||
|
||
if widget is not None:
|
||
if isinstance(param, QgsProcessingParameterFeatureSource):
|
||
layout = QHBoxLayout()
|
||
layout.setSpacing(2)
|
||
layout.setMargin(0)
|
||
layout.addWidget(widget)
|
||
button = QToolButton()
|
||
icon = QIcon(os.path.join(pluginPath, 'images', 'iterate.png'))
|
||
button.setIcon(icon)
|
||
button.setToolTip(self.tr('Iterate over this layer, creating a separate output for every feature in the layer'))
|
||
button.setCheckable(True)
|
||
layout.addWidget(button)
|
||
layout.setAlignment(button, Qt.AlignTop)
|
||
self.iterateButtons[param.name()] = button
|
||
button.toggled.connect(self.buttonToggled)
|
||
widget = QWidget()
|
||
widget.setLayout(layout)
|
||
|
||
widget.setToolTip(self.formatParameterTooltip(param))
|
||
|
||
if type(widget) is QCheckBox:
|
||
# checkbox widget - so description is embedded in widget rather than a separate
|
||
# label
|
||
widget.setText(desc)
|
||
else:
|
||
label = QLabel(desc)
|
||
# label.setToolTip(tooltip)
|
||
self.labels[param.name()] = label
|
||
|
||
if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
|
||
self.layoutAdvanced.addWidget(label)
|
||
else:
|
||
self.layoutMain.insertWidget(
|
||
self.layoutMain.count() - 2, label)
|
||
|
||
if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
|
||
self.layoutAdvanced.addWidget(widget)
|
||
else:
|
||
self.layoutMain.insertWidget(
|
||
self.layoutMain.count() - 2, widget)
|
||
|
||
for output in self.alg.destinationParameterDefinitions():
|
||
if output.flags() & QgsProcessingParameterDefinition.FlagHidden:
|
||
continue
|
||
|
||
label = QLabel(output.description())
|
||
widget = DestinationSelectionPanel(output, self.alg)
|
||
self.layoutMain.insertWidget(self.layoutMain.count() - 1, label)
|
||
self.layoutMain.insertWidget(self.layoutMain.count() - 1, widget)
|
||
if isinstance(output, (QgsProcessingParameterRasterDestination, QgsProcessingParameterFeatureSink, QgsProcessingParameterVectorDestination)):
|
||
check = QCheckBox()
|
||
check.setText(self.tr('Open output file after running algorithm'))
|
||
check.setChecked(True)
|
||
self.layoutMain.insertWidget(self.layoutMain.count() - 1, check)
|
||
self.checkBoxes[output.name()] = check
|
||
|
||
widget.setToolTip(self.formatParameterTooltip(param))
|
||
self.outputWidgets[output.name()] = widget
|
||
|
||
for wrapper in list(self.wrappers.values()):
|
||
wrapper.postInitialize(list(self.wrappers.values()))
|
||
|
||
def buttonToggled(self, value):
|
||
if value:
|
||
sender = self.sender()
|
||
for button in list(self.iterateButtons.values()):
|
||
if button is not sender:
|
||
button.setChecked(False)
|