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"