Re: [PATCH 5/6] perf scripts python: exported-sql-viewer.py: Add context menu

Arnaldo Carvalho de Melo
2019-05-13T20:09:35Z

Em Fri, May 03, 2019 at 03:08:27PM +0300, Adrian Hunter escreveu:
> Add a context menu (right-click) that provides options for copying to
> clipboard, including, for trees, the ability to copy only the cell under
> the mouse pointer.

Works as well:

Committer testing:

$ python ~acme/libexec/perf-core/scripts/python/exported-sql-viewer.py ~/c/adrian.hunter/simple-retpoline.db

Simply right click and pick "Copy selection", that at this point has
just the first line, not expanded, then see what was copied by pressing
shift+control+v on a terminal:

Call Path,Object,Count,Time (ns),Time (%),Branch Count,Branch Count (%)
▶ simple-retpolin,,,,,,

Ditto after expanding, i.e. the selection continues to be just one
line:

Call Path Object Count Time (ns) Time (%) Branch Count Branch Count (%)
▼ simple-retpolin

Now select all the lines with the mouse and control+shift+v again:

Call Path Object Count Time (ns) Time (%) Branch Count Branch Count (%)
▼ 14503:14503
▼ _start ld-2.28.so 1 156267 100.0 10602 100.0
▶ unknown unknown 1 2276 1.5 1 0.0
▶ _dl_start ld-2.28.so 1 137047 87.7 10088 95.2
▶ _dl_init ld-2.28.so 1 9142 5.9 326 3.1
▼ _start simple-retpoline 1 7457 4.8 182 1.7
▶ unknown unknown 1 805 10.8 1 0.5
▶ __libc_start_main libc-2.28.so 1 6347 85.1 179 98.4

> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
> ---
> .../scripts/python/exported-sql-viewer.py | 41 +++++++++++++++++++
> 1 file changed, 41 insertions(+)
>
> diff --git a/tools/perf/scripts/python/exported-sql-viewer.py b/tools/perf/scripts/python/exported-sql-viewer.py
> index 5804d9705ab7..421f3828ea43 100755
> --- a/tools/perf/scripts/python/exported-sql-viewer.py
> +++ b/tools/perf/scripts/python/exported-sql-viewer.py
> @@ -901,6 +901,8 @@ class TreeWindowBase(QMdiSubWindow):
> self.view.setSelectionMode(QAbstractItemView.ContiguousSelection)
> self.view.CopyCellsToClipboard = CopyTreeCellsToClipboard
>
> + self.context_menu = TreeContextMenu(self.view)
> +
> def DisplayFound(self, ids):
> if not len(ids):
> return False
> @@ -1674,6 +1676,8 @@ class BranchWindow(QMdiSubWindow):
>
> self.ResizeColumnsToContents()
>
> + self.context_menu = TreeContextMenu(self.view)
> +
> self.find_bar = FindBar(self, self, True)
>
> self.finder = ChildDataItemFinder(self.model.root)
> @@ -2483,6 +2487,39 @@ def CopyCellsToClipboardHdr(view):
> def CopyCellsToClipboardCSV(view):
> CopyCellsToClipboard(view, True, True)
>
> +# Context menu
> +
> +class ContextMenu(object):
> +
> + def __init__(self, view):
> + self.view = view
> + self.view.setContextMenuPolicy(Qt.CustomContextMenu)
> + self.view.customContextMenuRequested.connect(self.ShowContextMenu)
> +
> + def ShowContextMenu(self, pos):
> + menu = QMenu(self.view)
> + self.AddActions(menu)
> + menu.exec_(self.view.mapToGlobal(pos))
> +
> + def AddCopy(self, menu):
> + menu.addAction(CreateAction("&Copy selection", "Copy to clipboard", lambda: CopyCellsToClipboardHdr(self.view), self.view))
> + menu.addAction(CreateAction("Copy selection as CS&V", "Copy to clipboard as CSV", lambda: CopyCellsToClipboardCSV(self.view), self.view))
> +
> + def AddActions(self, menu):
> + self.AddCopy(menu)
> +
> +class TreeContextMenu(ContextMenu):
> +
> + def __init__(self, view):
> + super(TreeContextMenu, self).__init__(view)
> +
> + def AddActions(self, menu):
> + i = self.view.currentIndex()
> + text = str(i.data()).strip()
> + if len(text):
> + menu.addAction(CreateAction('Copy "' + text + '"', "Copy to clipboard", lambda: QApplication.clipboard().setText(text), self.view))
> + self.AddCopy(menu)
> +
> # Table window
>
> class TableWindow(QMdiSubWindow, ResizeColumnsToContentsBase):
> @@ -2506,6 +2543,8 @@ class TableWindow(QMdiSubWindow, ResizeColumnsToContentsBase):
>
> self.ResizeColumnsToContents()
>
> + self.context_menu = ContextMenu(self.view)
> +
> self.find_bar = FindBar(self, self, True)
>
> self.finder = ChildDataItemFinder(self.data_model)
> @@ -2622,6 +2661,8 @@ class TopCallsWindow(QMdiSubWindow, ResizeColumnsToContentsBase):
> self.view.setSelectionMode(QAbstractItemView.ContiguousSelection)
> self.view.CopyCellsToClipboard = CopyTableCellsToClipboard
>
> + self.context_menu = ContextMenu(self.view)
> +
> self.ResizeColumnsToContents()
>
> self.find_bar = FindBar(self, self, True)
> --
> 2.17.1

--

- Arnaldo