mirror of
https://invent.kde.org/system/dolphin
synced 2024-08-22 01:40:02 +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/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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue