Commit 09e215be authored by Nate Graham's avatar Nate Graham 🔩
Browse files

"Use newly-upstreamed rename dialog from KIO""

This reverts commit 41105103.

KIO's version was just bumped to 5.67, so this can land now without
breaking the CI.
parent 10d65563
......@@ -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.64.0")
set(KF5_MIN_VERSION "5.67.0")
# ECM setup
find_package(ECM ${KF5_MIN_VERSION} CONFIG REQUIRED)
......
......@@ -99,7 +99,6 @@ 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
......
......@@ -30,13 +30,13 @@
#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 {
RenameDialog* dialog = new RenameDialog(this, KFileItemList() << item);
KIO::RenameFileDialog* dialog = new KIO::RenameFileDialog(KFileItemList({item}), this);
dialog->open();
}
}
......
......@@ -31,7 +31,6 @@
#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"
......@@ -52,6 +51,7 @@
#include <KIO/Paste>
#include <KIO/PasteJob>
#include <KIO/PreviewJob>
#include <KIO/RenameFileDialog>
#include <KJobWidgets>
#include <KLocalizedString>
#include <KMessageBox>
......@@ -637,8 +637,9 @@ void DolphinView::renameSelectedItems()
connect(m_view, &DolphinItemListView::roleEditingFinished,
this, &DolphinView::slotRoleEditingFinished);
} else {
RenameDialog* dialog = new RenameDialog(this, items);
connect(dialog, &RenameDialog::renamingFinished, this, &DolphinView::slotRenameDialogRenamingFinished);
KIO::RenameFileDialog* dialog = new KIO::RenameFileDialog(items, this);
connect(dialog, &KIO::RenameFileDialog::renamingFinished,
this, &DolphinView::slotRenameDialogRenamingFinished);
dialog->open();
}
......
/***************************************************************************
* 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);
}
/***************************************************************************
* 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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment