File indexing completed on 2024-05-12 05:13:30

0001 /*
0002    SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 #include "managethemes.h"
0007 
0008 #include <KLocalizedString>
0009 #include <KMessageBox>
0010 #include <KSharedConfig>
0011 #include <QPushButton>
0012 
0013 #include <KConfigGroup>
0014 #include <QDialogButtonBox>
0015 #include <QDir>
0016 #include <QDirIterator>
0017 #include <QLabel>
0018 #include <QListWidget>
0019 #include <QStandardPaths>
0020 #include <QVBoxLayout>
0021 
0022 using namespace GrantleeThemeEditor;
0023 class GrantleeThemeEditor::ManageThemesPrivate
0024 {
0025 public:
0026     ManageThemesPrivate() = default;
0027 
0028     QString mLocalDirectory;
0029     QListWidget *mListThemes = nullptr;
0030     QPushButton *mDeleteTheme = nullptr;
0031 };
0032 
0033 ManageThemes::ManageThemes(const QString &relativeThemePath, QWidget *parent)
0034     : QDialog(parent)
0035     , d(new GrantleeThemeEditor::ManageThemesPrivate)
0036 {
0037     d->mLocalDirectory = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1Char('/') + relativeThemePath;
0038     setWindowTitle(i18nc("@title:window", "Manage Theme"));
0039     auto w = new QWidget;
0040 
0041     auto lay = new QVBoxLayout(w);
0042     lay->setContentsMargins(0, 0, 0, 0);
0043 
0044     auto lab = new QLabel(i18n("Local themes:"));
0045     lay->addWidget(lab);
0046 
0047     d->mListThemes = new QListWidget;
0048     connect(d->mListThemes, &QListWidget::itemSelectionChanged, this, &ManageThemes::slotItemSelectionChanged);
0049     d->mListThemes->setSelectionMode(QAbstractItemView::ExtendedSelection);
0050     lay->addWidget(d->mListThemes);
0051 
0052     d->mDeleteTheme = new QPushButton(i18n("Delete theme"));
0053     connect(d->mDeleteTheme, &QPushButton::clicked, this, &ManageThemes::slotDeleteTheme);
0054     d->mDeleteTheme->setEnabled(false);
0055     lay->addWidget(d->mDeleteTheme);
0056 
0057     initialize();
0058 
0059     auto mainLayout = new QVBoxLayout(this);
0060     mainLayout->addWidget(w);
0061     auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, this);
0062     connect(buttonBox, &QDialogButtonBox::rejected, this, &ManageThemes::reject);
0063     mainLayout->addWidget(buttonBox);
0064 
0065     readConfig();
0066 }
0067 
0068 ManageThemes::~ManageThemes()
0069 {
0070     writeConfig();
0071     delete d;
0072 }
0073 
0074 void ManageThemes::readConfig()
0075 {
0076     KConfigGroup group(KSharedConfig::openConfig(), QStringLiteral("ManageThemesDialog"));
0077     const QSize sizeDialog = group.readEntry("Size", QSize(300, 150));
0078     if (sizeDialog.isValid()) {
0079         resize(sizeDialog);
0080     }
0081 }
0082 
0083 void ManageThemes::writeConfig()
0084 {
0085     KConfigGroup group(KSharedConfig::openConfig(), QStringLiteral("ManageThemesDialog"));
0086     group.writeEntry("Size", size());
0087 }
0088 
0089 void ManageThemes::slotDeleteTheme()
0090 {
0091     const QList<QListWidgetItem *> selectItems = d->mListThemes->selectedItems();
0092     if (!selectItems.isEmpty()) {
0093         QString msg;
0094         const int selectedThemeCount(selectItems.count());
0095         if (selectedThemeCount == 1) {
0096             msg = i18n("Do you want to remove the selected theme \"%1\" ?", selectItems.first()->text());
0097         } else {
0098             msg = i18n("Do you want to remove %1 selected themes?", selectedThemeCount);
0099         }
0100         const int answer = KMessageBox::questionTwoActions(this, msg, i18n("Remove theme"), KStandardGuiItem::remove(), KStandardGuiItem::cancel());
0101         if (answer == KMessageBox::ButtonCode::PrimaryAction) {
0102             for (QListWidgetItem *item : selectItems) {
0103                 if (QDir((d->mLocalDirectory + QLatin1Char('/') + item->text())).removeRecursively()) {
0104                     delete item;
0105                 } else {
0106                     KMessageBox::error(this,
0107                                        i18n("Theme \"%1\" cannot be deleted. Please contact your administrator.", item->text()),
0108                                        i18n("Delete theme failed"));
0109                 }
0110             }
0111         }
0112     }
0113 }
0114 
0115 void ManageThemes::initialize()
0116 {
0117     QDir dir(d->mLocalDirectory);
0118     if (dir.exists()) {
0119         QDirIterator dirIt(d->mLocalDirectory, QStringList(), QDir::AllDirs | QDir::NoDotAndDotDot);
0120         while (dirIt.hasNext()) {
0121             dirIt.next();
0122             const QString dirName = dirIt.fileName();
0123             new QListWidgetItem(dirName, d->mListThemes);
0124         }
0125     }
0126 }
0127 
0128 void ManageThemes::slotItemSelectionChanged()
0129 {
0130     d->mDeleteTheme->setEnabled(!d->mListThemes->selectedItems().isEmpty());
0131 }
0132 
0133 #include "moc_managethemes.cpp"