Pimcommon

configurepluginslistwidget.cpp
1/*
2 SPDX-FileCopyrightText: 2016-2024 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "configurepluginslistwidget.h"
8
9#include <KLineEditEventHandler>
10#include <KLocalizedString>
11#include <KSharedConfig>
12#include <KTreeWidgetSearchLine>
13#include <KTreeWidgetSearchLineWidget>
14
15#include <QAction>
16#include <QHeaderView>
17#include <QPushButton>
18#include <QToolButton>
19#include <QTreeWidget>
20#include <QVBoxLayout>
21
22using namespace PimCommon;
23ConfigurePluginsListWidget::ConfigurePluginsListWidget(QWidget *parent)
24 : QWidget(parent)
25 , mListWidget(new QTreeWidget(this))
26{
27 auto mainLayout = new QVBoxLayout(this);
28 mainLayout->setObjectName(QLatin1StringView("mainlayout"));
29 mainLayout->setContentsMargins({});
30 mainLayout->setSpacing(0);
31
32 mListWidget->setSortingEnabled(true);
33 mListWidget->sortItems(0, Qt::AscendingOrder);
34 mListWidget->setObjectName(QLatin1StringView("listwidget"));
35 mListWidget->setHeaderHidden(true);
36 mListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
37 mListWidget->setColumnCount(2);
38 mListWidget->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
39 mListWidget->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
40 mListWidget->header()->setStretchLastSection(false);
41
42 mTreeWidgetSearchLineEdit = new KTreeWidgetSearchLineWidget(this, mListWidget);
43 mTreeWidgetSearchLineEdit->setObjectName(QLatin1StringView("mTreeWidgetSearchLineEdit"));
44 mTreeWidgetSearchLineEdit->searchLine()->setProperty("_breeze_borders_sides", QVariant::fromValue(QFlags{Qt::BottomEdge}));
45 KLineEditEventHandler::catchReturnKey(mTreeWidgetSearchLineEdit->searchLine());
46
47 connect(mListWidget, &QTreeWidget::itemSelectionChanged, this, &ConfigurePluginsListWidget::slotItemSelectionChanged);
48 connect(mListWidget, &QTreeWidget::itemChanged, this, &ConfigurePluginsListWidget::slotItemChanged);
49
50 mainLayout->addWidget(mTreeWidgetSearchLineEdit);
51 mainLayout->addWidget(mListWidget);
52}
53
54ConfigurePluginsListWidget::~ConfigurePluginsListWidget() = default;
55
56void ConfigurePluginsListWidget::slotItemChanged(QTreeWidgetItem *item, int column)
57{
58 Q_UNUSED(item)
59 if (mInitializeDone) {
60 if (column == 0) {
61 Q_EMIT changed();
62 }
63 }
64}
65
66void ConfigurePluginsListWidget::slotItemSelectionChanged()
67{
68 QTreeWidgetItem *item = mListWidget->currentItem();
69 if (auto pluginItem = dynamic_cast<PluginItem *>(item)) {
70 Q_EMIT descriptionChanged(pluginItem->mDescription);
71 }
72}
73
74void ConfigurePluginsListWidget::save()
75{
76}
77
78void ConfigurePluginsListWidget::doLoadFromGlobalSettings()
79{
80 initialize();
81 initializeDone();
82}
83
84void ConfigurePluginsListWidget::doResetToDefaultsOther()
85{
86}
87
88void ConfigurePluginsListWidget::defaults()
89{
90}
91
92void ConfigurePluginsListWidget::initialize()
93{
94}
95
96void ConfigurePluginsListWidget::initializeDone()
97{
98 mInitializeDone = true;
99}
100
101void ConfigurePluginsListWidget::savePlugins(const QString &groupName, const QString &prefixSettingKey, const QList<PluginItem *> &listItems)
102{
103 if (listItems.isEmpty()) {
104 return;
105 }
106 QStringList enabledPlugins;
107 QStringList disabledPlugins;
108 for (PluginItem *item : listItems) {
109 if (item->checkState(0) == Qt::Checked) {
110 enabledPlugins << item->mIdentifier;
111 } else {
112 disabledPlugins << item->mIdentifier;
113 }
114 }
115 PimCommon::PluginUtil::savePluginSettings(groupName, prefixSettingKey, enabledPlugins, disabledPlugins);
116}
117
118void ConfigurePluginsListWidget::fillTopItems(const QList<PimCommon::PluginUtilData> &lst,
119 const QString &topLevelItemName,
120 const QString &groupName,
121 const QString &prefixKey,
122 QList<PluginItem *> &itemsList,
123 const QString &configureGroupName,
124 bool checkable)
125{
126 itemsList.clear();
127 if (!lst.isEmpty()) {
128 auto topLevel = new QTreeWidgetItem(mListWidget, {topLevelItemName});
129 topLevel->setFlags(topLevel->flags() & ~Qt::ItemIsSelectable);
130 const QPair<QStringList, QStringList> pair = PimCommon::PluginUtil::loadPluginSetting(groupName, prefixKey);
131 for (const PimCommon::PluginUtilData &data : lst) {
132 auto subItem = new PluginItem(topLevel);
133 subItem->setText(0, data.mName);
134 subItem->mIdentifier = data.mIdentifier;
135 subItem->mDescription = data.mDescription;
136 subItem->mEnableByDefault = data.mEnableByDefault;
137 subItem->mHasConfigureSupport = data.mHasConfigureDialog;
138 if (checkable) {
139 const bool isPluginActivated = PimCommon::PluginUtil::isPluginActivated(pair.first, pair.second, data.mEnableByDefault, data.mIdentifier);
140 subItem->mEnableFromUserSettings = isPluginActivated;
141 subItem->setCheckState(0, isPluginActivated ? Qt::Checked : Qt::Unchecked);
142 }
143 if (data.mHasConfigureDialog) {
144 auto but = new QToolButton(mListWidget);
145 auto act = new QAction(but);
146 const QStringList actData{configureGroupName, data.mIdentifier};
147 act->setData(actData);
148 but->setDefaultAction(act);
149 but->setIcon(QIcon::fromTheme(QStringLiteral("configure")));
150 but->setText(i18n("..."));
151 but->setFixedWidth(28);
152 but->setToolTip(i18n("Configure"));
153 but->setAutoFillBackground(true);
154 but->setEnabled(subItem->mHasConfigureSupport);
155 mListWidget->setItemWidget(subItem, 1, but);
156 connect(but, &QToolButton::triggered, this, &ConfigurePluginsListWidget::slotConfigureClicked);
157 }
158 itemsList.append(subItem);
159 }
160 }
161}
162
163void ConfigurePluginsListWidget::slotConfigureClicked(QAction *act)
164{
165 if (act) {
166 const QStringList lst = act->data().toStringList();
167 if (lst.count() == 2) {
168 Q_EMIT configureClicked(lst.at(0), lst.at(1));
169 }
170 }
171}
172
173void ConfigurePluginsListWidget::changeState(const QList<PluginItem *> &items)
174{
175 for (PluginItem *item : items) {
176 item->setCheckState(0, item->mEnableByDefault ? Qt::Checked : Qt::Unchecked);
177 }
178}
179
180void ConfigurePluginsListWidget::resetToUserSettings(const QList<PluginItem *> &items)
181{
182 for (PluginItem *item : items) {
183 item->setCheckState(0, item->mEnableFromUserSettings ? Qt::Checked : Qt::Unchecked);
184 }
185}
186
187#include "moc_configurepluginslistwidget.cpp"
The PluginUtilData class.
Definition pluginutil.h:23
QString i18n(const char *text, const TYPE &arg...)
void catchReturnKey(QObject *lineEdit)
folderdialogacltab.h
QVariant data() const const
QIcon fromTheme(const QString &name)
void append(QList< T > &&value)
const_reference at(qsizetype i) const const
void clear()
qsizetype count() const const
bool isEmpty() const const
Q_EMITQ_EMIT
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
BottomEdge
ItemIsSelectable
AscendingOrder
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
void triggered(QAction *action)
QTreeWidgetItem * currentItem() const const
void itemChanged(QTreeWidgetItem *item, int column)
void itemSelectionChanged()
void setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget)
Qt::CheckState checkState(int column) const const
void setCheckState(int column, Qt::CheckState state)
void setFlags(Qt::ItemFlags flags)
QVariant fromValue(T &&value)
QStringList toStringList() const const
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.