Skip to content

Commit

Permalink
[processing] Always list native algorithms before 3rd party providers
Browse files Browse the repository at this point in the history
This change ensures that searching for algorithms always returns
native algorithms before matching 3rd party algorithms

TODO: we really need to replace the toolbox tree with a proper
model and redo the sorting/filtering using a sort/filter proxy
model.
  • Loading branch information
nyalldawson committed Oct 19, 2017
1 parent 325168e commit 925ec60
Showing 1 changed file with 58 additions and 22 deletions.
80 changes: 58 additions & 22 deletions python/plugins/processing/gui/ProcessingToolbox.py
Expand Up @@ -58,6 +58,14 @@

class ProcessingToolbox(BASE, WIDGET):

ALG_ITEM = 'ALG_ITEM'
PROVIDER_ITEM = 'PROVIDER_ITEM'
GROUP_ITEM = 'GROUP_ITEM'

NAME_ROLE = Qt.UserRole
TAG_ROLE = Qt.UserRole + 1
TYPE_ROLE = Qt.UserRole + 2

def __init__(self):
super(ProcessingToolbox, self).__init__(None)
self.tipWasClosed = False
Expand Down Expand Up @@ -143,10 +151,10 @@ def _filterItem(self, item, text):
return show
elif isinstance(item, (TreeAlgorithmItem, TreeActionItem)):
# hide if every part of text is not contained somewhere in either the item text or item user role
item_text = [item.text(0).lower(), item.data(0, Qt.UserRole).lower()]
item_text = [item.text(0).lower(), item.data(0, ProcessingToolbox.NAME_ROLE).lower()]
if isinstance(item, TreeAlgorithmItem):
item_text.append(item.alg.id())
item_text.extend(item.data(0, Qt.UserRole + 1))
item_text.extend(item.data(0, ProcessingToolbox.TAG_ROLE))

hide = bool(text) and not all(
any(part in t for t in item_text)
Expand Down Expand Up @@ -356,20 +364,37 @@ def addProvider(self, provider_id):
def fillTreeUsingProviders(self):
self.algorithmTree.clear()
self.disabledProviderItems = {}
disabled = []

# TODO - replace with proper model for toolbox!

# first add qgis/native providers, since they create top level groups
for provider in QgsApplication.processingRegistry().providers():
if provider.id() in ('qgis', 'native'):
self.addAlgorithmsFromProvider(provider, self.algorithmTree.invisibleRootItem())
else:
if provider.isActive():
providerItem = TreeProviderItem(provider, self.algorithmTree, self)
else:
disabled.append(provider)
continue
self.algorithmTree.sortItems(0, Qt.AscendingOrder)
for provider in disabled:
providerItem = TreeProviderItem(provider, self.algorithmTree, self)
providerItem.setHidden(True)
self.disabledProviderItems[provider.id()] = providerItem

for provider in QgsApplication.processingRegistry().providers():
if provider.id() in ('qgis', 'native'):
# already added
continue
else:
providerItem = TreeProviderItem(provider, self.algorithmTree, self)

if not provider.isActive():
providerItem.setHidden(True)
self.disabledProviderItems[provider.id()] = providerItem

# insert non-native providers at end of tree, alphabetically

for i in range(self.algorithmTree.invisibleRootItem().childCount()):
child = self.algorithmTree.invisibleRootItem().child(i)
if isinstance(child, TreeProviderItem):
if child.text(0) > providerItem.text(0):
break

self.algorithmTree.insertTopLevelItem(i + 1, providerItem)

def addAlgorithmsFromProvider(self, provider, parent):
groups = {}
Expand All @@ -393,12 +418,9 @@ def addAlgorithmsFromProvider(self, provider, parent):
break

if not groupItem:
groupItem = QTreeWidgetItem()
name = alg.group()
groupItem = TreeGroupItem(alg.group())
if not active:
groupItem.setForeground(0, Qt.darkGray)
groupItem.setText(0, name)
groupItem.setToolTip(0, name)
groupItem.setInactive()
if provider.id() in ('qgis', 'native'):
groupItem.setIcon(0, provider.icon())
groups[alg.group()] = groupItem
Expand All @@ -414,8 +436,7 @@ def addAlgorithmsFromProvider(self, provider, parent):
if action.group in groups:
groupItem = groups[action.group]
else:
groupItem = QTreeWidgetItem()
groupItem.setText(0, action.group)
groupItem = TreeGroupItem(action.group)
groups[action.group] = groupItem
algItem = TreeActionItem(action)
groupItem.addChild(algItem)
Expand Down Expand Up @@ -456,8 +477,22 @@ def __init__(self, alg):
self.setIcon(0, icon)
self.setToolTip(0, name)
self.setText(0, name)
self.setData(0, Qt.UserRole, nameEn)
self.setData(0, Qt.UserRole + 1, alg.tags())
self.setData(0, ProcessingToolbox.NAME_ROLE, nameEn)
self.setData(0, ProcessingToolbox.TAG_ROLE, alg.tags())
self.setData(0, ProcessingToolbox.TYPE_ROLE, ProcessingToolbox.ALG_ITEM)


class TreeGroupItem(QTreeWidgetItem):

def __init__(self, name):
QTreeWidgetItem.__init__(self)
self.setToolTip(0, name)
self.setText(0, name)
self.setData(0, ProcessingToolbox.NAME_ROLE, name)
self.setData(0, ProcessingToolbox.TYPE_ROLE, ProcessingToolbox.GROUP_ITEM)

def setInactive(self):
self.setForeground(0, Qt.darkGray)


class TreeActionItem(QTreeWidgetItem):
Expand All @@ -467,17 +502,18 @@ def __init__(self, action):
self.action = action
self.setText(0, action.i18n_name)
self.setIcon(0, action.getIcon())
self.setData(0, Qt.UserRole, action.name)
self.setData(0, ProcessingToolbox.NAME_ROLE, action.name)


class TreeProviderItem(QTreeWidgetItem):

def __init__(self, provider, tree, toolbox):
QTreeWidgetItem.__init__(self, tree)
QTreeWidgetItem.__init__(self, None)
self.tree = tree
self.toolbox = toolbox
self.provider = provider
self.setIcon(0, self.provider.icon())
self.setData(0, ProcessingToolbox.TYPE_ROLE, ProcessingToolbox.PROVIDER_ITEM)
self.populate()

def refresh(self):
Expand Down

0 comments on commit 925ec60

Please sign in to comment.