0
0
mirror of https://github.com/yse/easy_profiler.git synced 2024-12-25 23:40:51 +08:00

[ui] rearrange settings; some renames

This commit is contained in:
Victor Zarubkin 2019-10-27 14:27:53 +03:00
parent 33850d5abf
commit 0dc5a71aad
16 changed files with 218 additions and 211 deletions

View File

@ -6,7 +6,7 @@
* email : v.s.zarubkin@gmail.com
* ----------------- :
* 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++
* : Copyright(C) 2016-2019 Sergey Yagovtsev, Victor Zarubkin

View File

@ -6,7 +6,7 @@
* email : v.s.zarubkin@gmail.com
* ----------------- :
* 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++
* : Copyright(C) 2016-2019 Sergey Yagovtsev, Victor Zarubkin

View File

@ -1721,7 +1721,7 @@ void BlocksGraphicsView::mouseReleaseEvent(QMouseEvent* _event)
//////////////////////////////////////////////////////////////////////////
void BlocksGraphicsView::addSelectionToHierarchy()
void BlocksGraphicsView::addSelectionToStatsTree()
{
if (!m_selectionItem->isVisible())
return;
@ -1806,7 +1806,7 @@ void BlocksGraphicsView::onInspectCurrentView(bool strict)
emit EASY_GLOBALS.events.rulerVisible(true);
addSelectionToHierarchy();
addSelectionToStatsTree();
}
else
{

View File

@ -301,7 +301,7 @@ private:
void revalidateOffset();
void addSelectionToHierarchy();
void addSelectionToStatsTree();
private slots:

View File

@ -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] = {
true // COL_NAME = 0,
@ -183,6 +185,8 @@ const bool SELECTION_MODE_COLUMNS[COL_COLUMNS_NUMBER] = {
, true // COL_NCALLS_PER_AREA,
};
} // end of namespace <noname>.
//////////////////////////////////////////////////////////////////////////
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 2: Just click the right mouse button on any block", this);
m_hintLabel->setObjectName(QStringLiteral("BlocksTreeWidget_HintLabel"));
@ -492,15 +496,15 @@ void BlocksTreeWidget::mousePressEvent(QMouseEvent* _event)
void BlocksTreeWidget::onFillTimerTimeout()
{
if (m_hierarchyBuilder.done())
if (m_treeBuilder.done())
{
m_fillTimer.stop();
ThreadedItems toplevelitems;
m_hierarchyBuilder.takeItems(m_items);
m_hierarchyBuilder.takeTopLevelItems(toplevelitems);
auto error = m_hierarchyBuilder.error();
m_hierarchyBuilder.interrupt();
m_treeBuilder.takeItems(m_items);
m_treeBuilder.takeTopLevelItems(toplevelitems);
auto error = m_treeBuilder.error();
m_treeBuilder.interrupt();
{
const QSignalBlocker b(this);
for (auto& item : toplevelitems)
@ -557,7 +561,7 @@ void BlocksTreeWidget::onFillTimerTimeout()
}
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_hintLabel->hide();
createProgressDialog();
m_hierarchyBuilder.fillTreeBlocks(m_inputBlocks, _session_begin_time, _left, _right, _strict, m_mode);
m_fillTimer.start(HIERARCHY_BUILDER_TIMER_INTERVAL);
m_treeBuilder.fillTreeBlocks(m_inputBlocks, _session_begin_time, _left, _right, _strict, m_mode);
m_fillTimer.start(TREE_BUILDER_TIMER_INTERVAL);
}
//StubLocker l;
@ -647,7 +651,7 @@ void BlocksTreeWidget::clearSilent(bool _global)
{
const QSignalBlocker b(this);
m_hierarchyBuilder.interrupt();
m_treeBuilder.interrupt();
destroyProgressDialog();
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_searchBox(new QLineEdit(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();
}
HierarchyWidget::~HierarchyWidget()
StatsWidget::~StatsWidget()
{
saveSettings();
}
void HierarchyWidget::loadSettings()
void StatsWidget::loadSettings()
{
QSettings settings(profiler_gui::ORGANAZATION_NAME, profiler_gui::APPLICATION_NAME);
settings.beginGroup("HierarchyWidget");
@ -1630,7 +1634,7 @@ void HierarchyWidget::loadSettings()
settings.endGroup();
}
void HierarchyWidget::saveSettings()
void StatsWidget::saveSettings()
{
QSettings settings(profiler_gui::ORGANAZATION_NAME, profiler_gui::APPLICATION_NAME);
settings.beginGroup("HierarchyWidget");
@ -1638,19 +1642,19 @@ void HierarchyWidget::saveSettings()
settings.endGroup();
}
void HierarchyWidget::enterEvent(QEvent* event)
void StatsWidget::enterEvent(QEvent* event)
{
Parent::enterEvent(event);
m_tree->updateHintLabelOnHover(true);
}
void HierarchyWidget::leaveEvent(QEvent* event)
void StatsWidget::leaveEvent(QEvent* event)
{
Parent::leaveEvent(event);
m_tree->updateHintLabelOnHover(false);
}
void HierarchyWidget::keyPressEvent(QKeyEvent* _event)
void StatsWidget::keyPressEvent(QKeyEvent* _event)
{
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);
}
void HierarchyWidget::showEvent(QShowEvent* event)
void StatsWidget::showEvent(QShowEvent* event)
{
Parent::showEvent(event);
m_searchBox->setFixedWidth(px(300));
@ -1690,19 +1694,19 @@ void HierarchyWidget::showEvent(QShowEvent* event)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BlocksTreeWidget* HierarchyWidget::tree()
BlocksTreeWidget* StatsWidget::tree()
{
return m_tree;
}
void HierarchyWidget::clear(bool _global)
void StatsWidget::clear(bool _global)
{
m_tree->clearSilent(_global);
m_foundNumber->setText(QStringLiteral("<font color=\"red\">0</font> matches"));
m_foundNumber->hide();
}
void HierarchyWidget::onSeachBoxReturnPressed()
void StatsWidget::onSeachBoxReturnPressed()
{
if (m_searchButton->data().toBool())
findNext(true);
@ -1710,7 +1714,7 @@ void HierarchyWidget::onSeachBoxReturnPressed()
findPrev(true);
}
void HierarchyWidget::onSearchBoxTextChanged(const QString& _text)
void StatsWidget::onSearchBoxTextChanged(const QString& _text)
{
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();
if (text.isEmpty())
@ -1752,7 +1756,7 @@ void HierarchyWidget::findNext(bool)
m_foundNumber->show();
}
void HierarchyWidget::findPrev(bool)
void StatsWidget::findPrev(bool)
{
auto text = m_searchBox->text();
if (text.isEmpty())
@ -1785,7 +1789,7 @@ void HierarchyWidget::findPrev(bool)
m_foundNumber->show();
}
void HierarchyWidget::findNextFromMenu(bool _checked)
void StatsWidget::findNextFromMenu(bool _checked)
{
if (!_checked)
return;
@ -1802,7 +1806,7 @@ void HierarchyWidget::findNextFromMenu(bool _checked)
findNext(true);
}
void HierarchyWidget::findPrevFromMenu(bool _checked)
void StatsWidget::findPrevFromMenu(bool _checked)
{
if (!_checked)
return;

View File

@ -82,7 +82,7 @@ class BlocksTreeWidget : public QTreeWidget
protected:
TreeWidgetLoader m_hierarchyBuilder;
TreeWidgetLoader m_treeBuilder;
Items m_items;
RootsMap m_roots;
::profiler_gui::TreeBlocks m_inputBlocks;
@ -189,12 +189,12 @@ private:
//////////////////////////////////////////////////////////////////////////
class HierarchyWidget : public QWidget
class StatsWidget : public QWidget
{
Q_OBJECT
using Parent = QWidget;
using This = HierarchyWidget;
using This = StatsWidget;
private:
@ -208,8 +208,8 @@ public:
// Public virtual methods
explicit HierarchyWidget(QWidget* _parent = nullptr);
~HierarchyWidget() override;
explicit StatsWidget(QWidget* _parent = nullptr);
~StatsWidget() override;
void enterEvent(QEvent* event) override;
void leaveEvent(QEvent* event) override;

View File

@ -89,6 +89,7 @@ Globals::Globals()
, frame_time(16700)
, blocks_spacing(0)
, blocks_size_min(2)
, histogram_column_width_min(2)
, blocks_narrow_size(20)
, max_fps_history(90)
, fps_timer_interval(500)
@ -111,7 +112,7 @@ Globals::Globals()
, draw_histogram_borders(true)
, hide_narrow_children(false)
, hide_minsize_blocks(false)
, display_only_relevant_stats(false)
, hide_stats_for_single_blocks(false)
, collapse_items_on_tree_close(false)
, all_items_expanded_by_default(true)
, only_current_thread_hierarchy(false)

View File

@ -215,11 +215,12 @@ namespace profiler_gui {
::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 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
int blocks_spacing; ///< Minimum blocks spacing 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 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)
@ -245,7 +246,7 @@ namespace profiler_gui {
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_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 all_items_expanded_by_default; ///< Expand all items after file is opened
bool only_current_thread_hierarchy; ///< Build hierarchy tree for current thread only

View File

@ -66,7 +66,6 @@ namespace {
//////////////////////////////////////////////////////////////////////////
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
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)
{
// Draw marker displaying expected frame_time step
@ -406,24 +387,6 @@ void GraphicsHistogramItem::paintById(QPainter* _painter)
// MEDIAN & EXPECTED FRAME TIME
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)
{
// Draw marker displaying required frame_time step
@ -1057,9 +1020,10 @@ bool GraphicsHistogramItem::updateImage()
const auto beginTime = EASY_GLOBALS.begin_time;
const auto autoHeight = EASY_GLOBALS.auto_adjust_histogram_height;
const auto drawBorders = EASY_GLOBALS.draw_histogram_borders;
const auto minColumnWidth = EASY_GLOBALS.histogram_column_width_min;
m_worker.enqueue([=] {
updateImageAsync(rect, regime, scale, left, right, right - left, value, window, top, bottom, bindMode,
frameTime, beginTime, autoHeight, drawBorders);
updateImageAsync(rect, regime, scale, left, right, right - left, value, window, top, bottom,
minColumnWidth, bindMode, frameTime, beginTime, autoHeight, drawBorders);
}, m_bReady);
return true;
@ -1095,9 +1059,8 @@ void GraphicsHistogramItem::onImageUpdated()
}
void GraphicsHistogramItem::updateImageAsync(QRectF _boundingRect, HistRegime _regime, qreal _current_scale,
qreal _minimum, qreal _maximum, qreal _range,
qreal _value, qreal _width, qreal _top_duration, qreal _bottom_duration,
bool _bindMode, float _frame_time, profiler::timestamp_t _begin_time, bool _autoAdjustHist, bool _drawBorders)
qreal _minimum, qreal _maximum, qreal _range, 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)
{
const auto bottom = _boundingRect.height();//_boundingRect.bottom();
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 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)
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 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)
p.setPen(profiler_gui::BLOCK_BORDER_COLOR);

View File

@ -143,8 +143,8 @@ private:
void paintById(QPainter* _painter);
void updateImageAsync(QRectF _boundingRect, HistRegime _regime, qreal _current_scale,
qreal _minimum, qreal _maximum, qreal _range,
qreal _value, qreal _width, qreal _top_duration, qreal _bottom_duration, bool _bindMode,
qreal _minimum, qreal _maximum, qreal _range, 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);
}; // END of class GraphicsHistogramItem.

View File

@ -366,12 +366,12 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
connect(this, &MainWindow::activationChanged, graphicsView->threadsView(), &ThreadNamesWidget::onWindowActivationChanged, Qt::QueuedConnection);
m_graphicsView->setWidget(graphicsView);
m_treeWidget = new DockWidget("Hierarchy", this);
m_treeWidget = new DockWidget("Stats", this);
m_treeWidget->setObjectName("ProfilerGUI_Hierarchy");
m_treeWidget->setMinimumHeight(px(50));
m_treeWidget->setAllowedAreas(Qt::AllDockWidgetAreas);
auto treeWidget = new HierarchyWidget(this);
auto treeWidget = new StatsWidget(this);
m_treeWidget->setWidget(treeWidget);
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("collapse")), "Collapse all", this, SLOT(onCollapseAllClicked(bool)));
action = toolbar->addAction(QIcon(imagePath("binoculars")), "See blocks hierarchy");
action->setToolTip("Build blocks hierarchy\nfor current visible area\nor zoom to current selected area.");
action = toolbar->addAction(QIcon(imagePath("binoculars")), "Build stats tree");
action->setToolTip("Build stats tree\nfor current visible area\nor zoom to current selected area.");
connect(action, &QAction::triggered, [this] (bool) {
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);
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")));
}
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");
auto submenu = menu->addMenu("Diagram");
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->setCheckable(true);
action->setChecked(EASY_GLOBALS.draw_graphics_items_borders);
@ -528,57 +499,32 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
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->setToolTip("Children blocks will be overlaped by narrow\nparent blocks. See also \'Blocks narrow size\'.\nThis improves performance.");
action->setCheckable(true);
action->setChecked(EASY_GLOBALS.hide_narrow_children);
connect(action, &QAction::triggered, [this](bool _checked){ EASY_GLOBALS.hide_narrow_children = _checked; refreshDiagram(); });
connect(action, &QAction::triggered, [this] (bool _checked) { EASY_GLOBALS.hide_narrow_children = _checked; refreshDiagram(); });
action = submenu->addAction("Hide min-size blocks");
action->setToolTip("Hides blocks which screen size\nis less than \'Min blocks size\'.");
action->setCheckable(true);
action->setChecked(EASY_GLOBALS.hide_minsize_blocks);
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);
});
connect(action, &QAction::triggered, [this] (bool _checked) { EASY_GLOBALS.hide_minsize_blocks = _checked; refreshDiagram(); });
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->setCheckable(true);
action->setChecked(EASY_GLOBALS.enable_zero_length);
connect(action, &QAction::triggered, [this](bool _checked){ EASY_GLOBALS.enable_zero_length = _checked; refreshDiagram(); });
connect(action, &QAction::triggered, [this] (bool _checked) { EASY_GLOBALS.enable_zero_length = _checked; refreshDiagram(); });
action = submenu->addAction("Highlight similar blocks");
action->setToolTip("Highlight all visible blocks which are similar\nto the current selected block.\nThis reduces performance.");
action->setCheckable(true);
action->setChecked(EASY_GLOBALS.highlight_blocks_with_same_id);
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->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->setChecked(EASY_GLOBALS.collapse_items_on_tree_close);
connect(action, &QAction::triggered, this, &This::onCollapseItemsAfterCloseChanged);
@ -590,73 +536,27 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
connect(action, &QAction::triggered, this, &This::onAllItemsExpandedByDefaultChange);
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->setChecked(EASY_GLOBALS.bind_scene_and_tree_expand_status);
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->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->setChecked(EASY_GLOBALS.selecting_block_changes_thread);
connect(action, &QAction::triggered, [this](bool _checked){ EASY_GLOBALS.selecting_block_changes_thread = _checked; });
connect(action, &QAction::triggered, [this] (bool _checked) { EASY_GLOBALS.selecting_block_changes_thread = _checked; });
action = submenu->addAction("Draw event markers");
action->setToolTip("Display event markers under the blocks\n(even if event-blocks are not visible).\nThis slightly reduces performance.");
action->setCheckable(true);
action->setChecked(EASY_GLOBALS.enable_event_markers);
connect(action, &QAction::triggered, [this](bool _checked)
connect(action, &QAction::triggered, [this] (bool _checked)
{
EASY_GLOBALS.enable_event_markers = _checked;
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();
auto actionGroup = new QActionGroup(this);
actionGroup->setExclusive(true);
@ -735,7 +635,100 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
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();
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);
l = new QHBoxLayout(w);
l->setContentsMargins(26, 1, 16, 1);
@ -752,6 +745,39 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
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");
w = new QWidget(submenu);
@ -1457,7 +1483,7 @@ void MainWindow::onBindExpandStatusChange(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)
@ -1475,7 +1501,7 @@ void MainWindow::onExpandAllClicked(bool)
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);
tree->expandAll();
}
@ -1487,7 +1513,7 @@ void MainWindow::onCollapseAllClicked(bool)
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);
tree->collapseAll();
}
@ -1527,6 +1553,12 @@ void MainWindow::onMinSizeChange(int _value)
refreshDiagram();
}
void MainWindow::onHistogramMinSizeChange(int _value)
{
EASY_GLOBALS.histogram_column_width_min = _value;
refreshHistogramImage();
}
void MainWindow::onNarrowSizeChange(int _value)
{
EASY_GLOBALS.blocks_narrow_size = _value;
@ -1733,6 +1765,10 @@ void MainWindow::loadSettings()
if (!val.isNull())
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");
if (!val.isNull())
EASY_GLOBALS.blocks_narrow_size = val.toInt();
@ -1783,9 +1819,9 @@ void MainWindow::loadSettings()
if (!flag.isNull())
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())
EASY_GLOBALS.display_only_relevant_stats = flag.toBool();
EASY_GLOBALS.hide_stats_for_single_blocks = flag.toBool();
flag = settings.value("selecting_block_changes_thread");
if (!flag.isNull())
@ -1909,6 +1945,7 @@ void MainWindow::saveSettingsAndGeometry()
settings.setValue("max_rows_count", EASY_GLOBALS.max_rows_count);
settings.setValue("blocks_spacing", EASY_GLOBALS.blocks_spacing);
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("draw_graphics_items_borders", EASY_GLOBALS.draw_graphics_items_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("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("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("enable_event_indicators", EASY_GLOBALS.enable_event_markers);
settings.setValue("auto_adjust_histogram_height", EASY_GLOBALS.auto_adjust_histogram_height);

View File

@ -347,6 +347,7 @@ protected slots:
void onMaxBlocksCountChange(int _value);
void onSpacingChange(int _value);
void onMinSizeChange(int _value);
void onHistogramMinSizeChange(int _value);
void onNarrowSizeChange(int _value);
void onFpsIntervalChange(int _value);
void onFpsHistoryChange(int _value);

View File

@ -310,7 +310,7 @@ QMenu {
QMenu::item {
height: 15ex;
padding-left: 17ex;
padding-right: 5ex;
padding-right: 10ex;
border: 1px solid transparent;
/* reserve space for selection border */ }

View File

@ -425,7 +425,7 @@ QMenu {
QMenu::item {
height: $InputHeight;
padding-left: 17ex;
padding-right: 5ex;
padding-right: 10ex;
border: 1px solid transparent; /* reserve space for selection border */
}

View File

@ -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();
}

View File

@ -128,7 +128,7 @@ static void fillStatsColumns(
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;
}