Pimcommon

checkedcollectionwidget.cpp
1/*
2 SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "checkedcollectionwidget.h"
8#include <Akonadi/CollectionFilterProxyModel>
9
10#include <Akonadi/EntityTreeModel>
11#include <Akonadi/Monitor>
12#include <QSortFilterProxyModel>
13
14#include <KCheckableProxyModel>
15#include <KLocalizedString>
16#include <QLineEdit>
17
18#include <QTreeView>
19#include <QVBoxLayout>
20
21using namespace PimCommon;
22
23class PimCommon::CheckedCollectionWidgetPrivate
24{
25public:
26 CheckedCollectionWidgetPrivate() = default;
27
28 QTreeView *mFolderView = nullptr;
29 QItemSelectionModel *mSelectionModel = nullptr;
30 KCheckableProxyModel *mCheckProxy = nullptr;
31 QSortFilterProxyModel *mCollectionFilter = nullptr;
32
33 Akonadi::EntityTreeModel *mEntityTreeModel = nullptr;
34};
35
36CheckedCollectionWidget::CheckedCollectionWidget(const QString &mimetype, QWidget *parent)
37 : QWidget(parent)
38 , d(new PimCommon::CheckedCollectionWidgetPrivate)
39{
40 auto vbox = new QVBoxLayout(this);
41 vbox->setContentsMargins({});
42
43 // Create a new change recorder.
44 auto monitor = new Akonadi::Monitor(this);
45 monitor->setObjectName(QLatin1StringView("CheckedCollectionWidgetMonitor"));
46 monitor->fetchCollection(true);
47 monitor->setAllMonitored(true);
48 monitor->setMimeTypeMonitored(mimetype);
49 connect(monitor, &Akonadi::Monitor::collectionAdded, this, &CheckedCollectionWidget::collectionAdded);
50 connect(monitor, &Akonadi::Monitor::collectionRemoved, this, &CheckedCollectionWidget::collectionRemoved);
51
52 d->mEntityTreeModel = new Akonadi::EntityTreeModel(monitor, this);
53 // Set the model to show only collections, not items.
54 d->mEntityTreeModel->setItemPopulationStrategy(Akonadi::EntityTreeModel::NoItemPopulation);
55
56 auto mimeTypeProxy = new Akonadi::CollectionFilterProxyModel(this);
57 mimeTypeProxy->setExcludeVirtualCollections(true);
58 mimeTypeProxy->addMimeTypeFilters({mimetype});
59 mimeTypeProxy->setSourceModel(d->mEntityTreeModel);
60
61 // Create the Check proxy model.
62 d->mSelectionModel = new QItemSelectionModel(mimeTypeProxy);
63 d->mCheckProxy = new KCheckableProxyModel(this);
64 d->mCheckProxy->setSelectionModel(d->mSelectionModel);
65 d->mCheckProxy->setSourceModel(mimeTypeProxy);
66 d->mCollectionFilter = new QSortFilterProxyModel(this);
67 d->mCollectionFilter->setRecursiveFilteringEnabled(true);
68 d->mCollectionFilter->setSourceModel(d->mCheckProxy);
69 d->mCollectionFilter->setFilterCaseSensitivity(Qt::CaseInsensitive);
70
71 auto searchLine = new QLineEdit(this);
72 searchLine->setPlaceholderText(i18n("Search..."));
73 searchLine->setClearButtonEnabled(true);
74 connect(searchLine, &QLineEdit::textChanged, this, &CheckedCollectionWidget::slotSetCollectionFilter);
75
76 vbox->addWidget(searchLine);
77
78 d->mFolderView = new QTreeView;
80 d->mFolderView->setAlternatingRowColors(true);
81 d->mFolderView->setModel(d->mCollectionFilter);
82
83 vbox->addWidget(d->mFolderView);
84}
85
86CheckedCollectionWidget::~CheckedCollectionWidget() = default;
87
88Akonadi::EntityTreeModel *CheckedCollectionWidget::entityTreeModel() const
89{
90 return d->mEntityTreeModel;
91}
92
93QTreeView *CheckedCollectionWidget::folderTreeView() const
94{
95 return d->mFolderView;
96}
97
98QItemSelectionModel *CheckedCollectionWidget::selectionModel() const
99{
100 return d->mSelectionModel;
101}
102
103KCheckableProxyModel *CheckedCollectionWidget::checkableProxy() const
104{
105 return d->mCheckProxy;
106}
107
108void CheckedCollectionWidget::slotSetCollectionFilter(const QString &filter)
109{
110 d->mCollectionFilter->setFilterWildcard(filter);
111 d->mFolderView->expandAll();
112}
113
114#include "moc_checkedcollectionwidget.cpp"
void collectionRemoved(const Akonadi::Collection &collection)
void collectionAdded(const Akonadi::Collection &collection, const Akonadi::Collection &parent)
QString i18n(const char *text, const TYPE &arg...)
KIOCORE_EXPORT MimetypeJob * mimetype(const QUrl &url, JobFlags flags=DefaultFlags)
folderdialogacltab.h
void setEditTriggers(EditTriggers triggers)
void textChanged(const QString &text)
CaseInsensitive
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:17:23 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.