mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-08 00:05:09 -04:00
and logic for activating a custom map tool and ensuring it can only be enabled in the right circumstances to QGIS app If a plugin has to do this, it's a nightmare of code and hacks (partly because of the number of changing circumstances it needs to respond to, and partly because a lot of the useful functions available for handling this behavior is locked away in private methods in qgisapp.cpp) So instead make an abstract base class for map tool handlers and an iface method for register/unregistering them. From the dox: An abstract base class for map tool handlers which automatically handle all the necessary logic for toggling the map tool and enabling/disabling the associated action when the QGIS application is in a state permissible for the tool. Creating these handlers avoids a lot of complex setup code and manual connections which are otherwise necessary to ensure that a map tool is correctly activated and deactivated when the state of the QGIS application changes (e.g. when the active layer is changed, when edit modes are toggled, when other map tools are switched to, etc). - ### Example \code{.py} class MyMapTool(QgsMapTool): ... class MyMapToolHandler(QgsAbstractMapToolHandler): def __init__(self, tool, action): super().__init__(tool, action) def isCompatibleWithLayer(self, layer, context): # this tool can only be activated when an editable vector layer is selected return isinstance(layer, QgsVectorLayer) and layer.isEditable() my_tool = MyMapTool() my_action = QAction('My Map Tool') my_handler = MyMapToolHandler(my_tool, my_action) iface.registerMapToolHandler(my_handler) \endcode