blob: f59f5dfbe5f82775f0dc459e1571adfc44819194 [file] [log] [blame]
/* SPDX-License-Identifier: LGPL-2.1 */
/*
* Copyright (C) 2017 VMware Inc, Yordan Karadzhov <ykaradzhov@vmware.com>
*/
/**
* @file KsTraceViewer.hpp
* @brief KernelShark Trace Viewer widget.
*/
#ifndef _KS_TRACEVIEW_H
#define _KS_TRACEVIEW_H
// Qt
#include <QTableView>
// KernelShark
#include "KsUtils.hpp"
#include "KsModels.hpp"
#include "KsSearchFSM.hpp"
#include "KsDualMarker.hpp"
/**
* Table View class, needed in order to reimplemented the handler for mouse
* press events.
*/
class KsTableView : public QTableView
{
Q_OBJECT
public:
/** Create KsTableView. */
explicit KsTableView(QWidget *parent = nullptr)
: QTableView(parent) {};
void mousePressEvent(QMouseEvent *event) override;
void scrollTo(const QModelIndex &index, ScrollHint hint) override;
};
/**
* The KsTraceViewer class provides a widget for browsing in the trace data
* shown in a text form.
*/
class KsTraceViewer : public QWidget
{
Q_OBJECT
public:
explicit KsTraceViewer(QWidget *parent = nullptr);
void loadData(KsDataStore *data);
void setMarkerSM(KsDualMarkerSM *m);
void reset();
size_t getTopRow() const;
void setTopRow(size_t r);
void resizeEvent(QResizeEvent* event) override;
void keyReleaseEvent(QKeyEvent *event);
void markSwitch();
void showRow(size_t r, bool mark);
void clearSelection();
int selectedRow();
void update(KsDataStore *data);
signals:
/** Signal emitted when new row is selected. */
void select(size_t);
/**
* This signal is used to re-emitted the addTaskPlot signal of the
* KsQuickContextMenu.
*/
void addTaskPlot(int pid);
/**
* This signal is used to re-emitted the deselect signal of the
* KsQuickMarkerMenu.
*/
void deselect();
private:
QVBoxLayout _layout;
KsTableView _view;
KsViewModel _model;
KsFilterProxyModel _proxyModel;
QStringList _tableHeader;
QToolBar _toolbar;
QLabel _labelSearch, _labelGrFollows;
KsSearchFSM _searchFSM;
QCheckBox _graphFollowsCheckBox;
bool _graphFollows;
QList<int> _matchList;
QList<int>::iterator _it;
KsDualMarkerSM *_mState;
KsDataStore *_data;
enum Condition
{
Containes = 0,
Match = 1,
NotHave = 2
};
void _searchReset();
void _resizeToContents();
size_t _searchItems();
void _searchItemsMapReduce(int column, const QString &searchText,
search_condition_func cond);
void _searchEditText(const QString &);
void _graphFollowsChanged(int);
void _lockSearchPanel(bool lock);
void _search();
void _next();
void _prev();
void _updateSearchCount();
void _searchStop();
void _searchContinue();
void _clicked(const QModelIndex& i);
void _onCustomContextMenu(const QPoint &);
void _setSearchIterator(int row);
bool _searchDone()
{
return _searchFSM.getState() == search_state_t::Done_s ||
_searchFSM.getState() == search_state_t::Paused_s;
}
private slots:
void _searchEdit(int);
};
#endif // _KS_TRACEVIEW_H