8#include "completionorderwidget.h"
9#include <kldapcore/ldapactivitiesabstract.h>
11#include <KDescendantsProxyModel>
12#include <KLDAPCore/LdapClient>
13#include <KLDAPCore/LdapClientSearch>
15#include <KContacts/Addressee>
16#include <KContacts/ContactGroup>
17#include <KLDAPCore/LdapClientSearchConfig>
19#include <Akonadi/ChangeRecorder>
20#include <Akonadi/CollectionFilterProxyModel>
21#include <Akonadi/EntityTreeModel>
22#include <Akonadi/Monitor>
24#include <kldapcore/ldapserver.h>
26#include <KConfigGroup>
27#include <KLocalizedString>
28#include <QDBusConnection>
32#include <QTreeWidgetItem>
38CompletionOrderEditorAdaptor::CompletionOrderEditorAdaptor(
QObject *parent)
41 setAutoRelaySignals(
true);
44class LDAPCompletionItem :
public CompletionItem
47 explicit LDAPCompletionItem(KLDAPCore::LdapClient *ldapClient)
48 : mLdapClient(ldapClient)
50 mWeight = mLdapClient->completionWeight();
53 [[nodiscard]] QString label()
const override
55 return i18n(
"LDAP server %1", mLdapClient->server().host());
58 [[nodiscard]] QIcon icon()
const override
63 [[nodiscard]]
int completionWeight()
const override
68 void save(CompletionOrderWidget *)
override
70 KConfig *config = KLDAPCore::LdapClientSearchConfig::config();
71 KConfigGroup group(config, QStringLiteral(
"LDAP"));
72 group.writeEntry(QStringLiteral(
"SelectedCompletionWeight%1").arg(mLdapClient->clientNumber()), mWeight);
76 [[nodiscard]]
bool hasEnableSupport()
const override
81 [[nodiscard]]
bool isEnabled()
const override
86 void setIsEnabled(
bool b)
override
92 void setCompletionWeight(
int weight)
override
98 KLDAPCore::LdapClient *
const mLdapClient;
102class SimpleCompletionItem :
public CompletionItem
105 SimpleCompletionItem(CompletionOrderWidget *editor,
const QString &label,
const QString &identifier,
int weight,
bool enableSupport =
false)
107 , mIdentifier(identifier)
108 , mHasEnableSupport(enableSupport)
111 KConfigGroup groupCompletionWeights(editor->configFile(), QStringLiteral(
"CompletionWeights"));
112 mWeight = groupCompletionWeights.readEntry(mIdentifier, weight);
113 if (mHasEnableSupport) {
114 KConfigGroup groupEnabled(editor->configFile(), QStringLiteral(
"CompletionEnabled"));
115 mEnabled = groupEnabled.readEntry(mIdentifier,
true);
119 ~SimpleCompletionItem()
override =
default;
121 [[nodiscard]]
bool isEnabled()
const override
126 [[nodiscard]]
bool hasEnableSupport()
const override
128 return mHasEnableSupport;
131 void setIcon(
const QIcon &icon)
136 [[nodiscard]] QString label()
const override
141 [[nodiscard]] QIcon icon()
const override
146 [[nodiscard]]
int completionWeight()
const override
151 void setIsEnabled(
bool b)
override
156 void save(CompletionOrderWidget *editor)
override
158 KConfigGroup group(editor->configFile(), QStringLiteral(
"CompletionWeights"));
159 group.writeEntry(mIdentifier, mWeight);
160 if (mHasEnableSupport) {
161 KConfigGroup groupEnabled(editor->configFile(), QStringLiteral(
"CompletionEnabled"));
162 groupEnabled.writeEntry(mIdentifier, isEnabled());
167 void setCompletionWeight(
int weight)
override
177 bool mHasEnableSupport;
186 CompletionViewItem(QTreeWidget *
parent, CompletionItem *item)
192 ~CompletionViewItem()
override
197 void setItem(CompletionItem *item)
202 if (mItem->hasEnableSupport()) {
210 [[nodiscard]] CompletionItem *item()
const
218 const auto completionItem =
static_cast<const CompletionViewItem *
>(otherItem);
220 return mItem->completionWeight() > completionItem->item()->completionWeight();
224 CompletionItem *mItem =
nullptr;
227CompletionOrderWidget::CompletionOrderWidget(
QWidget *parent)
229 , mConfig(QStringLiteral(
"kpimcompletionorder"))
231 new CompletionOrderEditorAdaptor(
this);
238 pageHBoxLayout->setContentsMargins({});
239 hbox->addWidget(page);
241 mListView->setObjectName(
"listview"_L1);
243 pageHBoxLayout->addWidget(mListView);
244 mListView->setColumnCount(1);
245 mListView->setAlternatingRowColors(
true);
246 mListView->setIndentation(0);
247 mListView->setAllColumnsShowFocus(
true);
248 mListView->setHeaderHidden(
true);
249 mListView->setSortingEnabled(
true);
251 auto upDownBox =
new QWidget(page);
252 auto upDownBoxVBoxLayout =
new QVBoxLayout(upDownBox);
253 upDownBoxVBoxLayout->setContentsMargins({});
254 pageHBoxLayout->addWidget(upDownBox);
256 upDownBoxVBoxLayout->addWidget(mUpButton);
257 mUpButton->setAutoRepeat(
true);
258 mUpButton->setObjectName(
"mUpButton"_L1);
260 mUpButton->setEnabled(
false);
261 mUpButton->setToolTip(
i18nc(
"@info:tooltip",
"Move Up"));
265 upDownBoxVBoxLayout->addWidget(mDownButton);
266 mDownButton->setAutoRepeat(
true);
267 mDownButton->setObjectName(
"mDownButton"_L1);
269 mDownButton->setEnabled(
false);
270 mDownButton->setToolTip(
i18nc(
"@info:tooltip",
"Move Down"));
273 auto spacer =
new QWidget(upDownBox);
274 upDownBoxVBoxLayout->addWidget(spacer);
275 upDownBoxVBoxLayout->setStretchFactor(spacer, 100);
284CompletionOrderWidget::~CompletionOrderWidget() =
default;
286void CompletionOrderWidget::save()
291 KConfigGroup group(configFile(), QStringLiteral(
"CompletionWeights"));
292 group.deleteGroup(QLatin1StringView());
294 for (
int itemIndex = 0; itemIndex < mListView->topLevelItemCount(); ++itemIndex) {
295 auto item =
static_cast<CompletionViewItem *
>(mListView->topLevelItem(itemIndex));
296 item->item()->setCompletionWeight(w);
297 item->item()->setIsEnabled(item->checkState(0) ==
Qt::Checked);
298 item->item()->save(
this);
301 Q_EMIT completionOrderChanged();
305KConfig *CompletionOrderWidget::configFile()
310void CompletionOrderWidget::addRecentAddressItem()
313 auto item =
new SimpleCompletionItem(
this,
i18n(
"Recent Addresses"), QStringLiteral(
"Recent Addresses"), 10);
315 new CompletionViewItem(mListView, item);
318void CompletionOrderWidget::addCompletionItemForCollection(
const QModelIndex &index)
321 if (!collection.isValid()) {
328 new CompletionViewItem(mListView, item);
331void CompletionOrderWidget::loadCompletionItems()
335 const QList<KLDAPCore::LdapClient *> listClients = mLdapSearch->clients();
336 for (KLDAPCore::LdapClient *client : listClients) {
337 if (mLdapActivities) {
338 if (mLdapActivities->hasActivitySupport())
339 if (client->server().enablePlasmaActivities() && !client->server().activities().contains(mLdapActivities->currentActivity())) {
343 new CompletionViewItem(mListView,
new LDAPCompletionItem(client));
347 auto monitor =
new Akonadi::ChangeRecorder(
this);
348 monitor->fetchCollection(
true);
353 auto model =
new Akonadi::EntityTreeModel(monitor,
this);
356 auto descendantsProxy =
new KDescendantsProxyModel(
this);
357 descendantsProxy->setDisplayAncestorData(
true);
358 descendantsProxy->setSourceModel(model);
360 auto mimeTypeProxy =
new Akonadi::CollectionFilterProxyModel(
this);
362 mimeTypeProxy->setSourceModel(descendantsProxy);
363 mimeTypeProxy->setExcludeVirtualCollections(
true);
365 mCollectionModel = mimeTypeProxy;
368 for (
int row = 0; row < mCollectionModel->rowCount(); ++row) {
369 addCompletionItemForCollection(mCollectionModel->index(row, 0));
371 addRecentAddressItem();
378void CompletionOrderWidget::setLdapActivitiesAbstract(KLDAPCore::LdapActivitiesAbstract *ldapActivities)
380 mLdapActivities = ldapActivities;
383void CompletionOrderWidget::setLdapClientSearch(KLDAPCore::LdapClientSearch *ldapSearch)
385 mLdapSearch = ldapSearch;
388void CompletionOrderWidget::rowsInserted(
const QModelIndex &parent,
int start,
int end)
390 for (
int row =
start; row <=
end; ++row) {
391 addCompletionItemForCollection(mCollectionModel->index(row, 0,
parent));
397void CompletionOrderWidget::slotItemChanged()
402void CompletionOrderWidget::slotSelectionChanged()
404 QTreeWidgetItem *item = mListView->currentItem();
405 mDownButton->setEnabled(item && mListView->itemBelow(item));
406 mUpButton->setEnabled(item && mListView->itemAbove(item));
409static void swapItems(CompletionViewItem *one, CompletionViewItem *other)
411 CompletionItem *oneCompletion = one->item();
412 CompletionItem *otherCompletion = other->item();
414 int weight = otherCompletion->completionWeight();
415 otherCompletion->setCompletionWeight(oneCompletion->completionWeight());
416 oneCompletion->setCompletionWeight(weight);
418 one->setItem(oneCompletion);
419 other->setItem(otherCompletion);
422void CompletionOrderWidget::slotMoveUp()
424 auto item =
static_cast<CompletionViewItem *
>(mListView->currentItem());
428 auto above =
static_cast<CompletionViewItem *
>(mListView->itemAbove(item));
432 swapItems(item, above);
434 slotSelectionChanged();
438void CompletionOrderWidget::slotMoveDown()
440 auto item =
static_cast<CompletionViewItem *
>(mListView->currentItem());
444 auto below =
static_cast<CompletionViewItem *
>(mListView->itemBelow(item));
448 swapItems(item, below);
450 slotSelectionChanged();
454#include "moc_completionorderwidget.cpp"
Q_SCRIPTABLE Q_NOREPLY void start()
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
const QList< QKeySequence > & end()
void rowsInserted(const QModelIndex &parent, int first, int last)
bool registerObject(const QString &path, QObject *object, RegisterOptions options)
QDBusConnection sessionBus()
QIcon fromTheme(const QString &name)
QVariant data(int role) const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QObject * parent() const const
QString number(double n, char format, int precision)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
void setText(int column, const QString &text)
QString toString() const const