]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kstandarditemlistwidget.cpp
Merge branch 'KDE/4.9'
[dolphin.git] / src / kitemviews / kstandarditemlistwidget.cpp
index d41b9161bf4f5e7a9ce3fe38c3e3c3a82ed492df..97c8a038b5324f683c0929d8f2a2324b0c6f32e5 100644 (file)
@@ -68,6 +68,14 @@ QSizeF KStandardItemListWidgetInformant::itemSizeHint(int index, const KItemList
         const qreal maxWidth = itemWidth - 2 * option.padding;
         QTextLine line;
 
+        int emptyRolesCount = 0;
+        foreach (const QByteArray& role, view->visibleRoles()) {
+            const QString text = roleText(role, values);
+            if (role != "text" && role != "rating" && text.isEmpty()) {
+                emptyRolesCount++;
+            }
+        }
+
         // Calculate the number of lines required for wrapping the name
         QTextOption textOption(Qt::AlignHCenter);
         textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
@@ -84,7 +92,7 @@ QSizeF KStandardItemListWidgetInformant::itemSizeHint(int index, const KItemList
         layout.endLayout();
 
         // Add one line for each additional information
-        textHeight += additionalRolesCount * option.fontMetrics.lineSpacing();
+        textHeight += (additionalRolesCount - emptyRolesCount) * option.fontMetrics.lineSpacing();
 
         const qreal maxTextHeight = option.maxTextSize.height();
         if (maxTextHeight > 0 && textHeight > maxTextHeight) {
@@ -263,6 +271,16 @@ void KStandardItemListWidget::paint(QPainter* painter, const QStyleOptionGraphic
     painter->setFont(m_customizedFont);
     painter->setPen(m_isHidden ? m_additionalInfoTextColor : textColor());
     const TextInfo* textInfo = m_textInfo.value("text");
+
+    if (!textInfo) {
+        // It seems that we can end up here even if m_textInfo does not contain
+        // the key "text", see bug 306167. According to triggerCacheRefreshing(),
+        // this can only happen if the index is negative. This can happen when
+        // the item is about to be removed, see KItemListView::slotItemsRemoved().
+        // TODO: try to reproduce the crash and find a better fix.
+        return;
+    }
+
     painter->drawStaticText(textInfo->pos, textInfo->staticText);
 
     bool clipAdditionalInfoBounds = false;
@@ -464,7 +482,7 @@ QFont KStandardItemListWidget::customizedFont(const QFont& baseFont) const
     return baseFont;
 }
 
-QPalette::ColorRole KStandardItemListWidget::normalTextColorPalette() const
+QPalette::ColorRole KStandardItemListWidget::normalTextColorRole() const
 {
     return QPalette::Text;
 }
@@ -485,8 +503,8 @@ QColor KStandardItemListWidget::textColor() const
     }
 
     const QPalette::ColorGroup group = isActiveWindow() ? QPalette::Active : QPalette::Inactive;
-    const QPalette::ColorRole role = isSelected() ? QPalette::HighlightedText : normalTextColorPalette();
-    return styleOption().palette.brush(group, role).color();
+    const QPalette::ColorRole role = isSelected() ? QPalette::HighlightedText : normalTextColorRole();
+    return styleOption().palette.color(group, role);
 }
 
 void KStandardItemListWidget::setOverlay(const QPixmap& overlay)
@@ -581,6 +599,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);
@@ -589,6 +612,11 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const
    if (current.isEmpty() || !parent || current != "text") {
         if (m_roleEditor) {
             emit roleEditingCanceled(index(), current, data().value(current));
+
+            disconnect(m_roleEditor, SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)),
+                       this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant)));
+            disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)),
+                       this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant)));
             m_roleEditor->deleteLater();
             m_roleEditor = 0;
         }
@@ -610,25 +638,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);
     }
 
@@ -973,8 +988,17 @@ void KStandardItemListWidget::updateIconsLayoutTextCache()
     qreal nameHeight = 0;
     QTextLine line;
 
+    int emptyRolesCount = 0;
+    foreach (const QByteArray& role, visibleRoles()) {
+        const QString text = roleText(role, values);
+        if (role != "text" && role != "rating" && text.isEmpty()) {
+            emptyRolesCount++;
+        }
+    }
+
     const int additionalRolesCount = qMax(visibleRoles().count() - 1, 0);
-    const int maxNameLines = (option.maxTextSize.height() / int(lineSpacing)) - additionalRolesCount;
+    const int maxNameLines = (option.maxTextSize.height() / int(lineSpacing)) -
+                             (additionalRolesCount - emptyRolesCount);
 
     QTextLayout layout(nameTextInfo->staticText.text(), m_customizedFont);
     layout.setTextOption(nameTextInfo->staticText.textOption());
@@ -1008,7 +1032,7 @@ void KStandardItemListWidget::updateIconsLayoutTextCache()
     nameTextInfo->staticText.setTextWidth(maxWidth);
     nameTextInfo->pos = QPointF(padding, widgetHeight -
                                          nameHeight -
-                                         additionalRolesCount * lineSpacing -
+                                         (additionalRolesCount - emptyRolesCount)* lineSpacing -
                                          padding);
     m_textRect = QRectF(padding + (maxWidth - nameWidth) / 2,
                         nameTextInfo->pos.y(),
@@ -1023,6 +1047,11 @@ void KStandardItemListWidget::updateIconsLayoutTextCache()
         }
 
         const QString text = roleText(role, values);
+
+        if (role != "text" && role != "rating" && text.isEmpty()) {
+            continue;
+        }
+
         TextInfo* textInfo = m_textInfo.value(role);
         textInfo->staticText.setText(text);
 
@@ -1261,6 +1290,11 @@ void KStandardItemListWidget::closeRoleEditor()
         // to transfer the keyboard focus back to the KItemListContainer.
         scene()->views()[0]->parentWidget()->setFocus();
     }
+
+    disconnect(m_roleEditor, SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)),
+               this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant)));
+    disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)),
+               this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant)));
     m_roleEditor->deleteLater();
     m_roleEditor = 0;
 }