From eb6a881ae1d5224ff5db1cd72e7bb503ffb503dc Mon Sep 17 00:00:00 2001 From: DietmarSchwertberger Date: Wed, 18 Apr 2018 23:44:02 +0200 Subject: [PATCH 1/7] Help tool for Wx backends --- lib/matplotlib/backend_tools.py | 19 ++++++------ lib/matplotlib/backends/backend_wx.py | 44 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/backend_tools.py b/lib/matplotlib/backend_tools.py index a884cc838860..a0faddd1ad9e 100644 --- a/lib/matplotlib/backend_tools.py +++ b/lib/matplotlib/backend_tools.py @@ -1039,30 +1039,31 @@ def _format_tool_keymap(self, name): keymaps = self.toolmanager.get_tool_keymap(name) return ", ".join(self.format_shortcut(keymap) for keymap in keymaps) - def _get_help_text(self): + def _get_help_entries(self): entries = [] for name, tool in sorted(self.toolmanager.tools.items()): if not tool.description: continue - entries.append( - "{}: {}\n\t{}".format( - name, self._format_tool_keymap(name), tool.description)) + entries.append((name, self._format_tool_keymap(name), + tool.description)) + return entries + + def _get_help_text(self): + entries = self._get_help_entries() + entries = ["{}: {}\n\t{}".format(*entry) for entry in entries] return "\n".join(entries) def _get_help_html(self): fmt = "{}{}{}" rows = [fmt.format( "Action", "Shortcuts", "Description")] - for name, tool in sorted(self.toolmanager.tools.items()): - if not tool.description: - continue - rows.append(fmt.format( - name, self._format_tool_keymap(name), tool.description)) + rows += [fmt.format(*row) for row in self._get_help_entries()] return ("" "" + rows[0] + "" "".join(rows[1:]) + "
") + default_tools = {'home': ToolHome, 'back': ToolBack, 'forward': ToolForward, 'zoom': ToolZoom, 'pan': ToolPan, 'subplots': 'ToolConfigureSubplots', diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index dfbf23340492..0474dca1704e 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -1826,9 +1826,53 @@ def remove_rubberband(self, dc=None): self._rect = None +class _TableDialog(wx.Dialog): + def __init__(self, parent, help, title="Help"): + wx.Dialog.__init__(self, parent, title=title, + style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) + + sizer = wx.BoxSizer(wx.VERTICAL) + grid_sizer = wx.FlexGridSizer(0, 3, 8, 6) + # create and add the entries + widths = [100,140, 300] + bold = self.GetFont().MakeBold() + for r,row in enumerate(help): + for (col,width) in zip(row, widths): + label = wx.StaticText(self, label=col) + if r==0: + label.SetFont(bold) + label.Wrap(width) + grid_sizer.Add(label, 0, 0, 0) + # finalize layout, create button + sizer.Add(grid_sizer, 0, wx.ALL, 6) + OK = wx.Button(self, wx.ID_OK) + sizer.Add(OK, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 8) + self.SetSizer(sizer) + sizer.Fit(self) + self.Layout() + self.Bind(wx.EVT_CLOSE, self.OnClose) + + def OnClose(self, evt): + self.DestroyLater() + evt.Skip() + + +class HelpWx(backend_tools.ToolHelpBase): + def trigger(self, *args): + wx.MessageBox(self._get_help_text().replace("\t", " "), + "Help", style=wx.OK|wx.CENTRE, + parent=self.figure.canvas.GetTopLevelParent()) + def trigger(self, *args): + help = [("Action","Shortcuts", "Description")] + help += self._get_help_entries() + dlg = _TableDialog(self.figure.canvas.GetTopLevelParent(), help) + dlg.Show() + + backend_tools.ToolSaveFigure = SaveFigureWx backend_tools.ToolSetCursor = SetCursorWx backend_tools.ToolRubberband = RubberbandWx +backend_tools.ToolHelp = HelpWx # < Additions for printing support: Matt Newville From 31e32ddf8d7ffbce50b56bdf9c3023b2620cbcbd Mon Sep 17 00:00:00 2001 From: DietmarSchwertberger Date: Thu, 19 Apr 2018 00:15:34 +0200 Subject: [PATCH 2/7] fix PEP8 and remove first, pure-text implementation --- lib/matplotlib/backends/backend_wx.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index 0474dca1704e..46a22ed44115 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -1834,12 +1834,12 @@ def __init__(self, parent, help, title="Help"): sizer = wx.BoxSizer(wx.VERTICAL) grid_sizer = wx.FlexGridSizer(0, 3, 8, 6) # create and add the entries - widths = [100,140, 300] + widths = [100, 140, 300] bold = self.GetFont().MakeBold() - for r,row in enumerate(help): - for (col,width) in zip(row, widths): + for r, row in enumerate(help): + for (col, width) in zip(row, widths): label = wx.StaticText(self, label=col) - if r==0: + if r == 0: label.SetFont(bold) label.Wrap(width) grid_sizer.Add(label, 0, 0, 0) @@ -1858,10 +1858,6 @@ def OnClose(self, evt): class HelpWx(backend_tools.ToolHelpBase): - def trigger(self, *args): - wx.MessageBox(self._get_help_text().replace("\t", " "), - "Help", style=wx.OK|wx.CENTRE, - parent=self.figure.canvas.GetTopLevelParent()) def trigger(self, *args): help = [("Action","Shortcuts", "Description")] help += self._get_help_entries() From 48da3f1674c6fd859e206043a9ccdd773133fee0 Mon Sep 17 00:00:00 2001 From: DietmarSchwertberger Date: Thu, 19 Apr 2018 19:34:56 +0200 Subject: [PATCH 3/7] fix PEP78, rename help->help_entries; if a help dialog is already open, just raise it --- lib/matplotlib/backend_tools.py | 1 - lib/matplotlib/backends/backend_wx.py | 21 ++++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/backend_tools.py b/lib/matplotlib/backend_tools.py index a0faddd1ad9e..3568acc0619d 100644 --- a/lib/matplotlib/backend_tools.py +++ b/lib/matplotlib/backend_tools.py @@ -1063,7 +1063,6 @@ def _get_help_html(self): "".join(rows[1:]) + "") - default_tools = {'home': ToolHome, 'back': ToolBack, 'forward': ToolForward, 'zoom': ToolZoom, 'pan': ToolPan, 'subplots': 'ToolConfigureSubplots', diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index 46a22ed44115..91fceb02d9db 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -1826,8 +1826,8 @@ def remove_rubberband(self, dc=None): self._rect = None -class _TableDialog(wx.Dialog): - def __init__(self, parent, help, title="Help"): +class _HelpDialog(wx.Dialog): + def __init__(self, parent, help_entries, title="Help"): wx.Dialog.__init__(self, parent, title=title, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) @@ -1836,7 +1836,7 @@ def __init__(self, parent, help, title="Help"): # create and add the entries widths = [100, 140, 300] bold = self.GetFont().MakeBold() - for r, row in enumerate(help): + for r, row in enumerate(help_entries): for (col, width) in zip(row, widths): label = wx.StaticText(self, label=col) if r == 0: @@ -1851,18 +1851,25 @@ def __init__(self, parent, help, title="Help"): sizer.Fit(self) self.Layout() self.Bind(wx.EVT_CLOSE, self.OnClose) + OK.Bind(wx.EVT_BUTTON, self.OnClose) def OnClose(self, evt): + HelpWx.dlg = None self.DestroyLater() evt.Skip() class HelpWx(backend_tools.ToolHelpBase): + dlg = None def trigger(self, *args): - help = [("Action","Shortcuts", "Description")] - help += self._get_help_entries() - dlg = _TableDialog(self.figure.canvas.GetTopLevelParent(), help) - dlg.Show() + if self.dlg: + self.dlg.Raise() + return + help_entries = [("Action", "Shortcuts", "Description")] + help_entries += self._get_help_entries() + self.dlg = _HelpDialog(self.figure.canvas.GetTopLevelParent(), + help_entries) + self.dlg.Show() backend_tools.ToolSaveFigure = SaveFigureWx From 8818ee322e96c774801ec49a58fdf5d01045e322 Mon Sep 17 00:00:00 2001 From: DietmarSchwertberger Date: Thu, 19 Apr 2018 20:09:55 +0200 Subject: [PATCH 4/7] fix handling of the global reference to the open dialog; add comments to make clear --- lib/matplotlib/backends/backend_wx.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index 91fceb02d9db..b20df61ac7ad 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -1854,22 +1854,24 @@ def __init__(self, parent, help_entries, title="Help"): OK.Bind(wx.EVT_BUTTON, self.OnClose) def OnClose(self, evt): - HelpWx.dlg = None + HelpWx.dlg = None # remove global reference self.DestroyLater() evt.Skip() class HelpWx(backend_tools.ToolHelpBase): - dlg = None + dlg = None # a reference to the opened dialog, to avoid more than one def trigger(self, *args): - if self.dlg: - self.dlg.Raise() + if HelpWx.dlg: + # previous dialog is still open + HelpWx.dlg.Raise() return + # create new dialog and keep a reference help_entries = [("Action", "Shortcuts", "Description")] help_entries += self._get_help_entries() - self.dlg = _HelpDialog(self.figure.canvas.GetTopLevelParent(), - help_entries) - self.dlg.Show() + HelpWx.dlg = _HelpDialog(self.figure.canvas.GetTopLevelParent(), + help_entries) + HelpWx.dlg.Show() backend_tools.ToolSaveFigure = SaveFigureWx From 78ffba8120fa9ab4b33703fbada93f8f55282987 Mon Sep 17 00:00:00 2001 From: DietmarSchwertberger Date: Thu, 19 Apr 2018 21:25:03 +0200 Subject: [PATCH 5/7] move singleton reference to _HelpDialog and implement class method show() --- lib/matplotlib/backends/backend_wx.py | 36 ++++++++++++++------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index b20df61ac7ad..5e2e56dfecf0 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -1827,17 +1827,19 @@ def remove_rubberband(self, dc=None): class _HelpDialog(wx.Dialog): - def __init__(self, parent, help_entries, title="Help"): - wx.Dialog.__init__(self, parent, title=title, + _instance = None # a reference to an open dialog singleton + headers = [("Action", "Shortcuts", "Description")] + widths = [100, 140, 300] + def __init__(self, parent, help_entries): + wx.Dialog.__init__(self, parent, title="Help", style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) sizer = wx.BoxSizer(wx.VERTICAL) grid_sizer = wx.FlexGridSizer(0, 3, 8, 6) # create and add the entries - widths = [100, 140, 300] bold = self.GetFont().MakeBold() - for r, row in enumerate(help_entries): - for (col, width) in zip(row, widths): + for r, row in enumerate(self.headers + help_entries): + for (col, width) in zip(row, self.widths): label = wx.StaticText(self, label=col) if r == 0: label.SetFont(bold) @@ -1854,24 +1856,24 @@ def __init__(self, parent, help_entries, title="Help"): OK.Bind(wx.EVT_BUTTON, self.OnClose) def OnClose(self, evt): - HelpWx.dlg = None # remove global reference + _HelpDialog.instance = None # remove global reference self.DestroyLater() evt.Skip() + @classmethod + def show(cls, parent, help_entries): + # if no dialog is shown, create one; otherwise just re-raise it + if cls._instance: + cls._instance.Raise() + return + cls._instance = cls(parent, help_entries) + cls._instance.Show() + class HelpWx(backend_tools.ToolHelpBase): - dlg = None # a reference to the opened dialog, to avoid more than one def trigger(self, *args): - if HelpWx.dlg: - # previous dialog is still open - HelpWx.dlg.Raise() - return - # create new dialog and keep a reference - help_entries = [("Action", "Shortcuts", "Description")] - help_entries += self._get_help_entries() - HelpWx.dlg = _HelpDialog(self.figure.canvas.GetTopLevelParent(), - help_entries) - HelpWx.dlg.Show() + _HelpDialog.show(self.figure.canvas.GetTopLevelParent(), + self._get_help_entries()) backend_tools.ToolSaveFigure = SaveFigureWx From 1f51923cd562f79adb42103e9784f401afb9cae8 Mon Sep 17 00:00:00 2001 From: DietmarSchwertberger Date: Thu, 19 Apr 2018 22:23:59 +0200 Subject: [PATCH 6/7] add line for PEP8 --- lib/matplotlib/backends/backend_wx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index 5e2e56dfecf0..6db13591143e 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -1830,6 +1830,7 @@ class _HelpDialog(wx.Dialog): _instance = None # a reference to an open dialog singleton headers = [("Action", "Shortcuts", "Description")] widths = [100, 140, 300] + def __init__(self, parent, help_entries): wx.Dialog.__init__(self, parent, title="Help", style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) From 4ff121b3efd3b3928a859091868327503f7d5bcb Mon Sep 17 00:00:00 2001 From: DietmarSchwertberger Date: Thu, 26 Apr 2018 19:25:36 +0200 Subject: [PATCH 7/7] fix attribute name --- lib/matplotlib/backends/backend_wx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index 6db13591143e..99950c12b286 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -1857,7 +1857,7 @@ def __init__(self, parent, help_entries): OK.Bind(wx.EVT_BUTTON, self.OnClose) def OnClose(self, evt): - _HelpDialog.instance = None # remove global reference + _HelpDialog._instance = None # remove global reference self.DestroyLater() evt.Skip()