]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemlistview.cpp
Always determine icons for the visible items first
[dolphin.git] / src / kitemviews / kfileitemlistview.cpp
index 8f7c9c899c5e045e24cff5b129d108de9a7272bf..70ce11b1fbaad3ad9c749533945f423aef425f35 100644 (file)
 
 #include "kfileitemlistview.h"
 
-#include "kfileitemlistgroupheader.h"
 #include "kfileitemmodelrolesupdater.h"
 #include "kfileitemlistwidget.h"
 #include "kfileitemmodel.h"
-#include "kpixmapmodifier_p.h"
 #include <KLocale>
 #include <KStringHandler>
+#include "private/kpixmapmodifier.h"
 
 #include <KDebug>
 #include <KIcon>
+#include <KTextEdit>
 
 #include <QPainter>
 #include <QTextLine>
@@ -42,8 +42,7 @@ namespace {
 }
 
 KFileItemListView::KFileItemListView(QGraphicsWidget* parent) :
-    KItemListView(parent),
-    m_itemLayout(IconsLayout),
+    KStandardItemListView(parent),
     m_modelRolesUpdater(0),
     m_updateVisibleIndexRangeTimer(0),
     m_updateIconSizeTimer(0)
@@ -51,8 +50,6 @@ KFileItemListView::KFileItemListView(QGraphicsWidget* parent) :
     setAcceptDrops(true);
 
     setScrollOrientation(Qt::Vertical);
-    setWidgetCreator(new KItemListWidgetCreator<KFileItemListWidget>());
-    setGroupHeaderCreator(new KItemListGroupHeaderCreator<KFileItemListGroupHeader>());
 
     m_updateVisibleIndexRangeTimer = new QTimer(this);
     m_updateVisibleIndexRangeTimer->setSingleShot(true);
@@ -64,51 +61,42 @@ KFileItemListView::KFileItemListView(QGraphicsWidget* parent) :
     m_updateIconSizeTimer->setInterval(ShortInterval);
     connect(m_updateIconSizeTimer, SIGNAL(timeout()), this, SLOT(updateIconSize()));
 
-    setVisibleRoles(QList<QByteArray>() << "name");
+    setVisibleRoles(QList<QByteArray>() << "text");
 }
 
 KFileItemListView::~KFileItemListView()
 {
-    // The group headers are children of the widgets created by
-    // widgetCreator(). So it is mandatory to delete the group headers
-    // first.
-    delete groupHeaderCreator();
-    delete widgetCreator();
-
-    delete m_modelRolesUpdater;
-    m_modelRolesUpdater = 0;
 }
 
 void KFileItemListView::setPreviewsShown(bool show)
 {
-    if (m_modelRolesUpdater) {
-        m_modelRolesUpdater->setPreviewShown(show);
+    if (!m_modelRolesUpdater) {
+        return;
+    }
+
+    if (m_modelRolesUpdater->previewsShown() != show) {
+        beginTransaction();
+        m_modelRolesUpdater->setPreviewsShown(show);
+        onPreviewsShownChanged(show);
+        endTransaction();
     }
 }
 
 bool KFileItemListView::previewsShown() const
 {
-    return m_modelRolesUpdater->isPreviewShown();
+    return m_modelRolesUpdater ? m_modelRolesUpdater->previewsShown() : false;
 }
 
-void KFileItemListView::setItemLayout(Layout layout)
+void KFileItemListView::setEnlargeSmallPreviews(bool enlarge)
 {
-    if (m_itemLayout != layout) {
-        const bool updateRoles = (m_itemLayout == DetailsLayout || layout == DetailsLayout);
-        m_itemLayout = layout;
-        if (updateRoles) {
-            // The details-layout requires some invisible roles that
-            // must be added to the model if the new layout is "details".
-            // If the old layout was "details" the roles will get removed.
-            applyRolesToModel();
-        }
-        updateLayoutOfVisibleItems();
+    if (m_modelRolesUpdater) {
+        m_modelRolesUpdater->setEnlargeSmallPreviews(enlarge);
     }
 }
 
-KFileItemListView::Layout KFileItemListView::itemLayout() const
+bool KFileItemListView::enlargeSmallPreviews() const
 {
-    return m_itemLayout;
+    return m_modelRolesUpdater ? m_modelRolesUpdater->enlargeSmallPreviews() : false;
 }
 
 void KFileItemListView::setEnabledPlugins(const QStringList& list)
@@ -131,6 +119,9 @@ QPixmap KFileItemListView::createDragPixmap(const QSet<int>& indexes) const
 
     const int itemCount = indexes.count();
     Q_ASSERT(itemCount > 0);
+    if (itemCount == 1) {
+        return KItemListView::createDragPixmap(indexes);
+    }
 
     // If more than one item is dragged, align the items inside a
     // rectangular grid. The maximum grid size is limited to 5 x 5 items.
@@ -194,52 +185,48 @@ QPixmap KFileItemListView::createDragPixmap(const QSet<int>& indexes) const
     return dragPixmap;
 }
 
-void KFileItemListView::initializeItemListWidget(KItemListWidget* item)
+KItemListWidgetCreatorBase* KFileItemListView::defaultWidgetCreator() const
 {
-    KFileItemListWidget* fileItemListWidget = static_cast<KFileItemListWidget*>(item);
-
-    switch (m_itemLayout) {
-    case IconsLayout:   fileItemListWidget->setLayout(KFileItemListWidget::IconsLayout); break;
-    case CompactLayout: fileItemListWidget->setLayout(KFileItemListWidget::CompactLayout); break;
-    case DetailsLayout: fileItemListWidget->setLayout(KFileItemListWidget::DetailsLayout); break;
-    default:            Q_ASSERT(false); break;
-    }
-
-    fileItemListWidget->setSupportsItemExpanding(supportsItemExpanding());
+    return new KItemListWidgetCreator<KFileItemListWidget>();
 }
 
-bool KFileItemListView::itemSizeHintUpdateRequired(const QSet<QByteArray>& changedRoles) const
+void KFileItemListView::onPreviewsShownChanged(bool shown)
 {
-    // Even if the icons have a different size they are always aligned within
-    // the area defined by KItemStyleOption.iconSize and hence result in no
-    // change of the item-size.
-    const bool containsIconName = changedRoles.contains("iconName");
-    const bool containsIconPixmap = changedRoles.contains("iconPixmap");
-    const int count = changedRoles.count();
+    Q_UNUSED(shown);
+}
 
-    const bool iconChanged = (containsIconName && containsIconPixmap && count == 2) ||
-                             (containsIconName && count == 1) ||
-                             (containsIconPixmap && count == 1);
-    return !iconChanged;
+void KFileItemListView::onItemLayoutChanged(ItemLayout current, ItemLayout previous)
+{
+    if (previous == DetailsLayout || current == DetailsLayout) {
+        // The details-layout requires some invisible roles that
+        // must be added to the model if the new layout is "details".
+        // If the old layout was "details" the roles will get removed.
+        applyRolesToModel();
+    }
+    KStandardItemListView::onItemLayoutChanged(current, previous);
+    triggerVisibleIndexRangeUpdate();
 }
 
 void KFileItemListView::onModelChanged(KItemModelBase* current, KItemModelBase* previous)
 {
-    Q_UNUSED(previous);
     Q_ASSERT(qobject_cast<KFileItemModel*>(current));
+    KStandardItemListView::onModelChanged(current, previous);
 
     delete m_modelRolesUpdater;
-    m_modelRolesUpdater = new KFileItemModelRolesUpdater(static_cast<KFileItemModel*>(current), this);
-    m_modelRolesUpdater->setIconSize(availableIconSize());
+    m_modelRolesUpdater = 0;
 
-    applyRolesToModel();
+    if (current) {
+        m_modelRolesUpdater = new KFileItemModelRolesUpdater(static_cast<KFileItemModel*>(current), this);
+        m_modelRolesUpdater->setIconSize(availableIconSize());
+
+        applyRolesToModel();
+    }
 }
 
 void KFileItemListView::onScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous)
 {
-    Q_UNUSED(current);
-    Q_UNUSED(previous);
-    updateLayoutOfVisibleItems();
+    KStandardItemListView::onScrollOrientationChanged(current, previous);
+    triggerVisibleIndexRangeUpdate();
 }
 
 void KFileItemListView::onItemSizeChanged(const QSizeF& current, const QSizeF& previous)
@@ -251,39 +238,42 @@ void KFileItemListView::onItemSizeChanged(const QSizeF& current, const QSizeF& p
 
 void KFileItemListView::onScrollOffsetChanged(qreal current, qreal previous)
 {
-    Q_UNUSED(current);
-    Q_UNUSED(previous);
+    KStandardItemListView::onScrollOffsetChanged(current, previous);
     triggerVisibleIndexRangeUpdate();
 }
 
 void KFileItemListView::onVisibleRolesChanged(const QList<QByteArray>& current, const QList<QByteArray>& previous)
 {
-    Q_UNUSED(current);
-    Q_UNUSED(previous);
+    KStandardItemListView::onVisibleRolesChanged(current, previous);
     applyRolesToModel();
 }
 
 void KFileItemListView::onStyleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous)
 {
-    Q_UNUSED(current);
-    Q_UNUSED(previous);
+    KStandardItemListView::onStyleOptionChanged(current, previous);
     triggerIconSizeUpdate();
 }
 
 void KFileItemListView::onSupportsItemExpandingChanged(bool supportsExpanding)
 {
-    Q_UNUSED(supportsExpanding);
     applyRolesToModel();
-    updateLayoutOfVisibleItems();
+    KStandardItemListView::onSupportsItemExpandingChanged(supportsExpanding);
+    triggerVisibleIndexRangeUpdate();
 }
 
 void KFileItemListView::onTransactionBegin()
 {
-    m_modelRolesUpdater->setPaused(true);
+    if (m_modelRolesUpdater) {
+        m_modelRolesUpdater->setPaused(true);
+    }
 }
 
 void KFileItemListView::onTransactionEnd()
 {
+    if (!m_modelRolesUpdater) {
+        return;
+    }
+
     // Only unpause the model-roles-updater if no timer is active. If one
     // timer is still active the model-roles-updater will be unpaused later as
     // soon as the timer has been exceeded.
@@ -296,13 +286,13 @@ void KFileItemListView::onTransactionEnd()
 
 void KFileItemListView::resizeEvent(QGraphicsSceneResizeEvent* event)
 {
-    KItemListView::resizeEvent(event);
+    KStandardItemListView::resizeEvent(event);
     triggerVisibleIndexRangeUpdate();
 }
 
 void KFileItemListView::slotItemsRemoved(const KItemRangeList& itemRanges)
 {
-    KItemListView::slotItemsRemoved(itemRanges);
+    KStandardItemListView::slotItemsRemoved(itemRanges);
     updateTimersInterval();
 }
 
@@ -313,7 +303,7 @@ void KFileItemListView::slotSortRoleChanged(const QByteArray& current, const QBy
         applyRolesToModel();
     }
 
-    KItemListView::slotSortRoleChanged(current, previous);
+    KStandardItemListView::slotSortRoleChanged(current, previous);
 }
 
 void KFileItemListView::triggerVisibleIndexRangeUpdate()
@@ -333,6 +323,7 @@ void KFileItemListView::updateVisibleIndexRange()
 
     const int index = firstVisibleIndex();
     const int count = lastVisibleIndex() - index + 1;
+    m_modelRolesUpdater->setMaximumVisibleItems(maximumVisibleItems());
     m_modelRolesUpdater->setVisibleIndexRange(index, count);
 
     if (m_updateIconSizeTimer->isActive()) {
@@ -378,18 +369,6 @@ void KFileItemListView::updateIconSize()
     updateTimersInterval();
 }
 
-void KFileItemListView::updateLayoutOfVisibleItems()
-{
-    if (!model()) {
-        return;
-    }
-
-    foreach (KItemListWidget* widget, visibleItemListWidgets()) {
-        initializeItemListWidget(widget);
-    }
-    triggerVisibleIndexRangeUpdate();
-}
-
 void KFileItemListView::updateTimersInterval()
 {
     if (!model()) {
@@ -421,8 +400,9 @@ void KFileItemListView::applyRolesToModel()
     QSet<QByteArray> roles = visibleRoles().toSet();
     roles.insert("iconPixmap");
     roles.insert("iconName");
-    roles.insert("name");
+    roles.insert("text");
     roles.insert("isDir");
+    roles.insert("isLink");
     if (supportsItemExpanding()) {
         roles.insert("isExpanded");
         roles.insert("isExpandable");
@@ -440,7 +420,7 @@ QSize KFileItemListView::availableIconSize() const
 {
     const KItemListStyleOption& option = styleOption();
     const int iconSize = option.iconSize;
-    if (m_itemLayout == IconsLayout) {
+    if (itemLayout() == IconsLayout) {
         const int maxIconWidth = itemSize().width() - 2 * option.padding;
         return QSize(maxIconWidth, iconSize);
     }