From: David Faure Date: Fri, 20 Jul 2012 10:09:04 +0000 (+0200) Subject: Fix bug 303375 - Dots in directory names treated as file extension. X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/eb14263c480ea37c306a9ae6a7fda64875cfe418 Fix bug 303375 - Dots in directory names treated as file extension. Patch by Emmanuel Pescosta BUG: 303375 REVIEW: 105575 FIXED-IN: 4.9.0 --- diff --git a/src/kitemviews/kfileitemlistwidget.cpp b/src/kitemviews/kfileitemlistwidget.cpp index c99da383f..3a7724134 100644 --- a/src/kitemviews/kfileitemlistwidget.cpp +++ b/src/kitemviews/kfileitemlistwidget.cpp @@ -19,6 +19,7 @@ #include "kfileitemlistwidget.h" +#include #include #include #include @@ -101,4 +102,34 @@ QFont KFileItemListWidget::customizedFont(const QFont& baseFont) const return font; } +int KFileItemListWidget::selectionLength(const QString& text) const +{ + // Select the text without MIME-type extension + int selectionLength = text.length(); + + // If item is a directory, use the whole text length for + // selection (ignore all points) + if(data().value("isDir").toBool()) { + return selectionLength; + } + + const QString extension = KMimeType::extractKnownExtension(text); + if (extension.isEmpty()) { + // For an unknown extension just exclude the extension after + // the last point. This does not work for multiple extensions like + // *.tar.gz but usually this is anyhow a known extension. + selectionLength = text.lastIndexOf(QLatin1Char('.')); + + // If no point could be found, use whole text length for selection. + if (selectionLength < 1) { + selectionLength = text.length(); + } + + } else { + selectionLength -= extension.length() + 1; + } + + return selectionLength; +} + #include "kfileitemlistwidget.moc" diff --git a/src/kitemviews/kfileitemlistwidget.h b/src/kitemviews/kfileitemlistwidget.h index b0d8e1cd7..24c677828 100644 --- a/src/kitemviews/kfileitemlistwidget.h +++ b/src/kitemviews/kfileitemlistwidget.h @@ -48,6 +48,11 @@ protected: virtual bool isRoleRightAligned(const QByteArray& role) const; virtual bool isHidden() const; virtual QFont customizedFont(const QFont& baseFont) const; + + /** + * @return Selection length without MIME-type extension + */ + virtual int selectionLength(const QString& text) const; }; #endif diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index d41b9161b..69c5602c7 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -581,6 +581,11 @@ void KStandardItemListWidget::siblingsInformationChanged(const QBitArray& curren m_dirtyLayout = true; } +int KStandardItemListWidget::selectionLength(const QString& text) const +{ + return text.length(); +} + void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const QByteArray& previous) { Q_UNUSED(previous); @@ -610,25 +615,12 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const QTextOption textOption = textInfo->staticText.textOption(); m_roleEditor->document()->setDefaultTextOption(textOption); - // Select the text without MIME-type extension - // TODO: This is file-item-specific and should be moved - // into KFileItemListWidget. - int selectionLength = text.length(); - - const QString extension = KMimeType::extractKnownExtension(text); - if (extension.isEmpty()) { - // For an unknown extension just exclude the extension after - // the last point. This does not work for multiple extensions like - // *.tar.gz but usually this is anyhow a known extension. - selectionLength = text.lastIndexOf(QLatin1Char('.')); - } else { - selectionLength -= extension.length() + 1; - } + const int textSelectionLength = selectionLength(text); - if (selectionLength > 0) { + if (textSelectionLength > 0) { QTextCursor cursor = m_roleEditor->textCursor(); cursor.movePosition(QTextCursor::StartOfBlock); - cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, selectionLength); + cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, textSelectionLength); m_roleEditor->setTextCursor(cursor); } diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index f559f3d22..462d83d0f 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -133,6 +133,19 @@ protected: */ QString roleText(const QByteArray& role, const QHash& values) const; + /** + * Fixes: + * Select the text without MIME-type extension + * This is file-item-specific and should be moved + * into KFileItemListWidget. + * + * Inherited classes can define, if the MIME-type extension + * should be selected or not. + * + * @return Selection length (with or without MIME-type extension) + */ + virtual int selectionLength(const QString& text) const; + virtual void dataChanged(const QHash& current, const QSet& roles = QSet()); virtual void visibleRolesChanged(const QList& current, const QList& previous); virtual void columnWidthChanged(const QByteArray& role, qreal current, qreal previous); diff --git a/src/views/renamedialog.cpp b/src/views/renamedialog.cpp index e232b9614..a91f91b1b 100644 --- a/src/views/renamedialog.cpp +++ b/src/views/renamedialog.cpp @@ -87,7 +87,9 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : if (m_renameOneItem) { const QString fileName = items.first().url().prettyUrl(); const QString extension = KMimeType::extractKnownExtension(fileName.toLower()); - if (extension.length() > 0) { + + // 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; }