X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/c304ca1bb0eb1e56716d6b828bab2fc6160206dc..0a6257bce3de877e4ae869f974df645c428d32c9:/src/views/renamedialog.cpp diff --git a/src/views/renamedialog.cpp b/src/views/renamedialog.cpp index 65125c3aa..458b9ef79 100644 --- a/src/views/renamedialog.cpp +++ b/src/views/renamedialog.cpp @@ -20,31 +20,30 @@ #include "renamedialog.h" #include -#include -#include -#include +#include +#include +#include +#include +#include //TODO port to QCollator #include #include +#include #include #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; -} +#include +#include +#include +#include RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : - KDialog(parent), + QDialog(parent), m_renameOneItem(false), m_newName(), m_lineEdit(0), m_items(items), + m_allExtensionsDifferent(true), m_spinBox(0) { const QSize minSize = minimumSize(); @@ -54,24 +53,33 @@ 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, SIGNAL(accepted()), this, SLOT(slotAccepted())); + connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + m_okButton->setDefault(true); + + KGuiItem::assign(m_okButton, KGuiItem(i18nc("@action:button", "&Rename"), "dialog-ok-apply")); QWidget* page = new QWidget(this); - setMainWidget(page); + mainLayout->addWidget(page); + mainLayout->addWidget(buttonBox); QVBoxLayout* topLayout = new QVBoxLayout(page); QLabel* editLabel = 0; if (m_renameOneItem) { m_newName = items.first().name(); - editLabel = new QLabel(i18nc("@label:textbox", "Rename the item %1 to:", m_newName), + editLabel = new QLabel(xi18nc("@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,12 +89,14 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : } m_lineEdit = new KLineEdit(page); - connect(m_lineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotTextChanged(QString))); + mainLayout->addWidget(m_lineEdit); + 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 extension = KMimeType::extractKnownExtension(fileName.toLower()); + const QString fileName = items.first().url().toDisplayString(); + 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()) { @@ -106,7 +116,21 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : topLayout->addWidget(m_lineEdit); if (!m_renameOneItem) { + QSet extensions; + foreach (const KFileItem& item, m_items) { + QMimeDatabase db; + const QString extension = db.suffixForFileName(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); + mainLayout->addWidget(infoLabel); m_spinBox = new KIntSpinBox(0, 10000, 1, 1, page, 10); QHBoxLayout* horizontalLayout = new QHBoxLayout(page); @@ -122,42 +146,52 @@ RenameDialog::~RenameDialog() { } -void RenameDialog::slotButtonClicked(int button) +void RenameDialog::renameItem(const KFileItem &item, const QString& newName) { - 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)); - KonqOperations::rename(this, oldUrl, newUrl); - } else { - renameItems(); - } + 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; } - KDialog::slotButtonClicked(button); + KIO::Job * job = KIO::moveAs(oldUrl, newUrl); + KJobWidgets::setWindow(job, widget); + KIO::FileUndoManager::self()->recordJob(KIO::FileUndoManager::Rename, QList() << oldUrl, newUrl, job); + job->ui()->setAutoErrorHandlingEnabled(true); +} + +void RenameDialog::slotAccepted() +{ + m_newName = m_lineEdit->text(); + + if (m_renameOneItem) { + Q_ASSERT(m_items.count() == 1); + renameItem(m_items.first(), m_newName); + } else { + renameItems(); + } + accept(); } 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); + m_okButton->setEnabled(enable); } void RenameDialog::renameItems() @@ -168,17 +202,16 @@ void RenameDialog::renameItems() QString newName = indexedName(m_newName, index, QLatin1Char('#')); ++index; - const KUrl oldUrl = item.url(); - const QString extension = KMimeType::extractKnownExtension(oldUrl.prettyUrl().toLower()); + 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) { - KUrl newUrl = oldUrl; - newUrl.setFileName(KIO::encodeFileName(newName)); - KonqOperations::rename(this, oldUrl, newUrl); + renameItem(item, newName); } } } @@ -202,4 +235,3 @@ QString RenameDialog::indexedName(const QString& name, int index, const QChar& i return newName; } -#include "renamedialog.moc"