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"