diff --git a/doc/api/next_api_changes/behavior/9966-FAR.rst b/doc/api/next_api_changes/behavior/9966-FAR.rst new file mode 100644 index 000000000000..44eedf71197a --- /dev/null +++ b/doc/api/next_api_changes/behavior/9966-FAR.rst @@ -0,0 +1,12 @@ +Tool name removal +~~~~~~~~~~~~~~~~~~ + +The name attribute of the tools `matplotlib.backend_tools` was removed. + +When adding a tool to any Tool Container (ex. Toolbars) `matplotlib.backend_bases.ToolContainerBase.add_tool` , +it is now needed to pass the name of the tool. + +When creating new tools, or initializing existing tools, the initialization doesn't accept the tool name anymore `matplotlib.backend_tools.ToolBase` + +When creating a tool event `matplotlib.backend_managers.ToolEvent` its necessary to pass the tool name + diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 23773cca6ab6..76a4915ebab1 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -3306,7 +3306,7 @@ def __init__(self, toolmanager): lambda event: self.set_message(event.message)) toolmanager.toolmanager_connect( 'tool_removed_event', - lambda event: self.remove_toolitem(event.tool.name)) + lambda event: self.remove_toolitem(event.tool_name)) def _tool_toggled_cbk(self, event): """ @@ -3314,32 +3314,32 @@ def _tool_toggled_cbk(self, event): This only gets used for toggled tools. """ - self.toggle_toolitem(event.tool.name, event.tool.toggled) + self.toggle_toolitem(event.tool_name, event.tool.toggled) - def add_tool(self, tool, group, position=-1): + def add_tool(self, tool_name, group, position=-1): """ Add a tool to this container. Parameters ---------- - tool : tool_like - The tool to add, see `.ToolManager.get_tool`. + tool_name : str + Name of the tool to add, see `ToolManager.get_tool`. group : str The name of the group to add this tool to. position : int, default: -1 The position within the group to place this tool. """ - tool = self.toolmanager.get_tool(tool) + tool = self.toolmanager.get_tool(tool_name) image = self._get_image_filename(tool.image) toggle = getattr(tool, 'toggled', None) is not None - self.add_toolitem(tool.name, group, position, + self.add_toolitem(tool_name, group, position, image, tool.description, toggle) if toggle: - self.toolmanager.toolmanager_connect('tool_trigger_%s' % tool.name, + self.toolmanager.toolmanager_connect('tool_trigger_%s' % tool_name, self._tool_toggled_cbk) # If initially toggled if tool.toggled: - self.toggle_toolitem(tool.name, True) + self.toggle_toolitem(tool_name, True) def _get_image_filename(self, image): """Find the image based on its name.""" diff --git a/lib/matplotlib/backend_managers.py b/lib/matplotlib/backend_managers.py index c59c3c65ec06..3249e983aedb 100644 --- a/lib/matplotlib/backend_managers.py +++ b/lib/matplotlib/backend_managers.py @@ -10,17 +10,19 @@ class ToolEvent: """Event for tool manipulation (add/remove).""" - def __init__(self, name, sender, tool, data=None): + def __init__(self, name, sender, tool, tool_name, data=None): self.name = name self.sender = sender self.tool = tool + self.tool_name = tool_name self.data = data class ToolTriggerEvent(ToolEvent): """Event to inform that a tool has been triggered.""" - def __init__(self, name, sender, tool, canvasevent=None, data=None): - ToolEvent.__init__(self, name, sender, tool, data) + def __init__(self, name, sender, tool, tool_name, + canvasevent=None, data=None): + ToolEvent.__init__(self, name, sender, tool, tool_name, data) self.canvasevent = canvasevent @@ -234,7 +236,7 @@ def remove_tool(self, name): self._remove_keys(name) s = 'tool_removed_event' - event = ToolEvent(s, self, tool) + event = ToolEvent(s, self, tool, name) self._callbacks.process(s, event) del self._tools[name] @@ -272,7 +274,7 @@ def add_tool(self, name, tool, *args, **kwargs): 'exists, not added') return self._tools[name] - tool_obj = tool_cls(self, name, *args, **kwargs) + tool_obj = tool_cls(self, *args, **kwargs) self._tools[name] = tool_obj if tool_cls.default_keymap is not None: @@ -289,24 +291,25 @@ def add_tool(self, name, tool, *args, **kwargs): # If initially toggled if tool_obj.toggled: - self._handle_toggle(tool_obj, None, None, None) + self._handle_toggle(name, tool_obj, None, None, None) tool_obj.set_figure(self.figure) - self._tool_added_event(tool_obj) + self._tool_added_event(tool_obj, name) return tool_obj - def _tool_added_event(self, tool): + def _tool_added_event(self, tool, tool_name): s = 'tool_added_event' - event = ToolEvent(s, self, tool) + event = ToolEvent(s, self, tool, tool_name) self._callbacks.process(s, event) - def _handle_toggle(self, tool, sender, canvasevent, data): + def _handle_toggle(self, tool_name, tool, sender, canvasevent, data): """ Toggle tools, need to untoggle prior to using other Toggle tool. Called from trigger_tool. Parameters ---------- + tool_name: String tool : `.ToolBase` sender : object Object that wishes to trigger the tool. @@ -320,19 +323,19 @@ def _handle_toggle(self, tool, sender, canvasevent, data): # radio_group None is not mutually exclusive # just keep track of toggled tools in this group if radio_group is None: - if tool.name in self._toggled[None]: - self._toggled[None].remove(tool.name) + if tool_name in self._toggled[None]: + self._toggled[None].remove(tool_name) else: - self._toggled[None].add(tool.name) + self._toggled[None].add(tool_name) return # If the tool already has a toggled state, untoggle it - if self._toggled[radio_group] == tool.name: + if self._toggled[radio_group] == tool_name: toggled = None # If no tool was toggled in the radio_group # toggle it elif self._toggled[radio_group] is None: - toggled = tool.name + toggled = tool_name # Other tool in the radio_group is toggled else: # Untoggle previously toggled tool @@ -340,7 +343,7 @@ def _handle_toggle(self, tool, sender, canvasevent, data): self, canvasevent, data) - toggled = tool.name + toggled = tool_name # Keep track of the toggled tool in the radio_group self._toggled[radio_group] = toggled @@ -387,7 +390,7 @@ def trigger_tool(self, name, sender=None, canvasevent=None, data=None): self._trigger_tool(name, sender, canvasevent, data) s = 'tool_trigger_%s' % name - event = ToolTriggerEvent(s, sender, tool, canvasevent, data) + event = ToolTriggerEvent(s, sender, tool, name, canvasevent, data) self._callbacks.process(s, event) def _trigger_tool(self, name, sender=None, canvasevent=None, data=None): @@ -395,7 +398,7 @@ def _trigger_tool(self, name, sender=None, canvasevent=None, data=None): tool = self.get_tool(name) if isinstance(tool, tools.ToolToggleBase): - self._handle_toggle(tool, sender, canvasevent, data) + self._handle_toggle(name, tool, sender, canvasevent, data) # Important!!! # This is where the Tool object gets triggered @@ -434,7 +437,7 @@ def get_tool(self, name, warn=True): `.ToolBase` or None The tool or None if no tool with the given name exists. """ - if isinstance(name, tools.ToolBase) and name.name in self._tools: + if isinstance(name, tools.ToolBase) and name in self._tools.values(): return name if name not in self._tools: if warn: diff --git a/lib/matplotlib/backend_tools.py b/lib/matplotlib/backend_tools.py index cf8438bb4aff..6444fbc83c53 100644 --- a/lib/matplotlib/backend_tools.py +++ b/lib/matplotlib/backend_tools.py @@ -50,9 +50,6 @@ class ToolBase: ToolManager that controls this Tool. figure : `FigureCanvas` Figure instance that is affected by this Tool. - name : str - Used as **Id** of the tool, has to be unique among tools of the same - ToolManager. """ default_keymap = None @@ -79,11 +76,10 @@ class ToolBase: *name* is used as a label in the toolbar button. """ - def __init__(self, toolmanager, name): + def __init__(self, toolmanager): cbook._warn_external( 'The new Tool classes introduced in v1.5 are experimental; their ' 'API (including names) will likely change in future versions.') - self._name = name self._toolmanager = toolmanager self._figure = None @@ -142,11 +138,6 @@ def trigger(self, sender, event, data=None): """ pass - @property - def name(self): - """Tool Id.""" - return self._name - def destroy(self): """ Destroy the tool. @@ -262,8 +253,8 @@ def __init__(self, *args, **kwargs): self._add_tool_cbk) # process current tools - for tool in self.toolmanager.tools.values(): - self._add_tool(tool) + for tool_name, tool in self.toolmanager.tools.items(): + self._add_tool(tool_name, tool) def set_figure(self, figure): if self._id_drag: @@ -281,17 +272,17 @@ def _tool_trigger_cbk(self, event): self._set_cursor_cbk(event.canvasevent) - def _add_tool(self, tool): + def _add_tool(self, tool_name, tool): """Set the cursor when the tool is triggered.""" if getattr(tool, 'cursor', None) is not None: - self.toolmanager.toolmanager_connect('tool_trigger_%s' % tool.name, + self.toolmanager.toolmanager_connect('tool_trigger_%s' % tool_name, self._tool_trigger_cbk) def _add_tool_cbk(self, event): """Process every newly added tool.""" if event.tool is self: return - self._add_tool(event.tool) + self._add_tool(event.tool_name, event.tool) def _set_cursor_cbk(self, event): if not event: diff --git a/lib/matplotlib/backends/backend_gtk3.py b/lib/matplotlib/backends/backend_gtk3.py index c9094eb1df33..23e52e815f6e 100644 --- a/lib/matplotlib/backends/backend_gtk3.py +++ b/lib/matplotlib/backends/backend_gtk3.py @@ -882,7 +882,7 @@ def _show_shortcuts_window(self): self._normalize_shortcut(key) for key in self.toolmanager.get_tool_keymap(name) if self._is_valid_shortcut(key)), - title=tool.name, + title=name, subtitle=tool.description) group.add(shortcut)