blob: c53258cc873963327055e38ffdbf13e5c51784d4 [file] [log] [blame]
/* SPDX-License-Identifier: LGPL-2.1 */
/*
* Copyright (C) 2017 VMware Inc, Yordan Karadzhov <ykaradzhov@vmware.com>
*/
/**
* @file KsTraceGraph.hpp
* @brief KernelShark Trace Graph widget.
*/
#ifndef _KS_TRACEGRAPH_H
#define _KS_TRACEGRAPH_H
// KernelShark
#include "KsGLWidget.hpp"
/**
* Scroll Area class, needed in order to reimplemented the handler for mouse
* wheel events.
*/
class KsGraphScrollArea : public QScrollArea {
public:
/** Create a default Scroll Area. */
explicit KsGraphScrollArea(QWidget *parent = nullptr)
: QScrollArea(parent) {}
/**
* Reimplemented handler for mouse wheel events. All mouse wheel
* events will be ignored.
*/
void wheelEvent(QWheelEvent *evt) {evt->ignore();}
};
/**
* The KsTraceViewer class provides a widget for interactive visualization of
* trace data shown as time-series.
*/
class KsTraceGraph : public QWidget
{
Q_OBJECT
public:
explicit KsTraceGraph(QWidget *parent = nullptr);
void loadData(KsDataStore *data);
void setMarkerSM(KsDualMarkerSM *m);
void reset();
/** Get the KsGLWidget object. */
KsGLWidget *glPtr() {return &_glWindow;}
void markEntry(size_t);
void cpuReDraw(QVector<int>);
void taskReDraw(QVector<int>);
void addCPUPlot(int);
void addTaskPlot(int);
void removeCPUPlot(int);
void removeTaskPlot(int);
void update(KsDataStore *data);
void updateGeom();
void resizeEvent(QResizeEvent* event) override;
bool eventFilter(QObject* obj, QEvent* evt) override;
signals:
/**
* This signal is emitted in the case of a right mouse button click or
* in the case of a double click over an empty area (no visible
* KernelShark entries).
*/
void deselect();
private:
void _zoomIn();
void _zoomOut();
void _quickZoomIn();
void _quickZoomOut();
void _scrollLeft();
void _scrollRight();
void _stopUpdating();
void _resetPointer(uint64_t ts, int cpu, int pid);
void _setPointerInfo(size_t);
void _updateTimeLegends();
void _updateGraphLegends();
void _selfUpdate();
void _markerReDraw();
enum class GraphActions {
ZoomIn,
ZoomOut,
ScrollLeft,
ScrollRight
};
void _updateGraphs(GraphActions action);
void _onCustomContextMenu(const QPoint &point);
QToolBar _pointerBar, _navigationBar;
QPushButton _zoomInButton, _quickZoomInButton;
QPushButton _zoomOutButton, _quickZoomOutButton;
QPushButton _scrollLeftButton, _scrollRightButton;
QLabel _labelP1, _labelP2, // Pointer
_labelI1, _labelI2, _labelI3, _labelI4, _labelI5; // Proc. info
KsGraphScrollArea _scrollArea;
QWidget _drawWindow, _legendWindow, _legendAxisX;
QLabel _labelXMin, _labelXMid, _labelXMax;
KsGLWidget _glWindow;
QGridLayout _drawLayout;
QVBoxLayout _layout;
KsDualMarkerSM *_mState;
KsDataStore *_data;
bool _keyPressed;
};
#endif // _KS_TRACEGRAPH_H