Use BatchRenameJob to rename multiple files in Dolphin

Summary:
Use KIO::BatchRenameJob in Dolphin::RenameDialog to rename multiple files.
With this viewing progress of rename operation and undo is possible.

See D9103 and D9107.

Reviewers: #dolphin, elvisangelaccio

Subscribers: elvisangelaccio, ngraham, broulik

Differential Revision: https://phabricator.kde.org/D9836
This commit is contained in:
Chinmoy Ranjan Pradhan 2018-01-27 17:19:39 +05:30
parent add821885d
commit c5eb4e3116
2 changed files with 33 additions and 82 deletions

View file

@ -24,6 +24,7 @@
#include <KIO/CopyJob>
#include <KIO/FileUndoManager>
#include <KJobUiDelegate>
#include <KIO/BatchRenameJob>
#include <QHBoxLayout>
#include <QLabel>
@ -148,38 +149,32 @@ RenameDialog::~RenameDialog()
{
}
void RenameDialog::renameItem(const KFileItem &item, const QString& newName)
void RenameDialog::slotAccepted()
{
const QUrl oldUrl = item.url();
QUrl newUrl = oldUrl.adjusted(QUrl::RemoveFilename);
newUrl.setPath(newUrl.path() + KIO::encodeFileName(newName));
QWidget* widget = parentWidget();
if (!widget) {
widget = this;
}
KIO::Job * job = KIO::moveAs(oldUrl, newUrl, KIO::HideProgressInfo);
KJobWidgets::setWindow(job, widget);
KIO::FileUndoManager::self()->recordJob(KIO::FileUndoManager::Rename, {oldUrl}, newUrl, job);
if (!job->error()) {
m_renamedItems << newUrl;
}
job->uiDelegate()->setAutoErrorHandlingEnabled(true);
}
void RenameDialog::slotAccepted()
{
m_newName = m_lineEdit->text();
KIO::FileUndoManager::CommandType cmdType;
if (m_renameOneItem) {
Q_ASSERT(m_items.count() == 1);
renameItem(m_items.first(), m_newName);
cmdType = KIO::FileUndoManager::Rename;
} else {
renameItems();
cmdType = KIO::FileUndoManager::BatchRename;
}
const QList<QUrl> srcList = m_items.urlList();
KIO::BatchRenameJob* job = KIO::batchRename(srcList, m_lineEdit->text(), m_spinBox->value(), QLatin1Char('#'));
KJobWidgets::setWindow(job, widget);
const QUrl parentUrl = srcList.first().adjusted(QUrl::RemoveFilename | QUrl::StripTrailingSlash);
KIO::FileUndoManager::self()->recordJob(cmdType, srcList, parentUrl, job);
connect(job, &KIO::BatchRenameJob::fileRenamed, this, &RenameDialog::slotFileRenamed);
connect(job, &KIO::BatchRenameJob::result, this, &RenameDialog::slotResult);
job->uiDelegate()->setAutoErrorHandlingEnabled(true);
accept();
}
@ -201,55 +196,22 @@ void RenameDialog::slotTextChanged(const QString& newName)
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);
}
void RenameDialog::renameItems()
{
// Iterate through all items and rename them...
int index = m_spinBox->value();
foreach (const KFileItem& item, m_items) {
QString newName = indexedName(m_newName, index, QLatin1Char('#'));
++index;
const QUrl oldUrl = item.url();
QMimeDatabase db;
const QString extension = db.suffixForFileName(oldUrl.path().toLower());
if (!extension.isEmpty()) {
newName.append(QLatin1Char('.'));
newName.append(extension);
}
if (oldUrl.fileName() != newName) {
renameItem(item, newName);
}
}
if (!m_items.empty()) {
emit renamingFinished(m_renamedItems);
}
}
QString RenameDialog::indexedName(const QString& name, int index, const QChar& indexPlaceHolder)
{
QString newName = name;
QString indexString = QString::number(index);
// Insert leading zeros if necessary
const int minIndexLength = name.count(indexPlaceHolder);
while (indexString.length() < minIndexLength) {
indexString.prepend(QLatin1Char('0'));
}
// Replace the index placeholders by the indexString
const int placeHolderStart = newName.indexOf(indexPlaceHolder);
newName.replace(placeHolderStart, minIndexLength, indexString);
return newName;
}

View file

@ -29,7 +29,7 @@
class QLineEdit;
class QSpinBox;
class QPushButton;
class KJob;
/**
* @brief Dialog for renaming a variable number of files.
*/
@ -47,23 +47,12 @@ signals:
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:
void renameItems();
void renameItem(const KFileItem &item, const QString& newName);
/**
* @return Returns the string \p name, where the characters represented by
* \p indexPlaceHolder get replaced by the index \p index.
* E. g. Calling indexedName("Test #.jpg", 12, '#') returns "Test 12.jpg".
* A connected sequence of placeholders results in leading zeros:
* indexedName("Test ####.jpg", 12, '#') returns "Test 0012.jpg".
*/
static QString indexedName(const QString& name, int index, const QChar& indexPlaceHolder);
private:
bool m_renameOneItem;
QList<QUrl> m_renamedItems;