27
27
28
28
from qgis .PyQt .QtWidgets import QComboBox
29
29
from qgis .core import (QgsProcessingParameterString ,
30
- QgsProcessingOutputString )
30
+ QgsProcessingOutputString ,
31
+ QgsProcessingParameterDefinition )
32
+ from qgis .gui import QgsProcessingModelerParameterWidget
31
33
from processing .gui .wrappers import (WidgetWrapper ,
32
34
DIALOG_STANDARD ,
33
35
DIALOG_BATCH ,
34
36
DIALOG_MODELER )
35
37
38
+ # TODO: QGIS 3.8 move this class to processing/gui/
39
+ # OtbChoiceWidget is a crucial parameter type in otb provider
40
+ # It is the one that can handles required parameters are run-time depending on user input!.
41
+ # This idea is indeed different from static list of required/optional parameters from a descriptor file.
42
+ # So this class (if treated as first class citizen in processing/gui) have potential
43
+ # to be reused in existing or future processing providers.
44
+
36
45
37
46
class OtbChoiceWidgetWrapper (WidgetWrapper ):
38
47
48
+ def __init__ (self , param , dialog , row = 0 , col = 0 , ** kwargs ):
49
+ self .flagsModified = {}
50
+ super ().__init__ (param , dialog , row = 0 , col = 0 , ** kwargs )
51
+ self .updateAllParameters (None )
52
+
39
53
def createWidget (self ):
40
54
widget = QComboBox ()
41
55
widget .addItems (self .param .options )
42
56
if self .dialogType in (DIALOG_MODELER , DIALOG_STANDARD ):
43
- widget .currentIndexChanged .connect (self .valueChanged )
57
+ widget .currentIndexChanged .connect (self .updateAllParameters )
44
58
return widget
45
59
46
60
def get_algorithm (self ):
@@ -49,46 +63,59 @@ def get_algorithm(self):
49
63
else :
50
64
return self .dialog .algorithm ()
51
65
52
- def setWrapperVisible (self , name , visible ):
53
- if self .dialogType == DIALOG_STANDARD :
66
+ def __updateWrapper (self , name , visible ):
67
+ if self .dialogType == DIALOG_BATCH :
68
+ return
69
+ elif self .dialogType == DIALOG_STANDARD :
54
70
if self .dialog .mainWidget () is None :
55
71
return
56
- # For compatibility with 3.x API, we need to check whether the wrapper is
57
- # the deprecated WidgetWrapper class. If not, it's the newer
58
- # QgsAbstractProcessingParameterWidgetWrapper class
59
- # TODO QGIS 4.0 - remove is_python_wrapper logic
60
- is_python_wrapper = issubclass (self .dialog .mainWidget ().wrappers [name ].__class__ , WidgetWrapper )
61
- if is_python_wrapper :
62
- self .dialog .mainWidget ().wrappers [name ].widget .setVisible (visible )
63
- if self .dialog .mainWidget ().wrappers [name ].label :
64
- self .dialog .mainWidget ().wrappers [name ].label .setVisible (visible )
65
- else :
66
- self .dialog .mainWidget ().wrappers [name ].wrappedWidget ().setVisible (visible )
67
- if self .dialog .mainWidget ().wrappers [name ].wrappedLabel ():
68
- self .dialog .mainWidget ().wrappers [name ].wrappedLabel ().setVisible (visible )
72
+ if name in self .dialog .mainWidget ().wrappers :
73
+ self .__setWrapperVisibility (self .dialog .mainWidget ().wrappers [name ], visible )
74
+
75
+ #Fur Qgis modeler
69
76
else :
70
- # For compatibility with 3.x API, we need to check whether the wrapper is
71
- # the deprecated WidgetWrapper class. If not, it's the newer
72
- # QgsAbstractProcessingParameterWidgetWrapper class
73
- # TODO QGIS 4.0 - remove is_python_wrapper logic
74
77
if name in self .dialog .wrappers :
75
- is_python_wrapper = issubclass (self .dialog .wrappers [name ].__class__ , WidgetWrapper )
76
- if is_python_wrapper :
77
- self .dialog .wrappers [name ].widget .setVisible (visible )
78
- if self .dialog .wrappers [name ].label :
79
- self .dialog .wrappers [name ].label .setVisible (visible )
80
- else :
81
- self .dialog .wrappers [name ].setVisible (visible )
82
- if name in self .dialog .widget_labels :
83
- self .dialog .widget_labels [name ].setVisible (visible )
78
+ self .__setWrapperVisibility (self .dialog .wrappers [name ], visible )
79
+ if name in self .dialog .widget_labels :
80
+ self .dialog .widget_labels [name ].setVisible (visible )
81
+
82
+ def __setWrapperVisibility (self , wrapper , v ):
83
+ # For compatibility with 3.x API, we need to check whether the wrapper is
84
+ # the deprecated WidgetWrapper class. If not, it's the newer
85
+ # QgsAbstractProcessingParameterWidgetWrapper class
86
+ # TODO QGIS 4.0 - remove is_python_wrapper logic
87
+ if issubclass (wrapper .__class__ , WidgetWrapper ):
88
+ wrapper .widget .setVisible (v )
89
+ if wrapper .label :
90
+ wrapper .label .setVisible (v )
91
+ elif issubclass (wrapper .__class__ , QgsProcessingModelerParameterWidget ):
92
+ wrapper .setVisible (v )
93
+ else :
94
+ wrapper .wrappedWidget ().setVisible (v )
95
+ if wrapper .wrappedLabel ():
96
+ wrapper .wrappedLabel ().setVisible (v )
84
97
85
- def valueChanged (self , value ):
98
+ def updateAllParameters (self , current_value ):
86
99
for parameter in self .get_algorithm ().parameterDefinitions ():
87
100
if not 'group_key' in parameter .metadata () or parameter .metadata ()['group_key' ] != self .param .name ():
88
101
continue
89
102
name = parameter .name ()
90
- v = self .value () == parameter .metadata ()['group_value' ]
91
- self .setWrapperVisible (name , v )
103
+ choice_key = parameter .metadata ()['group_key' ]
104
+ if choice_key and choice_key + "." in name :
105
+ choice_param = self .get_algorithm ().parameterDefinition (choice_key )
106
+ if current_value is None :
107
+ current_value = choice_param .defaultValue ()
108
+ pattern = "{}.{}." .format (choice_key , choice_param .getValueAsText (current_value ))
109
+ if not pattern in name :
110
+ flags = self .get_algorithm ().parameterDefinition (name ).flags ()
111
+ if not flags & QgsProcessingParameterDefinition .FlagOptional :
112
+ self .flagsModified [name ] = True
113
+ self .get_algorithm ().parameterDefinition (name ).setFlags (QgsProcessingParameterDefinition .FlagOptional )
114
+ self .__updateWrapper (name , False )
115
+ else :
116
+ if name in self .flagsModified .keys ():
117
+ self .get_algorithm ().parameterDefinition (name ).setFlags (QgsProcessingParameterDefinition .FlagAdvanced )
118
+ self .__updateWrapper (name , True )
92
119
93
120
def setValue (self , value ):
94
121
if value in self .param .options :
@@ -101,29 +128,16 @@ def value(self):
101
128
return self .widget .currentText ()
102
129
103
130
def postInitialize (self , wrappers ):
104
- if self .dialogType == DIALOG_BATCH :
105
- return
106
-
131
+ # if self.dialogType == DIALOG_BATCH:
132
+ # return
133
+ self . updateAllParameters ( current_value = None )
107
134
for parameter in self .get_algorithm ().parameterDefinitions ():
108
135
if not 'group_key' in parameter .metadata () or parameter .metadata ()['group_key' ] != self .param .name ():
109
136
continue
110
- name = parameter .name ()
111
- v = self .value () == parameter .metadata ()['group_value' ]
112
137
for wrapper in wrappers :
113
- # For compatibility with 3.x API, we need to check whether the wrapper is
114
- # the deprecated WidgetWrapper class. If not, it's the newer
115
- # QgsAbstractProcessingParameterWidgetWrapper class
116
- # TODO QGIS 4.0 - remove is_python_wrapper logic
117
- is_python_wrapper = issubclass (wrapper .__class__ , WidgetWrapper )
118
- if wrapper .param .name () == name :
119
- if is_python_wrapper :
120
- wrapper .widget .setVisible (v )
121
- if wrapper .label :
122
- wrapper .label .setVisible (v )
123
- else :
124
- wrapper .wrappedWidget ().setVisible (v )
125
- if wrapper .wrappedLabel ():
126
- wrapper .wrappedLabel ().setVisible (v )
138
+ if wrapper .param .name () == parameter .name ():
139
+ v = self .value () == parameter .metadata ()['group_value' ]
140
+ self .__setWrapperVisibility (wrapper , v )
127
141
128
142
129
143
from qgis .core import QgsProcessingParameterDefinition
@@ -148,6 +162,11 @@ def __init__(self, name='', description='', options=[], default=None, isSource=F
148
162
self .default = 0
149
163
self .value = self .default
150
164
165
+ def getValueAsText (self , value ):
166
+ if not value in self .options :
167
+ value = self .options [int (value )]
168
+ return value
169
+
151
170
def setValue (self , value ):
152
171
if value is None :
153
172
self .value = 0
0 commit comments