]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Revert "Use newly-upstreamed rename dialog from KIO"
authorNate Graham <nate@kde.org>
Mon, 6 Jan 2020 21:34:36 +0000 (14:34 -0700)
committerNate Graham <nate@kde.org>
Mon, 6 Jan 2020 21:34:36 +0000 (14:34 -0700)
This reverts commit bae6620f22d29f8e42e38f4dff3df3e44b3f639a.

Frameworks 5.67 doesn't exist yet; this needs to wait another month.

CMakeLists.txt
src/CMakeLists.txt
src/panels/folders/folderspanel.cpp
src/views/dolphinview.cpp
src/views/renamedialog.cpp [new file with mode: 0644]
src/views/renamedialog.h [new file with mode: 0644]

index 0ab79e643c7707618e1fbdafaef89f716fbe07d2..79c0fefa95a5f44f749b77d7f87cd92917be629f 100644 (file)
@@ -8,7 +8,7 @@ set (RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE
 project(Dolphin VERSION ${RELEASE_SERVICE_VERSION})
 
 set(QT_MIN_VERSION "5.11.0")
-set(KF5_MIN_VERSION "5.67.0")
+set(KF5_MIN_VERSION "5.64.0")
 
 # ECM setup
 find_package(ECM ${KF5_MIN_VERSION} CONFIG REQUIRED)
index e8d623d2f2320fc0aa64955b144c50c8e96fb53a..e240f71066a9a51d818c1422510396fb58212933 100644 (file)
@@ -99,6 +99,7 @@ set(dolphinprivate_LIB_SRCS
     views/dolphinview.cpp
     views/dolphinviewactionhandler.cpp
     views/draganddrophelper.cpp
+    views/renamedialog.cpp
     views/versioncontrol/updateitemstatesthread.cpp
     views/versioncontrol/versioncontrolobserver.cpp
     views/viewmodecontroller.cpp
index 2e7e4dc28c1ee8d88a511044efec48bed940af37..01f338461f0d8990651ed615612cab5d239fa589 100644 (file)
 #include "kitemviews/kitemlistselectionmanager.h"
 #include "treeviewcontextmenu.h"
 #include "views/draganddrophelper.h"
+#include "views/renamedialog.h"
 
 #include <KJobWidgets>
 #include <KJobUiDelegate>
 #include <KIO/CopyJob>
 #include <KIO/DropJob>
 #include <KIO/FileUndoManager>
-#include <KIO/RenameFileDialog>
 
 #include <QApplication>
 #include <QBoxLayout>
@@ -104,7 +104,7 @@ void FoldersPanel::rename(const KFileItem& item)
         const int index = m_model->index(item);
         m_controller->view()->editRole(index, "text");
     } else {
-        KIO::RenameFileDialog* dialog = new KIO::RenameFileDialog(KFileItemList({item}), this);
+        RenameDialog* dialog = new RenameDialog(this, KFileItemList() << item);
         dialog->open();
     }
 }
index cfece0fe6b7f1e0b17349269fe340a888ec36b01..3437db7a76da37f93b818160863c77b233592b78 100644 (file)
@@ -31,6 +31,7 @@
 #include "kitemviews/kitemlistcontroller.h"
 #include "kitemviews/kitemlistheader.h"
 #include "kitemviews/kitemlistselectionmanager.h"
+#include "renamedialog.h"
 #include "versioncontrol/versioncontrolobserver.h"
 #include "viewproperties.h"
 #include "views/tooltips/tooltipmanager.h"
@@ -51,7 +52,6 @@
 #include <KIO/Paste>
 #include <KIO/PasteJob>
 #include <KIO/PreviewJob>
-#include <KIO/RenameFileDialog>
 #include <KJobWidgets>
 #include <KLocalizedString>
 #include <KMessageBox>
@@ -637,9 +637,8 @@ void DolphinView::renameSelectedItems()
         connect(m_view, &DolphinItemListView::roleEditingFinished,
                 this, &DolphinView::slotRoleEditingFinished);
     } else {
-        KIO::RenameFileDialog* dialog = new KIO::RenameFileDialog(items, this);
-        connect(dialog, &KIO::RenameFileDialog::renamingFinished,
-                this, &DolphinView::slotRenameDialogRenamingFinished);
+        RenameDialog* dialog = new RenameDialog(this, items);
+        connect(dialog, &RenameDialog::renamingFinished, this, &DolphinView::slotRenameDialogRenamingFinished);
 
         dialog->open();
     }
diff --git a/src/views/renamedialog.cpp b/src/views/renamedialog.cpp
new file mode 100644 (file)
index 0000000..9606856
--- /dev/null
@@ -0,0 +1,225 @@
+/***************************************************************************
+ *   Copyright (C) 2006-2010 by Peter Penz (peter.penz@gmx.at)             *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
+ ***************************************************************************/
+
+#include "renamedialog.h"
+
+#include <KGuiItem>
+#include <KIO/BatchRenameJob>
+#include <KIO/CopyJob>
+#include <KIO/FileUndoManager>
+#include <KJobUiDelegate>
+#include <KJobWidgets>
+#include <KLocalizedString>
+
+#include <QDialogButtonBox>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QLineEdit>
+#include <QMimeDatabase>
+#include <QPushButton>
+#include <QSpinBox>
+
+RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) :
+    QDialog(parent),
+    m_renameOneItem(false),
+    m_newName(),
+    m_lineEdit(nullptr),
+    m_items(items),
+    m_allExtensionsDifferent(true),
+    m_spinBox(nullptr)
+{
+    const QSize minSize = minimumSize();
+    setMinimumSize(QSize(320, minSize.height()));
+
+    const int itemCount = items.count();
+    Q_ASSERT(itemCount >= 1);
+    m_renameOneItem = (itemCount == 1);
+
+    setWindowTitle(m_renameOneItem ?
+               i18nc("@title:window", "Rename Item") :
+               i18nc("@title:window", "Rename Items"));
+    QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    setLayout(mainLayout);
+    m_okButton = buttonBox->button(QDialogButtonBox::Ok);
+    m_okButton->setDefault(true);
+    m_okButton->setShortcut(Qt::CTRL + Qt::Key_Return);
+    connect(buttonBox, &QDialogButtonBox::accepted, this, &RenameDialog::slotAccepted);
+    connect(buttonBox, &QDialogButtonBox::rejected, this, &RenameDialog::reject);
+    connect(buttonBox, &QDialogButtonBox::rejected, this, &QObject::deleteLater);
+    m_okButton->setDefault(true);
+
+    KGuiItem::assign(m_okButton, KGuiItem(i18nc("@action:button", "&Rename"), QStringLiteral("dialog-ok-apply")));
+
+    QWidget* page = new QWidget(this);
+    mainLayout->addWidget(page);
+    mainLayout->addWidget(buttonBox);
+
+    QVBoxLayout* topLayout = new QVBoxLayout(page);
+
+    QLabel* editLabel = nullptr;
+    if (m_renameOneItem) {
+        m_newName = items.first().name();
+        editLabel = new QLabel(xi18nc("@label:textbox", "Rename the item <filename>%1</filename> to:", m_newName),
+                               page);
+        editLabel->setTextFormat(Qt::PlainText);
+    } else {
+        m_newName = i18nc("@info:status", "New name #");
+        editLabel = new QLabel(i18ncp("@label:textbox",
+                                      "Rename the %1 selected item to:",
+                                      "Rename the %1 selected items to:", itemCount),
+                               page);
+    }
+
+    m_lineEdit = new QLineEdit(page);
+    mainLayout->addWidget(m_lineEdit);
+    connect(m_lineEdit, &QLineEdit::textChanged, this, &RenameDialog::slotTextChanged);
+
+    int selectionLength = m_newName.length();
+    if (m_renameOneItem) {
+        const QString fileName = items.first().url().toDisplayString();
+        QMimeDatabase db;
+        const QString extension = db.suffixForFileName(fileName.toLower());
+
+        // If the current item is a directory, select the whole file name.
+        if ((extension.length() > 0) && !items.first().isDir()) {
+            // Don't select the extension
+            selectionLength -= extension.length() + 1;
+        }
+    } else {
+         // Don't select the # character
+        --selectionLength;
+    }
+
+    m_lineEdit->setText(m_newName);
+    m_lineEdit->setSelection(0, selectionLength);
+
+    topLayout->addWidget(editLabel);
+    topLayout->addWidget(m_lineEdit);
+
+    if (!m_renameOneItem) {
+        QSet<QString> extensions;
+        foreach (const KFileItem& item, m_items) {
+            QMimeDatabase db;
+            const QString extension = db.suffixForFileName(item.url().toDisplayString().toLower());
+
+            if (extensions.contains(extension)) {
+                m_allExtensionsDifferent = false;
+                break;
+            }
+
+            extensions.insert(extension);
+        }
+
+        QLabel* infoLabel = new QLabel(i18nc("@info", "# will be replaced by ascending numbers starting with:"), page);
+        mainLayout->addWidget(infoLabel);
+        m_spinBox = new QSpinBox(page);
+        m_spinBox->setMaximum(10000);
+        m_spinBox->setMinimum(0);
+        m_spinBox->setSingleStep(1);
+        m_spinBox->setValue(1);
+        m_spinBox->setDisplayIntegerBase(10);
+
+        QHBoxLayout* horizontalLayout = new QHBoxLayout(page);
+        horizontalLayout->setContentsMargins(0, 0, 0, 0);
+        horizontalLayout->addWidget(infoLabel);
+        horizontalLayout->addWidget(m_spinBox);
+
+        topLayout->addLayout(horizontalLayout);
+    }
+}
+
+RenameDialog::~RenameDialog()
+{
+}
+
+void RenameDialog::slotAccepted()
+{
+    QWidget* widget = parentWidget();
+    if (!widget) {
+        widget = this;
+    }
+
+    const QList<QUrl> srcList = m_items.urlList();
+    const QString newName = m_lineEdit->text();
+    KIO::FileUndoManager::CommandType cmdType;
+    KIO::Job *job = nullptr;
+    if (m_renameOneItem) {
+        Q_ASSERT(m_items.count() == 1);
+        cmdType = KIO::FileUndoManager::Rename;
+        const QUrl oldUrl = m_items.constFirst().url();
+        QUrl newUrl = oldUrl.adjusted(QUrl::RemoveFilename);
+        newUrl.setPath(newUrl.path() + KIO::encodeFileName(newName));
+        m_renamedItems << newUrl;
+        job = KIO::moveAs(oldUrl, newUrl, KIO::HideProgressInfo);
+    } else {
+        cmdType = KIO::FileUndoManager::BatchRename;
+        job = KIO::batchRename(srcList, newName, m_spinBox->value(), QLatin1Char('#'));
+        connect(qobject_cast<KIO::BatchRenameJob*>(job), &KIO::BatchRenameJob::fileRenamed, this, &RenameDialog::slotFileRenamed);
+    }
+
+    KJobWidgets::setWindow(job, widget);
+    const QUrl parentUrl = srcList.first().adjusted(QUrl::RemoveFilename | QUrl::StripTrailingSlash);
+    KIO::FileUndoManager::self()->recordJob(cmdType, srcList, parentUrl, job);
+
+    connect(job, &KJob::result, this, &RenameDialog::slotResult);
+    connect(job, &KJob::result, this, &QObject::deleteLater);
+
+    job->uiDelegate()->setAutoErrorHandlingEnabled(true);
+
+    accept();
+}
+
+void RenameDialog::slotTextChanged(const QString& newName)
+{
+    bool enable = !newName.isEmpty() && (newName != QLatin1String("..")) && (newName != QLatin1Char('.'));
+    if (enable && !m_renameOneItem) {
+        const int count = newName.count(QLatin1Char('#'));
+        if (count == 0) {
+            // Renaming multiple files without '#' will only work if all extensions are different.
+            enable = m_allExtensionsDifferent;
+        } else {
+            // Assure that the new name contains exactly one # (or a connected sequence of #'s)
+            const int first = newName.indexOf(QLatin1Char('#'));
+            const int last = newName.lastIndexOf(QLatin1Char('#'));
+            enable = (last - first + 1 == count);
+        }
+    }
+    m_okButton->setEnabled(enable);
+}
+
+void RenameDialog::slotFileRenamed(const QUrl &oldUrl, const QUrl &newUrl)
+{
+    Q_UNUSED(oldUrl)
+    m_renamedItems << newUrl;
+}
+
+void RenameDialog::slotResult(KJob *job)
+{
+    if (!job->error()) {
+        emit renamingFinished(m_renamedItems);
+    }
+}
+
+void RenameDialog::showEvent(QShowEvent* event)
+{
+    m_lineEdit->setFocus();
+
+    QDialog::showEvent(event);
+}
diff --git a/src/views/renamedialog.h b/src/views/renamedialog.h
new file mode 100644 (file)
index 0000000..08571cd
--- /dev/null
@@ -0,0 +1,70 @@
+/***************************************************************************
+ *   Copyright (C) 2006-2010 by Peter Penz (peter.penz@gmx.at)             *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
+ ***************************************************************************/
+
+#ifndef RENAMEDIALOG_H
+#define RENAMEDIALOG_H
+
+#include "dolphin_export.h"
+
+#include <KFileItem>
+
+#include <QDialog>
+#include <QString>
+
+class QLineEdit;
+class QSpinBox;
+class QPushButton;
+class KJob;
+/**
+ * @brief Dialog for renaming a variable number of files.
+ *
+ * The dialog deletes itself when accepted or rejected.
+ */
+class DOLPHIN_EXPORT RenameDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit RenameDialog(QWidget* parent, const KFileItemList& items);
+    ~RenameDialog() override;
+
+signals:
+    void renamingFinished(const QList<QUrl>& urls);
+
+private slots:
+    void slotAccepted();
+    void slotTextChanged(const QString& newName);
+    void slotFileRenamed(const QUrl& oldUrl, const QUrl& newUrl);
+    void slotResult(KJob* job);
+
+protected:
+    void showEvent(QShowEvent* event) override;
+
+private:
+    bool m_renameOneItem;
+    QList<QUrl> m_renamedItems;
+    QString m_newName;
+    QLineEdit* m_lineEdit;
+    KFileItemList m_items;
+    bool m_allExtensionsDifferent;
+    QSpinBox* m_spinBox;
+    QPushButton* m_okButton;
+};
+
+#endif