QmlProfiler: Make V8 view properly sortable

Don't accidentally reuse the EventViewItem class from the events view,
drop the column number as it's always -1, and actually use the file name
for sorting instead of random junk. Also add all the missing bits
necessary for sorting all tables by any column and drop the hash string
as it's useless.

Change-Id: I26dcdd229f1f1ef18f68edcb6edfb0427a2e2e6f
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
This commit is contained in:
Ulf Hermann
2014-07-04 14:06:16 +02:00
parent 0100237a33
commit 6a93d41831

View File

@@ -58,11 +58,10 @@ namespace QmlProfiler {
namespace Internal { namespace Internal {
enum ItemRole { enum ItemRole {
EventHashStrRole = Qt::UserRole+1, SortRole = Qt::UserRole + 1, // Sort by data, not by displayed text
FilenameRole = Qt::UserRole+2, FilenameRole,
LineRole = Qt::UserRole+3, LineRole,
ColumnRole = Qt::UserRole+4, EventIdRole
EventIdRole = Qt::UserRole+5
}; };
//////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////
@@ -70,26 +69,28 @@ enum ItemRole {
//////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////
class EventsViewItem : public QStandardItem class V8ViewItem : public QStandardItem
{ {
public: public:
EventsViewItem(const QString &text) : QStandardItem(text) {} V8ViewItem(const QString &text) : QStandardItem(text) {}
virtual bool operator<(const QStandardItem &other) const virtual bool operator<(const QStandardItem &other) const
{ {
if (data().type() == QVariant::String) { // first column is special
// first column
if (column() == 0) { if (column() == 0) {
return data(FilenameRole).toString() == other.data(FilenameRole).toString() ? int filenameDiff = QUrl(data(FilenameRole).toString()).fileName().compare(
data(LineRole).toInt() < other.data(LineRole).toInt() : QUrl(other.data(FilenameRole).toString()).fileName(), Qt::CaseInsensitive);
data(FilenameRole).toString() < other.data(FilenameRole).toString(); return filenameDiff != 0 ? filenameDiff < 0 :
data(LineRole).toInt() < other.data(LineRole).toInt();
} else if (data(SortRole).type() == QVariant::String) {
// Strings should be case-insensitive compared
return data(SortRole).toString().compare(other.data(SortRole).toString(),
Qt::CaseInsensitive) < 0;
} else { } else {
return data().toString().toLower() < other.data().toString().toLower(); // For everything else the standard comparison should be OK
return QStandardItem::operator<(other);
} }
} }
return data().toDouble() < other.data().toDouble();
}
}; };
//////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////
@@ -290,6 +291,7 @@ QV8ProfilerEventsMainView::QV8ProfilerEventsMainView(QWidget *parent,
setSortingEnabled(false); setSortingEnabled(false);
d->m_model = new QStandardItemModel(this); d->m_model = new QStandardItemModel(this);
d->m_model->setSortRole(SortRole);
setModel(d->m_model); setModel(d->m_model);
connect(this, SIGNAL(activated(QModelIndex)), this, SLOT(jumpToItem(QModelIndex))); connect(this, SIGNAL(activated(QModelIndex)), this, SLOT(jumpToItem(QModelIndex)));
@@ -436,30 +438,30 @@ void QV8ProfilerEventsMainView::QV8ProfilerEventsMainViewPrivate::buildV8ModelFr
QList<QStandardItem *> newRow; QList<QStandardItem *> newRow;
if (m_fieldShown[Name]) if (m_fieldShown[Name])
newRow << new EventsViewItem(v8event->displayName); newRow << new V8ViewItem(v8event->displayName);
if (m_fieldShown[TimeInPercent]) { if (m_fieldShown[TimeInPercent]) {
newRow << new EventsViewItem(QString::number(v8event->totalPercent,'f',2)+QLatin1String(" %")); newRow << new V8ViewItem(QString::number(v8event->totalPercent,'f',2)+QLatin1String(" %"));
newRow.last()->setData(QVariant(v8event->totalPercent)); newRow.last()->setData(QVariant(v8event->totalPercent));
} }
if (m_fieldShown[TotalTime]) { if (m_fieldShown[TotalTime]) {
newRow << new EventsViewItem(QmlProfilerBaseModel::formatTime(v8event->totalTime)); newRow << new V8ViewItem(QmlProfilerBaseModel::formatTime(v8event->totalTime));
newRow.last()->setData(QVariant(v8event->totalTime)); newRow.last()->setData(QVariant(v8event->totalTime));
} }
if (m_fieldShown[SelfTimeInPercent]) { if (m_fieldShown[SelfTimeInPercent]) {
newRow << new EventsViewItem(QString::number(v8event->SelfTimeInPercent,'f',2)+QLatin1String(" %")); newRow << new V8ViewItem(QString::number(v8event->SelfTimeInPercent,'f',2)+QLatin1String(" %"));
newRow.last()->setData(QVariant(v8event->SelfTimeInPercent)); newRow.last()->setData(QVariant(v8event->SelfTimeInPercent));
} }
if (m_fieldShown[SelfTime]) { if (m_fieldShown[SelfTime]) {
newRow << new EventsViewItem(QmlProfilerBaseModel::formatTime(v8event->selfTime)); newRow << new V8ViewItem(QmlProfilerBaseModel::formatTime(v8event->selfTime));
newRow.last()->setData(QVariant(v8event->selfTime)); newRow.last()->setData(QVariant(v8event->selfTime));
} }
if (m_fieldShown[Details]) { if (m_fieldShown[Details]) {
newRow << new EventsViewItem(v8event->functionName); newRow << new V8ViewItem(v8event->functionName);
newRow.last()->setData(QVariant(v8event->functionName)); newRow.last()->setData(QVariant(v8event->functionName));
} }
@@ -470,10 +472,8 @@ void QV8ProfilerEventsMainView::QV8ProfilerEventsMainViewPrivate::buildV8ModelFr
// metadata // metadata
QStandardItem *firstItem = newRow.at(0); QStandardItem *firstItem = newRow.at(0);
firstItem->setData(QString::fromLatin1("%1:%2").arg(v8event->filename, QString::number(v8event->line)), EventHashStrRole);
firstItem->setData(QVariant(v8event->filename), FilenameRole); firstItem->setData(QVariant(v8event->filename), FilenameRole);
firstItem->setData(QVariant(v8event->line), LineRole); firstItem->setData(QVariant(v8event->line), LineRole);
firstItem->setData(QVariant(-1),ColumnRole); // v8 events have no column info
firstItem->setData(QVariant(v8event->eventId), EventIdRole); firstItem->setData(QVariant(v8event->eventId), EventIdRole);
// append // append
@@ -506,10 +506,9 @@ void QV8ProfilerEventsMainView::jumpToItem(const QModelIndex &index)
// show in editor // show in editor
int line = infoItem->data(LineRole).toInt(); int line = infoItem->data(LineRole).toInt();
int column = infoItem->data(ColumnRole).toInt();
QString fileName = infoItem->data(FilenameRole).toString(); QString fileName = infoItem->data(FilenameRole).toString();
if (line!=-1 && !fileName.isEmpty()) if (line!=-1 && !fileName.isEmpty())
emit gotoSourceLocation(fileName, line, column); emit gotoSourceLocation(fileName, line, -1);
// show in callers/callees subwindow // show in callers/callees subwindow
emit eventSelected(infoItem->data(EventIdRole).toInt()); emit eventSelected(infoItem->data(EventIdRole).toInt());
@@ -627,6 +626,7 @@ QV8ProfilerEventRelativesView::QV8ProfilerEventRelativesView(QV8ProfilerDataMode
, m_v8Model(model) , m_v8Model(model)
, m_model(new QStandardItemModel(this)) , m_model(new QStandardItemModel(this))
{ {
m_model->setSortRole(SortRole);
setModel(m_model); setModel(m_model);
updateHeader(); updateHeader();
@@ -666,11 +666,15 @@ void QV8ProfilerEventRelativesView::rebuildTree(QList<QV8ProfilerDataModel::QV8E
foreach (QV8ProfilerDataModel::QV8EventSub *event, events) { foreach (QV8ProfilerDataModel::QV8EventSub *event, events) {
QList<QStandardItem *> newRow; QList<QStandardItem *> newRow;
newRow << new EventsViewItem(event->reference->displayName); newRow << new V8ViewItem(event->reference->displayName);
newRow << new EventsViewItem(QmlProfilerBaseModel::formatTime(event->totalTime)); newRow << new V8ViewItem(QmlProfilerBaseModel::formatTime(event->totalTime));
newRow << new EventsViewItem(event->reference->functionName); newRow << new V8ViewItem(event->reference->functionName);
newRow.at(0)->setData(QVariant(event->reference->eventId), EventIdRole); newRow.at(0)->setData(QVariant(event->reference->eventId), EventIdRole);
newRow.at(0)->setData(QVariant(event->reference->filename), FilenameRole);
newRow.at(0)->setData(QVariant(event->reference->line), LineRole);
newRow.at(1)->setData(QVariant(event->totalTime)); newRow.at(1)->setData(QVariant(event->totalTime));
newRow.at(2)->setData(QVariant(event->reference->functionName));
foreach (QStandardItem *item, newRow) foreach (QStandardItem *item, newRow)
item->setEditable(false); item->setEditable(false);