29
29
30
30
import os
31
31
32
- from qgis .core import QgsSettings
32
+ from qgis .core import (QgsSettings ,
33
+ QgsProcessing ,
34
+ QgsVectorFileWriter ,
35
+ QgsProviderRegistry ,
36
+ QgsProcessingModelChildParameterSource )
33
37
from qgis .PyQt import uic
34
38
from qgis .PyQt .QtCore import Qt
35
39
from qgis .PyQt .QtCore import QByteArray
36
- from qgis .PyQt .QtWidgets import QDialog , QAbstractItemView , QPushButton , QDialogButtonBox
40
+ from qgis .PyQt .QtWidgets import QDialog , QAbstractItemView , QPushButton , QDialogButtonBox , QFileDialog
37
41
from qgis .PyQt .QtGui import QStandardItemModel , QStandardItem
42
+ from processing .tools import dataobjects
38
43
39
44
pluginPath = os .path .split (os .path .dirname (__file__ ))[0 ]
40
45
WIDGET , BASE = uic .loadUiType (
43
48
44
49
class MultipleInputDialog (BASE , WIDGET ):
45
50
46
- def __init__ (self , options , selectedoptions = None ):
51
+ def __init__ (self , options , selectedoptions = None , datatype = None ):
47
52
super (MultipleInputDialog , self ).__init__ (None )
48
53
self .setupUi (self )
54
+ self .datatype = datatype
55
+ self .model = None
49
56
50
57
self .lstLayers .setSelectionMode (QAbstractItemView .NoSelection )
51
58
@@ -68,6 +75,11 @@ def __init__(self, options, selectedoptions=None):
68
75
self .btnToggleSelection = QPushButton (self .tr ('Toggle selection' ))
69
76
self .buttonBox .addButton (self .btnToggleSelection ,
70
77
QDialogButtonBox .ActionRole )
78
+ if self .datatype is not None :
79
+ btnAddFile = QPushButton (self .tr ('Add file(s)…' ))
80
+ btnAddFile .clicked .connect (self .addFiles )
81
+ self .buttonBox .addButton (btnAddFile ,
82
+ QDialogButtonBox .ActionRole )
71
83
72
84
self .btnSelectAll .clicked .connect (lambda : self .selectAll (True ))
73
85
self .btnClearSelection .clicked .connect (lambda : self .selectAll (False ))
@@ -76,22 +88,34 @@ def __init__(self, options, selectedoptions=None):
76
88
self .settings = QgsSettings ()
77
89
self .restoreGeometry (self .settings .value ("/Processing/multipleInputDialogGeometry" , QByteArray ()))
78
90
91
+ self .lstLayers .setSelectionMode (QAbstractItemView .ExtendedSelection )
79
92
self .populateList ()
80
93
self .finished .connect (self .saveWindowGeometry )
81
94
82
95
def saveWindowGeometry (self ):
83
96
self .settings .setValue ("/Processing/multipleInputDialogGeometry" , self .saveGeometry ())
84
97
85
98
def populateList (self ):
86
- model = QStandardItemModel ()
99
+ self . model = QStandardItemModel ()
87
100
for value , text in self .options :
88
101
item = QStandardItem (text )
89
102
item .setData (value , Qt .UserRole )
90
103
item .setCheckState (Qt .Checked if value in self .selectedoptions else Qt .Unchecked )
91
104
item .setCheckable (True )
92
- model .appendRow (item )
105
+ self . model .appendRow (item )
93
106
94
- self .lstLayers .setModel (model )
107
+ # add extra options (e.g. manually added layers)
108
+ for t in [o for o in self .selectedoptions if not isinstance (o , int )]:
109
+ if isinstance (t , QgsProcessingModelChildParameterSource ):
110
+ item = QStandardItem (t .staticValue ())
111
+ else :
112
+ item = QStandardItem (t )
113
+ item .setData (item .text (), Qt .UserRole )
114
+ item .setCheckState (Qt .Checked )
115
+ item .setCheckable (True )
116
+ self .model .appendRow (item )
117
+
118
+ self .lstLayers .setModel (self .model )
95
119
96
120
def accept (self ):
97
121
self .selectedoptions = []
@@ -106,15 +130,56 @@ def reject(self):
106
130
self .selectedoptions = None
107
131
QDialog .reject (self )
108
132
133
+ def getItemsToModify (self ):
134
+ items = []
135
+ if len (self .lstLayers .selectedIndexes ()) > 1 :
136
+ for i in self .lstLayers .selectedIndexes ():
137
+ items .append (self .model .itemFromIndex (i ))
138
+ else :
139
+ for i in range (self .model .rowCount ()):
140
+ items .append (self .model .item (i ))
141
+ return items
142
+
109
143
def selectAll (self , value ):
110
- model = self .lstLayers .model ()
111
- for i in range (model .rowCount ()):
112
- item = model .item (i )
144
+ for item in self .getItemsToModify ():
113
145
item .setCheckState (Qt .Checked if value else Qt .Unchecked )
114
146
115
147
def toggleSelection (self ):
116
- model = self .lstLayers .model ()
117
- for i in range (model .rowCount ()):
118
- item = model .item (i )
148
+ for item in self .getItemsToModify ():
119
149
checked = item .checkState () == Qt .Checked
120
150
item .setCheckState (Qt .Unchecked if checked else Qt .Checked )
151
+
152
+ def getFileFilter (self , datatype ):
153
+ """
154
+ Returns a suitable file filter pattern for the specified parameter definition
155
+ :param param:
156
+ :return:
157
+ """
158
+ if datatype == QgsProcessing .TypeRaster :
159
+ return QgsProviderRegistry .instance ().fileRasterFilters ()
160
+ elif datatype == QgsProcessing .TypeFile :
161
+ return self .tr ('All files (*.*)' )
162
+ else :
163
+ exts = QgsVectorFileWriter .supportedFormatExtensions ()
164
+ for i in range (len (exts )):
165
+ exts [i ] = self .tr ('{0} files (*.{1})' ).format (exts [i ].upper (), exts [i ].lower ())
166
+ return self .tr ('All files (*.*)' ) + ';;' + ';;' .join (exts )
167
+
168
+ def addFiles (self ):
169
+ filter = self .getFileFilter (self .datatype )
170
+
171
+ settings = QgsSettings ()
172
+ path = str (settings .value ('/Processing/LastInputPath' ))
173
+
174
+ ret , selected_filter = QFileDialog .getOpenFileNames (self , self .tr ('Select file(s)' ),
175
+ path , filter )
176
+ if ret :
177
+ files = list (ret )
178
+ settings .setValue ('/Processing/LastInputPath' ,
179
+ os .path .dirname (str (files [0 ])))
180
+ for filename in files :
181
+ item = QStandardItem (filename )
182
+ item .setData (filename , Qt .UserRole )
183
+ item .setCheckState (Qt .Checked )
184
+ item .setCheckable (True )
185
+ self .model .appendRow (item )
0 commit comments