2016-06-26 18:56:40 +03:00
|
|
|
/************************************************************************
|
|
|
|
* file name : blocks_graphics_view.h
|
|
|
|
* ----------------- :
|
|
|
|
* creation time : 2016/06/26
|
|
|
|
* copyright : (c) 2016 Victor Zarubkin
|
|
|
|
* author : Victor Zarubkin
|
|
|
|
* email : v.s.zarubkin@gmail.com
|
|
|
|
* ----------------- :
|
|
|
|
* description : The file contains declaration of GraphicsScene and GraphicsView and
|
|
|
|
* : it's auxiliary classes for displyaing easy_profiler blocks tree.
|
|
|
|
* ----------------- :
|
|
|
|
* change log : * 2016/06/26 Victor Zarubkin: moved sources from graphics_view.h
|
2016-06-26 19:06:53 +03:00
|
|
|
* : and renamed classes from My* to Prof*.
|
2016-06-30 02:57:57 +03:00
|
|
|
* :
|
|
|
|
* : * 2016/06/29 Victor Zarubkin: Highly optimized painting performance and memory consumption.
|
|
|
|
* :
|
2016-06-30 03:45:11 +03:00
|
|
|
* : * 2016/06/30 Victor Zarubkin: Replaced doubles with floats (in ProfBlockItem) for less memory consumption.
|
|
|
|
* :
|
2016-06-26 18:56:40 +03:00
|
|
|
* : *
|
|
|
|
* ----------------- :
|
|
|
|
* license : TODO: add license text
|
|
|
|
************************************************************************/
|
2016-06-26 18:46:51 +03:00
|
|
|
|
|
|
|
#ifndef MY____GRAPHICS___VIEW_H
|
|
|
|
#define MY____GRAPHICS___VIEW_H
|
|
|
|
|
|
|
|
#include <QGraphicsView>
|
|
|
|
#include <QGraphicsScene>
|
|
|
|
#include <QGraphicsPolygonItem>
|
|
|
|
#include <QGraphicsSimpleTextItem>
|
2016-06-26 20:54:16 +03:00
|
|
|
#include <QPoint>
|
2016-06-26 18:46:51 +03:00
|
|
|
#include <stdlib.h>
|
2016-06-30 02:57:57 +03:00
|
|
|
#include <vector>
|
2016-06-26 18:46:51 +03:00
|
|
|
#include "profiler/reader.h"
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2016-07-10 01:24:31 +03:00
|
|
|
#define DRAW_METHOD 2
|
2016-06-30 03:45:11 +03:00
|
|
|
typedef float preal;
|
|
|
|
|
2016-06-30 02:57:57 +03:00
|
|
|
#pragma pack(push, 1)
|
|
|
|
struct ProfBlockItem
|
2016-06-26 18:46:51 +03:00
|
|
|
{
|
2016-06-30 03:45:11 +03:00
|
|
|
const BlocksTree* block;
|
|
|
|
preal x, y, w, h;
|
|
|
|
|
|
|
|
float totalHeight;
|
2016-06-30 02:57:57 +03:00
|
|
|
QRgb color;
|
2016-07-10 01:24:31 +03:00
|
|
|
#if DRAW_METHOD > 0
|
|
|
|
unsigned int children_begin;
|
|
|
|
#else
|
2016-06-30 02:57:57 +03:00
|
|
|
bool draw;
|
2016-07-10 01:24:31 +03:00
|
|
|
#endif
|
2016-06-26 20:54:16 +03:00
|
|
|
|
2016-06-30 03:45:11 +03:00
|
|
|
void setRect(preal _x, preal _y, preal _w, preal _h);
|
|
|
|
preal left() const;
|
|
|
|
preal top() const;
|
|
|
|
preal width() const;
|
|
|
|
preal height() const;
|
|
|
|
preal right() const;
|
|
|
|
preal bottom() const;
|
2016-06-30 02:57:57 +03:00
|
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
|
|
|
|
class ProfGraphicsItem : public QGraphicsItem
|
|
|
|
{
|
|
|
|
typedef ::std::vector<ProfBlockItem> Children;
|
2016-06-30 03:45:11 +03:00
|
|
|
|
2016-07-10 01:24:31 +03:00
|
|
|
#if DRAW_METHOD == 2
|
|
|
|
typedef ::std::vector<unsigned int> DrawIndexes;
|
|
|
|
DrawIndexes m_levelsIndexes;
|
|
|
|
typedef ::std::vector<Children> Sublevels;
|
|
|
|
Sublevels m_levels;
|
|
|
|
#else
|
2016-06-30 02:57:57 +03:00
|
|
|
Children m_items;
|
2016-07-10 01:24:31 +03:00
|
|
|
#endif
|
|
|
|
|
2016-06-30 02:57:57 +03:00
|
|
|
QRectF m_rect;
|
|
|
|
const bool m_bTest;
|
2016-06-26 18:46:51 +03:00
|
|
|
|
2016-06-30 02:57:57 +03:00
|
|
|
public:
|
2016-06-26 18:46:51 +03:00
|
|
|
|
2016-06-30 02:57:57 +03:00
|
|
|
ProfGraphicsItem();
|
|
|
|
ProfGraphicsItem(bool _test);
|
|
|
|
virtual ~ProfGraphicsItem();
|
2016-06-26 20:54:16 +03:00
|
|
|
|
2016-06-30 02:57:57 +03:00
|
|
|
QRectF boundingRect() const override;
|
|
|
|
void paint(QPainter* _painter, const QStyleOptionGraphicsItem* _option, QWidget* _widget = nullptr) override;
|
2016-06-26 18:46:51 +03:00
|
|
|
|
2016-06-30 02:57:57 +03:00
|
|
|
void setBoundingRect(qreal x, qreal y, qreal w, qreal h);
|
|
|
|
void setBoundingRect(const QRectF& _rect);
|
2016-06-26 18:46:51 +03:00
|
|
|
|
2016-07-10 01:24:31 +03:00
|
|
|
#if DRAW_METHOD == 0
|
|
|
|
void reserve(size_t _items);
|
2016-06-30 02:57:57 +03:00
|
|
|
const Children& items() const;
|
|
|
|
const ProfBlockItem& getItem(size_t _index) const;
|
|
|
|
ProfBlockItem& getItem(size_t _index);
|
|
|
|
size_t addItem();
|
|
|
|
size_t addItem(const ProfBlockItem& _item);
|
|
|
|
size_t addItem(ProfBlockItem&& _item);
|
2016-07-10 01:24:31 +03:00
|
|
|
#else
|
|
|
|
void setLevels(unsigned short _levels);
|
|
|
|
void reserve(unsigned short _level, size_t _items);
|
|
|
|
const Children& items(unsigned short _level) const;
|
|
|
|
const ProfBlockItem& getItem(unsigned short _level, size_t _index) const;
|
|
|
|
ProfBlockItem& getItem(unsigned short _level, size_t _index);
|
|
|
|
size_t addItem(unsigned short _level);
|
|
|
|
size_t addItem(unsigned short _level, const ProfBlockItem& _item);
|
|
|
|
size_t addItem(unsigned short _level, ProfBlockItem&& _item);
|
|
|
|
#endif
|
2016-06-30 03:45:11 +03:00
|
|
|
|
2016-06-30 02:57:57 +03:00
|
|
|
}; // END of class ProfGraphicsItem.
|
2016-06-26 18:46:51 +03:00
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2016-06-26 19:06:53 +03:00
|
|
|
class ProfGraphicsScene : public QGraphicsScene
|
2016-06-26 18:46:51 +03:00
|
|
|
{
|
2016-06-26 20:54:16 +03:00
|
|
|
friend class ProfGraphicsView;
|
|
|
|
|
2016-06-26 18:46:51 +03:00
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
2016-06-30 02:57:57 +03:00
|
|
|
typedef ProfGraphicsScene This;
|
|
|
|
|
|
|
|
::profiler::timestamp_t m_beginTime;
|
2016-06-26 18:46:51 +03:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
2016-06-26 20:54:16 +03:00
|
|
|
ProfGraphicsScene(QGraphicsView* _parent, bool _test = false);
|
2016-06-26 19:06:53 +03:00
|
|
|
ProfGraphicsScene(const thread_blocks_tree_t& _blocksTree, QGraphicsView* _parent);
|
|
|
|
virtual ~ProfGraphicsScene();
|
2016-06-26 18:46:51 +03:00
|
|
|
|
2016-06-26 20:54:16 +03:00
|
|
|
private:
|
|
|
|
|
2016-06-30 02:57:57 +03:00
|
|
|
void test(size_t _frames_number, size_t _total_items_number_estimate, int _depth);
|
2016-06-26 18:46:51 +03:00
|
|
|
|
2016-06-26 20:54:16 +03:00
|
|
|
void clearSilent();
|
|
|
|
|
2016-06-26 18:46:51 +03:00
|
|
|
void setTree(const thread_blocks_tree_t& _blocksTree);
|
|
|
|
|
2016-06-30 03:45:11 +03:00
|
|
|
qreal setTree(const BlocksTree::children_t& _children, qreal& _height, qreal _y);
|
2016-07-10 01:24:31 +03:00
|
|
|
qreal setTree(ProfGraphicsItem* _item, const BlocksTree::children_t& _children, qreal& _height, qreal _y, unsigned int _level);
|
2016-06-26 18:46:51 +03:00
|
|
|
|
|
|
|
inline qreal time2position(const profiler::timestamp_t& _time) const
|
|
|
|
{
|
2016-06-30 02:57:57 +03:00
|
|
|
return qreal(_time - m_beginTime) * 1e-6;
|
2016-06-26 18:46:51 +03:00
|
|
|
}
|
|
|
|
|
2016-06-26 19:06:53 +03:00
|
|
|
}; // END of class ProfGraphicsScene.
|
2016-06-26 18:46:51 +03:00
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2016-06-26 19:06:53 +03:00
|
|
|
class ProfGraphicsView : public QGraphicsView
|
2016-06-26 18:46:51 +03:00
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
2016-06-30 02:57:57 +03:00
|
|
|
typedef ProfGraphicsView This;
|
|
|
|
|
|
|
|
QRectF m_visibleSceneRect;
|
2016-06-26 20:54:16 +03:00
|
|
|
qreal m_scale;
|
|
|
|
qreal m_scaleCoeff;
|
|
|
|
QPoint m_mousePressPos;
|
|
|
|
Qt::MouseButtons m_mouseButtons;
|
2016-06-30 02:57:57 +03:00
|
|
|
bool m_bUpdatingRect;
|
2016-06-26 18:46:51 +03:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
2016-06-26 20:54:16 +03:00
|
|
|
ProfGraphicsView(bool _test = false);
|
2016-06-26 19:06:53 +03:00
|
|
|
ProfGraphicsView(const thread_blocks_tree_t& _blocksTree);
|
|
|
|
virtual ~ProfGraphicsView();
|
2016-06-26 18:46:51 +03:00
|
|
|
|
2016-06-26 20:54:16 +03:00
|
|
|
void wheelEvent(QWheelEvent* _event) override;
|
|
|
|
void mousePressEvent(QMouseEvent* _event) override;
|
|
|
|
void mouseReleaseEvent(QMouseEvent* _event) override;
|
|
|
|
void mouseMoveEvent(QMouseEvent* _event) override;
|
|
|
|
|
|
|
|
inline qreal currentScale() const
|
|
|
|
{
|
|
|
|
return m_scale;
|
|
|
|
}
|
2016-06-26 18:46:51 +03:00
|
|
|
|
2016-06-30 02:57:57 +03:00
|
|
|
inline const QRectF& visibleSceneRect() const
|
|
|
|
{
|
|
|
|
return m_visibleSceneRect;
|
|
|
|
}
|
|
|
|
|
2016-06-26 20:54:16 +03:00
|
|
|
void setTree(const thread_blocks_tree_t& _blocksTree);
|
2016-06-30 02:57:57 +03:00
|
|
|
void clearSilent();
|
|
|
|
|
|
|
|
void test(size_t _frames_number, size_t _total_items_number_estimate, int _depth);
|
|
|
|
|
|
|
|
private:
|
2016-06-26 20:54:16 +03:00
|
|
|
|
|
|
|
void initMode();
|
2016-06-30 02:57:57 +03:00
|
|
|
void updateVisibleSceneRect();
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
|
|
|
|
void onScrollbarValueChange(int);
|
2016-06-26 18:46:51 +03:00
|
|
|
|
2016-06-26 19:06:53 +03:00
|
|
|
}; // END of class ProfGraphicsView.
|
2016-06-26 18:46:51 +03:00
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#endif // MY____GRAPHICS___VIEW_H
|