Skip to content

Commit f33749a

Browse files
committedApr 27, 2016
[processing] different approach for provider add/remove
1 parent 8a9cb05 commit f33749a

File tree

3 files changed

+46
-41
lines changed

3 files changed

+46
-41
lines changed
 

‎python/plugins/processing/ProcessingPlugin.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ def initGui(self):
6262
self.toolbox = ProcessingToolbox()
6363
self.iface.addDockWidget(Qt.RightDockWidgetArea, self.toolbox)
6464
self.toolbox.hide()
65-
Processing.addAlgListListener(self.toolbox)
6665

6766
self.menu = QMenu(self.iface.mainWindow().menuBar())
6867
self.menu.setObjectName('processing')
@@ -147,7 +146,6 @@ def openCommander(self):
147146
self.commander = CommanderWindow(
148147
self.iface.mainWindow(),
149148
self.iface.mapCanvas())
150-
Processing.addAlgListListener(self.commander)
151149
self.commander.prepareGui()
152150
self.commander.show()
153151

‎python/plugins/processing/core/Processing.py

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import sys
2929
import traceback
3030

31-
from PyQt.QtCore import Qt, QCoreApplication
31+
from PyQt.QtCore import Qt, QCoreApplication, QObject, pyqtSignal
3232
from PyQt.QtWidgets import QApplication
3333
from PyQt.QtGui import QCursor
3434

@@ -61,6 +61,12 @@
6161

6262
from processing.tools import dataobjects
6363

64+
class AlgListWatcher(QObject):
65+
66+
providerAdded = pyqtSignal(str)
67+
providerRemoved = pyqtSignal(str)
68+
69+
algListWatcher = AlgListWatcher()
6470

6571
class Processing:
6672

@@ -93,6 +99,7 @@ def addProvider(provider, updateList=True):
9399
ProcessingConfig.readSettings()
94100
if updateList:
95101
Processing.updateAlgsList()
102+
algListWatcher.providerAdded.emit(provider.getName())
96103
except:
97104
ProcessingLog.addToLog(
98105
ProcessingLog.LOG_ERROR,
@@ -111,7 +118,7 @@ def removeProvider(provider):
111118
provider.unload()
112119
Processing.providers.remove(provider)
113120
del Processing.algs[provider.getName()]
114-
Processing.fireAlgsListHasChanged()
121+
algListWatcher.providerRemoved.emit(provider.getName())
115122
except:
116123
# This try catch block is here to avoid problems if the
117124
# plugin with a provider is unloaded after the Processing
@@ -151,8 +158,6 @@ def initialize():
151158
ProcessingConfig.readSettings()
152159
RenderingStyles.loadStyles()
153160
Processing.loadFromProviders()
154-
# Inform registered listeners that all providers' algorithms have been loaded
155-
Processing.fireAlgsListHasChanged()
156161

157162
@staticmethod
158163
def updateAlgsList():
@@ -162,7 +167,6 @@ def updateAlgsList():
162167
"""
163168
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
164169
Processing.loadFromProviders()
165-
Processing.fireAlgsListHasChanged()
166170
QApplication.restoreOverrideCursor()
167171

168172
@staticmethod
@@ -177,28 +181,6 @@ def updateProviders():
177181
for provider in providers:
178182
provider.loadAlgorithms()
179183

180-
@staticmethod
181-
def addAlgListListener(listener):
182-
"""
183-
Listener should implement a algsListHasChanged() method.
184-
185-
Whenever the list of algorithms changes, that method will be
186-
called for all registered listeners.
187-
"""
188-
Processing.listeners.append(listener)
189-
190-
@staticmethod
191-
def removeAlgListListener(listener):
192-
try:
193-
Processing.listeners.remove(listener)
194-
except:
195-
pass
196-
197-
@staticmethod
198-
def fireAlgsListHasChanged():
199-
for listener in Processing.listeners:
200-
listener.algsListHasChanged()
201-
202184
@staticmethod
203185
def loadAlgorithms():
204186
Processing.algs = {}

‎python/plugins/processing/gui/ProcessingToolbox.py

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
from qgis.utils import iface
3535

3636
from processing.gui.Postprocessing import handleAlgorithmResults
37-
from processing.core.Processing import Processing
37+
from processing.core.Processing import Processing, algListWatcher
3838
from processing.core.ProcessingLog import ProcessingLog
3939
from processing.core.ProcessingConfig import ProcessingConfig
4040
from processing.gui.MessageDialog import MessageDialog
@@ -83,6 +83,9 @@ def openSettings(url):
8383

8484
self.fillTree()
8585

86+
algListWatcher.providerRemoved.connect(self.removeProvider)
87+
algListWatcher.providerAdded.connect(self.addProvider)
88+
8689
def showDisabled(self):
8790
self.txtDisabled.setVisible(False)
8891
for providerName in self.disabledWithMatchingAlgs:
@@ -154,27 +157,31 @@ def activateProvider(self, providerName):
154157
QMessageBox.warning(self, "Activate provider",
155158
"The provider has been activated, but it might need additional configuration.")
156159

157-
def algsListHasChanged(self):
158-
if self.updateAlgList:
159-
self.fillTree()
160-
self.textChanged()
161160

162161
def updateProvider(self, providerName, updateAlgsList=True):
163162
if updateAlgsList:
164163
self.updateAlgList = False
165164
Processing.updateAlgsList()
166165
self.updateAlgList = True
166+
item = self._providerItem(providerName)
167+
if item is not None:
168+
item.refresh()
169+
item.sortChildren(0, Qt.AscendingOrder)
170+
for i in xrange(item.childCount()):
171+
item.child(i).sortChildren(0, Qt.AscendingOrder)
172+
self.addRecentAlgorithms(True)
173+
174+
def removeProvider(self, providerName):
175+
item = self._providerItem(providerName)
176+
if item is not None:
177+
self.algorithmTree.invisibleRootItem().removeChild(item)
178+
179+
def _providerItem(self, providerName):
167180
for i in xrange(self.algorithmTree.invisibleRootItem().childCount()):
168181
child = self.algorithmTree.invisibleRootItem().child(i)
169182
if isinstance(child, TreeProviderItem):
170183
if child.providerName == providerName:
171-
child.refresh()
172-
# sort categories and items in categories
173-
child.sortChildren(0, Qt.AscendingOrder)
174-
for i in xrange(child.childCount()):
175-
child.child(i).sortChildren(0, Qt.AscendingOrder)
176-
break
177-
self.addRecentAlgorithms(True)
184+
return child
178185

179186
def showPopupMenu(self, point):
180187
item = self.algorithmTree.itemAt(point)
@@ -304,6 +311,24 @@ def addRecentAlgorithms(self, updating):
304311

305312
self.algorithmTree.setWordWrap(True)
306313

314+
def addProvider(self, providerName):
315+
name = 'ACTIVATE_' + providerName.upper().replace(' ', '_')
316+
providerItem = TreeProviderItem(providerName, None, self)
317+
if ProcessingConfig.getSetting(name):
318+
providerItem.setHidden(providerItem.childCount() == 0)
319+
else:
320+
providerItem = TreeProviderItem(providerName, None, self)
321+
providerItem.setHidden(True)
322+
self.disabledProviderItems[providerName] = providerItem
323+
324+
for i in xrange(self.algorithmTree.invisibleRootItem().childCount()):
325+
child = self.algorithmTree.invisibleRootItem().child(i)
326+
if isinstance(child, TreeProviderItem):
327+
if child.text(0) > providerItem.text(0):
328+
break
329+
self.algorithmTree.insertTopLevelItem(i, providerItem)
330+
331+
307332
def fillTreeUsingProviders(self):
308333
self.algorithmTree.clear()
309334
self.disabledProviderItems = {}

0 commit comments

Comments
 (0)
Please sign in to comment.