File indexing completed on 2024-05-05 05:50:40

0001 /*
0002     SPDX-FileCopyrightText: 2008 Harald Hvaal <haraldhv@stud.ntnu.no>
0003     SPDX-FileCopyrightText: 2009, 2011 Raphael Kubo da Costa <rakuco@FreeBSD.org>
0004     SPDX-FileCopyrightText: 2015 Elvis Angelaccio <elvis.angelaccio@kde.org>
0005     SPDX-FileCopyrightText: 2016 Ragnar Thomsen <rthomsen6@gmail.com>
0006 
0007     SPDX-License-Identifier: BSD-2-Clause
0008 */
0009 
0010 #include "createdialog.h"
0011 #include "archiveformat.h"
0012 #include "ark_debug.h"
0013 #include "mimetypes.h"
0014 #include "ui_createdialog.h"
0015 
0016 #include <KMessageBox>
0017 #include <KSharedConfig>
0018 
0019 #include <QMimeDatabase>
0020 #include <QUrl>
0021 
0022 namespace Kerfuffle
0023 {
0024 class CreateDialogUI : public QWidget, public Ui::CreateDialog
0025 {
0026     Q_OBJECT
0027 
0028 public:
0029     CreateDialogUI(QWidget *parent = nullptr)
0030         : QWidget(parent)
0031     {
0032         setupUi(this);
0033     }
0034 };
0035 
0036 CreateDialog::CreateDialog(QWidget *parent, const QString &caption, const QUrl &startDir)
0037     : QDialog(parent, Qt::Dialog)
0038 {
0039     setWindowTitle(caption);
0040     setModal(true);
0041 
0042     m_supportedMimeTypes = m_pluginManger.supportedWriteMimeTypes(PluginManager::SortByComment);
0043 
0044     m_vlayout = new QVBoxLayout();
0045     setLayout(m_vlayout);
0046 
0047     m_ui = new CreateDialogUI(this);
0048     m_ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
0049 
0050     m_ui->destFolderUrlRequester->setMode(KFile::Directory);
0051     if (startDir.isEmpty()) {
0052         m_ui->destFolderUrlRequester->setUrl(QUrl::fromLocalFile(QDir::currentPath() + QLatin1Char('/')));
0053     } else {
0054         m_ui->destFolderUrlRequester->setUrl(startDir);
0055     }
0056 
0057     // Populate combobox with mimetypes.
0058     for (const QString &type : std::as_const(m_supportedMimeTypes)) {
0059         m_ui->mimeComboBox->addItem(QMimeDatabase().mimeTypeForName(type).comment());
0060     }
0061 
0062     connect(m_ui->filenameLineEdit, &QLineEdit::textChanged, this, &CreateDialog::slotFileNameEdited);
0063     connect(m_ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
0064     connect(m_ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
0065     connect(this, &QDialog::accepted, this, &CreateDialog::slotUpdateDefaultMimeType);
0066     connect(m_ui->mimeComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &CreateDialog::slotUpdateWidgets);
0067     connect(m_ui->mimeComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &CreateDialog::slotUpdateFilenameExtension);
0068 
0069     m_vlayout->addWidget(m_ui);
0070 
0071     m_ui->optionsWidget->setMimeType(currentMimeType());
0072 
0073     loadConfiguration();
0074 
0075     layout()->setSizeConstraint(QLayout::SetFixedSize);
0076     m_ui->filenameLineEdit->setFocus();
0077     slotUpdateFilenameExtension(m_ui->mimeComboBox->currentIndex());
0078 }
0079 
0080 void CreateDialog::setFileName(const QString &fileName)
0081 {
0082     m_ui->filenameLineEdit->setText(fileName);
0083 
0084     const QString detectedSuffix = QMimeDatabase().suffixForFileName(fileName);
0085     if (currentMimeType().suffixes().contains(detectedSuffix)) {
0086         m_ui->filenameLineEdit->setSelection(0, fileName.length() - detectedSuffix.length() - 1);
0087     } else {
0088         m_ui->filenameLineEdit->selectAll();
0089     }
0090 }
0091 
0092 void CreateDialog::slotFileNameEdited(const QString &fileName)
0093 {
0094     const QMimeType mimeFromFileName = QMimeDatabase().mimeTypeForFile(fileName, QMimeDatabase::MatchExtension);
0095 
0096     if (m_supportedMimeTypes.contains(mimeFromFileName.name())) {
0097         setMimeType(mimeFromFileName.name());
0098     }
0099 
0100     m_ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!fileName.isEmpty());
0101 }
0102 
0103 void CreateDialog::slotUpdateWidgets(int index)
0104 {
0105     m_ui->optionsWidget->setMimeType(QMimeDatabase().mimeTypeForName(m_supportedMimeTypes.at(index)));
0106 }
0107 
0108 void CreateDialog::slotUpdateFilenameExtension(int index)
0109 {
0110     m_ui->chkAddExtension->setText(i18nc("the argument is a file extension (the period is not a typo)",
0111                                          "Automatically add .%1",
0112                                          QMimeDatabase().mimeTypeForName(m_supportedMimeTypes.at(index)).preferredSuffix()));
0113 }
0114 
0115 QUrl CreateDialog::selectedUrl() const
0116 {
0117     QString fileName = m_ui->filenameLineEdit->text();
0118     QString dir = m_ui->destFolderUrlRequester->url().toLocalFile();
0119     if (dir.trimmed().endsWith(QLatin1Char('/'))) {
0120         dir = dir.trimmed();
0121     }
0122 
0123     if (m_ui->chkAddExtension->isChecked()) {
0124         QString detectedSuffix = QMimeDatabase().suffixForFileName(m_ui->filenameLineEdit->text().trimmed());
0125 
0126         if (!currentMimeType().suffixes().contains(detectedSuffix)) {
0127             if (!fileName.endsWith(QLatin1Char('.'))) {
0128                 fileName.append(QLatin1Char('.'));
0129             }
0130             fileName.append(currentMimeType().preferredSuffix());
0131         }
0132     }
0133 
0134     if (!dir.endsWith(QLatin1Char('/'))) {
0135         dir.append(QLatin1Char('/'));
0136     }
0137     return QUrl::fromLocalFile(dir + fileName);
0138 }
0139 
0140 int CreateDialog::compressionLevel() const
0141 {
0142     return m_ui->optionsWidget->compressionLevel();
0143 }
0144 
0145 QString CreateDialog::compressionMethod() const
0146 {
0147     return m_ui->optionsWidget->compressionMethod();
0148 }
0149 
0150 QString CreateDialog::encryptionMethod() const
0151 {
0152     return m_ui->optionsWidget->encryptionMethod();
0153 }
0154 
0155 ulong CreateDialog::volumeSize() const
0156 {
0157     return m_ui->optionsWidget->volumeSize();
0158 }
0159 
0160 QString CreateDialog::password() const
0161 {
0162     return m_ui->optionsWidget->password();
0163 }
0164 
0165 bool CreateDialog::isEncryptionAvailable() const
0166 {
0167     return m_ui->optionsWidget->isEncryptionAvailable();
0168 }
0169 
0170 bool CreateDialog::isEncryptionEnabled() const
0171 {
0172     return m_ui->optionsWidget->isEncryptionEnabled();
0173 }
0174 
0175 bool CreateDialog::isHeaderEncryptionAvailable() const
0176 {
0177     return m_ui->optionsWidget->isHeaderEncryptionAvailable();
0178 }
0179 
0180 bool CreateDialog::isHeaderEncryptionEnabled() const
0181 {
0182     return m_ui->optionsWidget->isHeaderEncryptionEnabled();
0183 }
0184 
0185 void CreateDialog::accept()
0186 {
0187     if (!isEncryptionEnabled()) {
0188         QDialog::accept();
0189         return;
0190     }
0191 
0192     switch (m_ui->optionsWidget->passwordStatus()) {
0193     case KNewPasswordWidget::WeakPassword:
0194     case KNewPasswordWidget::StrongPassword:
0195         QDialog::accept();
0196         break;
0197     case KNewPasswordWidget::PasswordNotVerified:
0198         KMessageBox::error(nullptr, i18n("The chosen password does not match the given verification password."));
0199         break;
0200     default:
0201         break;
0202     }
0203 }
0204 
0205 void CreateDialog::slotUpdateDefaultMimeType()
0206 {
0207     m_config.writeEntry("LastMimeType", currentMimeType().name());
0208 }
0209 
0210 void CreateDialog::loadConfiguration()
0211 {
0212     m_config = KConfigGroup(KSharedConfig::openStateConfig()->group(QStringLiteral("CreateDialog")));
0213     QMimeType lastUsedMime = QMimeDatabase().mimeTypeForName(m_config.readEntry("LastMimeType", QStringLiteral("application/x-compressed-tar")));
0214     setMimeType(lastUsedMime.name());
0215 }
0216 
0217 QMimeType CreateDialog::currentMimeType() const
0218 {
0219     Q_ASSERT(m_supportedMimeTypes.size() > m_ui->mimeComboBox->currentIndex());
0220     return QMimeDatabase().mimeTypeForName(m_supportedMimeTypes.at(m_ui->mimeComboBox->currentIndex()));
0221 }
0222 
0223 bool CreateDialog::setMimeType(const QString &mimeTypeName)
0224 {
0225     int index = m_supportedMimeTypes.indexOf(mimeTypeName);
0226     if (index == -1) {
0227         return false;
0228     }
0229     m_ui->mimeComboBox->setCurrentIndex(index);
0230 
0231     // This is needed to make sure widgets get updated in case the mimetype is already selected.
0232     slotUpdateWidgets(index);
0233 
0234     return true;
0235 }
0236 
0237 }
0238 
0239 #include "createdialog.moc"
0240 #include "moc_createdialog.cpp"