Skip to content

Commit 80911c6

Browse files
authoredJun 6, 2017
Merge pull request #4675 from alexbruy/processing-help
[processing] improve help system
2 parents 51e7efe + e89502f commit 80911c6

File tree

11 files changed

+197
-174
lines changed

11 files changed

+197
-174
lines changed
 

‎python/plugins/processing/ProcessingPlugin.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
from processing.gui.ResultsDock import ResultsDock
4545
from processing.gui.AlgorithmLocatorFilter import AlgorithmLocatorFilter
4646
from processing.modeler.ModelerDialog import ModelerDialog
47-
from processing.tools.system import tempFolder
47+
from processing.tools.system import tempFolder, tempHelpFolder
4848
from processing.gui.menus import removeMenus, initializeMenus, createMenus
4949
from processing.core.ProcessingResults import resultsList
5050

@@ -146,6 +146,11 @@ def unload(self):
146146
if QDir(folder).exists():
147147
shutil.rmtree(folder, True)
148148

149+
# also delete temporary help files
150+
folder = tempHelpFolder()
151+
if QDir(folder).exists():
152+
shutil.rmtree(folder, True)
153+
149154
self.iface.unregisterMainWindowAction(self.toolboxAction)
150155
self.iface.unregisterMainWindowAction(self.modelerAction)
151156
self.iface.unregisterMainWindowAction(self.historyAction)

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,19 +80,15 @@ def processAlgorithm(self, parameters, context, feedback):
8080
commands[i] = c
8181
GdalUtils.runGdal(commands, feedback)
8282

83-
def shortHelpString(self):
83+
def helpUrl(self):
8484
helpPath = GdalUtils.gdalHelpPath()
8585
if helpPath == '':
86-
return
86+
return None
8787

8888
if os.path.exists(helpPath):
89-
url = QUrl.fromLocalFile(os.path.join(helpPath, '{}.html'.format(self.commandName()))).toString()
89+
return QUrl.fromLocalFile(os.path.join(helpPath, '{}.html'.format(self.commandName()))).toString()
9090
else:
91-
url = helpPath + '{}.html'.format(self.commandName())
92-
93-
return '''This algorithm is based on the GDAL {} module.
94-
For more info, see the <a href={}> module help</a>
95-
'''.format(self.commandName(), url)
91+
return helpPath + '{}.html'.format(self.commandName())
9692

9793
def commandName(self):
9894
parameters = {}

‎python/plugins/processing/core/GeoAlgorithm.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525

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

28+
from builtins import str
29+
from builtins import object
30+
2831
import os.path
2932
import traceback
3033
import subprocess
@@ -39,9 +42,8 @@
3942
QgsProcessingUtils,
4043
QgsProcessingParameterDefinition,
4144
QgsMessageLog)
45+
from qgis.gui import QgsHelp
4246

43-
from builtins import str
44-
from builtins import object
4547
from processing.core.ProcessingConfig import ProcessingConfig
4648
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
4749
from processing.core.parameters import ParameterRaster, ParameterVector, ParameterMultipleInput, ParameterTable, Parameter
@@ -390,3 +392,7 @@ def executeAlgorithm(alg, parameters, context=None, feedback=None, model=None):
390392
# lines.append(traceback.format_exc())
391393
#QgsMessageLog.logMessage('\n'.join(lines), self.tr('Processing'), QgsMessageLog.CRITICAL)
392394
#raise GeoAlgorithmExecutionException(str(e) + self.tr('\nSee log for more details'), lines, e)
395+
396+
def helpUrl(self):
397+
return QgsHelp.helpUrl("processing_algs/{}/{}".format(
398+
self.provider().id(), self.id())).toString()

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ def checkExtentCRS(self):
157157
return hasExtent and unmatchingCRS
158158

159159
def accept(self):
160-
self.settings.setValue("/Processing/dialogBase", self.saveGeometry())
160+
super(AlgorithmDialog, self)._saveGeometry()
161161

162162
context = dataobjects.createContext()
163163

@@ -273,7 +273,7 @@ def finish(self, result, context):
273273
self.tr('HTML output has been generated by this algorithm.'
274274
'\nOpen the results dialog to check it.'))
275275

276-
def closeEvent(self, evt):
276+
def closeEvent(self, event):
277277
QgsProject.instance().layerWasAdded.disconnect(self.mainWidget.layerRegistryChanged)
278278
QgsProject.instance().layersWillBeRemoved.disconnect(self.mainWidget.layerRegistryChanged)
279-
super(AlgorithmDialog, self).closeEvent(evt)
279+
super(AlgorithmDialog, self).closeEvent(event)

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

Lines changed: 61 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,11 @@
3030
import webbrowser
3131

3232
from qgis.PyQt import uic
33-
from qgis.PyQt.QtCore import QCoreApplication, QByteArray, QUrl
34-
from qgis.PyQt.QtWidgets import QApplication, QDialogButtonBox
35-
from qgis.PyQt.QtNetwork import QNetworkRequest, QNetworkReply
33+
from qgis.PyQt.QtCore import Qt, QCoreApplication, QByteArray, QUrl
34+
from qgis.PyQt.QtWidgets import QApplication, QDialogButtonBox, QVBoxLayout, QToolButton
3635

3736
from qgis.utils import iface
38-
from qgis.core import (QgsNetworkAccessManager,
39-
QgsProject,
37+
from qgis.core import (QgsProject,
4038
QgsProcessingFeedback,
4139
QgsSettings)
4240

@@ -82,34 +80,56 @@ def __init__(self, alg):
8280
super(AlgorithmDialogBase, self).__init__(iface.mainWindow())
8381
self.setupUi(self)
8482

83+
# don't collapse parameters panel
84+
self.splitter.setCollapsible(0, False)
85+
86+
# add collapse button to splitter
87+
splitterHandle = self.splitter.handle(1)
88+
handleLayout = QVBoxLayout()
89+
handleLayout.setContentsMargins(0, 0, 0, 0)
90+
self.btnCollapse = QToolButton(splitterHandle)
91+
self.btnCollapse.setAutoRaise(True)
92+
self.btnCollapse.setFixedSize(12, 12)
93+
self.btnCollapse.setCursor(Qt.ArrowCursor)
94+
handleLayout.addWidget(self.btnCollapse)
95+
handleLayout.addStretch()
96+
splitterHandle.setLayout(handleLayout)
97+
8598
self.feedback = AlgorithmDialogFeedback(self)
8699
self.feedback.progressChanged.connect(self.setPercentage)
87100
self.buttonCancel.clicked.connect(self.feedback.cancel)
88101

89102
self.settings = QgsSettings()
103+
self.splitter.restoreState(self.settings.value("/Processing/dialogBaseSplitter", QByteArray()))
90104
self.restoreGeometry(self.settings.value("/Processing/dialogBase", QByteArray()))
105+
self.splitterState = self.splitter.saveState()
106+
self.splitterChanged(0, 0)
91107

92108
self.executed = False
93109
self.mainWidget = None
94110
self.alg = alg
95111

112+
self.setWindowTitle(self.alg.displayName())
113+
96114
# Rename OK button to Run
97115
self.btnRun = self.buttonBox.button(QDialogButtonBox.Ok)
98116
self.btnRun.setText(self.tr('Run'))
99117

100118
self.buttonCancel.setEnabled(False)
101119

102120
self.btnClose = self.buttonBox.button(QDialogButtonBox.Close)
121+
self.buttonBox.helpRequested.connect(self.openHelp)
103122

104-
self.setWindowTitle(self.alg.displayName())
123+
self.btnCollapse.clicked.connect(self.toggleCollapsed)
124+
self.splitter.splitterMoved.connect(self.splitterChanged)
105125

106126
# desktop = QDesktopWidget()
107127
# if desktop.physicalDpiX() > 96:
108128
# self.txtHelp.setZoomFactor(desktop.physicalDpiX() / 96)
109129

110130
algHelp = self.formatHelp(self.alg)
111131
if algHelp is None:
112-
self.textShortHelp.setVisible(False)
132+
self.textShortHelp.hide()
113133
else:
114134
self.textShortHelp.document().setDefaultStyleSheet('''.summary { margin-left: 10px; margin-right: 10px; }
115135
h2 { color: #555555; padding-bottom: 15px; }
@@ -119,30 +139,11 @@ def __init__(self, alg):
119139
dl dd { margin-bottom: 5px; }''')
120140
self.textShortHelp.setHtml(algHelp)
121141

122-
self.textShortHelp.setOpenLinks(False)
123-
124142
def linkClicked(url):
125143
webbrowser.open(url.toString())
126144

127145
self.textShortHelp.anchorClicked.connect(linkClicked)
128146

129-
if self.alg.helpString() is not None:
130-
try:
131-
self.txtHelp.setHtml(self.alg.helpString())
132-
except Exception:
133-
self.tabWidget.removeTab(2)
134-
elif self.alg.helpUrl() is not None:
135-
try:
136-
html = self.tr('<p>Downloading algorithm help... Please wait.</p>')
137-
self.txtHelp.setHtml(html)
138-
rq = QNetworkRequest(QUrl(self.alg.helpUrl()))
139-
self.reply = QgsNetworkAccessManager.instance().get(rq)
140-
self.reply.finished.connect(self.requestFinished)
141-
except Exception:
142-
self.tabWidget.removeTab(2)
143-
else:
144-
self.tabWidget.removeTab(2)
145-
146147
self.showDebug = ProcessingConfig.getSetting(
147148
ProcessingConfig.SHOW_DEBUG_IN_DIALOG)
148149

@@ -152,19 +153,9 @@ def formatHelp(self, alg):
152153
return None
153154
return "<h2>%s</h2>%s" % (alg.displayName(), "".join(["<p>%s</p>" % s for s in text.split("\n")]))
154155

155-
def requestFinished(self):
156-
"""Change the webview HTML content"""
157-
reply = self.sender()
158-
if reply.error() != QNetworkReply.NoError:
159-
html = self.tr('<h2>No help available for this algorithm</h2><p>{}</p>'.format(reply.errorString()))
160-
else:
161-
html = str(reply.readAll())
162-
reply.deleteLater()
163-
self.txtHelp.setHtml(html)
164-
165-
def closeEvent(self, evt):
166-
self.settings.setValue("/Processing/dialogBase", self.saveGeometry())
167-
super(AlgorithmDialogBase, self).closeEvent(evt)
156+
def closeEvent(self, event):
157+
self._saveGeometry()
158+
super(AlgorithmDialogBase, self).closeEvent(event)
168159

169160
def setMainWidget(self, widget):
170161
if self.mainWidget is not None:
@@ -228,9 +219,40 @@ def getParamValues(self):
228219
def accept(self):
229220
pass
230221

222+
def reject(self):
223+
self._saveGeometry()
224+
super(AlgorithmDialogBase, self).reject()
225+
231226
def finish(self, context):
232227
pass
233228

229+
def toggleCollapsed(self):
230+
if self.helpCollapsed:
231+
self.splitter.restoreState(self.splitterState)
232+
self.btnCollapse.setArrowType(Qt.RightArrow)
233+
else:
234+
self.splitterState = self.splitter.saveState()
235+
self.splitter.setSizes([1, 0])
236+
self.btnCollapse.setArrowType(Qt.LeftArrow)
237+
self.helpCollapsed = not self.helpCollapsed
238+
239+
def splitterChanged(self, pos, index):
240+
if self.splitter.sizes()[1] == 0:
241+
self.helpCollapsed = True
242+
self.btnCollapse.setArrowType(Qt.LeftArrow)
243+
else:
244+
self.helpCollapsed = False
245+
self.btnCollapse.setArrowType(Qt.RightArrow)
246+
247+
def openHelp(self):
248+
algHelp = self.alg.helpUrl()
249+
if algHelp not in [None, ""]:
250+
webbrowser.open(algHelp)
251+
252+
def _saveGeometry(self):
253+
self.settings.setValue("/Processing/dialogBaseSplitter", self.splitter.saveState())
254+
self.settings.setValue("/Processing/dialogBase", self.saveGeometry())
255+
234256
class InvalidParameterValue(Exception):
235257

236258
def __init__(self, param, widget):

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,14 @@
2727

2828
__revision__ = '$Format:%H$'
2929

30-
from qgis.PyQt.QtCore import QCoreApplication
3130
import os
3231
import re
3332
import json
3433

34+
from qgis.PyQt.QtCore import QCoreApplication, QUrl
35+
36+
from processing.tools import system
37+
3538
ALG_DESC = 'ALG_DESC'
3639
ALG_CREATOR = 'ALG_CREATOR'
3740
ALG_HELP_CREATOR = 'ALG_HELP_CREATOR'
@@ -63,7 +66,13 @@ def getHtmlFromHelpFile(alg, helpFile):
6366
try:
6467
with open(helpFile) as f:
6568
descriptions = json.load(f)
66-
return getHtmlFromDescriptionsDict(alg, descriptions)
69+
70+
content = getHtmlFromDescriptionsDict(alg, descriptions)
71+
algGroup, algName = alg.id().split(':')
72+
filePath = os.path.join(system.tempHelpFolder(), "{}_{}.html".format(algGroup, algName))
73+
with open(filePath, 'w', encoding='utf-8') as f:
74+
f.write(content)
75+
return QUrl.fromLocalFile(filePath).toString()
6776
except:
6877
return None
6978

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ def updateModelerView(self):
539539
if self.modelerdialog:
540540
self.modelerdialog.repaintModel()
541541

542-
def helpString(self):
542+
def helpUrl(self):
543543
try:
544544
return getHtmlFromDescriptionsDict(self, self.helpContent)
545545
except:

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

Lines changed: 14 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,14 @@
2727

2828
__revision__ = '$Format:%H$'
2929

30+
import webbrowser
31+
3032
from qgis.PyQt.QtCore import Qt, QUrl, QMetaObject
3133
from qgis.PyQt.QtWidgets import (QDialog, QDialogButtonBox, QLabel, QLineEdit,
3234
QFrame, QPushButton, QSizePolicy, QVBoxLayout,
33-
QHBoxLayout, QTabWidget, QWidget,
34-
QTextBrowser)
35-
from qgis.PyQt.QtNetwork import QNetworkRequest, QNetworkReply
35+
QHBoxLayout, QWidget)
3636

37-
from qgis.core import (QgsNetworkAccessManager,
38-
QgsProcessingParameterDefinition)
37+
from qgis.core import (QgsProcessingParameterDefinition)
3938

4039
from qgis.gui import (QgsMessageBar,
4140
QgsScrollArea)
@@ -89,7 +88,8 @@ def setupUi(self):
8988
self.buttonBox = QDialogButtonBox()
9089
self.buttonBox.setOrientation(Qt.Horizontal)
9190
self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel |
92-
QDialogButtonBox.Ok)
91+
+ QDialogButtonBox.Ok |
92+
+ QDialogButtonBox.Help)
9393
self.setSizePolicy(QSizePolicy.Expanding,
9494
QSizePolicy.Expanding)
9595
self.verticalLayout = QVBoxLayout()
@@ -182,53 +182,24 @@ def setupUi(self):
182182
self.verticalLayout2 = QVBoxLayout()
183183
self.verticalLayout2.setSpacing(2)
184184
self.verticalLayout2.setMargin(0)
185-
self.tabWidget = QTabWidget()
186-
self.tabWidget.setMinimumWidth(300)
185+
187186
self.paramPanel = QWidget()
188187
self.paramPanel.setLayout(self.verticalLayout)
189188
self.scrollArea = QgsScrollArea()
190189
self.scrollArea.setWidget(self.paramPanel)
191190
self.scrollArea.setWidgetResizable(True)
192-
self.tabWidget.addTab(self.scrollArea, self.tr('Parameters'))
193-
194-
self.txtHelp = QTextBrowser()
195191

196-
html = None
197-
isText, algHelp = self._alg.help()
198-
if algHelp is not None:
199-
algHelp = algHelp if isText else QUrl(algHelp)
200-
try:
201-
if isText:
202-
self.txtHelp.setHtml(algHelp)
203-
else:
204-
html = self.tr('<p>Downloading algorithm help... Please wait.</p>')
205-
self.txtHelp.setHtml(html)
206-
self.tabWidget.addTab(self.txtHelp, 'Help')
207-
self.reply = QgsNetworkAccessManager.instance().get(QNetworkRequest(algHelp))
208-
self.reply.finished.connect(self.requestFinished)
209-
except:
210-
pass
211-
212-
self.verticalLayout2.addWidget(self.tabWidget)
192+
self.verticalLayout2.addWidget(self.scrollArea)
213193
self.verticalLayout2.addWidget(self.buttonBox)
214194
self.setLayout(self.verticalLayout2)
215195
self.buttonBox.accepted.connect(self.okPressed)
216196
self.buttonBox.rejected.connect(self.cancelPressed)
197+
self.buttonBox.helpRequested.connect(self.openHelp)
217198
QMetaObject.connectSlotsByName(self)
218199

219200
for wrapper in list(self.wrappers.values()):
220201
wrapper.postInitialize(list(self.wrappers.values()))
221202

222-
def requestFinished(self):
223-
"""Change the webview HTML content"""
224-
reply = self.sender()
225-
if reply.error() != QNetworkReply.NoError:
226-
html = self.tr('<h2>No help available for this algorithm</h2><p>{}</p>'.format(reply.errorString()))
227-
else:
228-
html = str(reply.readAll())
229-
reply.deleteLater()
230-
self.txtHelp.setHtml(html)
231-
232203
def getAvailableDependencies(self): # spellok
233204
if self._algName is None:
234205
dependent = []
@@ -353,3 +324,8 @@ def okPressed(self):
353324
def cancelPressed(self):
354325
self.alg = None
355326
self.close()
327+
328+
def openHelp(self):
329+
algHelp = self._alg.help()
330+
if algHelp is not None:
331+
webbrowser.open(algHelp)

‎python/plugins/processing/script/ScriptAlgorithm.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,9 @@ def processAlgorithm(self, parameters, context, feedback):
198198
for out in self.outputs:
199199
out.setValue(ns[out.name])
200200

201-
def helpString(self):
201+
def helpUrl(self):
202202
if self.descriptionFile is None:
203-
return False, None
203+
return None
204204
helpfile = self.descriptionFile + '.help'
205205
if os.path.exists(helpfile):
206206
return getHtmlFromHelpFile(self, helpfile)

‎python/plugins/processing/tools/system.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,14 @@ def mkdir(newdir):
142142
os.mkdir(newdir)
143143

144144

145+
def tempHelpFolder():
146+
tmp = os.path.join(str(QDir.tempPath()), 'processing_help')
147+
if not QDir(tmp).exists():
148+
QDir().mkpath(tmp)
149+
150+
return str(os.path.abspath(tmp))
151+
152+
145153
def escapeAndJoin(strList):
146154
joined = ''
147155
for s in strList:

‎python/plugins/processing/ui/DlgAlgorithmBase.ui

Lines changed: 79 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>841</width>
9+
<width>685</width>
1010
<height>525</height>
1111
</rect>
1212
</property>
@@ -15,20 +15,37 @@
1515
</property>
1616
<layout class="QVBoxLayout" name="verticalLayout">
1717
<item>
18-
<layout class="QHBoxLayout" name="horizontalLayout">
19-
<item>
20-
<widget class="QTabWidget" name="tabWidget">
21-
<property name="currentIndex">
22-
<number>0</number>
23-
</property>
24-
<widget class="QWidget" name="tab">
25-
<attribute name="title">
26-
<string>Parameters</string>
27-
</attribute>
28-
<layout class="QVBoxLayout" name="verticalLayout_4">
29-
<property name="spacing">
30-
<number>2</number>
31-
</property>
18+
<widget class="QSplitter" name="splitter">
19+
<property name="sizePolicy">
20+
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
21+
<horstretch>0</horstretch>
22+
<verstretch>0</verstretch>
23+
</sizepolicy>
24+
</property>
25+
<property name="orientation">
26+
<enum>Qt::Horizontal</enum>
27+
</property>
28+
<property name="handleWidth">
29+
<number>16</number>
30+
</property>
31+
<widget class="QTabWidget" name="tabWidget">
32+
<property name="sizePolicy">
33+
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
34+
<horstretch>2</horstretch>
35+
<verstretch>0</verstretch>
36+
</sizepolicy>
37+
</property>
38+
<property name="currentIndex">
39+
<number>0</number>
40+
</property>
41+
<widget class="QWidget" name="tab">
42+
<attribute name="title">
43+
<string>Parameters</string>
44+
</attribute>
45+
<layout class="QVBoxLayout" name="verticalLayout_4">
46+
<property name="spacing">
47+
<number>2</number>
48+
</property>
3249
<property name="leftMargin">
3350
<number>0</number>
3451
</property>
@@ -39,18 +56,18 @@
3956
<number>0</number>
4057
</property>
4158
<property name="bottomMargin">
42-
<number>0</number>
43-
</property>
44-
</layout>
45-
</widget>
46-
<widget class="QWidget" name="tab_2">
47-
<attribute name="title">
48-
<string>Log</string>
49-
</attribute>
50-
<layout class="QVBoxLayout" name="verticalLayout_2">
51-
<property name="spacing">
52-
<number>2</number>
53-
</property>
59+
<number>0</number>
60+
</property>
61+
</layout>
62+
</widget>
63+
<widget class="QWidget" name="tab_2">
64+
<attribute name="title">
65+
<string>Log</string>
66+
</attribute>
67+
<layout class="QVBoxLayout" name="verticalLayout_2">
68+
<property name="spacing">
69+
<number>2</number>
70+
</property>
5471
<property name="leftMargin">
5572
<number>0</number>
5673
</property>
@@ -61,25 +78,14 @@
6178
<number>0</number>
6279
</property>
6380
<property name="bottomMargin">
64-
<number>0</number>
65-
</property>
66-
<item>
67-
<widget class="QTextEdit" name="txtLog">
68-
<property name="readOnly">
69-
<bool>true</bool>
70-
</property>
71-
</widget>
72-
</item>
73-
</layout>
74-
</widget>
75-
<widget class="QWidget" name="tab_3">
76-
<attribute name="title">
77-
<string>Help</string>
78-
</attribute>
79-
<layout class="QHBoxLayout" name="horizontalLayout_2">
80-
<property name="spacing">
81-
<number>0</number>
82-
</property>
81+
<number>0</number>
82+
</property>
83+
<property name="topMargin">
84+
<number>0</number>
85+
</property>
86+
<property name="rightMargin">
87+
<number>0</number>
88+
</property>
8389
<property name="leftMargin">
8490
<number>0</number>
8591
</property>
@@ -90,38 +96,33 @@
9096
<number>0</number>
9197
</property>
9298
<property name="bottomMargin">
93-
<number>0</number>
94-
</property>
95-
<item>
96-
<widget class="QTextBrowser" name="txtHelp"/>
97-
</item>
98-
</layout>
99-
</widget>
100-
</widget>
101-
</item>
102-
<item>
103-
<widget class="QTextBrowser" name="textShortHelp">
104-
<property name="sizePolicy">
105-
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
106-
<horstretch>0</horstretch>
107-
<verstretch>0</verstretch>
108-
</sizepolicy>
109-
</property>
110-
<property name="minimumSize">
111-
<size>
112-
<width>200</width>
113-
<height>0</height>
114-
</size>
115-
</property>
116-
<property name="maximumSize">
117-
<size>
118-
<width>300</width>
119-
<height>16777215</height>
120-
</size>
121-
</property>
99+
<number>0</number>
100+
</property>
101+
<item>
102+
<widget class="QTextEdit" name="txtLog">
103+
<property name="readOnly">
104+
<bool>true</bool>
105+
</property>
106+
</widget>
107+
</item>
108+
</layout>
122109
</widget>
123-
</item>
124-
</layout>
110+
</widget>
111+
<widget class="QTextBrowser" name="textShortHelp">
112+
<property name="sizePolicy">
113+
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
114+
<horstretch>0</horstretch>
115+
<verstretch>0</verstretch>
116+
</sizepolicy>
117+
</property>
118+
<property name="accessibleName">
119+
<string/>
120+
</property>
121+
<property name="openLinks">
122+
<bool>false</bool>
123+
</property>
124+
</widget>
125+
</widget>
125126
</item>
126127
<item>
127128
<widget class="QLabel" name="lblProgress">
@@ -157,7 +158,7 @@
157158
<enum>Qt::Horizontal</enum>
158159
</property>
159160
<property name="standardButtons">
160-
<set>QDialogButtonBox::Close|QDialogButtonBox::Ok</set>
161+
<set>QDialogButtonBox::Close|QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
161162
</property>
162163
</widget>
163164
</item>

0 commit comments

Comments
 (0)
Please sign in to comment.