File indexing completed on 2024-09-22 04:41:03

0001 /*
0002   SPDX-FileCopyrightText: 2009 Stephen Kelly <steveire@gmail.com>
0003 
0004   SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "selectionproxymodel.h"
0008 
0009 #include "entitytreemodel.h"
0010 
0011 using namespace Akonadi;
0012 
0013 namespace Akonadi
0014 {
0015 class SelectionProxyModelPrivate
0016 {
0017 public:
0018     explicit SelectionProxyModelPrivate(SelectionProxyModel *selectionProxyModel)
0019         : q_ptr(selectionProxyModel)
0020     {
0021         Q_Q(SelectionProxyModel);
0022         const auto indexes = q->sourceRootIndexes();
0023         for (const auto &rootIndex : indexes) {
0024             rootIndexAdded(rootIndex);
0025         }
0026     }
0027     ~SelectionProxyModelPrivate()
0028     {
0029         Q_Q(SelectionProxyModel);
0030         const auto indexes = q->sourceRootIndexes();
0031         for (const auto &rootIndex : indexes) {
0032             rootIndexAboutToBeRemoved(rootIndex);
0033         }
0034     }
0035 
0036     /**
0037       Increases the refcount of the Collection in @p newRootIndex
0038     */
0039     void rootIndexAdded(const QModelIndex &newRootIndex)
0040     {
0041         Q_Q(SelectionProxyModel);
0042         // newRootIndex is already in the sourceModel.
0043         q->sourceModel()->setData(newRootIndex, QVariant(), EntityTreeModel::CollectionRefRole);
0044         q->sourceModel()->fetchMore(newRootIndex);
0045     }
0046 
0047     /**
0048       Decreases the refcount of the Collection in @p removedRootIndex
0049     */
0050     void rootIndexAboutToBeRemoved(const QModelIndex &removedRootIndex)
0051     {
0052         Q_Q(SelectionProxyModel);
0053         q->sourceModel()->setData(removedRootIndex, QVariant(), EntityTreeModel::CollectionDerefRole);
0054     }
0055 
0056     Q_DECLARE_PUBLIC(SelectionProxyModel)
0057     SelectionProxyModel *const q_ptr;
0058 };
0059 
0060 } // namespace Akonadi
0061 
0062 SelectionProxyModel::SelectionProxyModel(QItemSelectionModel *selectionModel, QObject *parent)
0063     : KSelectionProxyModel(selectionModel, parent)
0064     , d_ptr(new SelectionProxyModelPrivate(this))
0065 {
0066     connect(this, SIGNAL(rootIndexAdded(QModelIndex)), SLOT(rootIndexAdded(QModelIndex))); // clazy:exclude=old-style-connect
0067     connect(this, SIGNAL(rootIndexAboutToBeRemoved(QModelIndex)), SLOT(rootIndexAboutToBeRemoved(QModelIndex))); // clazy:exclude=old-style-connect
0068 }
0069 
0070 SelectionProxyModel::~SelectionProxyModel() = default;
0071 
0072 #include "moc_selectionproxymodel.cpp"