86
86
from processing .modeler .MultilineTextPanel import MultilineTextPanel
87
87
from processing .tools import dataobjects
88
88
89
+ from qgis .core import QgsApplication
90
+ from qgis .PyQt .QtGui import QToolButton , QMenu , QAction
91
+
92
+
93
+ class ModelerWidgetWrapper (QWidget ):
94
+
95
+ def __init__ (self , wrapper , model_values ):
96
+ super (ModelerWidgetWrapper , self ).__init__ ()
97
+
98
+ self .wrapper = wrapper
99
+ self .widget = wrapper .widget
100
+ self .implemented = wrapper .implemented
101
+ self .model_values = model_values
102
+
103
+ menu = QMenu ()
104
+ fixed_value_action = QAction (self .tr ('Fixed value' ), menu )
105
+ fixed_value_action .triggered .connect (self .on_fixedValue )
106
+ menu .addAction (fixed_value_action )
107
+ menu .addSeparator ()
108
+ for text , value in model_values :
109
+ model_value_action = QAction (text , menu )
110
+ model_value_action .setData (value )
111
+ model_value_action .triggered .connect (self .on_modelValue )
112
+ menu .addAction (model_value_action )
113
+
114
+ self .mIconDataDefine = QgsApplication .getThemeIcon ("/mIconDataDefine.svg" )
115
+ self .mIconDataDefineOn = QgsApplication .getThemeIcon ("/mIconDataDefineOn.svg" )
116
+
117
+ button = QToolButton ()
118
+ button .setIcon (self .mIconDataDefine )
119
+ button .setPopupMode (QToolButton .InstantPopup )
120
+ button .setMenu (menu )
121
+ self .button = button
122
+
123
+ label = QLabel ()
124
+ label .hide ()
125
+ self .label = label
126
+
127
+ layout = QHBoxLayout ()
128
+ layout .addWidget (button , 0 )
129
+ layout .addWidget (label , 1 )
130
+ layout .addWidget (wrapper .widget , 1 )
131
+ self .setLayout (layout )
132
+
133
+ def on_fixedValue (self ):
134
+ self .button .setIcon (self .mIconDataDefine )
135
+ self .label .hide ()
136
+ self .wrapper .widget .show ()
137
+
138
+ def on_modelValue (self ):
139
+ action = self .sender ()
140
+ self .setValue (action .data ())
141
+
142
+ def setValue (self , value ):
143
+ for text , val in self .model_values :
144
+ if val == value :
145
+ self .model_value = value
146
+ self .button .setIcon (self .mIconDataDefineOn )
147
+ self .label .setText (text )
148
+ self .label .show ()
149
+ self .wrapper .widget .hide ()
150
+ return
151
+ self .wrapper .setValue (value )
152
+ self .on_fixedValue ()
153
+
154
+ def value (self ):
155
+ if self .label .isVisible ():
156
+ return self .model_value
157
+ else :
158
+ return self .wrapper .value ()
159
+
89
160
90
161
class ModelerParametersDialog (QDialog ):
91
162
@@ -166,8 +237,10 @@ def setupUi(self):
166
237
desc += self .tr ('(x, y)' )
167
238
label = QLabel (desc )
168
239
self .labels [param .name ] = label
240
+
169
241
wrapper = self .getWidgetWrapperFromParameter (param )
170
242
self .widget_wrappers [param .name ] = wrapper
243
+
171
244
widget = wrapper .widget
172
245
self .valueItems [param .name ] = widget
173
246
if param .name in list (tooltips .keys ()):
@@ -178,10 +251,11 @@ def setupUi(self):
178
251
widget .setToolTip (tooltip )
179
252
if param .isAdvanced :
180
253
label .setVisible (self .showAdvanced )
181
- widget .setVisible (self .showAdvanced )
254
+ wrapper .setVisible (self .showAdvanced )
182
255
self .widgets [param .name ] = widget
256
+
183
257
self .verticalLayout .addWidget (label )
184
- self .verticalLayout .addWidget (widget )
258
+ self .verticalLayout .addWidget (wrapper )
185
259
186
260
for output in self ._alg .outputs :
187
261
if output .hidden :
@@ -282,6 +356,12 @@ def showAdvancedParametersClicked(self):
282
356
self .labels [param .name ].setVisible (self .showAdvanced )
283
357
self .widgets [param .name ].setVisible (self .showAdvanced )
284
358
359
+ def getAvailableValuesForParam (self , param ):
360
+ outputType = None
361
+ if isinstance (param , ParameterCrs ):
362
+ outputType = OutputCrs
363
+ return self .getAvailableValuesOfType (param .__class__ , outputType )
364
+
285
365
def getAvailableValuesOfType (self , paramType , outType = None , dataType = None ):
286
366
values = []
287
367
inputs = self .model .inputs
@@ -317,18 +397,19 @@ def resolveValueDescription(self, value):
317
397
return self .tr ("'%s' from algorithm '%s'" ) % (alg .algorithm .getOutputFromName (value .output ).description , alg .description )
318
398
319
399
def getWidgetWrapperFromParameter (self , param ):
320
- extra_values = []
321
- values = self .getAvailableValuesOfType (param .__class__ , None )
400
+ wrapper = wrapper_from_param (param , DIALOG_MODELER )
401
+ if wrapper is None :
402
+ widget = self .getWidgetFromParameter (param )
403
+ wrapper = NotYetImplementedWidgetWrapper (param , widget )
404
+
405
+ model_values = []
406
+ values = self .getAvailableValuesForParam (param )
322
407
for value in values :
323
- extra_values .append ((self .resolveValueDescription (value ), value ))
408
+ model_values .append ((self .resolveValueDescription (value ), value ))
324
409
325
- wrapper = wrapper_from_param (param , DIALOG_MODELER , extra_values )
326
- if wrapper is not None :
327
- return wrapper
410
+ input_wrapper = ModelerWidgetWrapper (wrapper , model_values )
411
+ return input_wrapper
328
412
329
- widget = self .getWidgetFromParameter (param )
330
- wrapper = NotYetImplementedWidgetWrapper (param , widget )
331
- return wrapper
332
413
333
414
def getWidgetFromParameter (self , param ):
334
415
if isinstance (param , ParameterRaster ):
@@ -411,11 +492,6 @@ def getWidgetFromParameter(self, param):
411
492
for n in numbers :
412
493
item .addItem (self .resolveValueDescription (n ), n )
413
494
item .setEditText (str (param .default ))
414
- elif isinstance (param , ParameterCrs ):
415
- item = QComboBox ()
416
- values = self .getAvailableValuesOfType (ParameterCrs , OutputCrs )
417
- for v in values :
418
- item .addItem (self .resolveValueDescription (v ), v )
419
495
elif isinstance (param , ParameterExtent ):
420
496
item = QComboBox ()
421
497
item .setEditable (True )
@@ -514,6 +590,7 @@ def setPreviousValues(self):
514
590
wrapper = self .widget_wrappers [param .name ]
515
591
if wrapper .implemented :
516
592
wrapper .setValue (value )
593
+ continue
517
594
518
595
widget = wrapper .widget
519
596
if isinstance (param , (
@@ -724,15 +801,6 @@ def setParamPointValue(self, alg, param, widget):
724
801
alg .params [param .name ] = value
725
802
return True
726
803
727
- def setParamCrsValue (self , alg , param , widget ):
728
- idx = widget .currentIndex ()
729
- if idx < 0 :
730
- return False
731
- else :
732
- value = widget .itemData (widget .currentIndex ())
733
- alg .params [param .name ] = value
734
- return True
735
-
736
804
def setParamValue (self , alg , param , wrapper ):
737
805
if wrapper .implemented :
738
806
alg .params [param .name ] = wrapper .value ()
@@ -758,8 +826,6 @@ def setParamValue(self, alg, param, wrapper):
758
826
elif isinstance (param , ParameterRange ):
759
827
alg .params [param .name ] = widget .getValue ()
760
828
return True
761
- elif isinstance (param , ParameterCrs ):
762
- return self .setParamCrsValue (alg , param , widget )
763
829
elif isinstance (param , ParameterFixedTable ):
764
830
table = widget .table
765
831
if not bool (table ) and not param .optional :
0 commit comments