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 "desktopfilepage.h"
0007 #include "globalsettings_base.h"
0008 
0009 #include <KDesktopFile>
0010 #include <KEditListWidget>
0011 #include <KLocalizedString>
0012 #include <KMessageBox>
0013 #include <KZip>
0014 #include <QLineEdit>
0015 #include <QTemporaryFile>
0016 
0017 #include <QGridLayout>
0018 #include <QLabel>
0019 
0020 #include <TextCustomEditor/PlainTextEditor>
0021 #include <TextCustomEditor/PlainTextEditorWidget>
0022 
0023 using namespace GrantleeThemeEditor;
0024 
0025 DesktopFilePage::DesktopFilePage(const QString &defaultFileName, DesktopFilePage::DesktopFileOptions options, QWidget *parent)
0026     : QWidget(parent)
0027 {
0028     auto gridLayout = new QGridLayout(this);
0029     auto lab = new QLabel(i18n("Name:"), this);
0030     mName = new QLineEdit(this);
0031     mName->setReadOnly(true);
0032     int row = 0;
0033     gridLayout->addWidget(lab, row, 0);
0034     gridLayout->addWidget(mName, row, 1);
0035 
0036     ++row;
0037     lab = new QLabel(i18n("Author:"), this);
0038     mAuthor = new QLineEdit(this);
0039     mAuthor->setClearButtonEnabled(true);
0040     gridLayout->addWidget(lab, row, 0);
0041     gridLayout->addWidget(mAuthor, row, 1);
0042 
0043     ++row;
0044     lab = new QLabel(i18n("Email:"), this);
0045     mEmail = new QLineEdit(this);
0046     mEmail->setClearButtonEnabled(true);
0047     gridLayout->addWidget(lab, row, 0);
0048     gridLayout->addWidget(mEmail, row, 1);
0049 
0050     ++row;
0051     lab = new QLabel(i18n("Description:"));
0052     mDescription = new TextCustomEditor::PlainTextEditorWidget(this);
0053     mDescription->editor()->setSearchSupport(false);
0054     gridLayout->addWidget(lab, row, 0);
0055     gridLayout->addWidget(mDescription, row, 1);
0056 
0057     if (options & SpecifyFileName) {
0058         ++row;
0059         lab = new QLabel(i18n("Filename:"), this);
0060         mFilename = new QLineEdit(this);
0061         mFilename->setText(defaultFileName);
0062         connect(mFilename, &QLineEdit::textChanged, this, &DesktopFilePage::slotFileNameChanged);
0063         gridLayout->addWidget(lab, row, 0);
0064         gridLayout->addWidget(mFilename, row, 1);
0065     }
0066 
0067     ++row;
0068     lab = new QLabel(i18n("Version:"));
0069     mVersion = new QLineEdit(this);
0070     mVersion->setClearButtonEnabled(true);
0071     mVersion->setText(QStringLiteral("0.1"));
0072     gridLayout->addWidget(lab, row, 0);
0073     gridLayout->addWidget(mVersion, row, 1);
0074 
0075     ++row;
0076     if (options & ExtraDisplayVariables) {
0077         lab = new QLabel(i18n("Extract Headers:"), this);
0078         gridLayout->addWidget(lab, row, 0);
0079 
0080         ++row;
0081         lab = new QLabel(QStringLiteral("<qt><b>")
0082                              + i18n("Be careful, Grantlee does not support '-' in variable name. So when you want to add extra header as \"X-Original-To\" add "
0083                                     "\"X-Original-To\" in list, but use \"XOriginalTo\" as variable in Grantlee (remove '-' in name).")
0084                              + QStringLiteral("</b></qt>"),
0085                          this);
0086         lab->setWordWrap(true);
0087         gridLayout->addWidget(lab, row, 0, 1, 2);
0088 
0089         ++row;
0090         mExtraDisplayHeaders = new KEditListWidget(this);
0091         gridLayout->addWidget(mExtraDisplayHeaders, row, 0, 1, 2);
0092         connect(mExtraDisplayHeaders, &KEditListWidget::changed, this, &DesktopFilePage::slotExtraDisplayHeadersChanged);
0093     } else {
0094         gridLayout->setRowStretch(row, 1);
0095     }
0096 
0097     mEmail->setText(GrantleeThemeEditor::GrantleeThemeEditorSettings::authorEmail());
0098     mAuthor->setText(GrantleeThemeEditor::GrantleeThemeEditorSettings::author());
0099 
0100     connect(mDescription->editor(), &QPlainTextEdit::textChanged, this, &DesktopFilePage::changed);
0101     connect(mEmail, &QLineEdit::textChanged, this, &DesktopFilePage::changed);
0102     connect(mAuthor, &QLineEdit::textChanged, this, &DesktopFilePage::changed);
0103     connect(mVersion, &QLineEdit::textChanged, this, &DesktopFilePage::changed);
0104 }
0105 
0106 DesktopFilePage::~DesktopFilePage() = default;
0107 
0108 void DesktopFilePage::slotExtraDisplayHeadersChanged()
0109 {
0110     Q_EMIT extraDisplayHeaderChanged(mExtraDisplayHeaders->items());
0111     Q_EMIT changed();
0112 }
0113 
0114 void DesktopFilePage::slotFileNameChanged(const QString &filename)
0115 {
0116     Q_EMIT mainFileNameChanged(filename);
0117     Q_EMIT changed();
0118 }
0119 
0120 void DesktopFilePage::createZip(const QString &themeName, KZip *zip)
0121 {
0122     QTemporaryFile tmp;
0123     tmp.open();
0124     saveAsFilename(tmp.fileName());
0125     const bool fileAdded = zip->addLocalFile(tmp.fileName(), themeName + QLatin1Char('/') + mDefaultDesktopName);
0126     if (!fileAdded) {
0127         KMessageBox::error(this, i18n("Failed to add file into ZIP archive."), i18nc("@title:window", "Failed to add file"));
0128     }
0129 }
0130 
0131 void DesktopFilePage::setThemeName(const QString &themeName)
0132 {
0133     mName->setText(themeName);
0134 }
0135 
0136 QString DesktopFilePage::filename() const
0137 {
0138     if (mFilename) {
0139         return mFilename->text();
0140     }
0141     return {};
0142 }
0143 
0144 QString DesktopFilePage::themeName() const
0145 {
0146     return mName->text();
0147 }
0148 
0149 void DesktopFilePage::loadTheme(const QString &path)
0150 {
0151     const QString filename = path + QLatin1Char('/') + mDefaultDesktopName;
0152     KDesktopFile desktopFile(filename);
0153     mName->setText(desktopFile.desktopGroup().readEntry(QStringLiteral("Name")));
0154     mDescription->setPlainText(desktopFile.desktopGroup().readEntry(QStringLiteral("Description")));
0155     if (mFilename) {
0156         mFilename->setText(desktopFile.desktopGroup().readEntry(QStringLiteral("FileName")));
0157     }
0158     mAuthor->setText(desktopFile.desktopGroup().readEntry(QStringLiteral("Author")));
0159     mEmail->setText(desktopFile.desktopGroup().readEntry(QStringLiteral("AuthorEmail")));
0160     mVersion->setText(desktopFile.desktopGroup().readEntry(QStringLiteral("ThemeVersion")));
0161     if (mExtraDisplayHeaders) {
0162         const QStringList displayExtraHeaders = desktopFile.desktopGroup().readEntry(QStringLiteral("DisplayExtraVariables"), QStringList());
0163         mExtraDisplayHeaders->setItems(displayExtraHeaders);
0164     }
0165 }
0166 
0167 void DesktopFilePage::saveTheme(const QString &path)
0168 {
0169     const QString filename = path + QLatin1Char('/') + mDefaultDesktopName;
0170     saveAsFilename(filename);
0171 }
0172 
0173 void DesktopFilePage::saveAsFilename(const QString &filename)
0174 {
0175     KDesktopFile desktopFile(filename);
0176     desktopFile.desktopGroup().writeEntry(QStringLiteral("Name"), mName->text());
0177     desktopFile.desktopGroup().writeEntry(QStringLiteral("Description"), mDescription->toPlainText());
0178     if (mFilename) {
0179         desktopFile.desktopGroup().writeEntry(QStringLiteral("FileName"), mFilename->text());
0180     }
0181     if (mExtraDisplayHeaders) {
0182         const QStringList displayExtraHeaders = mExtraDisplayHeaders->items();
0183         if (!displayExtraHeaders.isEmpty()) {
0184             desktopFile.desktopGroup().writeEntry(QStringLiteral("DisplayExtraVariables"), displayExtraHeaders);
0185         }
0186     }
0187 
0188     desktopFile.desktopGroup().writeEntry(QStringLiteral("Author"), mAuthor->text());
0189     desktopFile.desktopGroup().writeEntry(QStringLiteral("AuthorEmail"), mEmail->text());
0190     desktopFile.desktopGroup().writeEntry(QStringLiteral("ThemeVersion"), mVersion->text());
0191     desktopFile.desktopGroup().sync();
0192 }
0193 
0194 void DesktopFilePage::installTheme(const QString &themePath)
0195 {
0196     const QString filename = themePath + QLatin1Char('/') + mDefaultDesktopName;
0197     saveAsFilename(filename);
0198 }
0199 
0200 void DesktopFilePage::setDefaultDesktopName(const QString &name)
0201 {
0202     mDefaultDesktopName = name;
0203 }
0204 
0205 QString DesktopFilePage::description() const
0206 {
0207     return mDescription->toPlainText();
0208 }
0209 
0210 #include "moc_desktopfilepage.cpp"