33
33
34
34
from qgis .core import (QgsApplication ,
35
35
QgsProcessingUtils ,
36
- QgsProcessingModelAlgorithm )
36
+ QgsProcessingModelAlgorithm ,
37
+ QgsDataItemProvider ,
38
+ QgsDataProvider ,
39
+ QgsDataItem ,
40
+ QgsMimeDataUtils )
37
41
from qgis .gui import (QgsOptionsWidgetFactory ,
38
42
QgsCustomDropHandler )
39
- from qgis .PyQt .QtCore import Qt , QCoreApplication , QDir
43
+ from qgis .PyQt .QtCore import Qt , QCoreApplication , QDir , QFileInfo
40
44
from qgis .PyQt .QtWidgets import QMenu , QAction
41
45
from qgis .PyQt .QtGui import QIcon
42
46
@@ -74,7 +78,10 @@ class ProcessingDropHandler(QgsCustomDropHandler):
74
78
def handleFileDrop (self , file ):
75
79
if not file .lower ().endswith ('.model3' ):
76
80
return False
81
+ self .runAlg (file )
77
82
83
+ @staticmethod
84
+ def runAlg (file ):
78
85
alg = QgsProcessingModelAlgorithm ()
79
86
if not alg .fromFile (file ):
80
87
return False
@@ -85,6 +92,72 @@ def handleFileDrop(self, file):
85
92
dlg .show ()
86
93
return True
87
94
95
+ def customUriProviderKey (self ):
96
+ return 'processing'
97
+
98
+ def handleCustomUriDrop (self , uri ):
99
+ path = uri .uri
100
+ self .runAlg (path )
101
+
102
+
103
+ class ProcessingModelItem (QgsDataItem ):
104
+
105
+ def __init__ (self , parent , name , path ):
106
+ super (ProcessingModelItem , self ).__init__ (QgsDataItem .Custom ,parent ,name ,path )
107
+ self .setState (QgsDataItem .Populated ) #no children
108
+ self .setIconName (":/images/themes/default/processingModel.svg" )
109
+ self .setToolTip (QDir .toNativeSeparators (path ) )
110
+
111
+ def hasDragEnabled (self ):
112
+ return True
113
+
114
+ def handleDoubleClick (self ):
115
+ self .runModel ()
116
+ return True
117
+
118
+ def mimeUri (self ):
119
+ u = QgsMimeDataUtils .Uri ()
120
+ u .layerType = "custom"
121
+ u .providerKey = "processing"
122
+ u .name = self .name ()
123
+ u .uri = self .path ()
124
+ return u
125
+
126
+ def runModel (self ):
127
+ ProcessingDropHandler .runAlg (self .path ())
128
+
129
+ def editModel (self ):
130
+ dlg = ModelerDialog ()
131
+ dlg .loadModel (self .path ())
132
+ dlg .show ()
133
+
134
+ def actions (self ):
135
+ run_model_action = QAction (self .tr ('&Run Model…' ), self )
136
+ run_model_action .triggered .connect (self .runModel )
137
+ edit_model_action = QAction (self .tr ('&Edit Model…' ), self )
138
+ edit_model_action .triggered .connect (self .editModel )
139
+ return [run_model_action , edit_model_action ]
140
+
141
+
142
+ class ProcessingDataItemProvider (QgsDataItemProvider ):
143
+
144
+ def __init__ (self ):
145
+ super (ProcessingDataItemProvider , self ).__init__ ()
146
+
147
+ def name (self ):
148
+ return 'processing'
149
+
150
+ def capabilities (self ):
151
+ return QgsDataProvider .File
152
+
153
+ def createDataItem (self , path , parentItem ):
154
+ file_info = QFileInfo (path )
155
+
156
+ if file_info .suffix ().lower () == 'model3' :
157
+ alg = QgsProcessingModelAlgorithm ()
158
+ if alg .fromFile (path ):
159
+ return ProcessingModelItem (parentItem , alg .name (), path )
160
+ return None
88
161
89
162
class ProcessingPlugin (object ):
90
163
@@ -95,6 +168,8 @@ def __init__(self, iface):
95
168
iface .registerOptionsWidgetFactory (self .options_factory )
96
169
self .drop_handler = ProcessingDropHandler ()
97
170
iface .registerCustomDropHandler (self .drop_handler )
171
+ self .item_provider = ProcessingDataItemProvider ()
172
+ QgsApplication .dataItemProviderRegistry ().addProvider (self .item_provider )
98
173
self .locator_filter = AlgorithmLocatorFilter ()
99
174
iface .registerLocatorFilter (self .locator_filter )
100
175
Processing .initialize ()
@@ -182,6 +257,7 @@ def unload(self):
182
257
self .iface .unregisterOptionsWidgetFactory (self .options_factory )
183
258
self .iface .deregisterLocatorFilter (self .locator_filter )
184
259
self .iface .unregisterCustomDropHandler (self .drop_handler )
260
+ QgsApplication .dataItemProviderRegistry ().removeProvider (self .item_provider )
185
261
186
262
removeMenus ()
187
263
Processing .deinitialize ()
0 commit comments