File indexing completed on 2024-05-12 04:33:19

0001 /*
0002     SPDX-FileCopyrightText: 2012 Victor Dodon <dodonvictor at gmail dot com>
0003     SPDX-FileCopyrightText: 2012-2018 Gilles Caulier <caulier dot gilles at gmail dot com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "kipisetup.h"
0009 
0010 // Qt includes
0011 
0012 #include <QList>
0013 #include <QRadioButton>
0014 #include <QPushButton>
0015 #include <QDir>
0016 #include <QVBoxLayout>
0017 #include <QWidget>
0018 #include <QDebug>
0019 #include <QScrollArea>
0020 #include <QApplication>
0021 #include <QComboBox>
0022 #include <QLineEdit>
0023 #include <QStyle>
0024 #include <QStandardPaths>
0025 #include <QDialogButtonBox>
0026 
0027 // KF includes
0028 
0029 #include <KSharedConfig>
0030 #include <KConfigGroup>
0031 #include <KWindowConfig>
0032 
0033 // Libkipi includes
0034 
0035 #include "pluginloader.h"
0036 #include "configwidget.h"
0037 
0038 // Local includes
0039 
0040 #include "kipitestpluginloader.h"
0041 
0042 using namespace KIPI;
0043 
0044 namespace KXMLKipiCmd
0045 {
0046 
0047 const QString SetupXML::CONFIG_GROUP_NAME = QString::fromLatin1("UI Settings");
0048 
0049 class KipiSetup::Private
0050 {
0051 
0052 public:
0053 
0054     Private() :
0055         pluginFilter(nullptr),
0056         buttons(nullptr),
0057         tabView(nullptr),
0058         pluginsList(nullptr),
0059         xmlPage(nullptr)
0060     {
0061     }
0062 
0063     QLineEdit*        pluginFilter;
0064 
0065     QDialogButtonBox* buttons;
0066     QTabWidget*       tabView;
0067 
0068     ConfigWidget*     pluginsList;
0069     SetupXML*         xmlPage;
0070 };
0071 
0072 KipiSetup::KipiSetup(QWidget* const parent)
0073     : QDialog(parent),
0074       d(new Private)
0075 {
0076     setWindowTitle(QLatin1String("Configure"));
0077     setModal(true);
0078     setMinimumSize(600, 400);
0079 
0080     d->buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
0081     d->tabView = new QTabWidget(this);
0082 
0083     QScrollArea* const sv   = new QScrollArea(this);
0084     QWidget* const panel    = new QWidget(sv->viewport());
0085     QGridLayout* const grid = new QGridLayout(panel);
0086 
0087     d->pluginFilter = new QLineEdit(panel);
0088     d->pluginFilter->setClearButtonEnabled(true);
0089     d->pluginFilter->setPlaceholderText(QLatin1String("Plugins list filter."));
0090 
0091     d->pluginsList  = PluginLoader::instance()->configWidget(d->tabView);
0092     d->pluginsList->setToolTip(QLatin1String("Configure plugins"));
0093 
0094     QStringList labels;
0095     labels.append(QLatin1String("Name"));
0096     labels.append(QLatin1String("Categories"));
0097     labels.append(QLatin1String("Description"));
0098     labels.append(QLatin1String("Author"));
0099     d->pluginsList->setHeaderLabels(labels);
0100 
0101     grid->addWidget(d->pluginFilter, 0, 0, 1, 1);
0102     grid->addWidget(d->pluginsList,  1, 0, 1, 1);
0103     grid->setRowStretch(1, 10);
0104 
0105     sv->setWidget(panel);
0106     sv->setWidgetResizable(true);
0107 
0108     d->tabView->insertTab(KipiPluginsPage, sv, QIcon(QLatin1String(":/icons/kipi-icon.svg")), QLatin1String("Kipi Plugins"));
0109 
0110     d->xmlPage = new SetupXML(d->tabView);
0111     d->xmlPage->setToolTip(QLatin1String("Configure the UI file for the KXMLKipiCmd application"));
0112     d->tabView->insertTab(XmlFilesPage, d->xmlPage, QIcon::fromTheme(QString::fromLatin1("application-xml")), QLatin1String("UI layouts"));
0113 
0114     QVBoxLayout* const vbx = new QVBoxLayout(this);
0115     vbx->addWidget(d->tabView);
0116     vbx->addWidget(d->buttons);
0117     setLayout(vbx);
0118 
0119     KSharedConfig::Ptr config = KSharedConfig::openConfig();
0120     KConfigGroup group        = config->group("Setup Dialog");
0121     KWindowConfig::restoreWindowSize(windowHandle(), group);
0122     d->tabView->setCurrentIndex(group.readEntry("Setup Page", 0));
0123 
0124     connect(d->pluginFilter, &QLineEdit::textChanged,
0125             this, &KipiSetup::slotFilterChanged);
0126 
0127     connect(d->buttons->button(QDialogButtonBox::Ok), &QPushButton::clicked,
0128             this, &KipiSetup::slotOkClicked);
0129 
0130     connect(d->buttons->button(QDialogButtonBox::Cancel), &QPushButton::clicked,
0131             this, &KipiSetup::close);
0132 }
0133 
0134 KipiSetup::~KipiSetup()
0135 {
0136     KSharedConfig::Ptr config = KSharedConfig::openConfig();
0137     KConfigGroup group        = config->group(QString::fromLatin1("Setup Dialog"));
0138     KWindowConfig::saveWindowSize(windowHandle(), group);
0139     group.writeEntry("Setup Page", d->tabView->currentIndex());
0140     config->sync();
0141 
0142     delete d;
0143 }
0144 
0145 void KipiSetup::slotFilterChanged(const QString& filter)
0146 {
0147      d->pluginsList->setFilter(filter, Qt::CaseInsensitive);
0148 }
0149 
0150 bool KipiSetup::runSetupDialog(QWidget* const parent)
0151 {
0152     QPointer<KipiSetup> setup = new KipiSetup(parent);
0153     bool success              = (setup->exec() == QDialog::Accepted);
0154     delete setup;
0155 
0156     return success;
0157 }
0158 
0159 void KipiSetup::slotOkClicked()
0160 {
0161     qDebug() << "Ok clicked";
0162 
0163     QApplication::setOverrideCursor(Qt::WaitCursor);
0164 
0165     d->pluginsList->apply();
0166     d->xmlPage->apply();
0167 
0168     QApplication::restoreOverrideCursor();
0169     accept();
0170 }
0171 
0172 // -------------------------------------------------------------------
0173 
0174 class SetupXML::Private
0175 {
0176 public:
0177 
0178     Private()
0179     {
0180         xmlFilesCob = nullptr;
0181     }
0182 
0183     QList<QString> uiFilesList;
0184     QComboBox*     xmlFilesCob;
0185 };
0186 
0187 SetupXML::SetupXML(QWidget* const parent)
0188     : QScrollArea(parent),
0189       d(new Private)
0190 {
0191     QWidget* const panel = new QWidget(viewport());
0192     setWidget(panel);
0193     setWidgetResizable(true);
0194 
0195     QDir dir(QStringLiteral(":/kxmlgui5/kxmlkipicmd"));
0196     QString filter = QString::fromLatin1("*ui.rc");
0197     d->uiFilesList = dir.entryList(QStringList(filter), QDir::Files | QDir::NoSymLinks);
0198 
0199     d->xmlFilesCob = new QComboBox(panel);
0200     d->xmlFilesCob->setEditable(false);
0201 
0202     for (const QString &uiFile : std::as_const(d->uiFilesList))
0203     {
0204         d->xmlFilesCob->addItem(uiFile, uiFile);
0205     }
0206 
0207     QVBoxLayout* const mainLayout = new QVBoxLayout;
0208     mainLayout->setAlignment(Qt::AlignTop);
0209     mainLayout->addWidget(d->xmlFilesCob);
0210     panel->setLayout(mainLayout);
0211 
0212     KSharedConfig::Ptr config = KSharedConfig::openConfig();
0213     KConfigGroup group        = config->group(CONFIG_GROUP_NAME);
0214     QString uiFile            = group.readEntry("UiFile", "kxmlkipicmd_defaultui.rc");
0215     d->xmlFilesCob->setCurrentIndex(d->uiFilesList.indexOf(uiFile));
0216 
0217     setWidgetResizable(true);
0218 }
0219 
0220 SetupXML::~SetupXML()
0221 {
0222     delete d;
0223 }
0224 
0225 void SetupXML::apply()
0226 {
0227     QString uiFile            = d->xmlFilesCob->itemData(d->xmlFilesCob->currentIndex()).toString();
0228 
0229     KSharedConfig::Ptr config = KSharedConfig::openConfig();
0230     KConfigGroup group        = config->group(CONFIG_GROUP_NAME);
0231     QString oldUiFile         = group.readEntry("UiFile", "kxmlkipicmd_defaultui.rc");
0232 
0233     if (uiFile != oldUiFile)
0234     {
0235         group.writeEntry("UiFile", uiFile);
0236     }
0237     group.sync();
0238 }
0239 
0240 } // namespace KXMLKipiCmd
0241 
0242 #include "moc_kipisetup.cpp"