/***************************************************************************
- * Copyright (C) 2005-09 by the Quassel Project *
+ * Copyright (C) 2005-2018 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "selectionmodelsynchronizer.h"
SelectionModelSynchronizer::SelectionModelSynchronizer(QAbstractItemModel *parent)
: QObject(parent),
_model(parent),
- _selectionModel(parent),
- _changeCurrentEnabled(true),
- _changeSelectionEnabled(true)
+ _selectionModel(parent)
{
connect(&_selectionModel, SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
this, SLOT(currentChanged(const QModelIndex &, const QModelIndex &)));
return false;
const QAbstractItemModel *baseModel = selectionModel->model();
- const QAbstractProxyModel *proxyModel = 0;
- while ((proxyModel = qobject_cast<const QAbstractProxyModel *>(baseModel)) != 0) {
+ const QAbstractProxyModel *proxyModel = nullptr;
+ while ((proxyModel = qobject_cast<const QAbstractProxyModel *>(baseModel)) != nullptr) {
baseModel = proxyModel->sourceModel();
if (baseModel == model())
break;
void SelectionModelSynchronizer::removeSelectionModel(QItemSelectionModel *model)
{
- disconnect(model, 0, this, 0);
- disconnect(this, 0, model, 0);
+ disconnect(model, nullptr, this, nullptr);
+ disconnect(this, nullptr, model, nullptr);
selectionModelDestroyed(model);
}
void SelectionModelSynchronizer::selectionModelDestroyed(QObject *object)
{
- QItemSelectionModel *model = static_cast<QItemSelectionModel *>(object);
+ auto *model = static_cast<QItemSelectionModel *>(object);
QSet<QItemSelectionModel *>::iterator iter = _selectionModels.begin();
while (iter != _selectionModels.end()) {
if (*iter == model) {
iter = _selectionModels.erase(iter);
}
else {
- iter++;
+ ++iter;
}
}
}
if (!_changeCurrentEnabled)
return;
- QItemSelectionModel *selectionModel = qobject_cast<QItemSelectionModel *>(sender());
+ auto *selectionModel = qobject_cast<QItemSelectionModel *>(sender());
Q_ASSERT(selectionModel);
QModelIndex newSourceCurrent = mapToSource(current, selectionModel);
if (newSourceCurrent.isValid() && newSourceCurrent != currentIndex())
if (!_changeSelectionEnabled)
return;
- QItemSelectionModel *selectionModel = qobject_cast<QItemSelectionModel *>(sender());
+ auto *selectionModel = qobject_cast<QItemSelectionModel *>(sender());
Q_ASSERT(selectionModel);
QItemSelection mappedSelection = selectionModel->selection();
// make a list of all involved proxies, wie have to traverse backwards
QList<const QAbstractProxyModel *> proxyModels;
const QAbstractItemModel *baseModel = selectionModel->model();
- const QAbstractProxyModel *proxyModel = 0;
- while ((proxyModel = qobject_cast<const QAbstractProxyModel *>(baseModel)) != 0) {
+ const QAbstractProxyModel *proxyModel = nullptr;
+ while ((proxyModel = qobject_cast<const QAbstractProxyModel *>(baseModel)) != nullptr) {
if (baseModel == model())
break;
proxyModels << proxyModel;
// make a list of all involved proxies, wie have to traverse backwards
QList<const QAbstractProxyModel *> proxyModels;
const QAbstractItemModel *baseModel = selectionModel->model();
- const QAbstractProxyModel *proxyModel = 0;
- while ((proxyModel = qobject_cast<const QAbstractProxyModel *>(baseModel)) != 0) {
+ const QAbstractProxyModel *proxyModel = nullptr;
+ while ((proxyModel = qobject_cast<const QAbstractProxyModel *>(baseModel)) != nullptr) {
if (baseModel == model())
break;
proxyModels << proxyModel;
QModelIndex sourceIndex = index;
const QAbstractItemModel *baseModel = selectionModel->model();
- const QAbstractProxyModel *proxyModel = 0;
- while ((proxyModel = qobject_cast<const QAbstractProxyModel *>(baseModel)) != 0) {
+ const QAbstractProxyModel *proxyModel = nullptr;
+ while ((proxyModel = qobject_cast<const QAbstractProxyModel *>(baseModel)) != nullptr) {
sourceIndex = proxyModel->mapToSource(sourceIndex);
baseModel = proxyModel->sourceModel();
if (baseModel == model())
QItemSelection sourceSelection = selection;
const QAbstractItemModel *baseModel = selectionModel->model();
- const QAbstractProxyModel *proxyModel = 0;
- while ((proxyModel = qobject_cast<const QAbstractProxyModel *>(baseModel)) != 0) {
+ const QAbstractProxyModel *proxyModel = nullptr;
+ while ((proxyModel = qobject_cast<const QAbstractProxyModel *>(baseModel)) != nullptr) {
sourceSelection = proxyModel->mapSelectionToSource(sourceSelection);
baseModel = proxyModel->sourceModel();
if (baseModel == model())
QSet<QItemSelectionModel *>::iterator iter = _selectionModels.begin();
while (iter != _selectionModels.end()) {
(*iter)->setCurrentIndex(mapFromSource(current, (*iter)), QItemSelectionModel::Current);
- iter++;
+ ++iter;
}
_changeCurrentEnabled = true;
+
+ // Trigger a dataChanged() signal from the base model to update all proxy models (e.g. filters).
+ // Since signals are protected, we have to use invokeMethod for faking signal emission.
+ if (previous.isValid()) {
+ QMetaObject::invokeMethod(model(), "dataChanged", Qt::DirectConnection,
+ Q_ARG(QModelIndex, previous), Q_ARG(QModelIndex, previous));
+ }
}
QSet<QItemSelectionModel *>::iterator iter = _selectionModels.begin();
while (iter != _selectionModels.end()) {
(*iter)->select(mapSelectionFromSource(currentSelection(), (*iter)), QItemSelectionModel::ClearAndSelect);
- iter++;
+ ++iter;
}
_changeSelectionEnabled = true;
}