mirror of
https://github.com/yse/easy_profiler.git
synced 2024-12-27 08:41:02 +08:00
(EasyGraphicsView) Added widget displaying thread names on scene. Double click on thread name makes it current selected thread.
(EasyGraphicsView) Selected item's text is now painted bold + removed selected item color, but made selected item's border more wide. (profiler_gui) Colors adjustment.
This commit is contained in:
parent
40a8ee3d16
commit
248348ee05
@ -364,7 +364,7 @@ namespace profiler {
|
|||||||
const color_t Skin = Orange100;
|
const color_t Skin = Orange100;
|
||||||
const color_t DeepOrange = DeepOrange500;
|
const color_t DeepOrange = DeepOrange500;
|
||||||
const color_t Brick = DeepOrange900;
|
const color_t Brick = DeepOrange900;
|
||||||
const color_t Coral = DeepOrange200;
|
const color_t Coral = DeepOrange300;
|
||||||
const color_t Brown = Brown500;
|
const color_t Brown = Brown500;
|
||||||
const color_t DarkBrown = Brown900;
|
const color_t DarkBrown = Brown900;
|
||||||
const color_t CreamWhite = Orange50;
|
const color_t CreamWhite = Orange50;
|
||||||
|
@ -77,19 +77,29 @@ const unsigned short GRAPHICS_ROW_SIZE_FULL = GRAPHICS_ROW_SIZE + GRAPHICS_ROW_S
|
|||||||
const unsigned short THREADS_ROW_SPACING = 8;
|
const unsigned short THREADS_ROW_SPACING = 8;
|
||||||
const unsigned short TIMELINE_ROW_SIZE = 20;
|
const unsigned short TIMELINE_ROW_SIZE = 20;
|
||||||
|
|
||||||
const QRgb BORDERS_COLOR = 0x00686868;// 0x00a07050;
|
const QRgb BORDERS_COLOR = ::profiler::colors::Grey700 & 0x00ffffff;// 0x00686868;
|
||||||
const QRgb BACKGROUND_1 = 0x00dddddd;
|
const QRgb BACKGROUND_1 = ::profiler::colors::Grey300;
|
||||||
const QRgb BACKGROUND_2 = 0x00ffffff;
|
const QRgb BACKGROUND_2 = ::profiler::colors::White;
|
||||||
const QRgb TIMELINE_BACKGROUND = 0x20303030;
|
const QRgb TIMELINE_BACKGROUND = 0x20000000 | (::profiler::colors::Grey800 & 0x00ffffff);// 0x20303030;
|
||||||
const QRgb SELECTED_ITEM_COLOR = 0x000050a0;
|
//const QRgb SELECTED_ITEM_COLOR = ::profiler::colors::Dark;// 0x000050a0;
|
||||||
const QColor CHRONOMETER_COLOR2 = QColor::fromRgba(0x40408040);
|
//const QRgb SELECTED_ITEM_BORDER_LIGHT = ::profiler::colors::RichRed;
|
||||||
|
const QRgb SELECTED_ITEM_BORDER_DARK = ::profiler::colors::Black;
|
||||||
|
const QColor CHRONOMETER_COLOR2 = QColor::fromRgba(0x40000000 | (::profiler::colors::Green700 & 0x00ffffff));// 0x40408040);
|
||||||
|
|
||||||
|
inline QRgb selectedItemBorderColor(::profiler::color_t _color)
|
||||||
|
{
|
||||||
|
//return ::profiler_gui::isLightColor(_color) ? SELECTED_ITEM_BORDER_DARK : SELECTED_ITEM_BORDER_LIGHT;
|
||||||
|
return SELECTED_ITEM_BORDER_DARK;
|
||||||
|
}
|
||||||
|
|
||||||
//const unsigned int TEST_PROGRESSION_BASE = 4;
|
//const unsigned int TEST_PROGRESSION_BASE = 4;
|
||||||
|
|
||||||
const int FLICKER_INTERVAL = 16; // 60Hz
|
const int FLICKER_INTERVAL = 16; // 60Hz
|
||||||
|
|
||||||
const auto CHRONOMETER_FONT = QFont("CourierNew", 18, 2);
|
const auto BG_FONT = QFont("CourierNew", 10, QFont::Bold);
|
||||||
const auto ITEMS_FONT = QFont("CourierNew", 10);// , 2);
|
const auto CHRONOMETER_FONT = QFont("CourierNew", 16, QFont::Bold);
|
||||||
|
const auto ITEMS_FONT = QFont("CourierNew", 10, QFont::Medium);
|
||||||
|
const auto SELECTED_ITEM_FONT = QFont("CourierNew", 10, QFont::Bold);
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -108,9 +118,10 @@ inline T logn(T _value)
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
EasyGraphicsItem::EasyGraphicsItem(uint8_t _index, const::profiler::BlocksTreeRoot* _root)
|
EasyGraphicsItem::EasyGraphicsItem(uint8_t _index, const::profiler::BlocksTreeRoot& _root)
|
||||||
: QGraphicsItem(nullptr)
|
: QGraphicsItem(nullptr)
|
||||||
, m_pRoot(_root)
|
, m_threadName(*_root.thread_name != 0 ? QString("%1 Thread %2").arg(_root.thread_name).arg(_root.thread_id) : QString("Thread %1").arg(_root.thread_id))
|
||||||
|
, m_pRoot(&_root)
|
||||||
, m_index(_index)
|
, m_index(_index)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -288,24 +299,9 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
|
|||||||
if (dh > 0)
|
if (dh > 0)
|
||||||
h -= dh;
|
h -= dh;
|
||||||
|
|
||||||
bool changepen = false;
|
|
||||||
if (item.block == EASY_GLOBALS.selected_block)
|
if (item.block == EASY_GLOBALS.selected_block)
|
||||||
{
|
|
||||||
selectedItemsWasPainted = true;
|
selectedItemsWasPainted = true;
|
||||||
changepen = true;
|
|
||||||
QPen pen(Qt::SolidLine);
|
|
||||||
pen.setColor(Qt::red);
|
|
||||||
pen.setWidth(2);
|
|
||||||
_painter->setPen(pen);
|
|
||||||
|
|
||||||
previousColor = SELECTED_ITEM_COLOR;
|
|
||||||
inverseColor = 0xffffffff - previousColor;
|
|
||||||
textColor = ::profiler_gui::textColorForRgb(previousColor);
|
|
||||||
brush.setColor(previousColor);
|
|
||||||
_painter->setBrush(brush);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const bool colorChange = (previousColor != item.color);
|
const bool colorChange = (previousColor != item.color);
|
||||||
if (colorChange)
|
if (colorChange)
|
||||||
{
|
{
|
||||||
@ -317,49 +313,18 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
|
|||||||
_painter->setBrush(brush);
|
_painter->setBrush(brush);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EASY_GLOBALS.draw_graphics_items_borders)
|
if (EASY_GLOBALS.draw_graphics_items_borders && (previousPenStyle != Qt::SolidLine || colorChange))
|
||||||
{
|
|
||||||
//if (w < 2)
|
|
||||||
//{
|
|
||||||
// // Do not paint borders for very narrow items
|
|
||||||
// if (previousPenStyle != Qt::NoPen)
|
|
||||||
// {
|
|
||||||
// previousPenStyle = Qt::NoPen;
|
|
||||||
// _painter->setPen(Qt::NoPen);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//else
|
|
||||||
if (previousPenStyle != Qt::SolidLine || colorChange)
|
|
||||||
{
|
{
|
||||||
// Restore pen for item which is wide enough to paint borders
|
// Restore pen for item which is wide enough to paint borders
|
||||||
previousPenStyle = Qt::SolidLine;
|
previousPenStyle = Qt::SolidLine;
|
||||||
_painter->setPen(BORDERS_COLOR & inverseColor);// BORDERS_COLOR);
|
_painter->setPen(BORDERS_COLOR & inverseColor);// BORDERS_COLOR);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (w < 2) w = 2;
|
if (w < 2) w = 2;
|
||||||
//if (w < 2 && !changepen)
|
|
||||||
//{
|
|
||||||
// // Draw line
|
|
||||||
// changepen = true;
|
|
||||||
// _painter->setPen(previousColor);
|
|
||||||
// _painter->drawLine(QPointF(x, top), QPointF(x, top + h));
|
|
||||||
//}
|
|
||||||
//else
|
|
||||||
{
|
|
||||||
// Draw rectangle
|
// Draw rectangle
|
||||||
rect.setRect(x, top, w, h);
|
rect.setRect(x, top, w, h);
|
||||||
_painter->drawRect(rect);
|
_painter->drawRect(rect);
|
||||||
}
|
|
||||||
|
|
||||||
if (changepen)
|
|
||||||
{
|
|
||||||
if (previousPenStyle == Qt::NoPen)
|
|
||||||
_painter->setPen(Qt::NoPen);
|
|
||||||
else
|
|
||||||
_painter->setPen(BORDERS_COLOR & inverseColor);// BORDERS_COLOR); // restore pen for rectangle painting
|
|
||||||
}
|
|
||||||
|
|
||||||
prevRight = rect.right();
|
prevRight = rect.right();
|
||||||
skip_children(next_level, item.children_begin);
|
skip_children(next_level, item.children_begin);
|
||||||
@ -386,21 +351,8 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (item.block == EASY_GLOBALS.selected_block)
|
if (item.block == EASY_GLOBALS.selected_block)
|
||||||
{
|
|
||||||
selectedItemsWasPainted = true;
|
selectedItemsWasPainted = true;
|
||||||
QPen pen(Qt::SolidLine);
|
|
||||||
pen.setColor(Qt::red);
|
|
||||||
pen.setWidth(2);
|
|
||||||
_painter->setPen(pen);
|
|
||||||
|
|
||||||
previousColor = SELECTED_ITEM_COLOR;
|
|
||||||
inverseColor = 0xffffffff - previousColor;
|
|
||||||
textColor = ::profiler_gui::textColorForRgb(previousColor);
|
|
||||||
brush.setColor(previousColor);
|
|
||||||
_painter->setBrush(brush);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const bool colorChange = (previousColor != item.color);
|
const bool colorChange = (previousColor != item.color);
|
||||||
if (colorChange)
|
if (colorChange)
|
||||||
{
|
{
|
||||||
@ -418,7 +370,6 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
|
|||||||
previousPenStyle = Qt::SolidLine;
|
previousPenStyle = Qt::SolidLine;
|
||||||
_painter->setPen(BORDERS_COLOR & inverseColor);// BORDERS_COLOR);
|
_painter->setPen(BORDERS_COLOR & inverseColor);// BORDERS_COLOR);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Draw rectangle
|
// Draw rectangle
|
||||||
//x = item.left() * currentScale - dx;
|
//x = item.left() * currentScale - dx;
|
||||||
@ -459,6 +410,9 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
|
|||||||
//if (textColor == previousColor) textColor = 0;
|
//if (textColor == previousColor) textColor = 0;
|
||||||
_painter->setPen(QColor::fromRgb(textColor));
|
_painter->setPen(QColor::fromRgb(textColor));
|
||||||
|
|
||||||
|
if (item.block == EASY_GLOBALS.selected_block)
|
||||||
|
_painter->setFont(SELECTED_ITEM_FONT);
|
||||||
|
|
||||||
// drawing text
|
// drawing text
|
||||||
auto name = *itemBlock.tree.node->name() != 0 ? itemBlock.tree.node->name() : easyDescriptor(itemBlock.tree.node->id()).name();
|
auto name = *itemBlock.tree.node->name() != 0 ? itemBlock.tree.node->name() : easyDescriptor(itemBlock.tree.node->id()).name();
|
||||||
_painter->drawText(rect, flags, ::profiler_gui::toUnicode(name));
|
_painter->drawText(rect, flags, ::profiler_gui::toUnicode(name));
|
||||||
@ -468,11 +422,15 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
|
|||||||
_painter->setPen(Qt::NoPen);
|
_painter->setPen(Qt::NoPen);
|
||||||
else
|
else
|
||||||
_painter->setPen(BORDERS_COLOR & inverseColor);// BORDERS_COLOR); // restore pen for rectangle painting
|
_painter->setPen(BORDERS_COLOR & inverseColor);// BORDERS_COLOR); // restore pen for rectangle painting
|
||||||
|
|
||||||
|
// restore font
|
||||||
|
if (item.block == EASY_GLOBALS.selected_block)
|
||||||
|
_painter->setFont(ITEMS_FONT);
|
||||||
// END Draw text~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// END Draw text~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!selectedItemsWasPainted && EASY_GLOBALS.selected_block < EASY_GLOBALS.gui_blocks.size())
|
if (EASY_GLOBALS.selected_block < EASY_GLOBALS.gui_blocks.size())
|
||||||
{
|
{
|
||||||
const auto& guiblock = EASY_GLOBALS.gui_blocks[EASY_GLOBALS.selected_block];
|
const auto& guiblock = EASY_GLOBALS.gui_blocks[EASY_GLOBALS.selected_block];
|
||||||
if (guiblock.graphics_item == m_index)
|
if (guiblock.graphics_item == m_index)
|
||||||
@ -481,7 +439,8 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
|
|||||||
if (item.left() < sceneRight && item.right() > sceneLeft)
|
if (item.left() < sceneRight && item.right() > sceneLeft)
|
||||||
{
|
{
|
||||||
auto top = levelY(guiblock.graphics_item_level);
|
auto top = levelY(guiblock.graphics_item_level);
|
||||||
decltype(top) h = item.totalHeight;
|
auto w = ::std::max(item.width() * currentScale, 1.0);
|
||||||
|
decltype(top) h = (selectedItemsWasPainted && easyBlock(item.block).expanded && w > 20) ? GRAPHICS_ROW_SIZE : item.totalHeight;
|
||||||
|
|
||||||
auto dh = top + h - visibleBottom;
|
auto dh = top + h - visibleBottom;
|
||||||
if (dh < h)
|
if (dh < h)
|
||||||
@ -490,19 +449,26 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
|
|||||||
h -= dh;
|
h -= dh;
|
||||||
|
|
||||||
QPen pen(Qt::SolidLine);
|
QPen pen(Qt::SolidLine);
|
||||||
pen.setColor(Qt::red);
|
pen.setJoinStyle(Qt::MiterJoin);
|
||||||
pen.setWidth(2);
|
pen.setColor(selectedItemBorderColor(item.color));//Qt::red);
|
||||||
|
pen.setWidth(3);
|
||||||
_painter->setPen(pen);
|
_painter->setPen(pen);
|
||||||
|
|
||||||
brush.setColor(SELECTED_ITEM_COLOR);
|
if (!selectedItemsWasPainted)
|
||||||
|
{
|
||||||
|
brush.setColor(item.color);// SELECTED_ITEM_COLOR);
|
||||||
_painter->setBrush(brush);
|
_painter->setBrush(brush);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_painter->setBrush(Qt::NoBrush);
|
||||||
|
}
|
||||||
|
|
||||||
auto x = item.left() * currentScale - dx;
|
auto x = item.left() * currentScale - dx;
|
||||||
auto w = ::std::max(item.width() * currentScale, 1.0);
|
|
||||||
rect.setRect(x, top, w, h);
|
rect.setRect(x, top, w, h);
|
||||||
_painter->drawRect(rect);
|
_painter->drawRect(rect);
|
||||||
|
|
||||||
if (w > 20)
|
if (!selectedItemsWasPainted && w > 20)
|
||||||
{
|
{
|
||||||
// Draw text-----------------------------------
|
// Draw text-----------------------------------
|
||||||
// calculating text coordinates
|
// calculating text coordinates
|
||||||
@ -525,9 +491,11 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
|
|||||||
// text will be painted with inverse color
|
// text will be painted with inverse color
|
||||||
//auto textColor = 0x00ffffff - previousColor;
|
//auto textColor = 0x00ffffff - previousColor;
|
||||||
//if (textColor == previousColor) textColor = 0;
|
//if (textColor == previousColor) textColor = 0;
|
||||||
textColor = ::profiler_gui::textColorForRgb(SELECTED_ITEM_COLOR);
|
textColor = ::profiler_gui::textColorForRgb(item.color);// SELECTED_ITEM_COLOR);
|
||||||
_painter->setPen(textColor);
|
_painter->setPen(textColor);
|
||||||
|
|
||||||
|
_painter->setFont(SELECTED_ITEM_FONT);
|
||||||
|
|
||||||
// drawing text
|
// drawing text
|
||||||
const auto& itemBlock = easyBlock(item.block);
|
const auto& itemBlock = easyBlock(item.block);
|
||||||
auto name = *itemBlock.tree.node->name() != 0 ? itemBlock.tree.node->name() : easyDescriptor(itemBlock.tree.node->id()).name();
|
auto name = *itemBlock.tree.node->name() != 0 ? itemBlock.tree.node->name() : easyDescriptor(itemBlock.tree.node->id()).name();
|
||||||
@ -543,8 +511,8 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
|
|||||||
#ifdef EASY_STORE_CSWITCH_SEPARATELY
|
#ifdef EASY_STORE_CSWITCH_SEPARATELY
|
||||||
if (!m_pRoot->sync.empty())
|
if (!m_pRoot->sync.empty())
|
||||||
{
|
{
|
||||||
_painter->setBrush(QColor::fromRgba(0xfffe6030));
|
_painter->setBrush(QColor::fromRgb(::profiler::colors::Coral));// 0xfffe6030));
|
||||||
_painter->setPen(QColor::fromRgb(0x00505050));
|
_painter->setPen(QColor::fromRgb(::profiler::colors::Grey800));// 0x00505050));
|
||||||
|
|
||||||
qreal prevRight = -1e100, top = y() - 4, h = 3;
|
qreal prevRight = -1e100, top = y() - 4, h = 3;
|
||||||
if (top + h < visibleBottom)
|
if (top + h < visibleBottom)
|
||||||
@ -593,6 +561,18 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
const ::profiler::BlocksTreeRoot* EasyGraphicsItem::root() const
|
||||||
|
{
|
||||||
|
return m_pRoot;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString& EasyGraphicsItem::threadName() const
|
||||||
|
{
|
||||||
|
return m_threadName;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
QRect EasyGraphicsItem::getRect() const
|
QRect EasyGraphicsItem::getRect() const
|
||||||
{
|
{
|
||||||
return view()->mapFromScene(m_boundingRect).boundingRect();
|
return view()->mapFromScene(m_boundingRect).boundingRect();
|
||||||
@ -1454,20 +1434,18 @@ void EasyGraphicsView::setTree(const ::profiler::thread_blocks_tree_t& _blocksTr
|
|||||||
|
|
||||||
// Calculating start and end time
|
// Calculating start and end time
|
||||||
::profiler::timestamp_t finish = 0;
|
::profiler::timestamp_t finish = 0;
|
||||||
::profiler::thread_id_t longestTree = 0;
|
::profiler::thread_id_t longestTree = 0, mainTree = 0;
|
||||||
const EasyGraphicsItem* longestItem = nullptr;
|
|
||||||
const EasyGraphicsItem* mainThreadItem = nullptr;
|
|
||||||
for (const auto& threadTree : _blocksTree)
|
for (const auto& threadTree : _blocksTree)
|
||||||
{
|
{
|
||||||
const auto& tree = threadTree.second.children;
|
const auto& t = threadTree.second;
|
||||||
auto timestart = blocksTree(tree.front()).node->begin();
|
auto timestart = blocksTree(t.children.front()).node->begin();
|
||||||
|
|
||||||
#ifdef EASY_STORE_CSWITCH_SEPARATELY
|
#ifdef EASY_STORE_CSWITCH_SEPARATELY
|
||||||
if (!threadTree.second.sync.empty())
|
if (!t.sync.empty())
|
||||||
timestart = ::std::min(timestart, blocksTree(threadTree.second.sync.front()).node->begin());
|
timestart = ::std::min(timestart, blocksTree(t.sync.front()).node->begin());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const auto timefinish = blocksTree(tree.back()).node->end();
|
const auto timefinish = blocksTree(t.children.back()).node->end();
|
||||||
|
|
||||||
if (m_beginTime > timestart)
|
if (m_beginTime > timestart)
|
||||||
{
|
{
|
||||||
@ -1479,11 +1457,17 @@ void EasyGraphicsView::setTree(const ::profiler::thread_blocks_tree_t& _blocksTr
|
|||||||
finish = timefinish;
|
finish = timefinish;
|
||||||
longestTree = threadTree.first;
|
longestTree = threadTree.first;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mainTree == 0 && !strcmp(t.thread_name, "Main"))
|
||||||
|
{
|
||||||
|
mainTree = threadTree.first;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filling scene with items
|
// Filling scene with items
|
||||||
m_items.reserve(_blocksTree.size());
|
m_items.reserve(_blocksTree.size());
|
||||||
qreal y = TIMELINE_ROW_SIZE;
|
qreal y = TIMELINE_ROW_SIZE;
|
||||||
|
const EasyGraphicsItem *longestItem = nullptr, *mainThreadItem = nullptr;
|
||||||
for (const auto& threadTree : _blocksTree)
|
for (const auto& threadTree : _blocksTree)
|
||||||
{
|
{
|
||||||
if (m_items.size() == 0xff)
|
if (m_items.size() == 0xff)
|
||||||
@ -1492,11 +1476,13 @@ void EasyGraphicsView::setTree(const ::profiler::thread_blocks_tree_t& _blocksTr
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto& t = threadTree.second;
|
||||||
|
|
||||||
// fill scene with new items
|
// fill scene with new items
|
||||||
const auto& tree = threadTree.second.children;
|
const auto& tree = t.children;
|
||||||
qreal h = 0, x = time2position(blocksTree(tree.front()).node->begin());
|
qreal h = 0, x = time2position(blocksTree(tree.front()).node->begin());
|
||||||
auto item = new EasyGraphicsItem(static_cast<uint8_t>(m_items.size()), &threadTree.second);
|
auto item = new EasyGraphicsItem(static_cast<uint8_t>(m_items.size()), t);
|
||||||
item->setLevels(threadTree.second.depth);
|
item->setLevels(t.depth);
|
||||||
item->setPos(0, y);
|
item->setPos(0, y);
|
||||||
|
|
||||||
const auto children_duration = setTree(item, tree, h, y, 0);
|
const auto children_duration = setTree(item, tree, h, y, 0);
|
||||||
@ -1510,7 +1496,7 @@ void EasyGraphicsView::setTree(const ::profiler::thread_blocks_tree_t& _blocksTr
|
|||||||
if (longestTree == threadTree.first)
|
if (longestTree == threadTree.first)
|
||||||
longestItem = item;
|
longestItem = item;
|
||||||
|
|
||||||
if (mainThreadItem == nullptr && !strcmp(threadTree.second.thread_name, "Main"))
|
if (mainTree == threadTree.first)
|
||||||
mainThreadItem = item;
|
mainThreadItem = item;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1524,16 +1510,6 @@ void EasyGraphicsView::setTree(const ::profiler::thread_blocks_tree_t& _blocksTr
|
|||||||
updateVisibleSceneRect();
|
updateVisibleSceneRect();
|
||||||
setScrollbar(m_pScrollbar);
|
setScrollbar(m_pScrollbar);
|
||||||
|
|
||||||
if (mainThreadItem != nullptr)
|
|
||||||
longestItem = mainThreadItem;
|
|
||||||
|
|
||||||
if (longestItem != nullptr)
|
|
||||||
{
|
|
||||||
m_pScrollbar->setMinimapFrom(longestItem->threadId(), longestItem->items(0));
|
|
||||||
EASY_GLOBALS.selected_thread = longestItem->threadId();
|
|
||||||
emit EASY_GLOBALS.events.selectedThreadChanged(longestItem->threadId());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create new chronometer item (previous item was destroyed by scene on scene()->clear()).
|
// Create new chronometer item (previous item was destroyed by scene on scene()->clear()).
|
||||||
// It will be shown on mouse right button click.
|
// It will be shown on mouse right button click.
|
||||||
m_chronometerItemAux = createChronometer(false);
|
m_chronometerItemAux = createChronometer(false);
|
||||||
@ -1549,6 +1525,19 @@ void EasyGraphicsView::setTree(const ::profiler::thread_blocks_tree_t& _blocksTr
|
|||||||
m_bEmpty = false;
|
m_bEmpty = false;
|
||||||
|
|
||||||
scaleTo(BASE_SCALE);
|
scaleTo(BASE_SCALE);
|
||||||
|
|
||||||
|
|
||||||
|
emit treeChanged();
|
||||||
|
|
||||||
|
if (mainThreadItem != nullptr)
|
||||||
|
longestItem = mainThreadItem;
|
||||||
|
|
||||||
|
if (longestItem != nullptr)
|
||||||
|
{
|
||||||
|
m_pScrollbar->setMinimapFrom(longestItem->threadId(), longestItem->items(0));
|
||||||
|
EASY_GLOBALS.selected_thread = longestItem->threadId();
|
||||||
|
emit EASY_GLOBALS.events.selectedThreadChanged(longestItem->threadId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const EasyGraphicsView::Items &EasyGraphicsView::getItems() const
|
const EasyGraphicsView::Items &EasyGraphicsView::getItems() const
|
||||||
@ -1910,6 +1899,8 @@ void EasyGraphicsView::mouseReleaseEvent(QMouseEvent* _event)
|
|||||||
|
|
||||||
//clicked = true;
|
//clicked = true;
|
||||||
auto mouseClickPos = mapToScene(m_mousePressPos);
|
auto mouseClickPos = mapToScene(m_mousePressPos);
|
||||||
|
if (mouseClickPos.x() >= 0)
|
||||||
|
{
|
||||||
mouseClickPos.setX(m_offset + mouseClickPos.x() / m_scale);
|
mouseClickPos.setX(m_offset + mouseClickPos.x() / m_scale);
|
||||||
|
|
||||||
// Try to select one of item blocks
|
// Try to select one of item blocks
|
||||||
@ -1932,6 +1923,7 @@ void EasyGraphicsView::mouseReleaseEvent(QMouseEvent* _event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_bDoubleClick = false;
|
m_bDoubleClick = false;
|
||||||
m_mouseButtons = _event->buttons();
|
m_mouseButtons = _event->buttons();
|
||||||
@ -2019,10 +2011,11 @@ void EasyGraphicsView::mouseMoveEvent(QMouseEvent* _event)
|
|||||||
|
|
||||||
auto mouseScenePos = mapToScene(m_mousePressPos);
|
auto mouseScenePos = mapToScene(m_mousePressPos);
|
||||||
mouseScenePos.setX(m_offset + mouseScenePos.x() / m_scale);
|
mouseScenePos.setX(m_offset + mouseScenePos.x() / m_scale);
|
||||||
|
const auto x = clamp(0., mouseScenePos.x(), sceneRect().width());
|
||||||
|
|
||||||
if (m_mouseButtons & Qt::RightButton)
|
if (m_mouseButtons & Qt::RightButton)
|
||||||
{
|
{
|
||||||
bool showItem = moveChrono(m_chronometerItem, mouseScenePos.x());
|
bool showItem = moveChrono(m_chronometerItem, x);
|
||||||
m_pScrollbar->setChronoPos(m_chronometerItem->left(), m_chronometerItem->right());
|
m_pScrollbar->setChronoPos(m_chronometerItem->left(), m_chronometerItem->right());
|
||||||
|
|
||||||
if (showItem)
|
if (showItem)
|
||||||
@ -2037,7 +2030,7 @@ void EasyGraphicsView::mouseMoveEvent(QMouseEvent* _event)
|
|||||||
{
|
{
|
||||||
if (m_bDoubleClick)
|
if (m_bDoubleClick)
|
||||||
{
|
{
|
||||||
moveChrono(m_chronometerItemAux, mouseScenePos.x());
|
moveChrono(m_chronometerItemAux, x);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2243,9 +2236,9 @@ void EasyGraphicsView::onItemsEspandStateChange()
|
|||||||
|
|
||||||
EasyGraphicsViewWidget::EasyGraphicsViewWidget(QWidget* _parent)
|
EasyGraphicsViewWidget::EasyGraphicsViewWidget(QWidget* _parent)
|
||||||
: QWidget(_parent)
|
: QWidget(_parent)
|
||||||
, m_scrollbar(new EasyGraphicsScrollbar(nullptr))
|
, m_scrollbar(new EasyGraphicsScrollbar(this))
|
||||||
, m_view(new EasyGraphicsView(nullptr))
|
, m_view(new EasyGraphicsView(this))
|
||||||
//, m_threadWidget(new EasyThreadViewWidget(this,m_view))
|
, m_threadNamesWidget(new EasyThreadNamesWidget(m_view, this))
|
||||||
{
|
{
|
||||||
initWidget();
|
initWidget();
|
||||||
}
|
}
|
||||||
@ -2254,11 +2247,11 @@ void EasyGraphicsViewWidget::initWidget()
|
|||||||
{
|
{
|
||||||
auto lay = new QGridLayout(this);
|
auto lay = new QGridLayout(this);
|
||||||
lay->setContentsMargins(1, 0, 1, 0);
|
lay->setContentsMargins(1, 0, 1, 0);
|
||||||
|
lay->addWidget(m_threadNamesWidget, 0, 0);
|
||||||
|
lay->setSpacing(1);
|
||||||
lay->addWidget(m_view, 0, 1);
|
lay->addWidget(m_view, 0, 1);
|
||||||
lay->setSpacing(1);
|
lay->setSpacing(1);
|
||||||
lay->addWidget(m_scrollbar, 1, 1);
|
lay->addWidget(m_scrollbar, 1, 1);
|
||||||
//lay->setSpacing(1);
|
|
||||||
//lay->addWidget(m_threadWidget, 0, 0);
|
|
||||||
setLayout(lay);
|
setLayout(lay);
|
||||||
|
|
||||||
m_view->setScrollbar(m_scrollbar);
|
m_view->setScrollbar(m_scrollbar);
|
||||||
@ -2277,47 +2270,186 @@ EasyGraphicsView* EasyGraphicsViewWidget::view()
|
|||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
EasyThreadViewWidget::EasyThreadViewWidget(QWidget *parent, EasyGraphicsView* view):QWidget(parent),
|
EasyThreadNameItem::EasyThreadNameItem() : QGraphicsItem(nullptr)
|
||||||
m_view(view)
|
|
||||||
, m_label(new QLabel("",this))
|
|
||||||
{
|
|
||||||
m_layout = new QHBoxLayout;
|
|
||||||
//QPushButton *button1 = new QPushButton();
|
|
||||||
|
|
||||||
//m_layout->addWidget(m_label);
|
|
||||||
//setLayout(m_layout);
|
|
||||||
//show();
|
|
||||||
connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::selectedThreadChanged, this, &This::onSelectedThreadChange);
|
|
||||||
}
|
|
||||||
|
|
||||||
EasyThreadViewWidget::~EasyThreadViewWidget()
|
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EasyThreadViewWidget::onSelectedThreadChange(::profiler::thread_id_t _id)
|
EasyThreadNameItem::~EasyThreadNameItem()
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
auto threadName = EASY_GLOBALS.profiler_blocks[EASY_GLOBALS.selected_thread].thread_name;
|
|
||||||
if(threadName[0]!=0)
|
|
||||||
{
|
|
||||||
m_label->setText(threadName);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QRectF EasyThreadNameItem::boundingRect() const
|
||||||
|
{
|
||||||
|
return m_boundingRect;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EasyThreadNameItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*, QWidget*)
|
||||||
|
{
|
||||||
|
const auto view = static_cast<const EasyThreadNamesWidget*>(scene()->parent())->view();
|
||||||
|
const auto& items = view->getItems();
|
||||||
|
if (items.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
const auto visibleSceneRect = view->visibleSceneRect();
|
||||||
|
const auto h = visibleSceneRect.height() + TIMELINE_ROW_SIZE;
|
||||||
|
const auto w = scene()->sceneRect().width();
|
||||||
|
|
||||||
|
static const auto OVERLAP = THREADS_ROW_SPACING >> 1;
|
||||||
|
static const QBrush brushes[2] = {QColor::fromRgb(BACKGROUND_1), QColor::fromRgb(BACKGROUND_2)};
|
||||||
|
int i = -1;
|
||||||
|
|
||||||
|
QRectF rect;
|
||||||
|
|
||||||
|
_painter->resetTransform();
|
||||||
|
_painter->setFont(BG_FONT);
|
||||||
|
|
||||||
|
for (auto item : items)
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
|
||||||
|
auto br = item->boundingRect();
|
||||||
|
auto top = item->y() + br.top() - visibleSceneRect.top() - OVERLAP;
|
||||||
|
auto hgt = br.height() + THREADS_ROW_SPACING;
|
||||||
|
auto bottom = top + hgt;
|
||||||
|
|
||||||
|
if (top > h || bottom < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (item->threadId() == EASY_GLOBALS.selected_thread)
|
||||||
|
_painter->setBrush(QBrush(QColor::fromRgb(::profiler_gui::SELECTED_THREAD_BACKGROUND)));
|
||||||
else
|
else
|
||||||
{
|
_painter->setBrush(brushes[i & 1]);
|
||||||
m_label->setText(QString("Thread %1").arg(EASY_GLOBALS.selected_thread));
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
QLayoutItem *ditem;
|
|
||||||
while ((ditem = m_layout->takeAt(0)))
|
|
||||||
delete ditem;
|
|
||||||
|
|
||||||
|
const auto dh = rect.bottom() - h;
|
||||||
|
if (dh > 0) hgt -= dh;
|
||||||
|
if (top < 0) { hgt += top; top = 0; }
|
||||||
|
rect.setRect(0, top, w, hgt);
|
||||||
|
|
||||||
|
_painter->setPen(Qt::NoPen);
|
||||||
|
_painter->drawRect(rect);
|
||||||
|
|
||||||
|
rect.translate(-5, 0);
|
||||||
|
_painter->setPen(QColor::fromRgb(::profiler::colors::Dark));
|
||||||
|
_painter->drawText(rect, Qt::AlignRight | Qt::AlignVCenter, item->threadName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EasyThreadNameItem::setBoundingRect(const QRectF& _rect)
|
||||||
|
{
|
||||||
|
m_boundingRect = _rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
EasyThreadNamesWidget::EasyThreadNamesWidget(EasyGraphicsView* _view, QWidget* _parent) : Parent(_parent)
|
||||||
|
, m_view(_view)
|
||||||
|
{
|
||||||
|
setScene(new QGraphicsScene(this));
|
||||||
|
|
||||||
|
setCacheMode(QGraphicsView::CacheNone);
|
||||||
|
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
|
||||||
|
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
|
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
|
setFixedWidth(100);
|
||||||
|
|
||||||
|
connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::selectedThreadChanged, this, &This::onSelectedThreadChange);
|
||||||
|
connect(m_view, &EasyGraphicsView::treeChanged, this, &This::onTreeChange);
|
||||||
|
connect(m_view->verticalScrollBar(), &QScrollBar::valueChanged, verticalScrollBar(), &QScrollBar::setValue);
|
||||||
|
connect(m_view->verticalScrollBar(), &QScrollBar::rangeChanged, verticalScrollBar(), &QScrollBar::setRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
EasyThreadNamesWidget::~EasyThreadNamesWidget()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void EasyThreadNamesWidget::onTreeChange()
|
||||||
|
{
|
||||||
|
QSignalBlocker b(this);
|
||||||
|
scene()->clear();
|
||||||
|
|
||||||
|
QFontMetricsF fm(BG_FONT);
|
||||||
|
qreal maxLength = 0;
|
||||||
|
const auto& graphicsItems = m_view->getItems();
|
||||||
|
for (auto graphicsItem : graphicsItems)
|
||||||
|
maxLength = ::std::max(maxLength, fm.boundingRect(graphicsItem->threadName()).width());
|
||||||
|
|
||||||
|
auto vbar = verticalScrollBar();
|
||||||
|
auto viewBar = m_view->verticalScrollBar();
|
||||||
|
|
||||||
|
vbar->setRange(viewBar->minimum(), viewBar->maximum());
|
||||||
|
vbar->setSingleStep(viewBar->singleStep());
|
||||||
|
vbar->setPageStep(viewBar->pageStep());
|
||||||
|
|
||||||
|
auto r = m_view->sceneRect();
|
||||||
|
setSceneRect(0, r.top(), maxLength, r.height());
|
||||||
|
|
||||||
|
auto item = new EasyThreadNameItem();
|
||||||
|
item->setPos(0, 0);
|
||||||
|
item->setBoundingRect(sceneRect());
|
||||||
|
scene()->addItem(item);
|
||||||
|
|
||||||
|
b.unblock();
|
||||||
|
setFixedWidth(maxLength);
|
||||||
|
scene()->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EasyThreadNamesWidget::onSelectedThreadChange(::profiler::thread_id_t)
|
||||||
|
{
|
||||||
|
scene()->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EasyThreadNamesWidget::mousePressEvent(QMouseEvent* _event)
|
||||||
|
{
|
||||||
|
QMouseEvent e(_event->type(), _event->pos() - QPointF(sceneRect().width(), 0), _event->button(), _event->buttons() & ~Qt::RightButton, _event->modifiers());
|
||||||
|
m_view->mousePressEvent(&e);
|
||||||
|
_event->accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EasyThreadNamesWidget::mouseDoubleClickEvent(QMouseEvent* _event)
|
||||||
|
{
|
||||||
|
static const auto OVERLAP = THREADS_ROW_SPACING >> 1;
|
||||||
|
|
||||||
|
auto y = mapToScene(_event->pos()).y();
|
||||||
const auto& items = m_view->getItems();
|
const auto& items = m_view->getItems();
|
||||||
for(const auto& item: items)
|
for (auto item : items)
|
||||||
{
|
{
|
||||||
m_layout->addWidget(new QLabel(QString("Thread %1").arg(item->threadId())));
|
auto br = item->boundingRect();
|
||||||
m_layout->setSpacing(1);
|
auto top = item->y() + br.top() - OVERLAP;
|
||||||
}
|
auto bottom = top + br.height() + OVERLAP;
|
||||||
setLayout(m_layout);
|
|
||||||
|
|
||||||
|
if (y < top || y > bottom)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const auto thread_id = item->threadId();
|
||||||
|
if (thread_id != EASY_GLOBALS.selected_thread)
|
||||||
|
{
|
||||||
|
EASY_GLOBALS.selected_thread = thread_id;
|
||||||
|
emit EASY_GLOBALS.events.selectedThreadChanged(thread_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
_event->accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EasyThreadNamesWidget::mouseReleaseEvent(QMouseEvent* _event)
|
||||||
|
{
|
||||||
|
QMouseEvent e(_event->type(), _event->pos() - QPointF(sceneRect().width(), 0), _event->button(), _event->buttons() & ~Qt::RightButton, _event->modifiers());
|
||||||
|
m_view->mouseReleaseEvent(&e);
|
||||||
|
_event->accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EasyThreadNamesWidget::mouseMoveEvent(QMouseEvent* _event)
|
||||||
|
{
|
||||||
|
QMouseEvent e(_event->type(), _event->pos() - QPointF(sceneRect().width(), 0), _event->button(), _event->buttons() & ~Qt::RightButton, _event->modifiers());
|
||||||
|
m_view->mouseMoveEvent(&e);
|
||||||
|
_event->accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@ -79,12 +79,13 @@ class EasyGraphicsItem : public QGraphicsItem
|
|||||||
Sublevels m_levels; ///< Arrays of items for each level
|
Sublevels m_levels; ///< Arrays of items for each level
|
||||||
|
|
||||||
QRectF m_boundingRect; ///< boundingRect (see QGraphicsItem)
|
QRectF m_boundingRect; ///< boundingRect (see QGraphicsItem)
|
||||||
|
QString m_threadName; ///<
|
||||||
const ::profiler::BlocksTreeRoot* m_pRoot; ///< Pointer to the root profiler block (thread block). Used by ProfTreeWidget to restore hierarchy.
|
const ::profiler::BlocksTreeRoot* m_pRoot; ///< Pointer to the root profiler block (thread block). Used by ProfTreeWidget to restore hierarchy.
|
||||||
uint8_t m_index; ///< This item's index in the list of items of EasyGraphicsView
|
uint8_t m_index; ///< This item's index in the list of items of EasyGraphicsView
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
EasyGraphicsItem(uint8_t _index, const::profiler::BlocksTreeRoot* _root);
|
explicit EasyGraphicsItem(uint8_t _index, const::profiler::BlocksTreeRoot& _root);
|
||||||
virtual ~EasyGraphicsItem();
|
virtual ~EasyGraphicsItem();
|
||||||
|
|
||||||
// Public virtual methods
|
// Public virtual methods
|
||||||
@ -97,6 +98,9 @@ public:
|
|||||||
|
|
||||||
// Public non-virtual methods
|
// Public non-virtual methods
|
||||||
|
|
||||||
|
const ::profiler::BlocksTreeRoot* root() const;
|
||||||
|
const QString& threadName() const;
|
||||||
|
|
||||||
QRect getRect() const;
|
QRect getRect() const;
|
||||||
|
|
||||||
void setBoundingRect(qreal x, qreal y, qreal w, qreal h);
|
void setBoundingRect(qreal x, qreal y, qreal w, qreal h);
|
||||||
@ -324,6 +328,7 @@ signals:
|
|||||||
|
|
||||||
// Signals
|
// Signals
|
||||||
|
|
||||||
|
void treeChanged();
|
||||||
void intervalChanged(const ::profiler_gui::TreeBlocks& _blocks, ::profiler::timestamp_t _session_begin_time, ::profiler::timestamp_t _left, ::profiler::timestamp_t _right, bool _strict);
|
void intervalChanged(const ::profiler_gui::TreeBlocks& _blocks, ::profiler::timestamp_t _session_begin_time, ::profiler::timestamp_t _left, ::profiler::timestamp_t _right, bool _strict);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -396,23 +401,62 @@ public:
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class EasyThreadViewWidget : public QWidget
|
class EasyThreadNameItem : public QGraphicsItem
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
QRectF m_boundingRect; ///< boundingRect (see QGraphicsItem)
|
||||||
private:
|
|
||||||
EasyGraphicsView* m_view;
|
|
||||||
QLabel* m_label;
|
|
||||||
typedef EasyThreadViewWidget This;
|
|
||||||
|
|
||||||
QHBoxLayout *m_layout;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EasyThreadViewWidget(QWidget *parent, EasyGraphicsView* view);
|
|
||||||
virtual ~EasyThreadViewWidget();
|
explicit EasyThreadNameItem();
|
||||||
public slots:
|
virtual ~EasyThreadNameItem();
|
||||||
void onSelectedThreadChange(::profiler::thread_id_t _id);
|
|
||||||
|
// Public virtual methods
|
||||||
|
|
||||||
|
QRectF boundingRect() const override;
|
||||||
|
|
||||||
|
void paint(QPainter* _painter, const QStyleOptionGraphicsItem* _option, QWidget* _widget = nullptr) override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Public non-virtual methods
|
||||||
|
|
||||||
|
void setBoundingRect(const QRectF& _rect);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class EasyThreadNamesWidget : public QGraphicsView
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
typedef QGraphicsView Parent;
|
||||||
|
typedef EasyThreadNamesWidget This;
|
||||||
|
|
||||||
|
EasyGraphicsView* m_view;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
explicit EasyThreadNamesWidget(EasyGraphicsView* _view, QWidget* _parent = nullptr);
|
||||||
|
virtual ~EasyThreadNamesWidget();
|
||||||
|
|
||||||
|
void mousePressEvent(QMouseEvent* _event) override;
|
||||||
|
void mouseDoubleClickEvent(QMouseEvent* _event) override;
|
||||||
|
void mouseReleaseEvent(QMouseEvent* _event) override;
|
||||||
|
void mouseMoveEvent(QMouseEvent* _event) override;
|
||||||
|
|
||||||
|
const EasyGraphicsView* view() const
|
||||||
|
{
|
||||||
|
return m_view;
|
||||||
|
}
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void onTreeChange();
|
||||||
|
void onSelectedThreadChange(::profiler::thread_id_t _id);
|
||||||
|
|
||||||
|
}; // END of class EasyThreadNamesWidget.
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class EasyGraphicsViewWidget : public QWidget
|
class EasyGraphicsViewWidget : public QWidget
|
||||||
@ -421,9 +465,9 @@ class EasyGraphicsViewWidget : public QWidget
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
EasyGraphicsView* m_view;
|
|
||||||
EasyGraphicsScrollbar* m_scrollbar;
|
EasyGraphicsScrollbar* m_scrollbar;
|
||||||
//EasyThreadViewWidget* m_threadWidget;
|
EasyGraphicsView* m_view;
|
||||||
|
EasyThreadNamesWidget* m_threadNamesWidget;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -113,10 +113,15 @@ inline QRgb fromProfilerRgb(uint32_t _red, uint32_t _green, uint32_t _blue)
|
|||||||
return toRgb(_red, _green, _blue) | 0x00141414;
|
return toRgb(_red, _green, _blue) | 0x00141414;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline ::profiler::color_t textColorForRgb(::profiler::color_t _color)
|
inline bool isLightColor(::profiler::color_t _color)
|
||||||
{
|
{
|
||||||
const auto sum = 255. - (((_color & 0x00ff0000) >> 16) * 0.299 + ((_color & 0x0000ff00) >> 8) * 0.587 + (_color & 0x000000ff) * 0.114);
|
const auto sum = 255. - (((_color & 0x00ff0000) >> 16) * 0.299 + ((_color & 0x0000ff00) >> 8) * 0.587 + (_color & 0x000000ff) * 0.114);
|
||||||
return sum < 76.5 || ((_color & 0xff000000) >> 24) < 0x80 ? ::profiler::colors::Dark : ::profiler::colors::CreamWhite;
|
return sum < 76.5 || ((_color & 0xff000000) >> 24) < 0x80;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline ::profiler::color_t textColorForRgb(::profiler::color_t _color)
|
||||||
|
{
|
||||||
|
return isLightColor(_color) ? ::profiler::colors::Dark : ::profiler::colors::CreamWhite;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -546,7 +546,7 @@ void EasyGraphicsScrollbar::onThreadActionClicked(bool)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
const auto thread_id = action->data().toUInt();
|
const auto thread_id = action->data().toUInt();
|
||||||
if (thread_id != m_minimap->threadId())
|
if (thread_id != EASY_GLOBALS.selected_thread)
|
||||||
{
|
{
|
||||||
EASY_GLOBALS.selected_thread = thread_id;
|
EASY_GLOBALS.selected_thread = thread_id;
|
||||||
emit EASY_GLOBALS.events.selectedThreadChanged(thread_id);
|
emit EASY_GLOBALS.events.selectedThreadChanged(thread_id);
|
||||||
|
@ -56,7 +56,7 @@ void calcIntersect(){
|
|||||||
|
|
||||||
double multModel(double i)
|
double multModel(double i)
|
||||||
{
|
{
|
||||||
EASY_FUNCTION(profiler::colors::Blue);
|
EASY_FUNCTION(profiler::colors::PaleGold);
|
||||||
return i * sin(i) * cos(i);
|
return i * sin(i) * cos(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +144,7 @@ namespace profiler {
|
|||||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364093(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364093(v=vs.85).aspx
|
||||||
m_stubThread = ::std::move(::std::thread([this]()
|
m_stubThread = ::std::move(::std::thread([this]()
|
||||||
{
|
{
|
||||||
EASY_THREAD("EasyProfiler.EventTracing");
|
EASY_THREAD("EasyProfiler.ETW");
|
||||||
//EASY_BLOCK("ProcessTrace()", ::profiler::colors::Red);
|
//EASY_BLOCK("ProcessTrace()", ::profiler::colors::Red);
|
||||||
ProcessTrace(&m_openedHandle, 1, 0, 0);
|
ProcessTrace(&m_openedHandle, 1, 0, 0);
|
||||||
}));
|
}));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user