]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kstandarditemlistwidget.cpp
Merge remote-tracking branch 'origin/KDE/4.9' into KDE/4.10
[dolphin.git] / src / kitemviews / kstandarditemlistwidget.cpp
index 97c8a038b5324f683c0929d8f2a2324b0c6f32e5..e1f0f9df1c88953074f633139133a0fd70cce56f 100644 (file)
@@ -42,6 +42,7 @@
 #include <QStyleOption>
 #include <QTextLayout>
 #include <QTextLine>
+#include <QPixmapCache>
 
 // #define KSTANDARDITEMLISTWIDGET_DEBUG
 
@@ -68,14 +69,6 @@ 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);
@@ -92,7 +85,7 @@ QSizeF KStandardItemListWidgetInformant::itemSizeHint(int index, const KItemList
         layout.endLayout();
 
         // Add one line for each additional information
-        textHeight += (additionalRolesCount - emptyRolesCount) * option.fontMetrics.lineSpacing();
+        textHeight += additionalRolesCount * option.fontMetrics.lineSpacing();
 
         const qreal maxTextHeight = option.maxTextSize.height();
         if (maxTextHeight > 0 && textHeight > maxTextHeight) {
@@ -201,7 +194,8 @@ KStandardItemListWidget::KStandardItemListWidget(KItemListWidgetInformant* infor
     m_additionalInfoTextColor(),
     m_overlay(),
     m_rating(),
-    m_roleEditor(0)
+    m_roleEditor(0),
+    m_oldRoleEditor(0)
 {
 }
 
@@ -211,6 +205,7 @@ KStandardItemListWidget::~KStandardItemListWidget()
     m_textInfo.clear();
 
     delete m_roleEditor;
+    delete m_oldRoleEditor;
 }
 
 void KStandardItemListWidget::setLayout(Layout layout)
@@ -608,8 +603,8 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const
 {
     Q_UNUSED(previous);
 
-   QGraphicsView* parent = scene()->views()[0];
-   if (current.isEmpty() || !parent || current != "text") {
+    QGraphicsView* parent = scene()->views()[0];
+    if (current.isEmpty() || !parent || current != "text") {
         if (m_roleEditor) {
             emit roleEditingCanceled(index(), current, data().value(current));
 
@@ -617,10 +612,16 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const
                        this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant)));
             disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)),
                        this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant)));
-            m_roleEditor->deleteLater();
+            m_oldRoleEditor = m_roleEditor;
+            m_roleEditor->hide();
             m_roleEditor = 0;
         }
         return;
+    } else if (m_oldRoleEditor) {
+        // Delete the old editor before constructing the new one to
+        // prevent a memory leak.
+        m_oldRoleEditor->deleteLater();
+        m_oldRoleEditor = 0;
     }
 
     Q_ASSERT(!m_roleEditor);
@@ -988,17 +989,8 @@ 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 - emptyRolesCount);
+    const int maxNameLines = (option.maxTextSize.height() / int(lineSpacing)) - additionalRolesCount;
 
     QTextLayout layout(nameTextInfo->staticText.text(), m_customizedFont);
     layout.setTextOption(nameTextInfo->staticText.textOption());
@@ -1032,7 +1024,7 @@ void KStandardItemListWidget::updateIconsLayoutTextCache()
     nameTextInfo->staticText.setTextWidth(maxWidth);
     nameTextInfo->pos = QPointF(padding, widgetHeight -
                                          nameHeight -
-                                         (additionalRolesCount - emptyRolesCount)* lineSpacing -
+                                         additionalRolesCount * lineSpacing -
                                          padding);
     m_textRect = QRectF(padding + (maxWidth - nameWidth) / 2,
                         nameTextInfo->pos.y(),
@@ -1047,11 +1039,6 @@ 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);
 
@@ -1244,6 +1231,7 @@ void KStandardItemListWidget::drawSiblingsInformation(QPainter* painter)
     QRect siblingRect(x, 0, siblingSize, siblingSize);
 
     QStyleOption option;
+    option.palette.setColor(QPalette::Text, option.palette.color(normalTextColorRole()));
     bool isItemSibling = true;
 
     const QBitArray siblings = siblingsInformation();
@@ -1285,46 +1273,55 @@ QRectF KStandardItemListWidget::roleEditingRect(const QByteArray& role) const
 
 void KStandardItemListWidget::closeRoleEditor()
 {
+    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)));
+
     if (m_roleEditor->hasFocus()) {
         // If the editing was not ended by a FocusOut event, we have
         // 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_oldRoleEditor = m_roleEditor;
+    m_roleEditor->hide();
     m_roleEditor = 0;
 }
 
 QPixmap KStandardItemListWidget::pixmapForIcon(const QString& name, int size)
 {
-    const KIcon icon(name);
-
-    int requestedSize;
-    if (size <= KIconLoader::SizeSmall) {
-        requestedSize = KIconLoader::SizeSmall;
-    } else if (size <= KIconLoader::SizeSmallMedium) {
-        requestedSize = KIconLoader::SizeSmallMedium;
-    } else if (size <= KIconLoader::SizeMedium) {
-        requestedSize = KIconLoader::SizeMedium;
-    } else if (size <= KIconLoader::SizeLarge) {
-        requestedSize = KIconLoader::SizeLarge;
-    } else if (size <= KIconLoader::SizeHuge) {
-        requestedSize = KIconLoader::SizeHuge;
-    } else if (size <= KIconLoader::SizeEnormous) {
-        requestedSize = KIconLoader::SizeEnormous;
-    } else if (size <= KIconLoader::SizeEnormous * 2) {
-        requestedSize = KIconLoader::SizeEnormous * 2;
-    } else {
-        requestedSize = size;
-    }
+    const QString key = "KStandardItemListWidget:" % name  % ":" % QString::number(size);
+    QPixmap pixmap;
+
+    if (!QPixmapCache::find(key, pixmap)) {
+        const KIcon icon(name);
+
+        int requestedSize;
+        if (size <= KIconLoader::SizeSmall) {
+            requestedSize = KIconLoader::SizeSmall;
+        } else if (size <= KIconLoader::SizeSmallMedium) {
+            requestedSize = KIconLoader::SizeSmallMedium;
+        } else if (size <= KIconLoader::SizeMedium) {
+            requestedSize = KIconLoader::SizeMedium;
+        } else if (size <= KIconLoader::SizeLarge) {
+            requestedSize = KIconLoader::SizeLarge;
+        } else if (size <= KIconLoader::SizeHuge) {
+            requestedSize = KIconLoader::SizeHuge;
+        } else if (size <= KIconLoader::SizeEnormous) {
+            requestedSize = KIconLoader::SizeEnormous;
+        } else if (size <= KIconLoader::SizeEnormous * 2) {
+            requestedSize = KIconLoader::SizeEnormous * 2;
+        } else {
+            requestedSize = size;
+        }
+
+        pixmap = icon.pixmap(requestedSize, requestedSize);
+        if (requestedSize != size) {
+            KPixmapModifier::scale(pixmap, QSize(size, size));
+        }
 
-    QPixmap pixmap = icon.pixmap(requestedSize, requestedSize);
-    if (requestedSize != size) {
-        KPixmapModifier::scale(pixmap, QSize(size, size));
+        QPixmapCache::insert(key, pixmap);
     }
 
     return pixmap;