0
0
mirror of https://github.com/yse/easy_profiler.git synced 2024-12-28 01:04:41 +08:00

#0 [GUI] Appearance progress

This commit is contained in:
Victor Zarubkin 2017-12-04 20:29:22 +03:00
parent d24e4a9e7e
commit 3b6986aa36
5 changed files with 120 additions and 117 deletions

View File

@ -1515,6 +1515,109 @@ void EasyGraphicsView::onIdleTimeout()
// Try to select one of context switches or items // Try to select one of context switches or items
for (auto item : m_items) for (auto item : m_items)
{ {
auto cse = item->intersectEvent(pos);
if (cse != nullptr)
{
const auto& itemBlock = cse->tree;
auto widget = new QWidget(nullptr, Qt::FramelessWindowHint);
if (widget == nullptr)
return;
widget->setAttribute(Qt::WA_ShowWithoutActivating, true);
widget->setFocusPolicy(Qt::NoFocus);
auto lay = new QGridLayout(widget);
if (lay == nullptr)
return;
int row = 0;
lay->addWidget(new EasyBoldLabel("Context switch event", widget), row, 0, 1, 3, Qt::AlignHCenter);
++row;
lay->addWidget(new QLabel("Thread:", widget), row, 0, Qt::AlignRight);
const char* process_name = "";
::profiler::thread_id_t tid = 0;
if (EASY_GLOBALS.version < ::profiler_gui::V130)
{
tid = cse->tree.node->id();
process_name = cse->tree.node->name();
}
else
{
tid = cse->tree.cs->tid();
process_name = cse->tree.cs->name();
}
auto it = EASY_GLOBALS.profiler_blocks.find(tid);
if (it != EASY_GLOBALS.profiler_blocks.end())
{
if (EASY_GLOBALS.hex_thread_id)
lay->addWidget(new QLabel(QString("0x%1 %2").arg(tid, 0, 16).arg(it->second.name()), widget), row, 1, 1, 2, Qt::AlignLeft);
else
lay->addWidget(new QLabel(QString("%1 %2").arg(tid).arg(it->second.name()), widget), row, 1, 1, 2, Qt::AlignLeft);
}
else if (EASY_GLOBALS.hex_thread_id)
lay->addWidget(new QLabel(QString("0x%1").arg(tid, 0, 16), widget), row, 1, 1, 2, Qt::AlignLeft);
else
lay->addWidget(new QLabel(QString::number(tid), widget), row, 1, 1, 2, Qt::AlignLeft);
++row;
lay->addWidget(new QLabel("Process:", widget), row, 0, Qt::AlignRight);
lay->addWidget(new QLabel(process_name, widget), row, 1, 1, 2, Qt::AlignLeft);
++row;
const auto duration = itemBlock.node->duration();
lay->addWidget(new QLabel("Duration:", widget), row, 0, Qt::AlignRight);
lay->addWidget(new QLabel(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, duration, 3), widget), row, 1, 1, 2, Qt::AlignLeft);
++row;
if (itemBlock.per_thread_stats)
{
lay->addWidget(new QLabel("Sum:", widget), row, 0, Qt::AlignRight);
lay->addWidget(new QLabel(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, itemBlock.per_thread_stats->total_duration, 3), widget), row, 1, 1, 2, Qt::AlignLeft);
++row;
lay->addWidget(new EasyBoldLabel("-------- Statistics --------", widget), row, 0, 1, 3, Qt::AlignHCenter);
lay->addWidget(new QLabel("per ", widget), row + 1, 0, Qt::AlignRight);
lay->addWidget(new QLabel("This %:", widget), row + 2, 0, Qt::AlignRight);
lay->addWidget(new QLabel("Sum %:", widget), row + 3, 0, Qt::AlignRight);
lay->addWidget(new QLabel("N Calls:", widget), row + 4, 0, Qt::AlignRight);
lay->addWidget(new QLabel("Thread", widget), row + 1, 1, Qt::AlignHCenter);
auto percent = ::profiler_gui::percentReal(duration, item->root()->profiled_time);
lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast<int>(0.5 + percent)), widget), row + 2, 1, Qt::AlignHCenter);
lay->addWidget(new QLabel(QString::number(::profiler_gui::percent(itemBlock.per_thread_stats->total_duration, item->root()->profiled_time)), widget), row + 3, 1, Qt::AlignHCenter);
lay->addWidget(new QLabel(QString::number(itemBlock.per_thread_stats->calls_number), widget), row + 4, 1, Qt::AlignHCenter);
if (itemBlock.per_frame_stats && !::profiler_gui::is_max(itemBlock.per_frame_stats->parent_block))
{
int col = 2;
auto frame_duration = blocksTree(itemBlock.per_frame_stats->parent_block).node->duration();
lay->addWidget(new QLabel("Frame", widget), row + 1, col, Qt::AlignHCenter);
percent = ::profiler_gui::percentReal(duration, frame_duration);
lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast<int>(0.5 + percent)), widget), row + 2, col, Qt::AlignHCenter);
percent = ::profiler_gui::percentReal(itemBlock.per_frame_stats->total_duration, frame_duration);
lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast<int>(0.5 + percent)), widget), row + 3, col, Qt::AlignHCenter);
lay->addWidget(new QLabel(QString::number(itemBlock.per_frame_stats->calls_number), widget), row + 4, col, Qt::AlignHCenter);
}
}
m_popupWidget = new QGraphicsProxyWidget();
m_popupWidget->setWidget(widget);
break;
}
::profiler::block_index_t i = ~0U; ::profiler::block_index_t i = ~0U;
auto block = item->intersect(pos, i); auto block = item->intersect(pos, i);
if (block != nullptr) if (block != nullptr)
@ -1736,109 +1839,6 @@ void EasyGraphicsView::onIdleTimeout()
break; break;
} }
auto cse = item->intersectEvent(pos);
if (cse != nullptr)
{
const auto& itemBlock = cse->tree;
auto widget = new QWidget(nullptr, Qt::FramelessWindowHint);
if (widget == nullptr)
return;
widget->setAttribute(Qt::WA_ShowWithoutActivating, true);
widget->setFocusPolicy(Qt::NoFocus);
auto lay = new QGridLayout(widget);
if (lay == nullptr)
return;
int row = 0;
lay->addWidget(new EasyBoldLabel("Context switch event", widget), row, 0, 1, 3, Qt::AlignHCenter);
++row;
lay->addWidget(new QLabel("Thread:", widget), row, 0, Qt::AlignRight);
const char* process_name = "";
::profiler::thread_id_t tid = 0;
if (EASY_GLOBALS.version < ::profiler_gui::V130)
{
tid = cse->tree.node->id();
process_name = cse->tree.node->name();
}
else
{
tid = cse->tree.cs->tid();
process_name = cse->tree.cs->name();
}
auto it = EASY_GLOBALS.profiler_blocks.find(tid);
if (it != EASY_GLOBALS.profiler_blocks.end())
{
if (EASY_GLOBALS.hex_thread_id)
lay->addWidget(new QLabel(QString("0x%1 %2").arg(tid, 0, 16).arg(it->second.name()), widget), row, 1, 1, 2, Qt::AlignLeft);
else
lay->addWidget(new QLabel(QString("%1 %2").arg(tid).arg(it->second.name()), widget), row, 1, 1, 2, Qt::AlignLeft);
}
else if (EASY_GLOBALS.hex_thread_id)
lay->addWidget(new QLabel(QString("0x%1").arg(tid, 0, 16), widget), row, 1, 1, 2, Qt::AlignLeft);
else
lay->addWidget(new QLabel(QString::number(tid), widget), row, 1, 1, 2, Qt::AlignLeft);
++row;
lay->addWidget(new QLabel("Process:", widget), row, 0, Qt::AlignRight);
lay->addWidget(new QLabel(process_name, widget), row, 1, 1, 2, Qt::AlignLeft);
++row;
const auto duration = itemBlock.node->duration();
lay->addWidget(new QLabel("Duration:", widget), row, 0, Qt::AlignRight);
lay->addWidget(new QLabel(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, duration, 3), widget), row, 1, 1, 2, Qt::AlignLeft);
++row;
if (itemBlock.per_thread_stats)
{
lay->addWidget(new QLabel("Sum:", widget), row, 0, Qt::AlignRight);
lay->addWidget(new QLabel(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, itemBlock.per_thread_stats->total_duration, 3), widget), row, 1, 1, 2, Qt::AlignLeft);
++row;
lay->addWidget(new EasyBoldLabel("-------- Statistics --------", widget), row, 0, 1, 3, Qt::AlignHCenter);
lay->addWidget(new QLabel("per ", widget), row + 1, 0, Qt::AlignRight);
lay->addWidget(new QLabel("This %:", widget), row + 2, 0, Qt::AlignRight);
lay->addWidget(new QLabel("Sum %:", widget), row + 3, 0, Qt::AlignRight);
lay->addWidget(new QLabel("N Calls:", widget), row + 4, 0, Qt::AlignRight);
lay->addWidget(new QLabel("Thread", widget), row + 1, 1, Qt::AlignHCenter);
auto percent = ::profiler_gui::percentReal(duration, item->root()->profiled_time);
lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast<int>(0.5 + percent)), widget), row + 2, 1, Qt::AlignHCenter);
lay->addWidget(new QLabel(QString::number(::profiler_gui::percent(itemBlock.per_thread_stats->total_duration, item->root()->profiled_time)), widget), row + 3, 1, Qt::AlignHCenter);
lay->addWidget(new QLabel(QString::number(itemBlock.per_thread_stats->calls_number), widget), row + 4, 1, Qt::AlignHCenter);
if (itemBlock.per_frame_stats && !::profiler_gui::is_max(itemBlock.per_frame_stats->parent_block))
{
int col = 2;
auto frame_duration = blocksTree(itemBlock.per_frame_stats->parent_block).node->duration();
lay->addWidget(new QLabel("Frame", widget), row + 1, col, Qt::AlignHCenter);
percent = ::profiler_gui::percentReal(duration, frame_duration);
lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast<int>(0.5 + percent)), widget), row + 2, col, Qt::AlignHCenter);
percent = ::profiler_gui::percentReal(itemBlock.per_frame_stats->total_duration, frame_duration);
lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast<int>(0.5 + percent)), widget), row + 3, col, Qt::AlignHCenter);
lay->addWidget(new QLabel(QString::number(itemBlock.per_frame_stats->calls_number), widget), row + 4, col, Qt::AlignHCenter);
}
}
m_popupWidget = new QGraphicsProxyWidget();
m_popupWidget->setWidget(widget);
break;
}
} }
if (m_popupWidget != nullptr) if (m_popupWidget != nullptr)

View File

@ -186,7 +186,7 @@ const char* statusText(::profiler::EasyBlockStatus _status)
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
EasyDescWidgetItem::EasyDescWidgetItem(::profiler::block_id_t _desc, Parent* _parent) EasyDescWidgetItem::EasyDescWidgetItem(::profiler::block_id_t _desc, Parent* _parent)
: Parent(_parent) : Parent(_parent, QTreeWidgetItem::UserType)
, m_desc(_desc) , m_desc(_desc)
, m_type(EasyDescWidgetItem::Type::File) , m_type(EasyDescWidgetItem::Type::File)
{ {

View File

@ -74,6 +74,7 @@ enum BlockItemState : int8_t
EASY_CONSTEXPR int MIN_SYNC_SPACING = 1; EASY_CONSTEXPR int MIN_SYNC_SPACING = 1;
EASY_CONSTEXPR int MIN_SYNC_SIZE = 3; EASY_CONSTEXPR int MIN_SYNC_SIZE = 3;
EASY_CONSTEXPR int EVENT_HEIGHT = 4;
EASY_CONSTEXPR QRgb BORDERS_COLOR = ::profiler::colors::Grey600 & 0x00ffffff;// 0x00686868; EASY_CONSTEXPR QRgb BORDERS_COLOR = ::profiler::colors::Grey600 & 0x00ffffff;// 0x00686868;
inline QRgb selectedItemBorderColor(::profiler::color_t _color) { inline QRgb selectedItemBorderColor(::profiler::color_t _color) {
@ -964,8 +965,9 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
//firstSync = m_pRoot->sync.begin(); //firstSync = m_pRoot->sync.begin();
p.previousColor = 0; p.previousColor = 0;
qreal prevRight = -1e100, top = y() - 6, h = 3; qreal prevRight = -1e100;
if (top + h < p.visibleBottom) const qreal top = y() + 1 - EVENT_HEIGHT;
if (top + EVENT_HEIGHT < p.visibleBottom)
{ {
_painter->setPen(BORDERS_COLOR); _painter->setPen(BORDERS_COLOR);
@ -1013,7 +1015,7 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
_painter->setBrush(QColor::fromRgb(color)); _painter->setBrush(QColor::fromRgb(color));
} }
p.rect.setRect(left, top, width, h); p.rect.setRect(left, top, width, EVENT_HEIGHT);
_painter->drawRect(p.rect); _painter->drawRect(p.rect);
prevRight = left + width + MIN_SYNC_SPACING; prevRight = left + width + MIN_SYNC_SPACING;
} }
@ -1041,8 +1043,9 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
} }
p.previousColor = 0; p.previousColor = 0;
qreal prevRight = -1e100, top = y() + boundingRect().height() + 1, h = 3; qreal prevRight = -1e100;
if (top + h < p.visibleBottom) const qreal top = y() + boundingRect().height() - 1;
if (top + EVENT_HEIGHT < p.visibleBottom)
{ {
_painter->setPen(BORDERS_COLOR); _painter->setPen(BORDERS_COLOR);
@ -1061,7 +1064,8 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
left *= p.currentScale; left *= p.currentScale;
left -= p.dx; left -= p.dx;
width *= p.currentScale; width *= p.currentScale;
if (width < 2) width = 2; if (width < 2)
width = 2;
if (left + width <= prevRight) // This item is not visible if (left + width <= prevRight) // This item is not visible
continue; continue;
@ -1082,7 +1086,7 @@ void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*
_painter->setBrush(QColor::fromRgb(color)); _painter->setBrush(QColor::fromRgb(color));
} }
p.rect.setRect(left, top, width, h); p.rect.setRect(left, top, width, EVENT_HEIGHT);
_painter->drawRect(p.rect); _painter->drawRect(p.rect);
prevRight = left + width + 2; prevRight = left + width + 2;
} }
@ -1340,14 +1344,13 @@ const ::profiler_gui::EasyBlock* EasyGraphicsItem::intersectEvent(const QPointF&
return nullptr; return nullptr;
} }
const auto top = y() - 6; const auto top = y() - EVENT_HEIGHT;
if (top > _pos.y()) if (top > _pos.y())
{ {
return nullptr; return nullptr;
} }
const auto bottom = top + 5; const auto bottom = top + EVENT_HEIGHT + 2;
if (bottom < _pos.y()) if (bottom < _pos.y())
{ {
return nullptr; return nullptr;

View File

@ -110,7 +110,7 @@ EASY_CONSTEXPR int ColumnBit[COL_COLUMNS_NUMBER] = {
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
EasyTreeWidgetItem::EasyTreeWidgetItem(const ::profiler::block_index_t _treeBlock, Parent* _parent) EasyTreeWidgetItem::EasyTreeWidgetItem(const ::profiler::block_index_t _treeBlock, Parent* _parent)
: Parent(_parent) : Parent(_parent, QTreeWidgetItem::UserType)
, m_block(_treeBlock) , m_block(_treeBlock)
, m_customBGColor(0) , m_customBGColor(0)
, m_bColorized(false) , m_bColorized(false)

View File

@ -115,8 +115,8 @@ enum EasyColumnsIndexes
class EasyTreeWidgetItem : public QTreeWidgetItem class EasyTreeWidgetItem : public QTreeWidgetItem
{ {
typedef QTreeWidgetItem Parent; using Parent = QTreeWidgetItem;
typedef EasyTreeWidgetItem This; using This = EasyTreeWidgetItem;
QFont m_font; QFont m_font;
const ::profiler::block_index_t m_block; const ::profiler::block_index_t m_block;