Skip to content

Help tool for Wx backends #11081

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Jul 9, 2018
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