Skip to content

Commit f6e63d7

Browse files
committedDec 1, 2017
Fixes and cleanups to algorithm dialogs
1 parent ce17091 commit f6e63d7

12 files changed

+90
-314
lines changed
 

‎python/gui/processing/qgsprocessingalgorithmdialogbase.sip

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,12 @@ class QgsProcessingAlgorithmDialogBase : QDialog
146146
:rtype: QDialogButtonBox
147147
%End
148148

149+
QTabWidget *tabWidget();
150+
%Docstring
151+
Returns the dialog's tab widget.
152+
:rtype: QTabWidget
153+
%End
154+
149155
void clearProgress();
150156
%Docstring
151157
Clears any current progress from the dialog.
@@ -172,6 +178,11 @@ class QgsProcessingAlgorithmDialogBase : QDialog
172178
:rtype: QgsMessageBar
173179
%End
174180

181+
void hideShortHelp();
182+
%Docstring
183+
Hides the short help panel.
184+
%End
185+
175186
protected slots:
176187

177188
virtual void finished( bool successful, const QVariantMap &result, QgsProcessingContext &context, QgsProcessingFeedback *feedback );

‎python/plugins/processing/algs/gdal/GdalAlgorithmDialog.py

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
from qgis.core import (QgsProcessingFeedback,
4141
QgsProcessingParameterDefinition)
4242
from qgis.gui import (QgsMessageBar,
43-
QgsProjectionSelectionWidget)
43+
QgsProjectionSelectionWidget,
44+
QgsProcessingAlgorithmDialogBase)
4445

4546
from processing.gui.AlgorithmDialog import AlgorithmDialog
4647
from processing.gui.AlgorithmDialogBase import AlgorithmDialogBase
@@ -53,22 +54,11 @@
5354
class GdalAlgorithmDialog(AlgorithmDialog):
5455

5556
def __init__(self, alg):
56-
AlgorithmDialogBase.__init__(self, alg)
57+
super().__init__(alg)
58+
self.mainWidget().parametersHaveChanged()
5759

58-
self.alg = alg
59-
60-
self.bar = QgsMessageBar()
61-
self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
62-
self.layout().insertWidget(0, self.bar)
63-
64-
self.setMainWidget(GdalParametersPanel(self, alg))
65-
66-
self.runAsBatchButton = QPushButton(QCoreApplication.translate("AlgorithmDialog", "Run as Batch Process…"))
67-
self.runAsBatchButton.clicked.connect(self.runAsBatch)
68-
self.buttonBox.addButton(self.runAsBatchButton,
69-
QDialogButtonBox.ResetRole) # reset role to ensure left alignment
70-
71-
self.mainWidget.parametersHaveChanged()
60+
def getParametersPanel(self, alg, parent):
61+
return GdalParametersPanel(parent, alg)
7262

7363

7464
class GdalParametersPanel(ParametersPanel):
@@ -117,7 +107,7 @@ def parametersHaveChanged(self):
117107
context = createContext()
118108
feedback = QgsProcessingFeedback()
119109
try:
120-
parameters = self.parent.getParamValues()
110+
parameters = self.parent.getParameterValues()
121111
for output in self.alg.destinationParameterDefinitions():
122112
if not output.name() in parameters or parameters[output.name()] is None:
123113
parameters[output.name()] = self.tr("[temporary file]")

‎python/plugins/processing/gui/AlgorithmDialog.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def runAsBatch(self):
8080
dlg.show()
8181
dlg.exec_()
8282

83-
def getParamValues(self):
83+
def getParameterValues(self):
8484
parameters = {}
8585

8686
if self.mainWidget() is None:
@@ -152,7 +152,7 @@ def accept(self):
152152

153153
checkCRS = ProcessingConfig.getSetting(ProcessingConfig.WARN_UNMATCHING_CRS)
154154
try:
155-
parameters = self.getParamValues()
155+
parameters = self.getParameterValues()
156156

157157
if checkCRS and not self.algorithm().validateInputCrs(parameters, context):
158158
reply = QMessageBox.question(self, self.tr("Unmatching CRS's"),

‎python/plugins/processing/gui/AlgorithmDialogBase.py

Lines changed: 1 addition & 245 deletions
Original file line numberDiff line numberDiff line change
@@ -25,252 +25,8 @@
2525

2626
__revision__ = '$Format:%H$'
2727

28-
import os
29-
import webbrowser
30-
import html
3128

32-
from qgis.PyQt import uic
33-
from qgis.PyQt.QtCore import pyqtSignal, Qt, QCoreApplication, QByteArray, QUrl
34-
from qgis.PyQt.QtWidgets import QApplication, QDialogButtonBox, QVBoxLayout, QToolButton
35-
36-
from qgis.utils import iface
37-
from qgis.core import (QgsProject,
38-
QgsProcessingFeedback,
39-
QgsSettings)
40-
from qgis.gui import QgsHelp
41-
42-
from processing.core.ProcessingConfig import ProcessingConfig
43-
44-
pluginPath = os.path.split(os.path.dirname(__file__))[0]
45-
WIDGET, BASE = uic.loadUiType(
46-
os.path.join(pluginPath, 'ui', 'DlgAlgorithmBase.ui'))
47-
48-
49-
class AlgorithmDialogFeedback(QgsProcessingFeedback):
50-
51-
"""
52-
Directs algorithm feedback to an algorithm dialog
53-
"""
54-
55-
error = pyqtSignal(str)
56-
progress_text = pyqtSignal(str)
57-
info = pyqtSignal(str)
58-
command_info = pyqtSignal(str)
59-
debug_info = pyqtSignal(str)
60-
console_info = pyqtSignal(str)
61-
62-
def __init__(self, dialog):
63-
QgsProcessingFeedback.__init__(self)
64-
self.dialog = dialog
65-
66-
def reportError(self, msg):
67-
self.error.emit(msg)
68-
69-
def setProgressText(self, text):
70-
self.progress_text.emit(text)
71-
72-
def pushInfo(self, msg):
73-
self.info.emit(msg)
74-
75-
def pushCommandInfo(self, msg):
76-
self.command_info.emit(msg)
77-
78-
def pushDebugInfo(self, msg):
79-
self.debug_info.emit(msg)
80-
81-
def pushConsoleInfo(self, msg):
82-
self.console_info.emit(msg)
83-
84-
85-
class AlgorithmDialogBase(BASE, WIDGET):
86-
87-
def __init__(self, alg):
88-
super(AlgorithmDialogBase, self).__init__(iface.mainWindow() if iface else None)
89-
self.setupUi(self)
90-
91-
# don't collapse parameters panel
92-
self.splitter.setCollapsible(0, False)
93-
94-
# add collapse button to splitter
95-
splitterHandle = self.splitter.handle(1)
96-
handleLayout = QVBoxLayout()
97-
handleLayout.setContentsMargins(0, 0, 0, 0)
98-
self.btnCollapse = QToolButton(splitterHandle)
99-
self.btnCollapse.setAutoRaise(True)
100-
self.btnCollapse.setFixedSize(12, 12)
101-
self.btnCollapse.setCursor(Qt.ArrowCursor)
102-
handleLayout.addWidget(self.btnCollapse)
103-
handleLayout.addStretch()
104-
splitterHandle.setLayout(handleLayout)
105-
106-
self.settings = QgsSettings()
107-
self.splitter.restoreState(self.settings.value("/Processing/dialogBaseSplitter", QByteArray()))
108-
self.restoreGeometry(self.settings.value("/Processing/dialogBase", QByteArray()))
109-
self.splitterState = self.splitter.saveState()
110-
self.splitterChanged(0, 0)
111-
112-
self.executed = False
113-
self.mainWidget = None
114-
self.alg = alg
115-
116-
self.setWindowTitle(self.alg.displayName())
117-
118-
self.buttonBox.rejected.connect(self.reject)
119-
self.buttonBox.accepted.connect(self.accept)
120-
121-
# Rename OK button to Run
122-
self.btnRun = self.buttonBox.button(QDialogButtonBox.Ok)
123-
self.btnRun.setText(self.tr('Run'))
124-
125-
self.buttonCancel.setEnabled(False)
126-
127-
self.btnClose = self.buttonBox.button(QDialogButtonBox.Close)
128-
129-
self.buttonBox.helpRequested.connect(self.openHelp)
130-
131-
self.btnCollapse.clicked.connect(self.toggleCollapsed)
132-
self.splitter.splitterMoved.connect(self.splitterChanged)
133-
134-
# desktop = QDesktopWidget()
135-
# if desktop.physicalDpiX() > 96:
136-
# self.txtHelp.setZoomFactor(desktop.physicalDpiX() / 96)
137-
138-
algHelp = self.formatHelp(self.alg)
139-
if algHelp is None:
140-
self.textShortHelp.hide()
141-
else:
142-
self.textShortHelp.document().setDefaultStyleSheet('''.summary { margin-left: 10px; margin-right: 10px; }
143-
h2 { color: #555555; padding-bottom: 15px; }
144-
a { text-decoration: none; color: #3498db; font-weight: bold; }
145-
p { color: #666666; }
146-
b { color: #333333; }
147-
dl dd { margin-bottom: 5px; }''')
148-
self.textShortHelp.setHtml(algHelp)
149-
150-
def linkClicked(url):
151-
webbrowser.open(url.toString())
152-
153-
self.textShortHelp.anchorClicked.connect(linkClicked)
154-
155-
self.showDebug = ProcessingConfig.getSetting(
156-
ProcessingConfig.SHOW_DEBUG_IN_DIALOG)
157-
158-
def createFeedback(self):
159-
feedback = AlgorithmDialogFeedback(self)
160-
feedback.progressChanged.connect(self.setPercentage)
161-
feedback.error.connect(self.error)
162-
feedback.progress_text.connect(self.setText)
163-
feedback.info.connect(self.setInfo)
164-
feedback.command_info.connect(self.setCommand)
165-
feedback.debug_info.connect(self.setDebugInfo)
166-
feedback.console_info.connect(self.setConsoleInfo)
167-
168-
self.buttonCancel.clicked.connect(feedback.cancel)
169-
return feedback
170-
171-
def formatHelp(self, alg):
172-
text = alg.shortHelpString()
173-
if not text:
174-
return None
175-
return "<h2>%s</h2>%s" % (alg.displayName(), "".join(["<p>%s</p>" % s for s in text.split("\n")]))
176-
177-
def closeEvent(self, event):
178-
self._saveGeometry()
179-
super(AlgorithmDialogBase, self).closeEvent(event)
180-
181-
def setMainWidget(self, widget):
182-
if self.mainWidget is not None:
183-
QgsProject.instance().layerWasAdded.disconnect(self.mainWidget.layerRegistryChanged)
184-
QgsProject.instance().layersWillBeRemoved.disconnect(self.mainWidget.layerRegistryChanged)
185-
self.mainWidget = widget
186-
self.tabWidget.widget(0).layout().addWidget(self.mainWidget)
187-
QgsProject.instance().layerWasAdded.connect(self.mainWidget.layerRegistryChanged)
188-
QgsProject.instance().layersWillBeRemoved.connect(self.mainWidget.layerRegistryChanged)
189-
190-
def error(self, msg):
191-
self.setInfo(msg, True)
192-
self.resetGUI()
193-
self.tabWidget.setCurrentIndex(1)
194-
195-
def resetGUI(self):
196-
self.lblProgress.setText('')
197-
self.progressBar.setMaximum(100)
198-
self.progressBar.setValue(0)
199-
self.btnRun.setEnabled(True)
200-
self.btnClose.setEnabled(True)
201-
202-
def setInfo(self, msg, error=False, escape_html=True):
203-
if error:
204-
self.txtLog.append('<span style="color:red">{}</span><br />'.format(msg, quote=False))
205-
elif escape_html:
206-
self.txtLog.append(html.escape(msg))
207-
else:
208-
self.txtLog.append(msg)
209-
210-
def setCommand(self, cmd):
211-
if self.showDebug:
212-
self.txtLog.append('<code>{}<code>'.format(html.escape(cmd, quote=False)))
213-
214-
def setDebugInfo(self, msg):
215-
if self.showDebug:
216-
self.txtLog.append('<span style="color:blue">{}</span>'.format(html.escape(msg, quote=False)))
217-
218-
def setConsoleInfo(self, msg):
219-
if self.showDebug:
220-
self.txtLog.append('<code><span style="color:darkgray">{}</span></code>'.format(html.escape(msg, quote=False)))
221-
222-
def setPercentage(self, value):
223-
if self.progressBar.maximum() == 0:
224-
self.progressBar.setMaximum(100)
225-
self.progressBar.setValue(value)
226-
227-
def setText(self, text):
228-
self.lblProgress.setText(text)
229-
self.setInfo(text, False)
230-
231-
def getParamValues(self):
232-
return {}
233-
234-
def accept(self):
235-
pass
236-
237-
def reject(self):
238-
self._saveGeometry()
239-
super(AlgorithmDialogBase, self).reject()
240-
241-
def finish(self, successful, result, context, feedback):
242-
pass
243-
244-
def toggleCollapsed(self):
245-
if self.helpCollapsed:
246-
self.splitter.restoreState(self.splitterState)
247-
self.btnCollapse.setArrowType(Qt.RightArrow)
248-
else:
249-
self.splitterState = self.splitter.saveState()
250-
self.splitter.setSizes([1, 0])
251-
self.btnCollapse.setArrowType(Qt.LeftArrow)
252-
self.helpCollapsed = not self.helpCollapsed
253-
254-
def splitterChanged(self, pos, index):
255-
if self.splitter.sizes()[1] == 0:
256-
self.helpCollapsed = True
257-
self.btnCollapse.setArrowType(Qt.LeftArrow)
258-
else:
259-
self.helpCollapsed = False
260-
self.btnCollapse.setArrowType(Qt.RightArrow)
261-
262-
def openHelp(self):
263-
algHelp = self.alg.helpUrl()
264-
if not algHelp:
265-
algHelp = QgsHelp.helpUrl("processing_algs/{}/{}".format(
266-
self.alg.provider().id(), self.alg.id())).toString()
267-
268-
if algHelp not in [None, ""]:
269-
webbrowser.open(algHelp)
270-
271-
def _saveGeometry(self):
272-
self.settings.setValue("/Processing/dialogBaseSplitter", self.splitter.saveState())
273-
self.settings.setValue("/Processing/dialogBase", self.saveGeometry())
29+
class AlgorithmDialogBase:
27430

27531
class InvalidParameterValue(Exception):
27632

0 commit comments

Comments
 (0)
Please sign in to comment.