From c75ddf6b9346f149d0dece56f712c256a28911f8 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 25 May 2016 18:17:45 +0200 Subject: [PATCH] Timeline: Provide a method to set all timeline models at once Setting a number of models one by one results in quadratic overhead when (re)building the UI. If there are many models this quickly gets out of hand. Change-Id: I7f017784c3f0a6a9d7e52c881eb1d8ca4cf70886 Reviewed-by: Christian Kandeler Reviewed-by: Ulf Hermann --- src/libs/timeline/timelinemodelaggregator.cpp | 24 +++++++++++++++++++ src/libs/timeline/timelinemodelaggregator.h | 1 + src/libs/timeline/timelinenotesmodel.cpp | 12 ++++++---- src/libs/timeline/timelinenotesmodel.h | 2 +- src/libs/timeline/timelinenotesmodel_p.h | 2 -- 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/libs/timeline/timelinemodelaggregator.cpp b/src/libs/timeline/timelinemodelaggregator.cpp index f08f9b45db0..7a311a11a4b 100644 --- a/src/libs/timeline/timelinemodelaggregator.cpp +++ b/src/libs/timeline/timelinemodelaggregator.cpp @@ -70,6 +70,30 @@ void TimelineModelAggregator::addModel(TimelineModel *m) emit heightChanged(); } +void TimelineModelAggregator::setModels(const QList &models) +{ + Q_D(TimelineModelAggregator); + if (d->modelList == models) + return; + + int prevHeight = height(); + foreach (TimelineModel *m, d->modelList) { + disconnect(m, &TimelineModel::heightChanged, this, &TimelineModelAggregator::heightChanged); + if (d->notesModel) + d->notesModel->removeTimelineModel(m); + } + + d->modelList = models; + foreach (TimelineModel *m, models) { + connect(m, &TimelineModel::heightChanged, this, &TimelineModelAggregator::heightChanged); + if (d->notesModel) + d->notesModel->addTimelineModel(m); + } + emit modelsChanged(); + if (height() != prevHeight) + emit heightChanged(); +} + const TimelineModel *TimelineModelAggregator::model(int modelIndex) const { Q_D(const TimelineModelAggregator); diff --git a/src/libs/timeline/timelinemodelaggregator.h b/src/libs/timeline/timelinemodelaggregator.h index 17e5d78f1a9..56aaf86d06c 100644 --- a/src/libs/timeline/timelinemodelaggregator.h +++ b/src/libs/timeline/timelinemodelaggregator.h @@ -43,6 +43,7 @@ public: int height() const; void addModel(TimelineModel *m); + void setModels(const QList &models); const TimelineModel *model(int modelIndex) const; QVariantList models() const; diff --git a/src/libs/timeline/timelinenotesmodel.cpp b/src/libs/timeline/timelinenotesmodel.cpp index ba9b567bf0c..2aec8959927 100644 --- a/src/libs/timeline/timelinenotesmodel.cpp +++ b/src/libs/timeline/timelinenotesmodel.cpp @@ -52,8 +52,9 @@ int TimelineNotesModel::count() const void TimelineNotesModel::addTimelineModel(const TimelineModel *timelineModel) { Q_D(TimelineNotesModel); - connect(timelineModel, SIGNAL(destroyed(QObject*)), - this, SLOT(_q_removeTimelineModel(QObject*))); + connect(timelineModel, &QObject::destroyed, this, [this](QObject *obj) { + removeTimelineModel(static_cast(obj)); + }); d->timelineModels.insert(timelineModel->modelId(), timelineModel); } @@ -178,11 +179,12 @@ void TimelineNotesModel::resetModified() d->modified = false; } -void TimelineNotesModel::TimelineNotesModelPrivate::_q_removeTimelineModel(QObject *timelineModel) +void TimelineNotesModel::removeTimelineModel(const TimelineModel *timelineModel) { - for (auto i = timelineModels.begin(); i != timelineModels.end();) { + Q_D(TimelineNotesModel); + for (auto i = d->timelineModels.begin(); i != d->timelineModels.end();) { if (i.value() == timelineModel) - i = timelineModels.erase(i); + i = d->timelineModels.erase(i); else ++i; } diff --git a/src/libs/timeline/timelinenotesmodel.h b/src/libs/timeline/timelinenotesmodel.h index 2a831367045..93996243b07 100644 --- a/src/libs/timeline/timelinenotesmodel.h +++ b/src/libs/timeline/timelinenotesmodel.h @@ -39,6 +39,7 @@ public: int count() const; void addTimelineModel(const TimelineModel *timelineModel); + void removeTimelineModel(const TimelineModel *timelineModel); QList timelineModels() const; Q_INVOKABLE int typeId(int index) const; @@ -73,7 +74,6 @@ private: TimelineNotesModelPrivate *d_ptr; Q_DECLARE_PRIVATE(TimelineNotesModel) - Q_PRIVATE_SLOT(d_ptr, void _q_removeTimelineModel(QObject *timelineModel)) }; } // namespace Timeline diff --git a/src/libs/timeline/timelinenotesmodel_p.h b/src/libs/timeline/timelinenotesmodel_p.h index 455ee8af69e..dd64fec2a99 100644 --- a/src/libs/timeline/timelinenotesmodel_p.h +++ b/src/libs/timeline/timelinenotesmodel_p.h @@ -46,8 +46,6 @@ public: QHash timelineModels; bool modified; - void _q_removeTimelineModel(QObject *model); - private: TimelineNotesModel *q_ptr; Q_DECLARE_PUBLIC(TimelineNotesModel)