34
34
import os
35
35
from functools import cmp_to_key
36
36
37
- from qgis .core import QgsCoordinateReferenceSystem , QgsVectorLayer
38
- from qgis .PyQt .QtWidgets import QCheckBox , QComboBox , QLineEdit , QPlainTextEdit
39
- from qgis .gui import QgsFieldExpressionWidget , QgsExpressionLineEdit , QgsProjectionSelectionWidget
37
+ from qgis .core import QgsCoordinateReferenceSystem , QgsVectorLayer , QgsApplication
38
+ from qgis .PyQt .QtWidgets import QCheckBox , QComboBox , QLineEdit , QPlainTextEdit , QWidget , QHBoxLayout , QToolButton
39
+ from qgis .gui import QgsFieldExpressionWidget , QgsExpressionLineEdit , QgsProjectionSelectionWidget , QgsGenericProjectionSelector
40
40
from qgis .PyQt .QtCore import pyqtSignal , QObject , QVariant
41
41
42
42
from processing .gui .NumberInputPanel import NumberInputPanel
@@ -107,36 +107,40 @@ def __init__(self, param, dialog, row=0, col=0):
107
107
if param .default is not None :
108
108
self .setValue (param .default )
109
109
110
- def comboValue (self , validator = None ):
111
- idx = self .widget .findText (self .widget .currentText ())
110
+ def comboValue (self , validator = None , combobox = None ):
111
+ if not combobox :
112
+ combobox = self .widget
113
+ idx = combobox .findText (combobox .currentText ())
112
114
if idx < 0 :
113
- v = self . widget .currentText ().strip ()
115
+ v = combobox .currentText ().strip ()
114
116
if validator is not None and not validator (v ):
115
117
raise InvalidParameterValue ()
116
118
return v
117
- return self . widget . itemData (self . widget .currentIndex ())
119
+ return combobox . itemData (combobox .currentIndex ())
118
120
119
121
def createWidget (self ):
120
122
pass
121
123
122
124
def setValue (self , value ):
123
125
pass
124
126
125
- def setComboValue (self , value ):
127
+ def setComboValue (self , value , combobox = None ):
128
+ if not combobox :
129
+ combobox = self .widget
126
130
if isinstance (value , list ):
127
131
value = value [0 ]
128
- values = [self . widget . itemData (i ) for i in range (self . widget .count ())]
132
+ values = [combobox . itemData (i ) for i in range (combobox .count ())]
129
133
try :
130
134
idx = values .index (value )
131
- self . widget .setCurrentIndex (idx )
135
+ combobox .setCurrentIndex (idx )
132
136
return
133
137
except ValueError :
134
138
pass
135
- if self . widget .isEditable ():
139
+ if combobox .isEditable ():
136
140
if value is not None :
137
- self . widget .setEditText (str (value ))
141
+ combobox .setEditText (str (value ))
138
142
else :
139
- self . widget .setCurrentIndex (0 )
143
+ combobox .setCurrentIndex (0 )
140
144
141
145
def value (self ):
142
146
pass
@@ -206,19 +210,32 @@ class CrsWidgetWrapper(WidgetWrapper):
206
210
207
211
def createWidget (self ):
208
212
if self .dialogType == DIALOG_MODELER :
209
- widget = QComboBox ()
210
- widget .setEditable (True )
213
+ self .combo = QComboBox ()
214
+ widget = QWidget ()
215
+ layout = QHBoxLayout ()
216
+ layout .setMargin (0 )
217
+ layout .setContentsMargins (0 , 0 , 0 , 0 )
218
+ layout .setSpacing (1 )
219
+ layout .addWidget (self .combo )
220
+ btn = QToolButton ()
221
+ btn .setIcon (QgsApplication .getThemeIcon ("mActionSetProjection.svg" ))
222
+ btn .setToolTip (self .tr ("Select CRS" ))
223
+ btn .clicked .connect (self .selectProjection )
224
+ layout .addWidget (btn )
225
+
226
+ widget .setLayout (layout )
227
+ self .combo .setEditable (True )
211
228
crss = self .dialog .getAvailableValuesOfType (ParameterCrs )
212
229
for crs in crss :
213
- widget .addItem (self .dialog .resolveValueDescription (crs ), crs )
230
+ self . combo .addItem (self .dialog .resolveValueDescription (crs ), crs )
214
231
raster = self .dialog .getAvailableValuesOfType (ParameterRaster , OutputRaster )
215
232
vector = self .dialog .getAvailableValuesOfType (ParameterVector , OutputVector )
216
233
for r in raster :
217
- widget .addItem ("Crs of layer " + self .dialog .resolveValueDescription (r ), r )
234
+ self . combo .addItem ("Crs of layer " + self .dialog .resolveValueDescription (r ), r )
218
235
for v in vector :
219
- widget .addItem ("Crs of layer " + self .dialog .resolveValueDescription (v ), v )
236
+ self . combo .addItem ("Crs of layer " + self .dialog .resolveValueDescription (v ), v )
220
237
if not self .param .default :
221
- widget .setEditText (self .param .default )
238
+ self . combo .setEditText (self .param .default )
222
239
return widget
223
240
else :
224
241
@@ -232,15 +249,24 @@ def createWidget(self):
232
249
233
250
return widget
234
251
252
+ def selectProjection (self ):
253
+ dialog = QgsGenericProjectionSelector (self .widget )
254
+ current_crs = QgsCoordinateReferenceSystem (self .combo .currentText ())
255
+ if current_crs .isValid ():
256
+ dialog .setSelectedCrsId (current_crs .srsid ())
257
+
258
+ if dialog .exec_ ():
259
+ self .setValue (dialog .selectedAuthId ())
260
+
235
261
def setValue (self , value ):
236
262
if self .dialogType == DIALOG_MODELER :
237
- self .setComboValue (value )
263
+ self .setComboValue (value , self . combo )
238
264
else :
239
265
self .widget .setCrs (QgsCoordinateReferenceSystem (value ))
240
266
241
267
def value (self ):
242
268
if self .dialogType == DIALOG_MODELER :
243
- return self .comboValue ()
269
+ return self .comboValue (combobox = self . combo )
244
270
else :
245
271
crs = self .widget .crs ()
246
272
if crs .isValid ():
0 commit comments