forked from qt-creator/qt-creator
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:
@@ -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.
|
// 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 startTime = (mouseX - 1) * duration / width() + m_zoomer->rangeStart();
|
||||||
qint64 endTime = (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());
|
int row = rowFromPosition(mouseY + y());
|
||||||
|
|
||||||
// already covered? Only recheck selectionLocked and make sure m_selectedItem is correct.
|
// already covered? Only recheck selectionLocked and make sure m_selectedItem is correct.
|
||||||
if (m_currentSelection.eventIndex != -1 &&
|
if (m_currentSelection.eventIndex != -1 &&
|
||||||
endTime >= m_currentSelection.startTime &&
|
exactTime >= m_currentSelection.startTime &&
|
||||||
startTime <= m_currentSelection.endTime &&
|
exactTime < m_currentSelection.endTime &&
|
||||||
row == m_currentSelection.row) {
|
row == m_currentSelection.row) {
|
||||||
if (!m_selectionLocked)
|
if (!m_selectionLocked)
|
||||||
setSelectedItem(m_currentSelection.eventIndex);
|
setSelectedItem(m_currentSelection.eventIndex);
|
||||||
@@ -454,12 +455,13 @@ void TimelineRenderer::manageHovered(int mouseX, int mouseY)
|
|||||||
// find if there's items in the time range
|
// find if there's items in the time range
|
||||||
int eventFrom = m_model->firstIndex(startTime);
|
int eventFrom = m_model->firstIndex(startTime);
|
||||||
int eventTo = m_model->lastIndex(endTime);
|
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;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
// find if we are in the right column
|
// find if we are in the right column
|
||||||
|
qint64 bestOffset = std::numeric_limits<qint64>::max();
|
||||||
for (int i=eventTo; i>=eventFrom; --i) {
|
for (int i=eventTo; i>=eventFrom; --i) {
|
||||||
if ( m_model->row(i) == row) {
|
if ( m_model->row(i) == row) {
|
||||||
// There can be small events that don't reach the cursor position after large events
|
// 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)
|
if (itemEnd < startTime)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// match
|
qint64 itemStart = m_model->startTime(i);
|
||||||
m_currentSelection.eventIndex = i;
|
|
||||||
m_currentSelection.startTime = m_model->startTime(i);
|
qint64 offset = qAbs(itemEnd - exactTime) + qAbs(itemStart - exactTime);
|
||||||
m_currentSelection.endTime = itemEnd;
|
if (offset < bestOffset) {
|
||||||
m_currentSelection.row = row;
|
// match
|
||||||
if (!m_selectionLocked)
|
m_currentSelection.eventIndex = i;
|
||||||
setSelectedItem(i);
|
m_currentSelection.startTime = itemStart;
|
||||||
return;
|
m_currentSelection.endTime = itemEnd;
|
||||||
|
m_currentSelection.row = row;
|
||||||
|
bestOffset = offset;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!m_selectionLocked && m_currentSelection.eventIndex != -1)
|
||||||
m_currentSelection.eventIndex = -1;
|
setSelectedItem(m_currentSelection.eventIndex);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimelineRenderer::clearData()
|
void TimelineRenderer::clearData()
|
||||||
|
|||||||
Reference in New Issue
Block a user