mirror of
https://github.com/yse/easy_profiler.git
synced 2025-01-14 00:27:55 +08:00
[ui] rearrange settings; some renames
This commit is contained in:
parent
33850d5abf
commit
0dc5a71aad
@ -6,7 +6,7 @@
|
|||||||
* email : v.s.zarubkin@gmail.com
|
* email : v.s.zarubkin@gmail.com
|
||||||
* ----------------- :
|
* ----------------- :
|
||||||
* description : The file contains implementation of ArbitraryValueToolTip which is used
|
* description : The file contains implementation of ArbitraryValueToolTip which is used
|
||||||
* : for displaying arbitrary value in Diagram and Hierarchy widgets.
|
* : for displaying arbitrary value in Diagram and StatsTree widgets.
|
||||||
* ----------------- :
|
* ----------------- :
|
||||||
* license : Lightweight profiler library for c++
|
* license : Lightweight profiler library for c++
|
||||||
* : Copyright(C) 2016-2019 Sergey Yagovtsev, Victor Zarubkin
|
* : Copyright(C) 2016-2019 Sergey Yagovtsev, Victor Zarubkin
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* email : v.s.zarubkin@gmail.com
|
* email : v.s.zarubkin@gmail.com
|
||||||
* ----------------- :
|
* ----------------- :
|
||||||
* description : The file contains declaration of ArbitraryValueToolTip which is used
|
* description : The file contains declaration of ArbitraryValueToolTip which is used
|
||||||
* : for displaying arbitrary value in Diagram and Hierarchy widgets.
|
* : for displaying arbitrary value in Diagram and StatsTree widgets.
|
||||||
* ----------------- :
|
* ----------------- :
|
||||||
* license : Lightweight profiler library for c++
|
* license : Lightweight profiler library for c++
|
||||||
* : Copyright(C) 2016-2019 Sergey Yagovtsev, Victor Zarubkin
|
* : Copyright(C) 2016-2019 Sergey Yagovtsev, Victor Zarubkin
|
||||||
|
@ -1721,7 +1721,7 @@ void BlocksGraphicsView::mouseReleaseEvent(QMouseEvent* _event)
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void BlocksGraphicsView::addSelectionToHierarchy()
|
void BlocksGraphicsView::addSelectionToStatsTree()
|
||||||
{
|
{
|
||||||
if (!m_selectionItem->isVisible())
|
if (!m_selectionItem->isVisible())
|
||||||
return;
|
return;
|
||||||
@ -1806,7 +1806,7 @@ void BlocksGraphicsView::onInspectCurrentView(bool strict)
|
|||||||
|
|
||||||
emit EASY_GLOBALS.events.rulerVisible(true);
|
emit EASY_GLOBALS.events.rulerVisible(true);
|
||||||
|
|
||||||
addSelectionToHierarchy();
|
addSelectionToStatsTree();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -301,7 +301,7 @@ private:
|
|||||||
|
|
||||||
void revalidateOffset();
|
void revalidateOffset();
|
||||||
|
|
||||||
void addSelectionToHierarchy();
|
void addSelectionToStatsTree();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
|
@ -97,7 +97,9 @@
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
const int HIERARCHY_BUILDER_TIMER_INTERVAL = 40;
|
namespace {
|
||||||
|
|
||||||
|
const int TREE_BUILDER_TIMER_INTERVAL = 40;
|
||||||
|
|
||||||
const bool PLAIN_MODE_COLUMNS[COL_COLUMNS_NUMBER] = {
|
const bool PLAIN_MODE_COLUMNS[COL_COLUMNS_NUMBER] = {
|
||||||
true // COL_NAME = 0,
|
true // COL_NAME = 0,
|
||||||
@ -183,6 +185,8 @@ const bool SELECTION_MODE_COLUMNS[COL_COLUMNS_NUMBER] = {
|
|||||||
, true // COL_NCALLS_PER_AREA,
|
, true // COL_NCALLS_PER_AREA,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // end of namespace <noname>.
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
BlocksTreeWidget::BlocksTreeWidget(QWidget* _parent)
|
BlocksTreeWidget::BlocksTreeWidget(QWidget* _parent)
|
||||||
@ -366,7 +370,7 @@ BlocksTreeWidget::BlocksTreeWidget(QWidget* _parent)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_hintLabel = new QLabel("Use Right Mouse Button on the Diagram to build a hierarchy...\n"
|
m_hintLabel = new QLabel("Use Right Mouse Button on the Diagram to build a tree...\n"
|
||||||
"Way 1: Press the button >> Move mouse >> Release the button\n"
|
"Way 1: Press the button >> Move mouse >> Release the button\n"
|
||||||
"Way 2: Just click the right mouse button on any block", this);
|
"Way 2: Just click the right mouse button on any block", this);
|
||||||
m_hintLabel->setObjectName(QStringLiteral("BlocksTreeWidget_HintLabel"));
|
m_hintLabel->setObjectName(QStringLiteral("BlocksTreeWidget_HintLabel"));
|
||||||
@ -492,15 +496,15 @@ void BlocksTreeWidget::mousePressEvent(QMouseEvent* _event)
|
|||||||
|
|
||||||
void BlocksTreeWidget::onFillTimerTimeout()
|
void BlocksTreeWidget::onFillTimerTimeout()
|
||||||
{
|
{
|
||||||
if (m_hierarchyBuilder.done())
|
if (m_treeBuilder.done())
|
||||||
{
|
{
|
||||||
m_fillTimer.stop();
|
m_fillTimer.stop();
|
||||||
|
|
||||||
ThreadedItems toplevelitems;
|
ThreadedItems toplevelitems;
|
||||||
m_hierarchyBuilder.takeItems(m_items);
|
m_treeBuilder.takeItems(m_items);
|
||||||
m_hierarchyBuilder.takeTopLevelItems(toplevelitems);
|
m_treeBuilder.takeTopLevelItems(toplevelitems);
|
||||||
auto error = m_hierarchyBuilder.error();
|
auto error = m_treeBuilder.error();
|
||||||
m_hierarchyBuilder.interrupt();
|
m_treeBuilder.interrupt();
|
||||||
{
|
{
|
||||||
const QSignalBlocker b(this);
|
const QSignalBlocker b(this);
|
||||||
for (auto& item : toplevelitems)
|
for (auto& item : toplevelitems)
|
||||||
@ -557,7 +561,7 @@ void BlocksTreeWidget::onFillTimerTimeout()
|
|||||||
}
|
}
|
||||||
else if (m_progress != nullptr)
|
else if (m_progress != nullptr)
|
||||||
{
|
{
|
||||||
m_progress->setValue(m_hierarchyBuilder.progress());
|
m_progress->setValue(m_treeBuilder.progress());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -614,8 +618,8 @@ void BlocksTreeWidget::setTreeBlocks(const profiler_gui::TreeBlocks& _blocks, pr
|
|||||||
m_bLocked = true;
|
m_bLocked = true;
|
||||||
m_hintLabel->hide();
|
m_hintLabel->hide();
|
||||||
createProgressDialog();
|
createProgressDialog();
|
||||||
m_hierarchyBuilder.fillTreeBlocks(m_inputBlocks, _session_begin_time, _left, _right, _strict, m_mode);
|
m_treeBuilder.fillTreeBlocks(m_inputBlocks, _session_begin_time, _left, _right, _strict, m_mode);
|
||||||
m_fillTimer.start(HIERARCHY_BUILDER_TIMER_INTERVAL);
|
m_fillTimer.start(TREE_BUILDER_TIMER_INTERVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
//StubLocker l;
|
//StubLocker l;
|
||||||
@ -647,7 +651,7 @@ void BlocksTreeWidget::clearSilent(bool _global)
|
|||||||
{
|
{
|
||||||
const QSignalBlocker b(this);
|
const QSignalBlocker b(this);
|
||||||
|
|
||||||
m_hierarchyBuilder.interrupt();
|
m_treeBuilder.interrupt();
|
||||||
destroyProgressDialog();
|
destroyProgressDialog();
|
||||||
m_hintLabel->show();
|
m_hintLabel->show();
|
||||||
|
|
||||||
@ -1545,7 +1549,7 @@ void BlocksTreeWidget::saveSettings()
|
|||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
HierarchyWidget::HierarchyWidget(QWidget* _parent) : Parent(_parent)
|
StatsWidget::StatsWidget(QWidget* _parent) : Parent(_parent)
|
||||||
, m_tree(new BlocksTreeWidget(this))
|
, m_tree(new BlocksTreeWidget(this))
|
||||||
, m_searchBox(new QLineEdit(this))
|
, m_searchBox(new QLineEdit(this))
|
||||||
, m_foundNumber(new QLabel(QStringLiteral("<font color=\"red\">0</font> matches"), this))
|
, m_foundNumber(new QLabel(QStringLiteral("<font color=\"red\">0</font> matches"), this))
|
||||||
@ -1613,12 +1617,12 @@ HierarchyWidget::HierarchyWidget(QWidget* _parent) : Parent(_parent)
|
|||||||
m_foundNumber->hide();
|
m_foundNumber->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
HierarchyWidget::~HierarchyWidget()
|
StatsWidget::~StatsWidget()
|
||||||
{
|
{
|
||||||
saveSettings();
|
saveSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::loadSettings()
|
void StatsWidget::loadSettings()
|
||||||
{
|
{
|
||||||
QSettings settings(profiler_gui::ORGANAZATION_NAME, profiler_gui::APPLICATION_NAME);
|
QSettings settings(profiler_gui::ORGANAZATION_NAME, profiler_gui::APPLICATION_NAME);
|
||||||
settings.beginGroup("HierarchyWidget");
|
settings.beginGroup("HierarchyWidget");
|
||||||
@ -1630,7 +1634,7 @@ void HierarchyWidget::loadSettings()
|
|||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::saveSettings()
|
void StatsWidget::saveSettings()
|
||||||
{
|
{
|
||||||
QSettings settings(profiler_gui::ORGANAZATION_NAME, profiler_gui::APPLICATION_NAME);
|
QSettings settings(profiler_gui::ORGANAZATION_NAME, profiler_gui::APPLICATION_NAME);
|
||||||
settings.beginGroup("HierarchyWidget");
|
settings.beginGroup("HierarchyWidget");
|
||||||
@ -1638,19 +1642,19 @@ void HierarchyWidget::saveSettings()
|
|||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::enterEvent(QEvent* event)
|
void StatsWidget::enterEvent(QEvent* event)
|
||||||
{
|
{
|
||||||
Parent::enterEvent(event);
|
Parent::enterEvent(event);
|
||||||
m_tree->updateHintLabelOnHover(true);
|
m_tree->updateHintLabelOnHover(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::leaveEvent(QEvent* event)
|
void StatsWidget::leaveEvent(QEvent* event)
|
||||||
{
|
{
|
||||||
Parent::leaveEvent(event);
|
Parent::leaveEvent(event);
|
||||||
m_tree->updateHintLabelOnHover(false);
|
m_tree->updateHintLabelOnHover(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::keyPressEvent(QKeyEvent* _event)
|
void StatsWidget::keyPressEvent(QKeyEvent* _event)
|
||||||
{
|
{
|
||||||
switch (_event->key())
|
switch (_event->key())
|
||||||
{
|
{
|
||||||
@ -1677,12 +1681,12 @@ void HierarchyWidget::keyPressEvent(QKeyEvent* _event)
|
|||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void HierarchyWidget::contextMenuEvent(QContextMenuEvent* _event)
|
void StatsWidget::contextMenuEvent(QContextMenuEvent* _event)
|
||||||
{
|
{
|
||||||
m_tree->contextMenuEvent(_event);
|
m_tree->contextMenuEvent(_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::showEvent(QShowEvent* event)
|
void StatsWidget::showEvent(QShowEvent* event)
|
||||||
{
|
{
|
||||||
Parent::showEvent(event);
|
Parent::showEvent(event);
|
||||||
m_searchBox->setFixedWidth(px(300));
|
m_searchBox->setFixedWidth(px(300));
|
||||||
@ -1690,19 +1694,19 @@ void HierarchyWidget::showEvent(QShowEvent* event)
|
|||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
BlocksTreeWidget* HierarchyWidget::tree()
|
BlocksTreeWidget* StatsWidget::tree()
|
||||||
{
|
{
|
||||||
return m_tree;
|
return m_tree;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::clear(bool _global)
|
void StatsWidget::clear(bool _global)
|
||||||
{
|
{
|
||||||
m_tree->clearSilent(_global);
|
m_tree->clearSilent(_global);
|
||||||
m_foundNumber->setText(QStringLiteral("<font color=\"red\">0</font> matches"));
|
m_foundNumber->setText(QStringLiteral("<font color=\"red\">0</font> matches"));
|
||||||
m_foundNumber->hide();
|
m_foundNumber->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::onSeachBoxReturnPressed()
|
void StatsWidget::onSeachBoxReturnPressed()
|
||||||
{
|
{
|
||||||
if (m_searchButton->data().toBool())
|
if (m_searchButton->data().toBool())
|
||||||
findNext(true);
|
findNext(true);
|
||||||
@ -1710,7 +1714,7 @@ void HierarchyWidget::onSeachBoxReturnPressed()
|
|||||||
findPrev(true);
|
findPrev(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::onSearchBoxTextChanged(const QString& _text)
|
void StatsWidget::onSearchBoxTextChanged(const QString& _text)
|
||||||
{
|
{
|
||||||
if (_text.isEmpty())
|
if (_text.isEmpty())
|
||||||
{
|
{
|
||||||
@ -1719,7 +1723,7 @@ void HierarchyWidget::onSearchBoxTextChanged(const QString& _text)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::findNext(bool)
|
void StatsWidget::findNext(bool)
|
||||||
{
|
{
|
||||||
auto text = m_searchBox->text();
|
auto text = m_searchBox->text();
|
||||||
if (text.isEmpty())
|
if (text.isEmpty())
|
||||||
@ -1752,7 +1756,7 @@ void HierarchyWidget::findNext(bool)
|
|||||||
m_foundNumber->show();
|
m_foundNumber->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::findPrev(bool)
|
void StatsWidget::findPrev(bool)
|
||||||
{
|
{
|
||||||
auto text = m_searchBox->text();
|
auto text = m_searchBox->text();
|
||||||
if (text.isEmpty())
|
if (text.isEmpty())
|
||||||
@ -1785,7 +1789,7 @@ void HierarchyWidget::findPrev(bool)
|
|||||||
m_foundNumber->show();
|
m_foundNumber->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::findNextFromMenu(bool _checked)
|
void StatsWidget::findNextFromMenu(bool _checked)
|
||||||
{
|
{
|
||||||
if (!_checked)
|
if (!_checked)
|
||||||
return;
|
return;
|
||||||
@ -1802,7 +1806,7 @@ void HierarchyWidget::findNextFromMenu(bool _checked)
|
|||||||
findNext(true);
|
findNext(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HierarchyWidget::findPrevFromMenu(bool _checked)
|
void StatsWidget::findPrevFromMenu(bool _checked)
|
||||||
{
|
{
|
||||||
if (!_checked)
|
if (!_checked)
|
||||||
return;
|
return;
|
||||||
|
@ -82,7 +82,7 @@ class BlocksTreeWidget : public QTreeWidget
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
TreeWidgetLoader m_hierarchyBuilder;
|
TreeWidgetLoader m_treeBuilder;
|
||||||
Items m_items;
|
Items m_items;
|
||||||
RootsMap m_roots;
|
RootsMap m_roots;
|
||||||
::profiler_gui::TreeBlocks m_inputBlocks;
|
::profiler_gui::TreeBlocks m_inputBlocks;
|
||||||
@ -189,12 +189,12 @@ private:
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class HierarchyWidget : public QWidget
|
class StatsWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
using Parent = QWidget;
|
using Parent = QWidget;
|
||||||
using This = HierarchyWidget;
|
using This = StatsWidget;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -208,8 +208,8 @@ public:
|
|||||||
|
|
||||||
// Public virtual methods
|
// Public virtual methods
|
||||||
|
|
||||||
explicit HierarchyWidget(QWidget* _parent = nullptr);
|
explicit StatsWidget(QWidget* _parent = nullptr);
|
||||||
~HierarchyWidget() override;
|
~StatsWidget() override;
|
||||||
|
|
||||||
void enterEvent(QEvent* event) override;
|
void enterEvent(QEvent* event) override;
|
||||||
void leaveEvent(QEvent* event) override;
|
void leaveEvent(QEvent* event) override;
|
||||||
|
@ -89,6 +89,7 @@ Globals::Globals()
|
|||||||
, frame_time(16700)
|
, frame_time(16700)
|
||||||
, blocks_spacing(0)
|
, blocks_spacing(0)
|
||||||
, blocks_size_min(2)
|
, blocks_size_min(2)
|
||||||
|
, histogram_column_width_min(2)
|
||||||
, blocks_narrow_size(20)
|
, blocks_narrow_size(20)
|
||||||
, max_fps_history(90)
|
, max_fps_history(90)
|
||||||
, fps_timer_interval(500)
|
, fps_timer_interval(500)
|
||||||
@ -111,7 +112,7 @@ Globals::Globals()
|
|||||||
, draw_histogram_borders(true)
|
, draw_histogram_borders(true)
|
||||||
, hide_narrow_children(false)
|
, hide_narrow_children(false)
|
||||||
, hide_minsize_blocks(false)
|
, hide_minsize_blocks(false)
|
||||||
, display_only_relevant_stats(false)
|
, hide_stats_for_single_blocks(false)
|
||||||
, collapse_items_on_tree_close(false)
|
, collapse_items_on_tree_close(false)
|
||||||
, all_items_expanded_by_default(true)
|
, all_items_expanded_by_default(true)
|
||||||
, only_current_thread_hierarchy(false)
|
, only_current_thread_hierarchy(false)
|
||||||
|
@ -215,11 +215,12 @@ namespace profiler_gui {
|
|||||||
::profiler::block_id_t selected_block_id; ///< Current selected profiler block id
|
::profiler::block_id_t selected_block_id; ///< Current selected profiler block id
|
||||||
uint32_t version; ///< Opened file version (files may have different format)
|
uint32_t version; ///< Opened file version (files may have different format)
|
||||||
|
|
||||||
uint32_t max_rows_count; ///< Maximum blocks count for the Hierarchy widget for the full call-stack mode
|
uint32_t max_rows_count; ///< Maximum blocks count for the StatsTree widget for the full call-stack mode
|
||||||
|
|
||||||
float frame_time; ///< Expected frame time value in microseconds to be displayed at minimap on graphics scrollbar
|
float frame_time; ///< Expected frame time value in microseconds to be displayed at minimap on graphics scrollbar
|
||||||
int blocks_spacing; ///< Minimum blocks spacing on diagram
|
int blocks_spacing; ///< Minimum blocks spacing on diagram
|
||||||
int blocks_size_min; ///< Minimum blocks size on diagram
|
int blocks_size_min; ///< Minimum blocks size on diagram
|
||||||
|
int histogram_column_width_min; ///< Minimum column width on histogram when borders are enabled
|
||||||
int blocks_narrow_size; ///< Width indicating narrow blocks
|
int blocks_narrow_size; ///< Width indicating narrow blocks
|
||||||
int max_fps_history; ///< Max frames history displayed in FPS Monitor
|
int max_fps_history; ///< Max frames history displayed in FPS Monitor
|
||||||
int fps_timer_interval; ///< Interval in milliseconds for sending network requests to the profiled application (used by FPS Monitor)
|
int fps_timer_interval; ///< Interval in milliseconds for sending network requests to the profiled application (used by FPS Monitor)
|
||||||
@ -245,7 +246,7 @@ namespace profiler_gui {
|
|||||||
bool draw_histogram_borders; ///< Draw borders for histogram columns or not
|
bool draw_histogram_borders; ///< Draw borders for histogram columns or not
|
||||||
bool hide_narrow_children; ///< Hide children for narrow graphics blocks (See blocks_narrow_size)
|
bool hide_narrow_children; ///< Hide children for narrow graphics blocks (See blocks_narrow_size)
|
||||||
bool hide_minsize_blocks; ///< Hide blocks which screen size is less than blocks_size_min
|
bool hide_minsize_blocks; ///< Hide blocks which screen size is less than blocks_size_min
|
||||||
bool display_only_relevant_stats; ///< Display only relevant information in ProfTreeWidget (excludes min, max, average times if there are only 1 calls number)
|
bool hide_stats_for_single_blocks; ///< Hide min, max, avg, median durations in stats tree if there is only 1 call for a block
|
||||||
bool collapse_items_on_tree_close; ///< Collapse all items which were displayed in the hierarchy tree after tree close/reset
|
bool collapse_items_on_tree_close; ///< Collapse all items which were displayed in the hierarchy tree after tree close/reset
|
||||||
bool all_items_expanded_by_default; ///< Expand all items after file is opened
|
bool all_items_expanded_by_default; ///< Expand all items after file is opened
|
||||||
bool only_current_thread_hierarchy; ///< Build hierarchy tree for current thread only
|
bool only_current_thread_hierarchy; ///< Build hierarchy tree for current thread only
|
||||||
|
@ -66,7 +66,6 @@ namespace {
|
|||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
EASY_CONSTEXPR int HIST_COLUMN_MIN_HEIGHT = 2;
|
EASY_CONSTEXPR int HIST_COLUMN_MIN_HEIGHT = 2;
|
||||||
EASY_CONSTEXPR qreal HIST_COLUMN_MIN_WIDTH_WITH_BORDER = 3;
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -251,24 +250,6 @@ void GraphicsHistogramItem::paintByPtr(QPainter* _painter)
|
|||||||
// MEDIAN & EXPECTED FRAME TIME
|
// MEDIAN & EXPECTED FRAME TIME
|
||||||
if (!isEmpty())
|
if (!isEmpty())
|
||||||
{
|
{
|
||||||
const qreal mdn = m_medianDuration * 1e-3;
|
|
||||||
|
|
||||||
if (m_bottomValue < mdn && mdn < m_topValue)
|
|
||||||
{
|
|
||||||
// Draw marker displaying expected frame_time step
|
|
||||||
const auto h = bottom - (mdn - m_bottomValue) * coeff;
|
|
||||||
_painter->setPen(Qt::DashDotDotLine);
|
|
||||||
|
|
||||||
auto w = width;
|
|
||||||
const auto boundary = widget->margin() - font_h;
|
|
||||||
if (h < (m_boundingRect.top() - boundary))
|
|
||||||
w = top_width;
|
|
||||||
else if (h > (bottom + boundary))
|
|
||||||
w = bottom_width;
|
|
||||||
|
|
||||||
_painter->drawLine(QLineF(0, h, w, h));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_bottomValue < EASY_GLOBALS.frame_time && EASY_GLOBALS.frame_time < m_topValue)
|
if (m_bottomValue < EASY_GLOBALS.frame_time && EASY_GLOBALS.frame_time < m_topValue)
|
||||||
{
|
{
|
||||||
// Draw marker displaying expected frame_time step
|
// Draw marker displaying expected frame_time step
|
||||||
@ -406,24 +387,6 @@ void GraphicsHistogramItem::paintById(QPainter* _painter)
|
|||||||
// MEDIAN & EXPECTED FRAME TIME
|
// MEDIAN & EXPECTED FRAME TIME
|
||||||
if (!isEmpty())
|
if (!isEmpty())
|
||||||
{
|
{
|
||||||
const qreal mdn = m_medianDuration * 1e-3;
|
|
||||||
|
|
||||||
if (m_bottomValue < mdn && mdn < m_topValue)
|
|
||||||
{
|
|
||||||
// Draw marker displaying expected frame_time step
|
|
||||||
const auto h = bottom - (mdn - m_bottomValue) * coeff;
|
|
||||||
_painter->setPen(Qt::DashDotDotLine);
|
|
||||||
|
|
||||||
auto w = width;
|
|
||||||
const auto boundary = widget->margin() - font_h;
|
|
||||||
if (h < (m_boundingRect.top() - boundary))
|
|
||||||
w = top_width;
|
|
||||||
else if (h > (bottom + boundary))
|
|
||||||
w = bottom_width;
|
|
||||||
|
|
||||||
_painter->drawLine(QLineF(0, h, w, h));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_bottomValue < EASY_GLOBALS.frame_time && EASY_GLOBALS.frame_time < m_topValue)
|
if (m_bottomValue < EASY_GLOBALS.frame_time && EASY_GLOBALS.frame_time < m_topValue)
|
||||||
{
|
{
|
||||||
// Draw marker displaying required frame_time step
|
// Draw marker displaying required frame_time step
|
||||||
@ -1057,9 +1020,10 @@ bool GraphicsHistogramItem::updateImage()
|
|||||||
const auto beginTime = EASY_GLOBALS.begin_time;
|
const auto beginTime = EASY_GLOBALS.begin_time;
|
||||||
const auto autoHeight = EASY_GLOBALS.auto_adjust_histogram_height;
|
const auto autoHeight = EASY_GLOBALS.auto_adjust_histogram_height;
|
||||||
const auto drawBorders = EASY_GLOBALS.draw_histogram_borders;
|
const auto drawBorders = EASY_GLOBALS.draw_histogram_borders;
|
||||||
|
const auto minColumnWidth = EASY_GLOBALS.histogram_column_width_min;
|
||||||
m_worker.enqueue([=] {
|
m_worker.enqueue([=] {
|
||||||
updateImageAsync(rect, regime, scale, left, right, right - left, value, window, top, bottom, bindMode,
|
updateImageAsync(rect, regime, scale, left, right, right - left, value, window, top, bottom,
|
||||||
frameTime, beginTime, autoHeight, drawBorders);
|
minColumnWidth, bindMode, frameTime, beginTime, autoHeight, drawBorders);
|
||||||
}, m_bReady);
|
}, m_bReady);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1095,9 +1059,8 @@ void GraphicsHistogramItem::onImageUpdated()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GraphicsHistogramItem::updateImageAsync(QRectF _boundingRect, HistRegime _regime, qreal _current_scale,
|
void GraphicsHistogramItem::updateImageAsync(QRectF _boundingRect, HistRegime _regime, qreal _current_scale,
|
||||||
qreal _minimum, qreal _maximum, qreal _range,
|
qreal _minimum, qreal _maximum, qreal _range, qreal _value, qreal _width, qreal _top_duration, qreal _bottom_duration,
|
||||||
qreal _value, qreal _width, qreal _top_duration, qreal _bottom_duration,
|
int _min_column_width, bool _bindMode, float _frame_time, profiler::timestamp_t _begin_time, bool _autoAdjustHist, bool _drawBorders)
|
||||||
bool _bindMode, float _frame_time, profiler::timestamp_t _begin_time, bool _autoAdjustHist, bool _drawBorders)
|
|
||||||
{
|
{
|
||||||
const auto bottom = _boundingRect.height();//_boundingRect.bottom();
|
const auto bottom = _boundingRect.height();//_boundingRect.bottom();
|
||||||
const auto screenWidth = _boundingRect.width() * _current_scale;
|
const auto screenWidth = _boundingRect.width() * _current_scale;
|
||||||
@ -1225,7 +1188,7 @@ void GraphicsHistogramItem::updateImageAsync(QRectF _boundingRect, HistRegime _r
|
|||||||
const auto dtime = _top_duration - _bottom_duration;
|
const auto dtime = _top_duration - _bottom_duration;
|
||||||
const auto coeff = _boundingRect.height() / (dtime > 1e-3 ? dtime : 1.);
|
const auto coeff = _boundingRect.height() / (dtime > 1e-3 ? dtime : 1.);
|
||||||
|
|
||||||
const qreal minWidth = _drawBorders ? HIST_COLUMN_MIN_WIDTH_WITH_BORDER : 1.;
|
const qreal minWidth = _drawBorders ? _min_column_width : 1;
|
||||||
if (_drawBorders)
|
if (_drawBorders)
|
||||||
p.setPen(profiler_gui::BLOCK_BORDER_COLOR);
|
p.setPen(profiler_gui::BLOCK_BORDER_COLOR);
|
||||||
|
|
||||||
@ -1433,7 +1396,7 @@ void GraphicsHistogramItem::updateImageAsync(QRectF _boundingRect, HistRegime _r
|
|||||||
const auto dtime = _top_duration - _bottom_duration;
|
const auto dtime = _top_duration - _bottom_duration;
|
||||||
const auto coeff = _boundingRect.height() / (dtime > 1e-3 ? dtime : 1.);
|
const auto coeff = _boundingRect.height() / (dtime > 1e-3 ? dtime : 1.);
|
||||||
|
|
||||||
const qreal minWidth = _drawBorders ? HIST_COLUMN_MIN_WIDTH_WITH_BORDER : 1.;
|
const qreal minWidth = _drawBorders ? _min_column_width : 1;
|
||||||
if (_drawBorders)
|
if (_drawBorders)
|
||||||
p.setPen(profiler_gui::BLOCK_BORDER_COLOR);
|
p.setPen(profiler_gui::BLOCK_BORDER_COLOR);
|
||||||
|
|
||||||
|
@ -143,8 +143,8 @@ private:
|
|||||||
void paintById(QPainter* _painter);
|
void paintById(QPainter* _painter);
|
||||||
|
|
||||||
void updateImageAsync(QRectF _boundingRect, HistRegime _regime, qreal _current_scale,
|
void updateImageAsync(QRectF _boundingRect, HistRegime _regime, qreal _current_scale,
|
||||||
qreal _minimum, qreal _maximum, qreal _range,
|
qreal _minimum, qreal _maximum, qreal _range, qreal _value, qreal _width,
|
||||||
qreal _value, qreal _width, qreal _top_duration, qreal _bottom_duration, bool _bindMode,
|
qreal _top_duration, qreal _bottom_duration, int _min_column_width, bool _bindMode,
|
||||||
float _frame_time, profiler::timestamp_t _begin_time, bool _autoAdjustHist, bool _drawBorders);
|
float _frame_time, profiler::timestamp_t _begin_time, bool _autoAdjustHist, bool _drawBorders);
|
||||||
|
|
||||||
}; // END of class GraphicsHistogramItem.
|
}; // END of class GraphicsHistogramItem.
|
||||||
|
@ -366,12 +366,12 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
|
|||||||
connect(this, &MainWindow::activationChanged, graphicsView->threadsView(), &ThreadNamesWidget::onWindowActivationChanged, Qt::QueuedConnection);
|
connect(this, &MainWindow::activationChanged, graphicsView->threadsView(), &ThreadNamesWidget::onWindowActivationChanged, Qt::QueuedConnection);
|
||||||
m_graphicsView->setWidget(graphicsView);
|
m_graphicsView->setWidget(graphicsView);
|
||||||
|
|
||||||
m_treeWidget = new DockWidget("Hierarchy", this);
|
m_treeWidget = new DockWidget("Stats", this);
|
||||||
m_treeWidget->setObjectName("ProfilerGUI_Hierarchy");
|
m_treeWidget->setObjectName("ProfilerGUI_Hierarchy");
|
||||||
m_treeWidget->setMinimumHeight(px(50));
|
m_treeWidget->setMinimumHeight(px(50));
|
||||||
m_treeWidget->setAllowedAreas(Qt::AllDockWidgetAreas);
|
m_treeWidget->setAllowedAreas(Qt::AllDockWidgetAreas);
|
||||||
|
|
||||||
auto treeWidget = new HierarchyWidget(this);
|
auto treeWidget = new StatsWidget(this);
|
||||||
m_treeWidget->setWidget(treeWidget);
|
m_treeWidget->setWidget(treeWidget);
|
||||||
|
|
||||||
m_fpsViewer = new DockWidget("FPS Monitor", this);
|
m_fpsViewer = new DockWidget("FPS Monitor", this);
|
||||||
@ -464,8 +464,8 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
|
|||||||
toolbar->addAction(QIcon(imagePath("expand")), "Expand all", this, SLOT(onExpandAllClicked(bool)));
|
toolbar->addAction(QIcon(imagePath("expand")), "Expand all", this, SLOT(onExpandAllClicked(bool)));
|
||||||
toolbar->addAction(QIcon(imagePath("collapse")), "Collapse all", this, SLOT(onCollapseAllClicked(bool)));
|
toolbar->addAction(QIcon(imagePath("collapse")), "Collapse all", this, SLOT(onCollapseAllClicked(bool)));
|
||||||
|
|
||||||
action = toolbar->addAction(QIcon(imagePath("binoculars")), "See blocks hierarchy");
|
action = toolbar->addAction(QIcon(imagePath("binoculars")), "Build stats tree");
|
||||||
action->setToolTip("Build blocks hierarchy\nfor current visible area\nor zoom to current selected area.");
|
action->setToolTip("Build stats tree\nfor current visible area\nor zoom to current selected area.");
|
||||||
connect(action, &QAction::triggered, [this] (bool) {
|
connect(action, &QAction::triggered, [this] (bool) {
|
||||||
static_cast<DiagramWidget*>(m_graphicsView->widget())->view()->inspectCurrentView(true);
|
static_cast<DiagramWidget*>(m_graphicsView->widget())->view()->inspectCurrentView(true);
|
||||||
});
|
});
|
||||||
@ -486,40 +486,11 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
|
|||||||
toolButton->setPopupMode(QToolButton::InstantPopup);
|
toolButton->setPopupMode(QToolButton::InstantPopup);
|
||||||
toolbar->addWidget(toolButton);
|
toolbar->addWidget(toolButton);
|
||||||
|
|
||||||
action = menu->addAction("Statistics enabled");
|
|
||||||
action->setCheckable(true);
|
|
||||||
action->setChecked(EASY_GLOBALS.enable_statistics);
|
|
||||||
connect(action, &QAction::triggered, this, &This::onEnableDisableStatistics);
|
|
||||||
if (EASY_GLOBALS.enable_statistics)
|
|
||||||
{
|
|
||||||
auto f = action->font();
|
|
||||||
f.setBold(true);
|
|
||||||
action->setFont(f);
|
|
||||||
action->setIcon(QIcon(imagePath("stats")));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
action->setText("Statistics disabled");
|
|
||||||
action->setIcon(QIcon(imagePath("stats-off")));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
auto submenu = menu->addMenu("Diagram");
|
||||||
action = menu->addAction("Only frames on histogram");
|
|
||||||
action->setToolTip("Display only top-level blocks on histogram.");
|
|
||||||
action->setCheckable(true);
|
|
||||||
action->setChecked(EASY_GLOBALS.display_only_frames_on_histogram);
|
|
||||||
connect(action, &QAction::triggered, [this](bool _checked)
|
|
||||||
{
|
|
||||||
EASY_GLOBALS.display_only_frames_on_histogram = _checked;
|
|
||||||
emit EASY_GLOBALS.events.displayOnlyFramesOnHistogramChanged();
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
menu->addSeparator();
|
|
||||||
auto submenu = menu->addMenu("View");
|
|
||||||
submenu->setToolTipsVisible(true);
|
submenu->setToolTipsVisible(true);
|
||||||
|
|
||||||
action = submenu->addAction("Diagram borders");
|
action = submenu->addAction("Draw borders");
|
||||||
action->setToolTip("Draw borders for blocks on diagram.\nThis slightly reduces performance.");
|
action->setToolTip("Draw borders for blocks on diagram.\nThis slightly reduces performance.");
|
||||||
action->setCheckable(true);
|
action->setCheckable(true);
|
||||||
action->setChecked(EASY_GLOBALS.draw_graphics_items_borders);
|
action->setChecked(EASY_GLOBALS.draw_graphics_items_borders);
|
||||||
@ -528,15 +499,6 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
|
|||||||
refreshDiagram();
|
refreshDiagram();
|
||||||
});
|
});
|
||||||
|
|
||||||
action = submenu->addAction("Histogram borders");
|
|
||||||
action->setToolTip("Draw borders for histogram columns.");
|
|
||||||
action->setCheckable(true);
|
|
||||||
action->setChecked(EASY_GLOBALS.draw_histogram_borders);
|
|
||||||
connect(action, &QAction::triggered, [this] (bool _checked) {
|
|
||||||
EASY_GLOBALS.draw_histogram_borders = _checked;
|
|
||||||
refreshHistogramImage();
|
|
||||||
});
|
|
||||||
|
|
||||||
action = submenu->addAction("Overlap narrow children");
|
action = submenu->addAction("Overlap narrow children");
|
||||||
action->setToolTip("Children blocks will be overlaped by narrow\nparent blocks. See also \'Blocks narrow size\'.\nThis improves performance.");
|
action->setToolTip("Children blocks will be overlaped by narrow\nparent blocks. See also \'Blocks narrow size\'.\nThis improves performance.");
|
||||||
action->setCheckable(true);
|
action->setCheckable(true);
|
||||||
@ -549,22 +511,6 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
|
|||||||
action->setChecked(EASY_GLOBALS.hide_minsize_blocks);
|
action->setChecked(EASY_GLOBALS.hide_minsize_blocks);
|
||||||
connect(action, &QAction::triggered, [this] (bool _checked) { EASY_GLOBALS.hide_minsize_blocks = _checked; refreshDiagram(); });
|
connect(action, &QAction::triggered, [this] (bool _checked) { EASY_GLOBALS.hide_minsize_blocks = _checked; refreshDiagram(); });
|
||||||
|
|
||||||
action = submenu->addAction("Build hierarchy only for current thread");
|
|
||||||
action->setToolTip("Hierarchy tree will be built\nfor blocks from current thread only.\nThis improves performance\nand saves a lot of memory.");
|
|
||||||
action->setCheckable(true);
|
|
||||||
action->setChecked(EASY_GLOBALS.only_current_thread_hierarchy);
|
|
||||||
connect(action, &QAction::triggered, this, &This::onHierarchyFlagChange);
|
|
||||||
|
|
||||||
action = submenu->addAction("Add zero blocks to hierarchy");
|
|
||||||
action->setToolTip("Zero duration blocks will be added into hierarchy tree.\nThis reduces performance and increases memory consumption.");
|
|
||||||
action->setCheckable(true);
|
|
||||||
action->setChecked(EASY_GLOBALS.add_zero_blocks_to_hierarchy);
|
|
||||||
connect(action, &QAction::triggered, [this](bool _checked)
|
|
||||||
{
|
|
||||||
EASY_GLOBALS.add_zero_blocks_to_hierarchy = _checked;
|
|
||||||
emit EASY_GLOBALS.events.hierarchyFlagChanged(_checked);
|
|
||||||
});
|
|
||||||
|
|
||||||
action = submenu->addAction("Enable zero duration blocks on diagram");
|
action = submenu->addAction("Enable zero duration blocks on diagram");
|
||||||
action->setToolTip("If checked then allows diagram to paint zero duration blocks\nwith 1px width on each scale. Otherwise, such blocks will be resized\nto 250ns duration.");
|
action->setToolTip("If checked then allows diagram to paint zero duration blocks\nwith 1px width on each scale. Otherwise, such blocks will be resized\nto 250ns duration.");
|
||||||
action->setCheckable(true);
|
action->setCheckable(true);
|
||||||
@ -578,7 +524,7 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
|
|||||||
connect(action, &QAction::triggered, [this] (bool _checked) { EASY_GLOBALS.highlight_blocks_with_same_id = _checked; refreshDiagram(); });
|
connect(action, &QAction::triggered, [this] (bool _checked) { EASY_GLOBALS.highlight_blocks_with_same_id = _checked; refreshDiagram(); });
|
||||||
|
|
||||||
action = submenu->addAction("Collapse blocks on tree reset");
|
action = submenu->addAction("Collapse blocks on tree reset");
|
||||||
action->setToolTip("This collapses all blocks on diagram\nafter hierarchy tree reset.");
|
action->setToolTip("This collapses all blocks on diagram\nafter stats tree reset.");
|
||||||
action->setCheckable(true);
|
action->setCheckable(true);
|
||||||
action->setChecked(EASY_GLOBALS.collapse_items_on_tree_close);
|
action->setChecked(EASY_GLOBALS.collapse_items_on_tree_close);
|
||||||
connect(action, &QAction::triggered, this, &This::onCollapseItemsAfterCloseChanged);
|
connect(action, &QAction::triggered, this, &This::onCollapseItemsAfterCloseChanged);
|
||||||
@ -590,17 +536,11 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
|
|||||||
connect(action, &QAction::triggered, this, &This::onAllItemsExpandedByDefaultChange);
|
connect(action, &QAction::triggered, this, &This::onAllItemsExpandedByDefaultChange);
|
||||||
|
|
||||||
action = submenu->addAction("Bind diagram and tree expand");
|
action = submenu->addAction("Bind diagram and tree expand");
|
||||||
action->setToolTip("Expanding/collapsing blocks at diagram expands/collapses\nblocks at hierarchy tree and wise versa.");
|
action->setToolTip("Expanding/collapsing blocks at diagram expands/collapses\nblocks at stats tree and wise versa.");
|
||||||
action->setCheckable(true);
|
action->setCheckable(true);
|
||||||
action->setChecked(EASY_GLOBALS.bind_scene_and_tree_expand_status);
|
action->setChecked(EASY_GLOBALS.bind_scene_and_tree_expand_status);
|
||||||
connect(action, &QAction::triggered, this, &This::onBindExpandStatusChange);
|
connect(action, &QAction::triggered, this, &This::onBindExpandStatusChange);
|
||||||
|
|
||||||
action = submenu->addAction("Hide stats for single blocks in tree");
|
|
||||||
action->setToolTip("If checked then such stats like Min,Max,Avg etc.\nwill not be displayed in stats tree for blocks\nwith number of calls == 1");
|
|
||||||
action->setCheckable(true);
|
|
||||||
action->setChecked(EASY_GLOBALS.display_only_relevant_stats);
|
|
||||||
connect(action, &QAction::triggered, this, &This::onDisplayRelevantStatsChange);
|
|
||||||
|
|
||||||
action = submenu->addAction("Selecting block changes current thread");
|
action = submenu->addAction("Selecting block changes current thread");
|
||||||
action->setToolTip("Automatically select thread while selecting a block.\nIf not checked then you will have to select current thread\nmanually double clicking on thread name on a diagram.");
|
action->setToolTip("Automatically select thread while selecting a block.\nIf not checked then you will have to select current thread\nmanually double clicking on thread name on a diagram.");
|
||||||
action->setCheckable(true);
|
action->setCheckable(true);
|
||||||
@ -617,46 +557,6 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
|
|||||||
refreshDiagram();
|
refreshDiagram();
|
||||||
});
|
});
|
||||||
|
|
||||||
action = submenu->addAction("Automatically adjust histogram height");
|
|
||||||
action->setToolTip("You do not need to adjust boundaries manually,\nbut this restricts you from adjusting boundaries at all (zoom mode).\nYou can still adjust boundaries in overview mode though.");
|
|
||||||
action->setCheckable(true);
|
|
||||||
action->setChecked(EASY_GLOBALS.auto_adjust_histogram_height);
|
|
||||||
connect(action, &QAction::triggered, [](bool _checked)
|
|
||||||
{
|
|
||||||
EASY_GLOBALS.auto_adjust_histogram_height = _checked;
|
|
||||||
emit EASY_GLOBALS.events.autoAdjustHistogramChanged();
|
|
||||||
});
|
|
||||||
|
|
||||||
action = submenu->addAction("Automatically adjust chart height");
|
|
||||||
action->setToolTip("Same as similar option for histogram\nbut used for arbitrary values charts.");
|
|
||||||
action->setCheckable(true);
|
|
||||||
action->setChecked(EASY_GLOBALS.auto_adjust_chart_height);
|
|
||||||
connect(action, &QAction::triggered, [](bool _checked)
|
|
||||||
{
|
|
||||||
EASY_GLOBALS.auto_adjust_chart_height = _checked;
|
|
||||||
emit EASY_GLOBALS.events.autoAdjustChartChanged();
|
|
||||||
});
|
|
||||||
|
|
||||||
action = submenu->addAction("Use decorated thread names");
|
|
||||||
action->setToolTip("Add \'Thread\' word into thread name if there is no one already.\nExamples: \'Render\' will change to \'Render Thread\'\n\'WorkerThread\' will not change.");
|
|
||||||
action->setCheckable(true);
|
|
||||||
action->setChecked(EASY_GLOBALS.use_decorated_thread_name);
|
|
||||||
connect(action, &QAction::triggered, [this](bool _checked)
|
|
||||||
{
|
|
||||||
EASY_GLOBALS.use_decorated_thread_name = _checked;
|
|
||||||
emit EASY_GLOBALS.events.threadNameDecorationChanged();
|
|
||||||
});
|
|
||||||
|
|
||||||
action = submenu->addAction("Display hex thread id");
|
|
||||||
action->setToolTip("Display hex thread id instead of decimal.");
|
|
||||||
action->setCheckable(true);
|
|
||||||
action->setChecked(EASY_GLOBALS.hex_thread_id);
|
|
||||||
connect(action, &QAction::triggered, [this](bool _checked)
|
|
||||||
{
|
|
||||||
EASY_GLOBALS.hex_thread_id = _checked;
|
|
||||||
emit EASY_GLOBALS.events.hexThreadIdChanged();
|
|
||||||
});
|
|
||||||
|
|
||||||
submenu->addSeparator();
|
submenu->addSeparator();
|
||||||
auto actionGroup = new QActionGroup(this);
|
auto actionGroup = new QActionGroup(this);
|
||||||
actionGroup->setExclusive(true);
|
actionGroup->setExclusive(true);
|
||||||
@ -735,7 +635,100 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
|
|||||||
submenu->addAction(waction);
|
submenu->addAction(waction);
|
||||||
|
|
||||||
|
|
||||||
|
submenu = menu->addMenu("Histogram");
|
||||||
|
submenu->setToolTipsVisible(true);
|
||||||
|
|
||||||
|
action = submenu->addAction("Draw borders");
|
||||||
|
action->setToolTip("Draw borders for histogram columns.");
|
||||||
|
action->setCheckable(true);
|
||||||
|
action->setChecked(EASY_GLOBALS.draw_histogram_borders);
|
||||||
|
connect(action, &QAction::triggered, [this] (bool _checked) {
|
||||||
|
EASY_GLOBALS.draw_histogram_borders = _checked;
|
||||||
|
refreshHistogramImage();
|
||||||
|
});
|
||||||
|
|
||||||
|
action = submenu->addAction("Automatically adjust histogram height");
|
||||||
|
action->setToolTip("You do not need to adjust boundaries manually,\n"
|
||||||
|
"but this restricts you from adjusting boundaries at all (zoom mode).\n"
|
||||||
|
"You can still adjust boundaries in overview mode though.");
|
||||||
|
action->setCheckable(true);
|
||||||
|
action->setChecked(EASY_GLOBALS.auto_adjust_histogram_height);
|
||||||
|
connect(action, &QAction::triggered, [] (bool _checked)
|
||||||
|
{
|
||||||
|
EASY_GLOBALS.auto_adjust_histogram_height = _checked;
|
||||||
|
emit EASY_GLOBALS.events.autoAdjustHistogramChanged();
|
||||||
|
});
|
||||||
|
|
||||||
|
action = submenu->addAction("Only frames on histogram");
|
||||||
|
action->setToolTip("Display only top-level blocks on histogram.");
|
||||||
|
action->setCheckable(true);
|
||||||
|
action->setChecked(EASY_GLOBALS.display_only_frames_on_histogram);
|
||||||
|
connect(action, &QAction::triggered, [this] (bool _checked)
|
||||||
|
{
|
||||||
|
EASY_GLOBALS.display_only_frames_on_histogram = _checked;
|
||||||
|
emit EASY_GLOBALS.events.displayOnlyFramesOnHistogramChanged();
|
||||||
|
});
|
||||||
|
|
||||||
submenu->addSeparator();
|
submenu->addSeparator();
|
||||||
|
w = new QWidget(submenu);
|
||||||
|
l = new QHBoxLayout(w);
|
||||||
|
l->setContentsMargins(26, 1, 16, 1);
|
||||||
|
l->addWidget(new QLabel("Min column width, px", w), 0, Qt::AlignLeft);
|
||||||
|
spinbox = new QSpinBox(w);
|
||||||
|
spinbox->setRange(1, 400);
|
||||||
|
spinbox->setValue(EASY_GLOBALS.histogram_column_width_min);
|
||||||
|
spinbox->setFixedWidth(px(70));
|
||||||
|
connect(spinbox, Overload<int>::of(&QSpinBox::valueChanged), this, &This::onHistogramMinSizeChange);
|
||||||
|
l->addWidget(spinbox);
|
||||||
|
w->setLayout(l);
|
||||||
|
waction = new QWidgetAction(submenu);
|
||||||
|
waction->setDefaultWidget(w);
|
||||||
|
waction->setToolTip("Minimum column width when borders are enabled.");
|
||||||
|
submenu->addAction(waction);
|
||||||
|
|
||||||
|
|
||||||
|
submenu = menu->addMenu("Stats");
|
||||||
|
submenu->setToolTipsVisible(true);
|
||||||
|
|
||||||
|
action = submenu->addAction("Statistics enabled");
|
||||||
|
action->setCheckable(true);
|
||||||
|
action->setChecked(EASY_GLOBALS.enable_statistics);
|
||||||
|
connect(action, &QAction::triggered, this, &This::onEnableDisableStatistics);
|
||||||
|
if (EASY_GLOBALS.enable_statistics)
|
||||||
|
{
|
||||||
|
auto f = action->font();
|
||||||
|
f.setBold(true);
|
||||||
|
action->setFont(f);
|
||||||
|
action->setIcon(QIcon(imagePath("stats")));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
action->setText("Statistics disabled");
|
||||||
|
action->setIcon(QIcon(imagePath("stats-off")));
|
||||||
|
}
|
||||||
|
|
||||||
|
action = submenu->addAction("Build tree only for current thread");
|
||||||
|
action->setToolTip("Stats tree will be built\nfor blocks from current thread only.\nThis improves performance\nand saves a lot of memory for Call-stack mode.");
|
||||||
|
action->setCheckable(true);
|
||||||
|
action->setChecked(EASY_GLOBALS.only_current_thread_hierarchy);
|
||||||
|
connect(action, &QAction::triggered, this, &This::onHierarchyFlagChange);
|
||||||
|
|
||||||
|
action = submenu->addAction("Add zero blocks to the tree");
|
||||||
|
action->setToolTip("Zero duration blocks will be added into stats tree.\nThis reduces performance and increases memory consumption.");
|
||||||
|
action->setCheckable(true);
|
||||||
|
action->setChecked(EASY_GLOBALS.add_zero_blocks_to_hierarchy);
|
||||||
|
connect(action, &QAction::triggered, [this](bool _checked)
|
||||||
|
{
|
||||||
|
EASY_GLOBALS.add_zero_blocks_to_hierarchy = _checked;
|
||||||
|
emit EASY_GLOBALS.events.hierarchyFlagChanged(_checked);
|
||||||
|
});
|
||||||
|
|
||||||
|
action = submenu->addAction("Hide stats for single blocks in tree");
|
||||||
|
action->setToolTip("If checked then such stats like Min,Max,Avg etc.\nwill not be displayed in stats tree for blocks\nwith number of calls == 1");
|
||||||
|
action->setCheckable(true);
|
||||||
|
action->setChecked(EASY_GLOBALS.hide_stats_for_single_blocks);
|
||||||
|
connect(action, &QAction::triggered, this, &This::onDisplayRelevantStatsChange);
|
||||||
|
|
||||||
w = new QWidget(submenu);
|
w = new QWidget(submenu);
|
||||||
l = new QHBoxLayout(w);
|
l = new QHBoxLayout(w);
|
||||||
l->setContentsMargins(26, 1, 16, 1);
|
l->setContentsMargins(26, 1, 16, 1);
|
||||||
@ -752,6 +745,39 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
|
|||||||
submenu->addAction(waction);
|
submenu->addAction(waction);
|
||||||
|
|
||||||
|
|
||||||
|
submenu = menu->addMenu("General");
|
||||||
|
submenu->setToolTipsVisible(true);
|
||||||
|
|
||||||
|
action = submenu->addAction("Automatically adjust values chart height");
|
||||||
|
action->setToolTip("Automatically adjusts arbitrary values chart height\nfor currently visible region.");
|
||||||
|
action->setCheckable(true);
|
||||||
|
action->setChecked(EASY_GLOBALS.auto_adjust_chart_height);
|
||||||
|
connect(action, &QAction::triggered, [](bool _checked)
|
||||||
|
{
|
||||||
|
EASY_GLOBALS.auto_adjust_chart_height = _checked;
|
||||||
|
emit EASY_GLOBALS.events.autoAdjustChartChanged();
|
||||||
|
});
|
||||||
|
|
||||||
|
action = submenu->addAction("Use decorated thread names");
|
||||||
|
action->setToolTip("Add \'Thread\' word into thread name if there is no one already.\nExamples: \'Render\' will change to \'Render Thread\'\n\'WorkerThread\' will not change.");
|
||||||
|
action->setCheckable(true);
|
||||||
|
action->setChecked(EASY_GLOBALS.use_decorated_thread_name);
|
||||||
|
connect(action, &QAction::triggered, [this](bool _checked)
|
||||||
|
{
|
||||||
|
EASY_GLOBALS.use_decorated_thread_name = _checked;
|
||||||
|
emit EASY_GLOBALS.events.threadNameDecorationChanged();
|
||||||
|
});
|
||||||
|
|
||||||
|
action = submenu->addAction("Display hex thread id");
|
||||||
|
action->setToolTip("Display hex thread id instead of decimal.");
|
||||||
|
action->setCheckable(true);
|
||||||
|
action->setChecked(EASY_GLOBALS.hex_thread_id);
|
||||||
|
connect(action, &QAction::triggered, [this](bool _checked)
|
||||||
|
{
|
||||||
|
EASY_GLOBALS.hex_thread_id = _checked;
|
||||||
|
emit EASY_GLOBALS.events.hexThreadIdChanged();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
submenu = menu->addMenu("FPS Monitor");
|
submenu = menu->addMenu("FPS Monitor");
|
||||||
w = new QWidget(submenu);
|
w = new QWidget(submenu);
|
||||||
@ -1457,7 +1483,7 @@ void MainWindow::onBindExpandStatusChange(bool _checked)
|
|||||||
|
|
||||||
void MainWindow::onDisplayRelevantStatsChange(bool _checked)
|
void MainWindow::onDisplayRelevantStatsChange(bool _checked)
|
||||||
{
|
{
|
||||||
EASY_GLOBALS.display_only_relevant_stats = _checked;
|
EASY_GLOBALS.hide_stats_for_single_blocks = _checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::onHierarchyFlagChange(bool _checked)
|
void MainWindow::onHierarchyFlagChange(bool _checked)
|
||||||
@ -1475,7 +1501,7 @@ void MainWindow::onExpandAllClicked(bool)
|
|||||||
|
|
||||||
emit EASY_GLOBALS.events.itemsExpandStateChanged();
|
emit EASY_GLOBALS.events.itemsExpandStateChanged();
|
||||||
|
|
||||||
auto tree = static_cast<HierarchyWidget*>(m_treeWidget->widget())->tree();
|
auto tree = static_cast<StatsWidget*>(m_treeWidget->widget())->tree();
|
||||||
const QSignalBlocker b(tree);
|
const QSignalBlocker b(tree);
|
||||||
tree->expandAll();
|
tree->expandAll();
|
||||||
}
|
}
|
||||||
@ -1487,7 +1513,7 @@ void MainWindow::onCollapseAllClicked(bool)
|
|||||||
|
|
||||||
emit EASY_GLOBALS.events.itemsExpandStateChanged();
|
emit EASY_GLOBALS.events.itemsExpandStateChanged();
|
||||||
|
|
||||||
auto tree = static_cast<HierarchyWidget*>(m_treeWidget->widget())->tree();
|
auto tree = static_cast<StatsWidget*>(m_treeWidget->widget())->tree();
|
||||||
const QSignalBlocker b(tree);
|
const QSignalBlocker b(tree);
|
||||||
tree->collapseAll();
|
tree->collapseAll();
|
||||||
}
|
}
|
||||||
@ -1527,6 +1553,12 @@ void MainWindow::onMinSizeChange(int _value)
|
|||||||
refreshDiagram();
|
refreshDiagram();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::onHistogramMinSizeChange(int _value)
|
||||||
|
{
|
||||||
|
EASY_GLOBALS.histogram_column_width_min = _value;
|
||||||
|
refreshHistogramImage();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::onNarrowSizeChange(int _value)
|
void MainWindow::onNarrowSizeChange(int _value)
|
||||||
{
|
{
|
||||||
EASY_GLOBALS.blocks_narrow_size = _value;
|
EASY_GLOBALS.blocks_narrow_size = _value;
|
||||||
@ -1733,6 +1765,10 @@ void MainWindow::loadSettings()
|
|||||||
if (!val.isNull())
|
if (!val.isNull())
|
||||||
EASY_GLOBALS.blocks_size_min = val.toInt();
|
EASY_GLOBALS.blocks_size_min = val.toInt();
|
||||||
|
|
||||||
|
val = settings.value("histogram_column_width_min");
|
||||||
|
if (!val.isNull())
|
||||||
|
EASY_GLOBALS.histogram_column_width_min = val.toInt();
|
||||||
|
|
||||||
val = settings.value("blocks_narrow_size");
|
val = settings.value("blocks_narrow_size");
|
||||||
if (!val.isNull())
|
if (!val.isNull())
|
||||||
EASY_GLOBALS.blocks_narrow_size = val.toInt();
|
EASY_GLOBALS.blocks_narrow_size = val.toInt();
|
||||||
@ -1783,9 +1819,9 @@ void MainWindow::loadSettings()
|
|||||||
if (!flag.isNull())
|
if (!flag.isNull())
|
||||||
EASY_GLOBALS.bind_scene_and_tree_expand_status = flag.toBool();
|
EASY_GLOBALS.bind_scene_and_tree_expand_status = flag.toBool();
|
||||||
|
|
||||||
flag = settings.value("display_only_relevant_stats");
|
flag = settings.value("hide_stats_for_single_blocks");
|
||||||
if (!flag.isNull())
|
if (!flag.isNull())
|
||||||
EASY_GLOBALS.display_only_relevant_stats = flag.toBool();
|
EASY_GLOBALS.hide_stats_for_single_blocks = flag.toBool();
|
||||||
|
|
||||||
flag = settings.value("selecting_block_changes_thread");
|
flag = settings.value("selecting_block_changes_thread");
|
||||||
if (!flag.isNull())
|
if (!flag.isNull())
|
||||||
@ -1909,6 +1945,7 @@ void MainWindow::saveSettingsAndGeometry()
|
|||||||
settings.setValue("max_rows_count", EASY_GLOBALS.max_rows_count);
|
settings.setValue("max_rows_count", EASY_GLOBALS.max_rows_count);
|
||||||
settings.setValue("blocks_spacing", EASY_GLOBALS.blocks_spacing);
|
settings.setValue("blocks_spacing", EASY_GLOBALS.blocks_spacing);
|
||||||
settings.setValue("blocks_size_min", EASY_GLOBALS.blocks_size_min);
|
settings.setValue("blocks_size_min", EASY_GLOBALS.blocks_size_min);
|
||||||
|
settings.setValue("histogram_column_width_min", EASY_GLOBALS.histogram_column_width_min);
|
||||||
settings.setValue("blocks_narrow_size", EASY_GLOBALS.blocks_narrow_size);
|
settings.setValue("blocks_narrow_size", EASY_GLOBALS.blocks_narrow_size);
|
||||||
settings.setValue("draw_graphics_items_borders", EASY_GLOBALS.draw_graphics_items_borders);
|
settings.setValue("draw_graphics_items_borders", EASY_GLOBALS.draw_graphics_items_borders);
|
||||||
settings.setValue("draw_histogram_borders", EASY_GLOBALS.draw_histogram_borders);
|
settings.setValue("draw_histogram_borders", EASY_GLOBALS.draw_histogram_borders);
|
||||||
@ -1921,7 +1958,7 @@ void MainWindow::saveSettingsAndGeometry()
|
|||||||
settings.setValue("add_zero_blocks_to_hierarchy", EASY_GLOBALS.add_zero_blocks_to_hierarchy);
|
settings.setValue("add_zero_blocks_to_hierarchy", EASY_GLOBALS.add_zero_blocks_to_hierarchy);
|
||||||
settings.setValue("highlight_blocks_with_same_id", EASY_GLOBALS.highlight_blocks_with_same_id);
|
settings.setValue("highlight_blocks_with_same_id", EASY_GLOBALS.highlight_blocks_with_same_id);
|
||||||
settings.setValue("bind_scene_and_tree_expand_status", EASY_GLOBALS.bind_scene_and_tree_expand_status);
|
settings.setValue("bind_scene_and_tree_expand_status", EASY_GLOBALS.bind_scene_and_tree_expand_status);
|
||||||
settings.setValue("display_only_relevant_stats", EASY_GLOBALS.display_only_relevant_stats);
|
settings.setValue("hide_stats_for_single_blocks", EASY_GLOBALS.hide_stats_for_single_blocks);
|
||||||
settings.setValue("selecting_block_changes_thread", EASY_GLOBALS.selecting_block_changes_thread);
|
settings.setValue("selecting_block_changes_thread", EASY_GLOBALS.selecting_block_changes_thread);
|
||||||
settings.setValue("enable_event_indicators", EASY_GLOBALS.enable_event_markers);
|
settings.setValue("enable_event_indicators", EASY_GLOBALS.enable_event_markers);
|
||||||
settings.setValue("auto_adjust_histogram_height", EASY_GLOBALS.auto_adjust_histogram_height);
|
settings.setValue("auto_adjust_histogram_height", EASY_GLOBALS.auto_adjust_histogram_height);
|
||||||
|
@ -347,6 +347,7 @@ protected slots:
|
|||||||
void onMaxBlocksCountChange(int _value);
|
void onMaxBlocksCountChange(int _value);
|
||||||
void onSpacingChange(int _value);
|
void onSpacingChange(int _value);
|
||||||
void onMinSizeChange(int _value);
|
void onMinSizeChange(int _value);
|
||||||
|
void onHistogramMinSizeChange(int _value);
|
||||||
void onNarrowSizeChange(int _value);
|
void onNarrowSizeChange(int _value);
|
||||||
void onFpsIntervalChange(int _value);
|
void onFpsIntervalChange(int _value);
|
||||||
void onFpsHistoryChange(int _value);
|
void onFpsHistoryChange(int _value);
|
||||||
|
@ -310,7 +310,7 @@ QMenu {
|
|||||||
QMenu::item {
|
QMenu::item {
|
||||||
height: 15ex;
|
height: 15ex;
|
||||||
padding-left: 17ex;
|
padding-left: 17ex;
|
||||||
padding-right: 5ex;
|
padding-right: 10ex;
|
||||||
border: 1px solid transparent;
|
border: 1px solid transparent;
|
||||||
/* reserve space for selection border */ }
|
/* reserve space for selection border */ }
|
||||||
|
|
||||||
|
@ -425,7 +425,7 @@ QMenu {
|
|||||||
QMenu::item {
|
QMenu::item {
|
||||||
height: $InputHeight;
|
height: $InputHeight;
|
||||||
padding-left: 17ex;
|
padding-left: 17ex;
|
||||||
padding-right: 5ex;
|
padding-right: 10ex;
|
||||||
border: 1px solid transparent; /* reserve space for selection border */
|
border: 1px solid transparent; /* reserve space for selection border */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,7 +272,7 @@ QVariant TreeWidgetItem::relevantData(int _column, int _role) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EASY_GLOBALS.display_only_relevant_stats && _role == Qt::DisplayRole)
|
if (EASY_GLOBALS.hide_stats_for_single_blocks && _role == Qt::DisplayRole)
|
||||||
{
|
{
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ static void fillStatsColumns(
|
|||||||
item->setData(max_column, MinMaxBlockIndexRole, stats->max_duration_block);
|
item->setData(max_column, MinMaxBlockIndexRole, stats->max_duration_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stats->calls_number < 2)// && EASY_GLOBALS.display_only_relevant_stats)
|
if (stats->calls_number < 2)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user