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"