From df86884d7b7af9c3180cf6da6a36c53d5eef4f0d Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 9 Jul 2014 17:43:10 +0200 Subject: [PATCH] QmlProfiler: Keep TimelineRenderer and Button states in sync You could enable the select-on-hover mode by clicking in an empty time line, even though the buttons bar was disabled. You could also trigger various bad behavior by clearing the view and restarting the profiler. Properly initializing and clearing all members, and sending change signals on clearing helps with that. Change-Id: Ie7df80a52daaf166c3a4adb2eb1f28a59c21df57 Reviewed-by: Kai Koehne --- src/plugins/qmlprofiler/timelinerenderer.cpp | 38 ++++++++++++-------- src/plugins/qmlprofiler/timelinerenderer.h | 1 + 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/plugins/qmlprofiler/timelinerenderer.cpp b/src/plugins/qmlprofiler/timelinerenderer.cpp index e59b2e03474..e8e67838bb0 100644 --- a/src/plugins/qmlprofiler/timelinerenderer.cpp +++ b/src/plugins/qmlprofiler/timelinerenderer.cpp @@ -43,10 +43,10 @@ using namespace QmlProfiler::Internal; TimelineRenderer::TimelineRenderer(QQuickPaintedItem *parent) : QQuickPaintedItem(parent), m_startTime(0), m_endTime(0), m_spacing(0), m_spacedDuration(0), - m_lastStartTime(0), m_lastEndTime(0) - , m_profilerModelProxy(0) + m_lastStartTime(0), m_lastEndTime(0), m_profilerModelProxy(0), m_selectedItem(-1), + m_selectedModel(-1), m_selectionLocked(true), m_startDragArea(-1), m_endDragArea(-1) { - clearData(); + resetCurrentSelection(); setAcceptedMouseButtons(Qt::LeftButton); setAcceptHoverEvents(true); } @@ -102,6 +102,15 @@ inline void TimelineRenderer::getItemXExtent(int modelIndex, int i, int ¤t } } +void TimelineRenderer::resetCurrentSelection() +{ + m_currentSelection.startTime = -1; + m_currentSelection.endTime = -1; + m_currentSelection.row = -1; + m_currentSelection.eventIndex = -1; + m_currentSelection.modelIndex = -1; +} + void TimelineRenderer::paint(QPainter *p) { qint64 windowDuration = m_endTime - m_startTime; @@ -318,7 +327,8 @@ void TimelineRenderer::mousePressEvent(QMouseEvent *event) void TimelineRenderer::mouseReleaseEvent(QMouseEvent *event) { Q_UNUSED(event); - manageClicked(); + if (!m_profilerModelProxy->isEmpty()) + manageClicked(); } void TimelineRenderer::mouseMoveEvent(QMouseEvent *event) @@ -415,18 +425,18 @@ void TimelineRenderer::manageHovered(int mouseX, int mouseY) void TimelineRenderer::clearData() { - m_startTime = 0; - m_endTime = 0; m_lastStartTime = 0; m_lastEndTime = 0; - m_currentSelection.startTime = -1; - m_currentSelection.endTime = -1; - m_currentSelection.row = -1; - m_currentSelection.eventIndex = -1; - m_currentSelection.modelIndex = -1; - m_selectedItem = -1; - m_selectedModel = -1; - m_selectionLocked = true; + m_spacing = 0; + m_spacedDuration = 0; + resetCurrentSelection(); + setStartTime(0); + setEndTime(0); + setSelectedItem(-1); + setSelectedModel(-1); + setSelectionLocked(true); + setStartDragArea(-1); + setEndDragArea(-1); } int TimelineRenderer::getYPosition(int modelIndex, int index) const diff --git a/src/plugins/qmlprofiler/timelinerenderer.h b/src/plugins/qmlprofiler/timelinerenderer.h index 587438f6044..a515228fdea 100644 --- a/src/plugins/qmlprofiler/timelinerenderer.h +++ b/src/plugins/qmlprofiler/timelinerenderer.h @@ -198,6 +198,7 @@ private: private: static const int OutOfScreenMargin = 3; // margin to make sure the rectangles stay invisible inline void getItemXExtent(int modelIndex, int i, int ¤tX, int &itemWidth); + void resetCurrentSelection(); qint64 m_startTime; qint64 m_endTime;