From 1a76a0963e22257cf891f71430dda826628a83b9 Mon Sep 17 00:00:00 2001 From: Alexander Bruy Date: Sat, 15 Aug 2020 13:51:45 +0300 Subject: [PATCH] add Select By Location to the Selection toolbar (fix #20350) --- python/plugins/processing/ProcessingPlugin.py | 4 +- python/plugins/processing/gui/menus.py | 45 ++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/python/plugins/processing/ProcessingPlugin.py b/python/plugins/processing/ProcessingPlugin.py index 51d7484a543..866442d71c2 100644 --- a/python/plugins/processing/ProcessingPlugin.py +++ b/python/plugins/processing/ProcessingPlugin.py @@ -51,7 +51,7 @@ from processing.gui.AlgorithmLocatorFilter import (AlgorithmLocatorFilter, InPlaceAlgorithmLocatorFilter) from processing.modeler.ModelerDialog import ModelerDialog from processing.tools.system import tempHelpFolder -from processing.gui.menus import removeMenus, initializeMenus, createMenus +from processing.gui.menus import removeMenus, initializeMenus, createMenus, createButtons, removeButtons from processing.core.ProcessingResults import resultsList pluginPath = os.path.dirname(__file__) @@ -271,6 +271,7 @@ class ProcessingPlugin: initializeMenus() createMenus() + createButtons() # In-place editing button state sync self.iface.currentLayerChanged.connect(self.sync_in_place_button_state) @@ -322,6 +323,7 @@ class ProcessingPlugin: self.iface.unregisterCustomDropHandler(self.drop_handler) QgsApplication.dataItemProviderRegistry().removeProvider(self.item_provider) + removeButtons() removeMenus() Processing.deinitialize() diff --git a/python/plugins/processing/gui/menus.py b/python/plugins/processing/gui/menus.py index 009d726fd64..eb5b58a1c62 100644 --- a/python/plugins/processing/gui/menus.py +++ b/python/plugins/processing/gui/menus.py @@ -131,6 +131,8 @@ defaultMenuEntries.update({'gdal:buildvirtualraster': miscMenu, 'gdal:overviews': miscMenu, 'gdal:tileindex': miscMenu}) +toolBarButtons = {'native:selectbylocation': iface.selectionToolBar()} + def initializeMenus(): for m in defaultMenuEntries.keys(): @@ -281,6 +283,47 @@ def getMenu(name, parent): def findAction(actions, alg): for action in actions: - if action.data() == alg.id(): + if (isinstance(alg, str) and action.data() == alg) or (isinstance(alg, QgsProcessingAlgorithm) and action.data() == alg.id()): return action return None + + +def addToolBarButton(algId, toolbar, icon=None, tooltip=None): + alg = QgsApplication.processingRegistry().algorithmById(algId) + if alg is None or alg.id() != algId: + QgsMessageLog.logMessage(Processing.tr('Invalid algorithm ID for button: {}').format(algId), Processing.tr('Processing')) + return + + if tooltip is None: + if (QgsGui.higFlags() & QgsGui.HigMenuTextIsTitleCase) and not (alg.flags() & QgsProcessingAlgorithm.FlagDisplayNameIsLiteral): + tooltip = QgsStringUtils.capitalize(alg.displayName(), QgsStringUtils.TitleCase) + else: + tooltip = alg.displayName() + + action = QAction(icon or alg.icon(), tooltip, iface.mainWindow()) + algId = alg.id() + action.setData(algId) + action.triggered.connect(lambda: _executeAlgorithm(algId)) + action.setObjectName("mProcessingAlg_%s" % algId) + + if toolbar: + toolbar.addAction(action) + else: + QgsMessageLog.logMessage(Processing.tr('Toolbar "{}" not found').format(toolbar.windowTitle), Processing.tr('Processing')) + + +def removeToolBarButton(algId, toolbar): + if toolbar: + action = findAction(toolbar.actions(), algId) + if action is not None: + toolbar.removeAction(action) + + +def createButtons(): + for algId, toolbar in toolBarButtons.items(): + addToolBarButton(algId, toolbar) + + +def removeButtons(): + for algId, toolbar in toolBarButtons.items(): + removeToolBarButton(algId, toolbar)