X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/af37efda77571ccdef5a972e210c0afd1f7f3394..e8c4d19b7c8d1881dae2a28b1ff7202683648ceb:/src/views/renamedialog.cpp diff --git a/src/views/renamedialog.cpp b/src/views/renamedialog.cpp index c0c6ad58c..abb37b897 100644 --- a/src/views/renamedialog.cpp +++ b/src/views/renamedialog.cpp @@ -23,7 +23,10 @@ #include #include #include +#include +#include +#include #include #include @@ -41,7 +44,9 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : m_renameOneItem(false), m_newName(), m_lineEdit(0), - m_items(items) + m_items(items), + m_allExtensionsDifferent(true), + m_spinBox(0) { const QSize minSize = minimumSize(); setMinimumSize(QSize(320, minSize.height())); @@ -68,6 +73,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", @@ -79,35 +85,19 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : m_lineEdit = new KLineEdit(page); connect(m_lineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotTextChanged(QString))); - QString fileName = items[0].url().prettyUrl(); - QString extension = KMimeType::extractKnownExtension(fileName.toLower()); - if (!extension.isEmpty()) { - extension.insert(0, '.'); - // The first item seems to have a extension (e. g. '.jpg' or '.txt'). Now - // check whether all other URLs have the same extension. If this is the - // case, add this extension to the name suggestion. - for (int i = 1; i < itemCount; ++i) { - fileName = items[i].url().prettyUrl().toLower(); - if (!fileName.endsWith(extension)) { - // at least one item does not have the same extension - extension.truncate(0); - break; - } - } - } - int selectionLength = m_newName.length(); - if (!m_renameOneItem) { - --selectionLength; // don't select the # character - } + if (m_renameOneItem) { + const QString fileName = items.first().url().prettyUrl(); + const QString extension = KMimeType::extractKnownExtension(fileName.toLower()); - const int extensionLength = extension.length(); - if (extensionLength > 0) { - if (m_renameOneItem) { - selectionLength -= extensionLength; - } else { - m_newName.append(extension); + // If the current item is a directory, select the whole file name. + if ((extension.length() > 0) && !items.first().isDir()) { + // Don't select the extension + selectionLength -= extension.length() + 1; } + } else { + // Don't select the # character + --selectionLength; } m_lineEdit->setText(m_newName); @@ -118,8 +108,27 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : topLayout->addWidget(m_lineEdit); if (!m_renameOneItem) { - QLabel* infoLabel = new QLabel(i18nc("@info", "(# will be replaced by ascending numbers)"), page); - topLayout->addWidget(infoLabel); + QSet extensions; + foreach (const KFileItem& item, m_items) { + const QString extension = KMimeType::extractKnownExtension(item.url().prettyUrl().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); + + QHBoxLayout* horizontalLayout = new QHBoxLayout(page); + horizontalLayout->setMargin(0); + horizontalLayout->addWidget(infoLabel); + horizontalLayout->addWidget(m_spinBox); + + topLayout->addLayout(horizontalLayout); } } @@ -149,21 +158,16 @@ void RenameDialog::slotButtonClicked(int button) void RenameDialog::slotTextChanged(const QString& newName) { bool enable = !newName.isEmpty() && (newName != QLatin1String("..")) && (newName != QLatin1String(".")); - if (enable) { - if (m_renameOneItem) { - enable = enable && (newName != m_newName); + if (enable && !m_renameOneItem) { + 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 minSplitCount = 1; - int maxSplitCount = 2; - if (newName.startsWith(QLatin1Char('#'))) { - --maxSplitCount; - } - if (newName.endsWith(QLatin1Char('#'))) { - --maxSplitCount; - } - const int splitCount = newName.split(QLatin1Char('#'), QString::SkipEmptyParts).count(); - enable = enable && (splitCount >= minSplitCount) && (splitCount <= maxSplitCount); + const int first = newName.indexOf(QLatin1Char('#')); + const int last = newName.lastIndexOf(QLatin1Char('#')); + enable = (last - first + 1 == count); } } enableButtonOk(enable); @@ -171,18 +175,19 @@ void RenameDialog::slotTextChanged(const QString& newName) 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 = 1; + int index = m_spinBox->value(); foreach (const KFileItem& item, m_items) { - const QString newName = indexedName(m_newName, index, QLatin1Char('#')); + 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));