Skip to content

Commit 6e1c5c4

Browse files
committedSep 20, 2017
[FEATURE] Show processing models in browser
And allow them to be executed and edited directly from there
1 parent 253c4c7 commit 6e1c5c4

File tree

2 files changed

+97
-18
lines changed

2 files changed

+97
-18
lines changed
 

‎python/plugins/processing/ProcessingPlugin.py

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,14 @@
3333

3434
from qgis.core import (QgsApplication,
3535
QgsProcessingUtils,
36-
QgsProcessingModelAlgorithm)
36+
QgsProcessingModelAlgorithm,
37+
QgsDataItemProvider,
38+
QgsDataProvider,
39+
QgsDataItem,
40+
QgsMimeDataUtils)
3741
from qgis.gui import (QgsOptionsWidgetFactory,
3842
QgsCustomDropHandler)
39-
from qgis.PyQt.QtCore import Qt, QCoreApplication, QDir
43+
from qgis.PyQt.QtCore import Qt, QCoreApplication, QDir, QFileInfo
4044
from qgis.PyQt.QtWidgets import QMenu, QAction
4145
from qgis.PyQt.QtGui import QIcon
4246

@@ -74,7 +78,10 @@ class ProcessingDropHandler(QgsCustomDropHandler):
7478
def handleFileDrop(self, file):
7579
if not file.lower().endswith('.model3'):
7680
return False
81+
self.runAlg(file)
7782

83+
@staticmethod
84+
def runAlg(file):
7885
alg = QgsProcessingModelAlgorithm()
7986
if not alg.fromFile(file):
8087
return False
@@ -85,6 +92,72 @@ def handleFileDrop(self, file):
8592
dlg.show()
8693
return True
8794

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
88161

89162
class ProcessingPlugin(object):
90163

@@ -95,6 +168,8 @@ def __init__(self, iface):
95168
iface.registerOptionsWidgetFactory(self.options_factory)
96169
self.drop_handler = ProcessingDropHandler()
97170
iface.registerCustomDropHandler(self.drop_handler)
171+
self.item_provider = ProcessingDataItemProvider()
172+
QgsApplication.dataItemProviderRegistry().addProvider(self.item_provider)
98173
self.locator_filter = AlgorithmLocatorFilter()
99174
iface.registerLocatorFilter(self.locator_filter)
100175
Processing.initialize()
@@ -182,6 +257,7 @@ def unload(self):
182257
self.iface.unregisterOptionsWidgetFactory(self.options_factory)
183258
self.iface.deregisterLocatorFilter(self.locator_filter)
184259
self.iface.unregisterCustomDropHandler(self.drop_handler)
260+
QgsApplication.dataItemProviderRegistry().removeProvider(self.item_provider)
185261

186262
removeMenus()
187263
Processing.deinitialize()

‎python/plugins/processing/modeler/ModelerDialog.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -503,23 +503,26 @@ def openModel(self):
503503
ModelerUtils.modelsFolders()[0],
504504
self.tr('Processing models (*.model3 *.MODEL3)'))
505505
if filename:
506-
alg = QgsProcessingModelAlgorithm()
507-
if alg.fromFile(filename):
508-
self.model = alg
509-
self.model.setProvider(QgsApplication.processingRegistry().providerById('model'))
510-
self.textGroup.setText(alg.group())
511-
self.textName.setText(alg.name())
512-
self.repaintModel()
506+
self.loadModel(filename)
513507

514-
self.view.centerOn(0, 0)
515-
self.hasChanged = False
516-
else:
517-
QgsMessageLog.logMessage(self.tr('Could not load model {0}').format(filename),
518-
self.tr('Processing'),
519-
QgsMessageLog.CRITICAL)
520-
QMessageBox.critical(self, self.tr('Could not open model'),
521-
self.tr('The selected model could not be loaded.\n'
522-
'See the log for more information.'))
508+
def loadModel(self, filename):
509+
alg = QgsProcessingModelAlgorithm()
510+
if alg.fromFile(filename):
511+
self.model = alg
512+
self.model.setProvider(QgsApplication.processingRegistry().providerById('model'))
513+
self.textGroup.setText(alg.group())
514+
self.textName.setText(alg.name())
515+
self.repaintModel()
516+
517+
self.view.centerOn(0, 0)
518+
self.hasChanged = False
519+
else:
520+
QgsMessageLog.logMessage(self.tr('Could not load model {0}').format(filename),
521+
self.tr('Processing'),
522+
QgsMessageLog.CRITICAL)
523+
QMessageBox.critical(self, self.tr('Could not open model'),
524+
self.tr('The selected model could not be loaded.\n'
525+
'See the log for more information.'))
523526

524527
def repaintModel(self, controls=True):
525528
self.scene = ModelerScene(self, dialog=self)

0 commit comments

Comments
 (0)
Please sign in to comment.