File indexing completed on 2024-04-28 05:49:28

0001 /* This file is part of the KDE project
0002    SPDX-FileCopyrightText: 2001 Christoph Cullmann <cullmann@kde.org>
0003    SPDX-FileCopyrightText: 2002 Joseph Wenninger <jowenn@kde.org>
0004    SPDX-FileCopyrightText: 2007 Mirko Stocker <me@misto.ch>
0005 
0006    SPDX-License-Identifier: LGPL-2.0-only
0007 */
0008 
0009 #include "kateconfigplugindialogpage.h"
0010 
0011 #include "kateapp.h"
0012 #include "kateconfigdialog.h"
0013 #include "katepluginmanager.h"
0014 
0015 #include <KLocalizedString>
0016 
0017 #include <QVBoxLayout>
0018 
0019 class KatePluginListItem : public QTreeWidgetItem
0020 {
0021 public:
0022     KatePluginListItem(bool checked, KatePluginInfo *info);
0023 
0024     KatePluginInfo *info() const
0025     {
0026         return mInfo;
0027     }
0028 
0029 protected:
0030     void stateChange(bool);
0031 
0032 private:
0033     KatePluginInfo *mInfo;
0034 };
0035 
0036 KatePluginListItem::KatePluginListItem(bool checked, KatePluginInfo *info)
0037     : mInfo(info)
0038 {
0039     setCheckState(0, checked ? Qt::Checked : Qt::Unchecked);
0040 }
0041 
0042 KatePluginListView::KatePluginListView(QWidget *parent)
0043     : QTreeWidget(parent)
0044 {
0045     setRootIsDecorated(false);
0046     connect(this, &KatePluginListView::itemChanged, this, &KatePluginListView::stateChanged);
0047 }
0048 
0049 void KatePluginListView::stateChanged(QTreeWidgetItem *item)
0050 {
0051     Q_EMIT stateChange(static_cast<KatePluginListItem *>(item), item->checkState(0) == Qt::Checked);
0052 }
0053 
0054 KateConfigPluginPage::KateConfigPluginPage(QWidget *parent, KateConfigDialog *dialog)
0055     : QFrame(parent)
0056     , myDialog(dialog)
0057 {
0058     QVBoxLayout *layout = new QVBoxLayout(this);
0059     layout->setSpacing(0);
0060     layout->setContentsMargins(0, 0, 0, 0);
0061 
0062     KatePluginListView *listView = new KatePluginListView(this);
0063     layout->addWidget(listView);
0064 
0065     QStringList headers;
0066     headers << i18n("Name") << i18n("Description");
0067     listView->setHeaderLabels(headers);
0068     listView->setWhatsThis(
0069         i18n("Here you can see all available Kate plugins. Those with a check mark are loaded, and will be loaded again the next time Kate is started."));
0070 
0071     KatePluginList &pluginList(KateApp::self()->pluginManager()->pluginList());
0072     for (auto &pluginInfo : pluginList) {
0073         auto item = new KatePluginListItem(pluginInfo.load, &pluginInfo);
0074         item->setText(0, pluginInfo.metaData.name());
0075         item->setText(1, pluginInfo.metaData.description());
0076         listView->addTopLevelItem(item);
0077         m_pluginItems.push_back(item);
0078     }
0079 
0080     listView->resizeColumnToContents(0);
0081     listView->sortByColumn(0, Qt::AscendingOrder);
0082     connect(listView, &KatePluginListView::stateChange, this, &KateConfigPluginPage::stateChange);
0083 }
0084 
0085 void KateConfigPluginPage::stateChange(KatePluginListItem * /*item*/, bool /*b*/)
0086 {
0087     // just signal change to dialog, we will unload/load the plugins on apply
0088     Q_EMIT changed();
0089 }
0090 
0091 void KateConfigPluginPage::slotApply()
0092 {
0093     for (auto item : m_pluginItems) {
0094         if (item->checkState(0) == Qt::Checked) {
0095             loadPlugin(item);
0096         } else {
0097             unloadPlugin(item);
0098         }
0099     }
0100 }
0101 
0102 void KateConfigPluginPage::loadPlugin(KatePluginListItem *item)
0103 {
0104     if (item->info()->load) {
0105         return;
0106     }
0107 
0108     const bool ok = KateApp::self()->pluginManager()->loadPlugin(item->info());
0109     if (!ok) {
0110         return;
0111     }
0112     KateApp::self()->pluginManager()->enablePluginGUI(item->info());
0113     myDialog->addPluginPage(item->info()->plugin);
0114 
0115     item->setCheckState(0, Qt::Checked);
0116 }
0117 
0118 void KateConfigPluginPage::unloadPlugin(KatePluginListItem *item)
0119 {
0120     if (!item->info()->load) {
0121         return;
0122     }
0123 
0124     myDialog->removePluginPage(item->info()->plugin);
0125     KateApp::self()->pluginManager()->unloadPlugin(item->info());
0126 
0127     item->setCheckState(0, Qt::Unchecked);
0128 }
0129 
0130 #include "moc_kateconfigplugindialogpage.cpp"