Skip to content
18 changes: 9 additions & 9 deletions lib/matplotlib/backend_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -1039,25 +1039,25 @@ 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 = "<tr><td>{}</td><td>{}</td><td>{}</td></tr>"
rows = [fmt.format(
"<b>Action</b>", "<b>Shortcuts</b>", "<b>Description</b>")]
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 ("<style>td {padding: 0px 4px}</style>"
"<table><thead>" + rows[0] + "</thead>"
"<tbody>".join(rows[1:]) + "</tbody></table>")
Expand Down
52 changes: 52 additions & 0 deletions lib/matplotlib/backends/backend_wx.py
Original file line number Diff line number Diff line change
Expand Up @@ -1824,6 +1824,57 @@ def remove_rubberband(self, dc=None):
self._rect = None


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)

sizer = wx.BoxSizer(wx.VERTICAL)
grid_sizer = wx.FlexGridSizer(0, 3, 8, 6)
# create and add the entries
bold = self.GetFont().MakeBold()
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)
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)
OK.Bind(wx.EVT_BUTTON, self.OnClose)

def OnClose(self, evt):
_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):
def trigger(self, *args):
_HelpDialog.show(self.figure.canvas.GetTopLevelParent(),
self._get_help_entries())


class ToolCopyToClipboardWx(backend_tools.ToolCopyToClipboardBase):
def trigger(self, *args, **kwargs):
if not self.canvas._isDrawn:
Expand All @@ -1839,6 +1890,7 @@ def trigger(self, *args, **kwargs):
backend_tools.ToolSaveFigure = SaveFigureWx
backend_tools.ToolSetCursor = SetCursorWx
backend_tools.ToolRubberband = RubberbandWx
backend_tools.ToolHelp = HelpWx
backend_tools.ToolCopyToClipboard = ToolCopyToClipboardWx


Expand Down