modernize: Prefer default member init over ctor init
[quassel.git] / src / client / selectionmodelsynchronizer.cpp
index 5f22e4a..717ef4e 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2013 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  *
@@ -28,9 +28,7 @@
 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 &)));
@@ -45,8 +43,8 @@ bool SelectionModelSynchronizer::checkBaseModel(QItemSelectionModel *selectionMo
         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;
@@ -81,8 +79,8 @@ void SelectionModelSynchronizer::synchronizeSelectionModel(QItemSelectionModel *
 
 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);
 }
 
@@ -96,7 +94,7 @@ void SelectionModelSynchronizer::selectionModelDestroyed(QObject *object)
             iter = _selectionModels.erase(iter);
         }
         else {
-            iter++;
+            ++iter;
         }
     }
 }
@@ -156,8 +154,8 @@ QModelIndex SelectionModelSynchronizer::mapFromSource(const QModelIndex &sourceI
     // 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;
@@ -182,8 +180,8 @@ QItemSelection SelectionModelSynchronizer::mapSelectionFromSource(const QItemSel
     // 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;
@@ -204,8 +202,8 @@ QModelIndex SelectionModelSynchronizer::mapToSource(const QModelIndex &index, QI
 
     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())
@@ -221,8 +219,8 @@ QItemSelection SelectionModelSynchronizer::mapSelectionToSource(const QItemSelec
 
     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())
@@ -252,9 +250,16 @@ void SelectionModelSynchronizer::currentChanged(const QModelIndex &current, cons
     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));
+    }
 }
 
 
@@ -267,7 +272,7 @@ void SelectionModelSynchronizer::selectionChanged(const QItemSelection &selected
     QSet<QItemSelectionModel *>::iterator iter = _selectionModels.begin();
     while (iter != _selectionModels.end()) {
         (*iter)->select(mapSelectionFromSource(currentSelection(), (*iter)), QItemSelectionModel::ClearAndSelect);
-        iter++;
+        ++iter;
     }
     _changeSelectionEnabled = true;
 }