From 8131760ab2c3dcbc212a2ec2a2408ccd0c62fc49 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Sat, 9 Dec 2017 23:16:43 -0500 Subject: [PATCH 1/7] removing name argument from tools --- lib/matplotlib/backend_bases.py | 16 +++++++----- lib/matplotlib/backend_managers.py | 39 +++++++++++++++--------------- lib/matplotlib/backend_tools.py | 29 ++++++++-------------- 3 files changed, 40 insertions(+), 44 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 23773cca6ab6..91e410babc47 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -3314,9 +3314,9 @@ 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. @@ -3329,17 +3329,21 @@ def add_tool(self, tool, group, position=-1): 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 _remove_tool_cbk(self, event): + """Captures the 'tool_removed_event' signal and removes the tool.""" + self.remove_toolitem(event.tool_name) 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..7f7e10655805 100644 --- a/lib/matplotlib/backend_managers.py +++ b/lib/matplotlib/backend_managers.py @@ -9,18 +9,18 @@ class ToolEvent: - """Event for tool manipulation (add/remove).""" - def __init__(self, name, sender, tool, data=None): + """Event for tool manipulation (add/remove)""" + 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 +234,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] @@ -289,24 +289,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 +321,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 +341,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 +388,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 +396,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 diff --git a/lib/matplotlib/backend_tools.py b/lib/matplotlib/backend_tools.py index cf8438bb4aff..6c9a0f346a69 100644 --- a/lib/matplotlib/backend_tools.py +++ b/lib/matplotlib/backend_tools.py @@ -46,13 +46,10 @@ class ToolBase: Attributes ---------- - toolmanager : `matplotlib.backend_managers.ToolManager` - 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. + toolmanager: `matplotlib.backend_managers.ToolManager` + ToolManager that controls this Tool + figure: `FigureCanvas` + Figure instance that is affected by this Tool """ default_keymap = None @@ -83,7 +80,6 @@ def __init__(self, toolmanager, name): 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): - """Set the cursor when the tool is triggered.""" + 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: From ba1ab48a313d32f8b98c9516dfd6ea92ac4d213d Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Sun, 10 Dec 2017 21:23:01 -0500 Subject: [PATCH 2/7] docstring correction --- lib/matplotlib/backend_bases.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 91e410babc47..91cac99d07e2 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -3322,8 +3322,8 @@ def add_tool(self, tool_name, group, position=-1): Parameters ---------- - tool : tool_like - The tool to add, see `.ToolManager.get_tool`. + tool_name : str + Name of the the tool to add, see `ToolManager.get_tool`. group : str The name of the group to add this tool to. position : int, default: -1 From a107967df97ff60e772083260a02c45956f5fa74 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Wed, 13 Dec 2017 19:58:55 -0500 Subject: [PATCH 3/7] pep8 fix --- lib/matplotlib/backend_managers.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/backend_managers.py b/lib/matplotlib/backend_managers.py index 7f7e10655805..8e5d5af98647 100644 --- a/lib/matplotlib/backend_managers.py +++ b/lib/matplotlib/backend_managers.py @@ -19,7 +19,9 @@ def __init__(self, name, sender, tool, tool_name, data=None): class ToolTriggerEvent(ToolEvent): - def __init__(self, name, sender, tool, tool_name, canvasevent=None, data=None): + """Event to inform that a tool has been triggered""" + def __init__(self, name, sender, tool, tool_name, + canvasevent=None, data=None): ToolEvent.__init__(self, name, sender, tool, tool_name, data) self.canvasevent = canvasevent From 7a02d5133bbe3950c6f0bec90afb1343795a14c2 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Fri, 15 Dec 2017 10:52:37 -0500 Subject: [PATCH 4/7] fix docstring --- lib/matplotlib/backend_bases.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 91cac99d07e2..764b3033c601 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -3323,7 +3323,7 @@ def add_tool(self, tool_name, group, position=-1): Parameters ---------- tool_name : str - Name of the the tool to add, see `ToolManager.get_tool`. + 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 From ef686fcfc2d440b5960f951ac105390466b723f2 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Thu, 16 Jul 2020 22:40:05 -0400 Subject: [PATCH 5/7] docstring corrections --- lib/matplotlib/backend_bases.py | 2 +- lib/matplotlib/backend_managers.py | 8 ++++---- lib/matplotlib/backend_tools.py | 12 ++++++------ lib/matplotlib/backends/backend_gtk3.py | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 764b3033c601..736ecb2c4128 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): """ diff --git a/lib/matplotlib/backend_managers.py b/lib/matplotlib/backend_managers.py index 8e5d5af98647..3249e983aedb 100644 --- a/lib/matplotlib/backend_managers.py +++ b/lib/matplotlib/backend_managers.py @@ -9,7 +9,7 @@ class ToolEvent: - """Event for tool manipulation (add/remove)""" + """Event for tool manipulation (add/remove).""" def __init__(self, name, sender, tool, tool_name, data=None): self.name = name self.sender = sender @@ -19,7 +19,7 @@ def __init__(self, name, sender, tool, tool_name, data=None): class ToolTriggerEvent(ToolEvent): - """Event to inform that a tool has been triggered""" + """Event to inform that a tool has been triggered.""" def __init__(self, name, sender, tool, tool_name, canvasevent=None, data=None): ToolEvent.__init__(self, name, sender, tool, tool_name, data) @@ -274,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: @@ -437,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 6c9a0f346a69..6444fbc83c53 100644 --- a/lib/matplotlib/backend_tools.py +++ b/lib/matplotlib/backend_tools.py @@ -46,10 +46,10 @@ class ToolBase: Attributes ---------- - toolmanager: `matplotlib.backend_managers.ToolManager` - ToolManager that controls this Tool - figure: `FigureCanvas` - Figure instance that is affected by this Tool + toolmanager : `matplotlib.backend_managers.ToolManager` + ToolManager that controls this Tool. + figure : `FigureCanvas` + Figure instance that is affected by this Tool. """ default_keymap = None @@ -76,7 +76,7 @@ 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.') @@ -273,7 +273,7 @@ def _tool_trigger_cbk(self, event): self._set_cursor_cbk(event.canvasevent) def _add_tool(self, tool_name, tool): - """set the cursor when the tool is triggered""" + """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._tool_trigger_cbk) 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) From 375c2f03ab6e4177b706f2ab244c391366c4f51a Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Thu, 16 Jul 2020 23:05:47 -0400 Subject: [PATCH 6/7] remove unused method --- lib/matplotlib/backend_bases.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 736ecb2c4128..76a4915ebab1 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -3341,10 +3341,6 @@ def add_tool(self, tool_name, group, position=-1): if tool.toggled: self.toggle_toolitem(tool_name, True) - def _remove_tool_cbk(self, event): - """Captures the 'tool_removed_event' signal and removes the tool.""" - self.remove_toolitem(event.tool_name) - def _get_image_filename(self, image): """Find the image based on its name.""" if not image: From 8695315bc3d3c2af9c830b80372a2ab73009fbb7 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Fri, 17 Jul 2020 18:04:43 -0400 Subject: [PATCH 7/7] api changes --- doc/api/next_api_changes/behavior/9966-FAR.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/api/next_api_changes/behavior/9966-FAR.rst 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 +