┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/settings/dolphin_generalsettings.kcfg4
-rw-r--r--src/settings/interface/confirmationssettingspage.cpp7
-rw-r--r--src/settings/interface/confirmationssettingspage.h1
-rw-r--r--src/views/dolphinview.cpp50
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);