1 | /* |
2 | SPDX-FileCopyrightText: 2010 Stephen Kelly <steveire@gmail.com> |
3 | |
4 | SPDX-License-Identifier: LGPL-2.0-or-later |
5 | */ |
6 | |
7 | #ifndef KCHECKABLEPROXYMODEL_H |
8 | #define KCHECKABLEPROXYMODEL_H |
9 | |
10 | #include "kitemmodels_export.h" |
11 | |
12 | #include <QIdentityProxyModel> |
13 | #include <QItemSelection> |
14 | |
15 | #include <memory> |
16 | |
17 | class KCheckableProxyModelPrivate; |
18 | |
19 | /** |
20 | * @class KCheckableProxyModel kcheckableproxymodel.h KCheckableProxyModel |
21 | * |
22 | * @brief Adds a checkable capability to a source model |
23 | * |
24 | * Items is standard Qt views such as QTreeView and QListView can have a |
25 | * checkable capability and draw checkboxes. Adding such a capability |
26 | * requires specific implementations of the data() and flags() virtual methods. |
27 | * This class implements those methods generically so that it is not necessary to |
28 | * implement them in your model. |
29 | * |
30 | * This can be combined with a KSelectionProxyModel showing the items currently selected |
31 | * |
32 | * @code |
33 | * |
34 | * QItemSelectionModel *checkModel = new QItemSelectionModel(rootModel, this); |
35 | * KCheckableProxyModel *checkable = new KCheckableProxyModel(this); |
36 | * checkable->setSourceModel(rootModel); |
37 | * checkable->setSelectionModel(checkModel); |
38 | * |
39 | * QTreeView *tree1 = new QTreeView(vSplitter); |
40 | * tree1->setModel(checkable); |
41 | * tree1->expandAll(); |
42 | * |
43 | * KSelectionProxyModel *selectionProxy = new KSelectionProxyModel(checkModel, this); |
44 | * selectionProxy->setFilterBehavior(KSelectionProxyModel::ExactSelection); |
45 | * selectionProxy->setSourceModel(rootModel); |
46 | * |
47 | * QTreeView *tree2 = new QTreeView(vSplitter); |
48 | * tree2->setModel(selectionProxy); |
49 | * @endcode |
50 | * |
51 | * @image html kcheckableproxymodel.png "A KCheckableProxyModel and KSelectionProxyModel showing checked items" |
52 | * |
53 | * @since 4.6 |
54 | * @author Stephen Kelly <steveire@gmail.com> |
55 | */ |
56 | class KITEMMODELS_EXPORT KCheckableProxyModel : public QIdentityProxyModel |
57 | { |
58 | Q_OBJECT |
59 | public: |
60 | explicit KCheckableProxyModel(QObject *parent = nullptr); |
61 | ~KCheckableProxyModel() override; |
62 | |
63 | void setSelectionModel(QItemSelectionModel *itemSelectionModel); |
64 | QItemSelectionModel *selectionModel() const; |
65 | |
66 | Qt::ItemFlags flags(const QModelIndex &index) const override; |
67 | |
68 | QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; |
69 | |
70 | bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; |
71 | |
72 | void setSourceModel(QAbstractItemModel *sourceModel) override; |
73 | |
74 | /// Expose following role: "checkState" => Qt::CheckStateRole |
75 | QHash<int, QByteArray> roleNames() const override; |
76 | |
77 | protected: |
78 | virtual bool select(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command); |
79 | |
80 | private: |
81 | Q_DECLARE_PRIVATE(KCheckableProxyModel) |
82 | std::unique_ptr<KCheckableProxyModelPrivate> const d_ptr; |
83 | |
84 | Q_PRIVATE_SLOT(d_func(), void selectionChanged(const QItemSelection &, const QItemSelection &)) |
85 | }; |
86 | |
87 | #endif |
88 | |