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"