X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/d4fb129710d7fadf8e21f2cfd2588a794f774e41..0bc919bd4758a84ccc0928ff784223984ec5df88:/src/views/renamedialog.cpp diff --git a/src/views/renamedialog.cpp b/src/views/renamedialog.cpp index 5b20942d5..5d329c3ce 100644 --- a/src/views/renamedialog.cpp +++ b/src/views/renamedialog.cpp @@ -19,26 +19,30 @@ #include "renamedialog.h" -#include -#include -#include -#include -#include //TODO port to QCollator -#include -#include - +#include +#include +#include +#include +#include +#include +#include + +#include #include #include -#include +#include +#include +#include +#include RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : - KDialog(parent), + QDialog(parent), m_renameOneItem(false), m_newName(), - m_lineEdit(0), + m_lineEdit(nullptr), m_items(items), m_allExtensionsDifferent(true), - m_spinBox(0) + m_spinBox(nullptr) { const QSize minSize = minimumSize(); setMinimumSize(QSize(320, minSize.height())); @@ -47,20 +51,29 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : Q_ASSERT(itemCount >= 1); m_renameOneItem = (itemCount == 1); - setCaption(m_renameOneItem ? + setWindowTitle(m_renameOneItem ? i18nc("@title:window", "Rename Item") : i18nc("@title:window", "Rename Items")); - setButtons(Ok | Cancel); - setDefaultButton(Ok); - - setButtonGuiItem(Ok, KGuiItem(i18nc("@action:button", "&Rename"), "dialog-ok-apply")); + 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); - setMainWidget(page); + mainLayout->addWidget(page); + mainLayout->addWidget(buttonBox); QVBoxLayout* topLayout = new QVBoxLayout(page); - QLabel* editLabel = 0; + QLabel* editLabel = nullptr; if (m_renameOneItem) { m_newName = items.first().name(); editLabel = new QLabel(xi18nc("@label:textbox", "Rename the item %1 to:", m_newName), @@ -74,13 +87,15 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : page); } - m_lineEdit = new KLineEdit(page); - connect(m_lineEdit, &KLineEdit::textChanged, this, &RenameDialog::slotTextChanged); + 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(); - const QString extension = KMimeType::extractKnownExtension(fileName.toLower()); + 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()) { @@ -94,7 +109,6 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : m_lineEdit->setText(m_newName); m_lineEdit->setSelection(0, selectionLength); - m_lineEdit->setFocus(); topLayout->addWidget(editLabel); topLayout->addWidget(m_lineEdit); @@ -102,7 +116,8 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : if (!m_renameOneItem) { QSet extensions; foreach (const KFileItem& item, m_items) { - const QString extension = KMimeType::extractKnownExtension(item.url().toDisplayString().toLower()); + QMimeDatabase db; + const QString extension = db.suffixForFileName(item.url().toDisplayString().toLower()); if (extensions.contains(extension)) { m_allExtensionsDifferent = false; @@ -113,10 +128,16 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : } QLabel* infoLabel = new QLabel(i18nc("@info", "# will be replaced by ascending numbers starting with:"), page); - m_spinBox = new KIntSpinBox(0, 10000, 1, 1, page, 10); + 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->setMargin(0); + horizontalLayout->setContentsMargins(0, 0, 0, 0); horizontalLayout->addWidget(infoLabel); horizontalLayout->addWidget(m_spinBox); @@ -128,29 +149,41 @@ RenameDialog::~RenameDialog() { } -void RenameDialog::slotButtonClicked(int button) +void RenameDialog::slotAccepted() { - if (button == KDialog::Ok) { - m_newName = m_lineEdit->text(); - - if (m_renameOneItem) { - Q_ASSERT(m_items.count() == 1); - const KUrl oldUrl = m_items.first().url(); - KUrl newUrl = oldUrl; - newUrl.setFileName(KIO::encodeFileName(m_newName)); - - QWidget* widget = parentWidget(); - if (!widget) { - widget = this; - } + QWidget* widget = parentWidget(); + if (!widget) { + widget = this; + } - KonqOperations::rename(widget, oldUrl, newUrl); - } else { - renameItems(); - } + const QList 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(job), &KIO::BatchRenameJob::fileRenamed, this, &RenameDialog::slotFileRenamed); } - KDialog::slotButtonClicked(button); + 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) @@ -168,54 +201,25 @@ void RenameDialog::slotTextChanged(const QString& newName) enable = (last - first + 1 == count); } } - enableButtonOk(enable); + m_okButton->setEnabled(enable); } -void RenameDialog::renameItems() +void RenameDialog::slotFileRenamed(const QUrl &oldUrl, const QUrl &newUrl) { - // 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 KUrl oldUrl = item.url(); - const QString extension = KMimeType::extractKnownExtension(oldUrl.prettyUrl().toLower()); - if (!extension.isEmpty()) { - newName.append(QLatin1Char('.')); - newName.append(extension); - } - - if (oldUrl.fileName() != newName) { - KUrl newUrl = oldUrl; - newUrl.setFileName(KIO::encodeFileName(newName)); - - QWidget* widget = parentWidget(); - if (!widget) { - widget = this; - } - - KonqOperations::rename(widget, oldUrl, newUrl); - } - } + Q_UNUSED(oldUrl) + m_renamedItems << newUrl; } -QString RenameDialog::indexedName(const QString& name, int index, const QChar& indexPlaceHolder) +void RenameDialog::slotResult(KJob *job) { - 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')); + if (!job->error()) { + emit renamingFinished(m_renamedItems); } +} - // Replace the index placeholders by the indexString - const int placeHolderStart = newName.indexOf(indexPlaceHolder); - newName.replace(placeHolderStart, minIndexLength, indexString); +void RenameDialog::showEvent(QShowEvent* event) +{ + m_lineEdit->setFocus(); - return newName; + QDialog::showEvent(event); } -