diff options
| -rw-r--r-- | src/settings/dolphin_generalsettings.kcfg | 4 | ||||
| -rw-r--r-- | src/settings/interface/confirmationssettingspage.cpp | 7 | ||||
| -rw-r--r-- | src/settings/interface/confirmationssettingspage.h | 1 | ||||
| -rw-r--r-- | src/views/dolphinview.cpp | 50 |
4 files changed, 61 insertions, 1 deletions
diff --git a/src/settings/dolphin_generalsettings.kcfg b/src/settings/dolphin_generalsettings.kcfg index 2252eed28..498a70ecf 100644 --- a/src/settings/dolphin_generalsettings.kcfg +++ b/src/settings/dolphin_generalsettings.kcfg @@ -167,5 +167,9 @@ <label>Ask for confirmation when opening many terminals at once.</label> <default>true</default> </entry> + <entry name="ConfirmRenameFileType" type="Bool"> + <label>Ask for confirmation when remaing a file changes its type.</label> + <default>true</default> + </entry> </group> </kcfg> diff --git a/src/settings/interface/confirmationssettingspage.cpp b/src/settings/interface/confirmationssettingspage.cpp index ea8ef6dfd..7f541de6d 100644 --- a/src/settings/interface/confirmationssettingspage.cpp +++ b/src/settings/interface/confirmationssettingspage.cpp @@ -27,6 +27,7 @@ const bool ConfirmEmptyTrash = true; const bool ConfirmTrash = false; const bool ConfirmDelete = true; const int ConfirmScriptExecution = ScriptExecution::AlwaysAsk; +const bool ConfirmRenameFileType = true; } ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget *parent) @@ -65,6 +66,7 @@ ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget *parent) m_confirmOpenManyFolders = new QCheckBox(i18nc("@option:check Ask for confirmation in Dolphin when", "Opening many folders at once"), this); m_confirmOpenManyTerminals = new QCheckBox(i18nc("@option:check Ask for confirmation in Dolphin when", "Opening many terminals at once"), this); m_confirmRisksOfActingAsAdmin = new QCheckBox(i18nc("@option:check Ask for confirmation in Dolphin when", "Switching to act as an administrator"), this); + m_confirmRenameFileType = new QCheckBox(i18nc("@option:check Ask for confirmation in Dolphin when", "Renaming a file will change its type"), this); QLabel *executableScriptLabel = new QLabel(i18nc("@title:group", "When opening an executable file:"), this); executableScriptLabel->setWordWrap(true); @@ -92,6 +94,7 @@ ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget *parent) } else { m_confirmRisksOfActingAsAdmin->hide(); } + topLayout->addRow(nullptr, m_confirmRenameFileType); topLayout->addItem(new QSpacerItem(0, Dolphin::VERTICAL_SPACER_HEIGHT, QSizePolicy::Fixed, QSizePolicy::Fixed)); topLayout->addRow(executableScriptLabel, m_confirmScriptExecution); @@ -106,6 +109,7 @@ ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget *parent) connect(m_confirmOpenManyFolders, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed); connect(m_confirmOpenManyTerminals, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed); connect(m_confirmRisksOfActingAsAdmin, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed); + connect(m_confirmRenameFileType, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed); #if HAVE_TERMINAL connect(m_confirmClosingTerminalRunningProgram, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed); @@ -148,6 +152,7 @@ void ConfirmationsSettingsPage::applySettings() } else { KMessageBox::saveDontShowAgainContinue(Admin::warningDontShowAgainName); } + settings->setConfirmRenameFileType(m_confirmRenameFileType->isChecked()); #if HAVE_TERMINAL settings->setConfirmClosingTerminalRunningProgram(m_confirmClosingTerminalRunningProgram->isChecked()); @@ -168,6 +173,7 @@ void ConfirmationsSettingsPage::restoreDefaults() m_confirmDelete->setChecked(ConfirmDelete); m_confirmScriptExecution->setCurrentIndex(ConfirmScriptExecution); KMessageBox::enableMessage(Admin::warningDontShowAgainName); + m_confirmRenameFileType->setChecked(ConfirmRenameFileType); } void ConfirmationsSettingsPage::loadSettings() @@ -196,6 +202,7 @@ void ConfirmationsSettingsPage::loadSettings() m_confirmOpenManyFolders->setChecked(GeneralSettings::confirmOpenManyFolders()); m_confirmOpenManyTerminals->setChecked(GeneralSettings::confirmOpenManyTerminals()); m_confirmRisksOfActingAsAdmin->setChecked(KMessageBox::shouldBeShownContinue(Admin::warningDontShowAgainName)); + m_confirmRenameFileType->setChecked(GeneralSettings::confirmRenameFileType()); #if HAVE_TERMINAL m_confirmClosingTerminalRunningProgram->setChecked(GeneralSettings::confirmClosingTerminalRunningProgram()); diff --git a/src/settings/interface/confirmationssettingspage.h b/src/settings/interface/confirmationssettingspage.h index ff9aca20e..353a49ee5 100644 --- a/src/settings/interface/confirmationssettingspage.h +++ b/src/settings/interface/confirmationssettingspage.h @@ -46,6 +46,7 @@ private: QCheckBox *m_confirmOpenManyFolders; QCheckBox *m_confirmOpenManyTerminals; QCheckBox *m_confirmRisksOfActingAsAdmin; + QCheckBox *m_confirmRenameFileType = nullptr; }; #endif diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 1ed857851..6bd2ad0c1 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -44,10 +44,12 @@ #include <KIO/Paste> #include <KIO/PasteJob> #include <KIO/RenameFileDialog> +#include <KIconUtils> #include <KJob> #include <KJobWidgets> #include <KLocalizedString> #include <KMessageBox> +#include <KMessageDialog> #include <KProtocolManager> #include <KUrlMimeData> @@ -2057,8 +2059,54 @@ void DolphinView::slotRoleEditingFinished(int index, const QByteArray &role, con if (code == KMessageBox::SecondaryAction) { return; } - } + } else #endif + // Confirm potentially changing the file type. + if (GeneralSettings::confirmRenameFileType() && oldItem.isFile() && oldItem.isLocalFile() && !oldItem.isSlow() && oldItem.isMimeTypeKnown()) { + QMimeDatabase db; + const QMimeType oldMimeType = db.mimeTypeForName(oldItem.mimetype()); + + // Guess what the new file type would be. + // We have to also read the file as its new type could be auto-determined from content. + QFile oldFile(oldItem.localPath()); + const QMimeType newMimeType = db.mimeTypeForFileNameAndData(newName, &oldFile); + + if (oldMimeType.isValid() && !oldMimeType.isDefault() && newMimeType.isValid() && newMimeType != oldMimeType) { + const KGuiItem yesGuiItem(i18nc("@action:button", "Rename"), QStringLiteral("edit-rename")); + + const QIcon mimeTypeIcon = QIcon::fromTheme(newMimeType.iconName(), QIcon::fromTheme(QStringLiteral("unknown"))); + // emblem-warning is non-standard, fall back to emblem-important if necessary. + const QIcon warningBadge = QIcon::fromTheme(QStringLiteral("emblem-warning"), QIcon::fromTheme(QStringLiteral("emblem-important"))); + + const QIcon messageBoxIcon = + KIconUtils::addOverlay(mimeTypeIcon, warningBadge, isRightToLeft() ? Qt::BottomLeftCorner : Qt::BottomRightCorner); + + const QString prompt = newMimeType.isDefault() ? i18n( + "This will make the file type unknown.\n" + "The file's content won't change but applications may no longer recognize it.\n" + "Do you still want to rename it?") + : i18n( + "This will change the file type from \"%1\" to \"%2\".\n" + "The file's content won't change but applications may no longer recognize it.\n" + "Do you still want to rename it?", + oldMimeType.comment(), + newMimeType.comment()); + auto *dialog = new KMessageDialog(KMessageDialog::QuestionTwoActions, prompt, this); + dialog->setWindowTitle(i18nc("@title:window", "Change File Type")); + dialog->setButtons(yesGuiItem, KStandardGuiItem::cancel()); + dialog->setIcon(messageBoxIcon); + dialog->setDontAskAgainText(i18n("Do not ask again")); + + if (dialog->exec() != KMessageDialog::PrimaryAction) { + return; + } + + if (dialog->isDontAskAgainChecked()) { + GeneralSettings::setConfirmRenameFileType(false); + GeneralSettings::self()->save(); + } + } + } KIO::Job *job = KIO::moveAs(oldUrl, newUrl); KJobWidgets::setWindow(job, this); |
