/***************************************************************************
- * Copyright (C) 2005-07 by the Quassel IRC Team *
+ * Copyright (C) 2005-2020 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. *
***************************************************************************/
-#ifndef _SELECTIONMODELSYNCHRONIZER_H_
-#define _SELECTIONMODELSYNCHRONIZER_H_
+#pragma once
+
+#include "client-export.h"
-#include <QObject>
#include <QItemSelectionModel>
+#include <QObject>
class QAbstractItemModel;
-class MappedSelectionModel;
-class SelectionModelSynchronizer : public QObject {
- Q_OBJECT
+class CLIENT_EXPORT SelectionModelSynchronizer : public QObject
+{
+ Q_OBJECT
public:
- SelectionModelSynchronizer(QAbstractItemModel *parent = 0);
- virtual ~SelectionModelSynchronizer();
+ SelectionModelSynchronizer(QAbstractItemModel* parent = nullptr);
- void addSelectionModel(MappedSelectionModel *model);
- void removeSelectionModel(MappedSelectionModel *model);
+ void synchronizeSelectionModel(QItemSelectionModel* selectionModel);
+ void removeSelectionModel(QItemSelectionModel* selectionModel);
- inline QAbstractItemModel *model() { return _model; }
+ inline QAbstractItemModel* model() { return _model; }
+ inline QItemSelectionModel* selectionModel() const { return const_cast<QItemSelectionModel*>(&_selectionModel); }
+ inline QModelIndex currentIndex() const { return _selectionModel.currentIndex(); }
+ inline QItemSelection currentSelection() const { return _selectionModel.selection(); }
private slots:
- void _mappedCurrentChanged(const QModelIndex ¤t);
- void _mappedSelectionChanged(const QItemSelection &selected);
+ void syncedCurrentChanged(const QModelIndex& current, const QModelIndex& previous);
+ void syncedSelectionChanged(const QItemSelection& selected, const QItemSelection& previous);
+
+ void setCurrentIndex(const QModelIndex& index);
+ void setCurrentSelection(const QItemSelection& selection);
+
+ void currentChanged(const QModelIndex& current, const QModelIndex& previous);
+ void selectionChanged(const QItemSelection& selected, const QItemSelection& deselected);
+
+ void selectionModelDestroyed(QObject* object);
-signals:
- void select(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command);
- void setCurrentIndex(const QModelIndex &index, QItemSelectionModel::SelectionFlags command);
-
private:
- QAbstractItemModel *_model;
-};
+ QAbstractItemModel* _model;
+ QItemSelectionModel _selectionModel;
+ bool _changeCurrentEnabled{true};
+ bool _changeSelectionEnabled{true};
-#endif
+ bool checkBaseModel(QItemSelectionModel* model);
+ QModelIndex mapFromSource(const QModelIndex& sourceIndex, const QItemSelectionModel* selectionModel);
+ QItemSelection mapSelectionFromSource(const QItemSelection& sourceSelection, const QItemSelectionModel* selectionModel);
+ QModelIndex mapToSource(const QModelIndex& index, QItemSelectionModel* selectionModel);
+ QItemSelection mapSelectionToSource(const QItemSelection& selection, QItemSelectionModel* selectionModel);
+
+ QSet<QItemSelectionModel*> _selectionModels;
+};