File indexing completed on 2024-04-28 03:59:17

0001 /*
0002     SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.net>
0003     SPDX-FileContributor: Stephen Kelly <stephen@kdab.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "kviewstatemaintainerbase.h"
0009 
0010 #include <QAbstractItemView>
0011 #include <QItemSelectionModel>
0012 #include <QPointer>
0013 
0014 class KViewStateMaintainerBasePrivate
0015 {
0016     KViewStateMaintainerBasePrivate(KViewStateMaintainerBase *qq)
0017         : q_ptr(qq)
0018     {
0019     }
0020 
0021     Q_DECLARE_PUBLIC(KViewStateMaintainerBase)
0022     KViewStateMaintainerBase *const q_ptr;
0023 
0024     void slotModelAboutToBeReset();
0025     void slotModelReset();
0026 
0027     QPointer<QAbstractItemView> m_view;
0028     QMetaObject::Connection m_viewModelAboutToBeResetConnection;
0029     QMetaObject::Connection m_viewModelResetConnection;
0030 
0031     QPointer<QItemSelectionModel> m_selectionModel;
0032     QMetaObject::Connection m_selectionModelAboutToBeResetConnection;
0033     QMetaObject::Connection m_selectionModelResetConnection;
0034 };
0035 
0036 void KViewStateMaintainerBasePrivate::slotModelAboutToBeReset()
0037 {
0038     Q_Q(KViewStateMaintainerBase);
0039     q->saveState();
0040 }
0041 
0042 void KViewStateMaintainerBasePrivate::slotModelReset()
0043 {
0044     Q_Q(KViewStateMaintainerBase);
0045     q->restoreState();
0046 }
0047 
0048 KViewStateMaintainerBase::KViewStateMaintainerBase(QObject *parent)
0049     : QObject(parent)
0050     , d_ptr(new KViewStateMaintainerBasePrivate(this))
0051 {
0052 }
0053 
0054 KViewStateMaintainerBase::~KViewStateMaintainerBase() = default;
0055 
0056 QItemSelectionModel *KViewStateMaintainerBase::selectionModel() const
0057 {
0058     Q_D(const KViewStateMaintainerBase);
0059     if (d->m_selectionModel.isNull()) {
0060         return nullptr;
0061     }
0062     return d->m_selectionModel.data();
0063 }
0064 
0065 void KViewStateMaintainerBase::setSelectionModel(QItemSelectionModel *selectionModel)
0066 {
0067     Q_D(KViewStateMaintainerBase);
0068     if (selectionModel == d->m_selectionModel) {
0069         return;
0070     }
0071 
0072     d->m_selectionModel = selectionModel;
0073 
0074     if (d->m_view && d->m_view->model()) {
0075         disconnect(d->m_selectionModelAboutToBeResetConnection);
0076         disconnect(d->m_selectionModelResetConnection);
0077     }
0078 
0079     d->m_viewModelAboutToBeResetConnection = connect(d->m_selectionModel->model(), &QAbstractItemModel::modelAboutToBeReset, this, [d]() {
0080         d->slotModelAboutToBeReset();
0081     });
0082     d->m_viewModelResetConnection = connect(d->m_selectionModel->model(), &QAbstractItemModel::modelReset, this, [d]() {
0083         d->slotModelReset();
0084     });
0085 }
0086 
0087 QAbstractItemView *KViewStateMaintainerBase::view() const
0088 {
0089     Q_D(const KViewStateMaintainerBase);
0090     if (d->m_view.isNull()) {
0091         return nullptr;
0092     }
0093     return d->m_view.data();
0094 }
0095 
0096 void KViewStateMaintainerBase::setView(QAbstractItemView *view)
0097 {
0098     Q_D(KViewStateMaintainerBase);
0099     if (view == d->m_view) {
0100         return;
0101     }
0102 
0103     d->m_view = view;
0104 
0105     if (d->m_selectionModel && d->m_selectionModel->model()) {
0106         disconnect(d->m_viewModelAboutToBeResetConnection);
0107         disconnect(d->m_viewModelResetConnection);
0108     }
0109 
0110     if (d->m_view && d->m_view->model()) {
0111         d->m_selectionModelAboutToBeResetConnection = connect(d->m_view->model(), &QAbstractItemModel::modelAboutToBeReset, this, [d]() {
0112             d->slotModelAboutToBeReset();
0113         });
0114         d->m_selectionModelResetConnection = connect(d->m_view->model(), &QAbstractItemModel::modelReset, this, [d]() {
0115             d->slotModelReset();
0116         });
0117     }
0118 }
0119 
0120 #include "moc_kviewstatemaintainerbase.cpp"