QmlProfiler: more precise event selection in timeline

Generate a score for each candidate event and choose the one with the
best score in the end.

Change-Id: I463e87d2e6cb4e182f7febda7182ae8abf304e04
Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com>
This commit is contained in:
Ulf Hermann
2014-12-04 13:24:49 +01:00
parent c34ad1dc5b
commit 901da05def

View File

@@ -439,12 +439,13 @@ void TimelineRenderer::manageHovered(int mouseX, int mouseY)
// Make the "selected" area 3 pixels wide by adding/subtracting 1 to catch very narrow events.
qint64 startTime = (mouseX - 1) * duration / width() + m_zoomer->rangeStart();
qint64 endTime = (mouseX + 1) * duration / width() + m_zoomer->rangeStart();
qint64 exactTime = (startTime + endTime) / 2;
int row = rowFromPosition(mouseY + y());
// already covered? Only recheck selectionLocked and make sure m_selectedItem is correct.
if (m_currentSelection.eventIndex != -1 &&
endTime >= m_currentSelection.startTime &&
startTime <= m_currentSelection.endTime &&
exactTime >= m_currentSelection.startTime &&
exactTime < m_currentSelection.endTime &&
row == m_currentSelection.row) {
if (!m_selectionLocked)
setSelectedItem(m_currentSelection.eventIndex);
@@ -454,12 +455,13 @@ void TimelineRenderer::manageHovered(int mouseX, int mouseY)
// find if there's items in the time range
int eventFrom = m_model->firstIndex(startTime);
int eventTo = m_model->lastIndex(endTime);
if (eventFrom == -1 || eventTo < eventFrom || eventTo >= m_model->count()) {
m_currentSelection.eventIndex = -1;
m_currentSelection.eventIndex = -1;
if (eventFrom == -1 || eventTo < eventFrom || eventTo >= m_model->count())
return;
}
// find if we are in the right column
qint64 bestOffset = std::numeric_limits<qint64>::max();
for (int i=eventTo; i>=eventFrom; --i) {
if ( m_model->row(i) == row) {
// There can be small events that don't reach the cursor position after large events
@@ -468,19 +470,21 @@ void TimelineRenderer::manageHovered(int mouseX, int mouseY)
if (itemEnd < startTime)
continue;
// match
m_currentSelection.eventIndex = i;
m_currentSelection.startTime = m_model->startTime(i);
m_currentSelection.endTime = itemEnd;
m_currentSelection.row = row;
if (!m_selectionLocked)
setSelectedItem(i);
return;
qint64 itemStart = m_model->startTime(i);
qint64 offset = qAbs(itemEnd - exactTime) + qAbs(itemStart - exactTime);
if (offset < bestOffset) {
// match
m_currentSelection.eventIndex = i;
m_currentSelection.startTime = itemStart;
m_currentSelection.endTime = itemEnd;
m_currentSelection.row = row;
bestOffset = offset;
}
}
}
m_currentSelection.eventIndex = -1;
return;
if (!m_selectionLocked && m_currentSelection.eventIndex != -1)
setSelectedItem(m_currentSelection.eventIndex);
}
void TimelineRenderer::clearData()