diff --git a/.gitignore b/.gitignore --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,6 @@ *.BASE.* *.LOCAL.* *.REMOTE.* + +# from Qt Creator +CMakeLists.txt.user diff --git a/src/analyze/gui/CMakeLists.txt b/src/analyze/gui/CMakeLists.txt --- a/src/analyze/gui/CMakeLists.txt +++ b/src/analyze/gui/CMakeLists.txt @@ -26,6 +26,7 @@ parser.cpp flamegraph.cpp stacksmodel.cpp + stackstreeview.cpp topproxy.cpp callercalleemodel.cpp util.cpp diff --git a/src/analyze/gui/mainwindow.ui b/src/analyze/gui/mainwindow.ui --- a/src/analyze/gui/mainwindow.ui +++ b/src/analyze/gui/mainwindow.ui @@ -757,7 +757,10 @@ - + + + QAbstractItemView::ExtendedSelection + false @@ -803,6 +806,11 @@
flamegraph.h
1 + + StacksTreeView + QTreeView +
stackstreeview.hpp
+
diff --git a/src/analyze/gui/stackstreeview.hpp b/src/analyze/gui/stackstreeview.hpp new file mode 100644 --- /dev/null +++ b/src/analyze/gui/stackstreeview.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include + +class StacksTreeView : public QTreeView { +public: + StacksTreeView(QWidget* parent = nullptr); + +protected: + void keyPressEvent(QKeyEvent* event) override; +}; diff --git a/src/analyze/gui/stackstreeview.cpp b/src/analyze/gui/stackstreeview.cpp new file mode 100644 --- /dev/null +++ b/src/analyze/gui/stackstreeview.cpp @@ -0,0 +1,28 @@ +#include "stackstreeview.hpp" + +#include +#include +#include + +StacksTreeView::StacksTreeView(QWidget* parent) + : QTreeView(parent) { + +} + +void StacksTreeView::keyPressEvent(QKeyEvent* event) { + if(!selectedIndexes().isEmpty() && event->matches(QKeySequence::Copy)) { + QString text; + QItemSelectionRange range = selectionModel()->selection().first(); + for (auto i = range.top(); i <= range.bottom(); ++i) + { + QStringList rowContents; + for (auto j = range.left(); j <= range.right(); ++j) + rowContents << model()->index(i,j).data().toString(); + text += rowContents.join(QString::fromUtf8("\t")); + text += QString::fromUtf8("\n"); + } + QApplication::clipboard()->setText(text); + } else { + QTreeView::keyPressEvent(event); + } +}