File indexing completed on 2025-02-02 14:20:13
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"