Make it possible to switch between bottom-up/top-down flame graph.
authorMilian Wolff <mail@milianw.de>
Sat, 5 Dec 2015 01:20:14 +0000 (02:20 +0100)
committerMilian Wolff <mail@milianw.de>
Sat, 5 Dec 2015 01:20:14 +0000 (02:20 +0100)
The context menu has a new action now to switch the view mode of
the flame graph.

gui/flamegraph.cpp
gui/flamegraph.h
gui/mainwindow.cpp

index 4777475..301ba21 100644 (file)
@@ -30,6 +30,7 @@
 #include <QEvent>
 #include <QToolTip>
 #include <QDebug>
+#include <QAction>
 
 #include <KLocalizedString>
 #include <KColorScheme>
@@ -241,6 +242,14 @@ FlameGraph::FlameGraph(QWidget* parent, Qt::WindowFlags flags)
     m_view->viewport()->installEventFilter(this);
     m_view->viewport()->setMouseTracking(true);
     m_view->setFont(QFont(QStringLiteral("monospace")));
+    m_view->setContextMenuPolicy(Qt::ActionsContextMenu);
+    auto bottomUpViewAction = new QAction(i18n("Bottom-Down View"), this);
+    bottomUpViewAction->setCheckable(true);
+    connect(bottomUpViewAction, &QAction::toggled, this, [this, bottomUpViewAction] {
+        m_showBottomUpData = bottomUpViewAction->isChecked();
+        showData();
+    });
+    m_view->addAction(bottomUpViewAction);
 
     layout()->addWidget(m_view);
 }
@@ -257,29 +266,35 @@ bool FlameGraph::eventFilter(QObject* object, QEvent* event)
             selectItem(static_cast<FrameGraphicsItem*>(m_view->itemAt(mouseEvent->pos())));
         }
     } else if (event->type() == QEvent::Resize || event->type() == QEvent::Show) {
-        selectItem(m_selectedItem);
+        if (!m_rootItem) {
+            showData();
+        } else {
+            selectItem(m_selectedItem);
+        }
+    } else if (event->type() == QEvent::Hide) {
+        setData(nullptr);
     }
     return ret;
 }
 
-void FlameGraph::showEvent(QShowEvent* event)
+void FlameGraph::setTopDownData(const TreeData& topDownData)
 {
-    setData(parseData(m_topDownData));
-    QWidget::showEvent(event);
+    m_topDownData = topDownData;
+
+    if (isVisible()) {
+        showData();
+    }
 }
 
-void FlameGraph::hideEvent(QHideEvent* event)
+void FlameGraph::setBottomUpData(const TreeData& bottomUpData)
 {
-    setData(nullptr);
-    QWidget::hideEvent(event);
+    m_bottomUpData = bottomUpData;
 }
 
-void FlameGraph::setTopDownData(const TreeData& topDownData)
+void FlameGraph::showData()
 {
-    m_topDownData = topDownData;
-    if (isVisible()) {
-        setData(parseData(topDownData));
-    }
+    setData(nullptr);
+    setData(parseData(m_showBottomUpData ? m_bottomUpData : m_topDownData));
 }
 
 void FlameGraph::setData(FrameGraphicsItem* rootItem)
index 4c00b0e..580b9c4 100644 (file)
@@ -36,23 +36,25 @@ public:
     ~FlameGraph();
 
     void setTopDownData(const TreeData& topDownData);
+    void setBottomUpData(const TreeData& bottomUpData);
 
 protected:
     bool eventFilter(QObject* object, QEvent* event) override;
-    void showEvent(QShowEvent* event) override;
-    void hideEvent(QHideEvent* event) override;
 
 private:
+    void showData();
     void setData(FrameGraphicsItem* rootItem);
     void selectItem(FrameGraphicsItem* item);
 
     TreeData m_topDownData;
+    TreeData m_bottomUpData;
 
     QGraphicsScene* m_scene;
     QGraphicsView* m_view;
     FrameGraphicsItem* m_rootItem;
     FrameGraphicsItem* m_selectedItem;
     int m_minRootWidth;
+    bool m_showBottomUpData = false;
 };
 
 #endif // FLAMEGRAPH_H
index 08b441e..5860abb 100644 (file)
@@ -70,6 +70,8 @@ MainWindow::MainWindow(QWidget* parent)
             m_ui->summary, &QLabel::setText);
     connect(m_parser, &Parser::topDownDataAvailable,
             m_ui->flameGraphTab, &FlameGraph::setTopDownData);
+    connect(m_parser, &Parser::bottomUpDataAvailable,
+            m_ui->flameGraphTab, &FlameGraph::setBottomUpData);
     connect(m_parser, &Parser::finished,
             this, [&] { m_ui->pages->setCurrentWidget(m_ui->resultsPage); });