mirror of
https://invent.kde.org/system/dolphin
synced 2024-10-28 03:21:56 +00:00
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:
parent
add821885d
commit
c5eb4e3116
|
@ -24,6 +24,7 @@
|
||||||
#include <KIO/CopyJob>
|
#include <KIO/CopyJob>
|
||||||
#include <KIO/FileUndoManager>
|
#include <KIO/FileUndoManager>
|
||||||
#include <KJobUiDelegate>
|
#include <KJobUiDelegate>
|
||||||
|
#include <KIO/BatchRenameJob>
|
||||||
|
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
#include <QLabel>
|
#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();
|
QWidget* widget = parentWidget();
|
||||||
if (!widget) {
|
if (!widget) {
|
||||||
widget = this;
|
widget = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
KIO::Job * job = KIO::moveAs(oldUrl, newUrl, KIO::HideProgressInfo);
|
KIO::FileUndoManager::CommandType cmdType;
|
||||||
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();
|
|
||||||
|
|
||||||
if (m_renameOneItem) {
|
if (m_renameOneItem) {
|
||||||
Q_ASSERT(m_items.count() == 1);
|
Q_ASSERT(m_items.count() == 1);
|
||||||
renameItem(m_items.first(), m_newName);
|
cmdType = KIO::FileUndoManager::Rename;
|
||||||
} else {
|
} 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();
|
accept();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,55 +196,22 @@ void RenameDialog::slotTextChanged(const QString& newName)
|
||||||
m_okButton->setEnabled(enable);
|
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)
|
void RenameDialog::showEvent(QShowEvent* event)
|
||||||
{
|
{
|
||||||
m_lineEdit->setFocus();
|
m_lineEdit->setFocus();
|
||||||
|
|
||||||
QDialog::showEvent(event);
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
class QLineEdit;
|
class QLineEdit;
|
||||||
class QSpinBox;
|
class QSpinBox;
|
||||||
class QPushButton;
|
class QPushButton;
|
||||||
|
class KJob;
|
||||||
/**
|
/**
|
||||||
* @brief Dialog for renaming a variable number of files.
|
* @brief Dialog for renaming a variable number of files.
|
||||||
*/
|
*/
|
||||||
|
@ -47,23 +47,12 @@ signals:
|
||||||
private slots:
|
private slots:
|
||||||
void slotAccepted();
|
void slotAccepted();
|
||||||
void slotTextChanged(const QString& newName);
|
void slotTextChanged(const QString& newName);
|
||||||
|
void slotFileRenamed(const QUrl& oldUrl, const QUrl& newUrl);
|
||||||
|
void slotResult(KJob* job);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void showEvent(QShowEvent* event) override;
|
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:
|
private:
|
||||||
bool m_renameOneItem;
|
bool m_renameOneItem;
|
||||||
QList<QUrl> m_renamedItems;
|
QList<QUrl> m_renamedItems;
|
||||||
|
|
Loading…
Reference in a new issue