X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/50eaec7a81faaeccc5dbcc2f47cbd982a7dd7207..c8a2db7d4e79422ee3301e855ac5f6bb0a09e710:/src/views/renamedialog.cpp diff --git a/src/views/renamedialog.cpp b/src/views/renamedialog.cpp index a91f91b1b..3b94e01e5 100644 --- a/src/views/renamedialog.cpp +++ b/src/views/renamedialog.cpp @@ -23,6 +23,7 @@ #include #include #include +#include //TODO port to QCollator #include #include @@ -30,21 +31,13 @@ #include #include -/** - * Helper function for sorting items with qSort() in - * DolphinView::renameSelectedItems(). - */ -bool lessThan(const KFileItem& item1, const KFileItem& item2) -{ - return KStringHandler::naturalCompare(item1.name(), item2.name()) < 0; -} - RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : KDialog(parent), m_renameOneItem(false), m_newName(), m_lineEdit(0), m_items(items), + m_allExtensionsDifferent(true), m_spinBox(0) { const QSize minSize = minimumSize(); @@ -72,6 +65,7 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : m_newName = items.first().name(); editLabel = new QLabel(i18nc("@label:textbox", "Rename the item %1 to:", m_newName), page); + editLabel->setTextFormat(Qt::PlainText); } else { m_newName = i18nc("@info:status", "New name #"); editLabel = new QLabel(i18ncp("@label:textbox", @@ -81,11 +75,11 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : } m_lineEdit = new KLineEdit(page); - connect(m_lineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotTextChanged(QString))); + connect(m_lineEdit, &KLineEdit::textChanged, this, &RenameDialog::slotTextChanged); int selectionLength = m_newName.length(); if (m_renameOneItem) { - const QString fileName = items.first().url().prettyUrl(); + const QString fileName = items.first().url().toDisplayString(); const QString extension = KMimeType::extractKnownExtension(fileName.toLower()); // If the current item is a directory, select the whole file name. @@ -106,6 +100,18 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : topLayout->addWidget(m_lineEdit); if (!m_renameOneItem) { + QSet extensions; + foreach (const KFileItem& item, m_items) { + const QString extension = KMimeType::extractKnownExtension(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); m_spinBox = new KIntSpinBox(0, 10000, 1, 1, page, 10); @@ -132,7 +138,13 @@ void RenameDialog::slotButtonClicked(int button) const KUrl oldUrl = m_items.first().url(); KUrl newUrl = oldUrl; newUrl.setFileName(KIO::encodeFileName(m_newName)); - KonqOperations::rename(this, oldUrl, newUrl); + + QWidget* widget = parentWidget(); + if (!widget) { + widget = this; + } + + KonqOperations::rename(widget, oldUrl, newUrl); } else { renameItems(); } @@ -145,28 +157,22 @@ void RenameDialog::slotTextChanged(const QString& newName) { bool enable = !newName.isEmpty() && (newName != QLatin1String("..")) && (newName != QLatin1String(".")); if (enable && !m_renameOneItem) { - // Assure that the new name contains exactly one # (or a connected sequence of #'s) - const int minSplitCount = 1; - int maxSplitCount = 2; - if (newName.startsWith(QLatin1Char('#'))) { - --maxSplitCount; - } - if (newName.endsWith(QLatin1Char('#'))) { - --maxSplitCount; + 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); } - const int splitCount = newName.split(QLatin1Char('#'), QString::SkipEmptyParts).count(); - enable = enable && (splitCount >= minSplitCount) && (splitCount <= maxSplitCount); } enableButtonOk(enable); } void RenameDialog::renameItems() { - // Currently the items are sorted by the selection order, resort - // them by the filename. This assures that the new sort order is similar to - // the current filename sort order. - qSort(m_items.begin(), m_items.end(), lessThan); - // Iterate through all items and rename them... int index = m_spinBox->value(); foreach (const KFileItem& item, m_items) { @@ -183,7 +189,13 @@ void RenameDialog::renameItems() if (oldUrl.fileName() != newName) { KUrl newUrl = oldUrl; newUrl.setFileName(KIO::encodeFileName(newName)); - KonqOperations::rename(this, oldUrl, newUrl); + + QWidget* widget = parentWidget(); + if (!widget) { + widget = this; + } + + KonqOperations::rename(widget, oldUrl, newUrl); } } }