From c884bb979c6b0425aac80f2d89e832d4adeed737 Mon Sep 17 00:00:00 2001 From: Neil Vaytet Date: Thu, 18 Jun 2026 12:16:31 +0200 Subject: [PATCH 1/2] adapt changes from old branch to new button mechanism --- src/plopp/backends/matplotlib/canvas.py | 6 +++++ src/plopp/backends/matplotlib/figure.py | 31 ++++++++++++++++--------- src/plopp/widgets/toolbar.py | 5 ++++ src/plopp/widgets/tools.py | 3 +++ 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/plopp/backends/matplotlib/canvas.py b/src/plopp/backends/matplotlib/canvas.py index 4ab668f3..c5aca2fa 100644 --- a/src/plopp/backends/matplotlib/canvas.py +++ b/src/plopp/backends/matplotlib/canvas.py @@ -731,6 +731,12 @@ def toggle_logy(self): """ self.yscale = 'log' if self.yscale == 'linear' else 'linear' + def toggle_grid(self): + """ + Toggle the visibility of the grid. + """ + self.grid = not self.grid + def has_user_xlabel(self) -> bool: """ Return ``True`` if the user has set an x-axis label. diff --git a/src/plopp/backends/matplotlib/figure.py b/src/plopp/backends/matplotlib/figure.py index c96d492c..716c7f0f 100644 --- a/src/plopp/backends/matplotlib/figure.py +++ b/src/plopp/backends/matplotlib/figure.py @@ -2,6 +2,8 @@ # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) from __future__ import annotations +from functools import partial + from matplotlib.axes import Axes from matplotlib.figure import Figure as MplFigure @@ -137,7 +139,7 @@ def __init__(self, View, *args, **kwargs): self.interactive = True self.toolbar = make_toolbar_canvas2d(view=self.view) - self._setup_linked_home_buttons() + self._setup_linked_buttons() self.left_bar = VBar([self.toolbar]) self.right_bar = VBar() @@ -158,27 +160,34 @@ def _make_children(self): self.bottom_bar, ] - def _setup_linked_home_buttons(self): + def _setup_linked_buttons(self): """ - Link home buttons across all Plopp figures sharing this matplotlib figure. + Link some buttons buttons across all Plopp figures sharing this matplotlib + figure (e.g. the 'home' or 'grid' buttons). This is needed when multiple Plopp figures are created from matplotlib axes that belong to the same figure, e.g. subplots. """ - if not hasattr(self.fig, '_plopp_home_data'): - self.fig._plopp_home_data = {'callbacks': [], 'toolbars': []} - data = self.fig._plopp_home_data - # Store the original callback - data['callbacks'].append(self.toolbar['home'].callback) + keys = ('home', 'grid') + if not hasattr(self.fig, '_plopp_buttons_data'): + self.fig._plopp_buttons_data = { + 'callbacks': {key: [] for key in keys}, + 'toolbars': [], + } + data = self.fig._plopp_buttons_data + # Store the original callbacks + for key in keys: + data['callbacks'][key].append(self.toolbar[key].callback) data['toolbars'].append(self.toolbar) # Create a linked callback that calls ALL original callbacks - def linked_home(): - for callback in data['callbacks']: + def linked_home(key): + for callback in data['callbacks'][key]: callback() # Update all toolbars (including this one) to use the linked callback for toolbar in data['toolbars']: - toolbar['home'].callback = linked_home + for key in keys: + toolbar[key].callback = partial(linked_home, key) class StaticFigure(MplBaseFig): diff --git a/src/plopp/widgets/toolbar.py b/src/plopp/widgets/toolbar.py index 26555272..cd10428c 100644 --- a/src/plopp/widgets/toolbar.py +++ b/src/plopp/widgets/toolbar.py @@ -63,10 +63,15 @@ def autoscale_axes() -> None: view.autoscale() view.canvas.draw() + def grid() -> None: + view.canvas.toggle_grid() + view.canvas.draw() + return Toolbar( tools={ "home": tools.HomeTool(autoscale_axes, tooltip="Autoscale axes range"), "panzoom": tools.PanZoomTool(view.canvas.panzoom), + "grid": tools.GridTool(grid), "save": tools.SaveTool(view.canvas.download_figure), } ) diff --git a/src/plopp/widgets/tools.py b/src/plopp/widgets/tools.py index bc67d9ae..d17e98b5 100644 --- a/src/plopp/widgets/tools.py +++ b/src/plopp/widgets/tools.py @@ -166,6 +166,9 @@ def value(self) -> str | None: ) """Toggle normalization scale tool.""" +GridTool = partial(ToggleTool, icon='th', tooltip='Toggle grid visibility') +"""Toggle grid visibility tool.""" + SaveTool = partial(ButtonTool, icon='save', tooltip='Save figure') """Save figure to png tool.""" From d84a22ee0054eb8394c50970d7c4ebab0c9658da Mon Sep 17 00:00:00 2001 From: Neil Vaytet Date: Thu, 18 Jun 2026 12:20:28 +0200 Subject: [PATCH 2/2] sync button state with kwargs --- src/plopp/widgets/toolbar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plopp/widgets/toolbar.py b/src/plopp/widgets/toolbar.py index cd10428c..9026df5f 100644 --- a/src/plopp/widgets/toolbar.py +++ b/src/plopp/widgets/toolbar.py @@ -71,7 +71,7 @@ def grid() -> None: tools={ "home": tools.HomeTool(autoscale_axes, tooltip="Autoscale axes range"), "panzoom": tools.PanZoomTool(view.canvas.panzoom), - "grid": tools.GridTool(grid), + "grid": tools.GridTool(grid, value=view.canvas.grid), "save": tools.SaveTool(view.canvas.download_figure), } )