]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemlistview.cpp
Merge remote-tracking branch 'fork/work/zakharafoniam/useful-groups'
[dolphin.git] / src / kitemviews / kfileitemlistview.cpp
index 26bc014653e555c5d375fbcfa0a0060fa7a0aee8..d58a1a8baf3ac982d82135f1ed1ba55a2ae41404 100644 (file)
@@ -9,38 +9,39 @@
 #include "kfileitemlistwidget.h"
 #include "kfileitemmodel.h"
 #include "kfileitemmodelrolesupdater.h"
+#include "private/kitemviewsutils.h"
 #include "private/kpixmapmodifier.h"
 
 #include <KIconLoader>
 
 #include <QGraphicsScene>
 #include <QGraphicsView>
-#include <QPainter>
-#include <QTimer>
 #include <QIcon>
 #include <QMimeDatabase>
+#include <QPainter>
+#include <QTimer>
 
 // #define KFILEITEMLISTVIEW_DEBUG
 
-namespace {
-    // If the visible index range changes, KFileItemModelRolesUpdater is not
-    // informed immediately, but with a short delay. This ensures that scrolling
-    // always feels smooth and is not interrupted by icon loading (which can be
-    // quite expensive if a disk access is required to determine the final icon).
-    const int ShortInterval = 50;
+namespace
+{
+// If the visible index range changes, KFileItemModelRolesUpdater is not
+// informed immediately, but with a short delay. This ensures that scrolling
+// always feels smooth and is not interrupted by icon loading (which can be
+// quite expensive if a disk access is required to determine the final icon).
+const int ShortInterval = 50;
 
-    // If the icon size changes, a longer delay is used. This prevents that
-    // the expensive re-generation of all previews is triggered repeatedly when
-    // changing the zoom level.
-    const int LongInterval = 300;
+// If the icon size changes, a longer delay is used. This prevents that
+// the expensive re-generation of all previews is triggered repeatedly when
+// changing the zoom level.
+const int LongInterval = 300;
 }
 
-KFileItemListView::KFileItemListView(QGraphicsWidget* parent) :
-    KStandardItemListView(parent),
-    m_modelRolesUpdater(nullptr),
-    m_updateVisibleIndexRangeTimer(nullptr),
-    m_updateIconSizeTimer(nullptr),
-    m_scanDirectories(true)
+KFileItemListView::KFileItemListView(QGraphicsWidget *parent)
+    : KStandardItemListView(parent)
+    , m_modelRolesUpdater(nullptr)
+    , m_updateVisibleIndexRangeTimer(nullptr)
+    , m_updateIconSizeTimer(nullptr)
 {
     setAcceptDrops(true);
 
@@ -94,7 +95,7 @@ bool KFileItemListView::enlargeSmallPreviews() const
     return m_modelRolesUpdater ? m_modelRolesUpdater->enlargeSmallPreviews() : false;
 }
 
-void KFileItemListView::setEnabledPlugins(const QStringListlist)
+void KFileItemListView::setEnabledPlugins(const QStringList &list)
 {
     if (m_modelRolesUpdater) {
         m_modelRolesUpdater->setEnabledPlugins(list);
@@ -118,20 +119,7 @@ qlonglong KFileItemListView::localFileSizePreviewLimit() const
     return m_modelRolesUpdater ? m_modelRolesUpdater->localFileSizePreviewLimit() : 0;
 }
 
-void KFileItemListView::setScanDirectories(bool enabled)
-{
-    m_scanDirectories = enabled;
-    if (m_modelRolesUpdater) {
-        m_modelRolesUpdater->setScanDirectories(m_scanDirectories);
-    }
-}
-
-bool KFileItemListView::scanDirectories()
-{
-    return m_scanDirectories;
-}
-
-QPixmap KFileItemListView::createDragPixmap(const KItemSet& indexes) const
+QPixmap KFileItemListView::createDragPixmap(const KItemSet &indexes) const
 {
     if (!model()) {
         return QPixmap();
@@ -170,7 +158,7 @@ QPixmap KFileItemListView::createDragPixmap(const KItemSet& indexes) const
         yCount = xCount;
     }
 
-    const qreal dpr = scene()->views()[0]->devicePixelRatio();
+    const qreal dpr = KItemViewsUtils::devicePixelRatio(this);
     // Draw the selected items into the grid cells.
     QPixmap dragPixmap(QSize(xCount * size + xCount, yCount * size + yCount) * dpr);
     dragPixmap.setDevicePixelRatio(dpr);
@@ -213,27 +201,27 @@ QPixmap KFileItemListView::createDragPixmap(const KItemSet& indexes) const
     return dragPixmap;
 }
 
-void KFileItemListView::setHoverSequenceState(const QUrlitemUrl, int seqIdx)
+void KFileItemListView::setHoverSequenceState(const QUrl &itemUrl, int seqIdx)
 {
     if (m_modelRolesUpdater) {
         m_modelRolesUpdater->setHoverSequenceState(itemUrl, seqIdx);
     }
 }
 
-KItemListWidgetCreatorBaseKFileItemListView::defaultWidgetCreator() const
+KItemListWidgetCreatorBase *KFileItemListView::defaultWidgetCreator() const
 {
     return new KItemListWidgetCreator<KFileItemListWidget>();
 }
 
-void KFileItemListView::initializeItemListWidget(KItemListWidgetitem)
+void KFileItemListView::initializeItemListWidget(KItemListWidget *item)
 {
     KStandardItemListView::initializeItemListWidget(item);
 
     // Make sure that the item has an icon.
     QHash<QByteArray, QVariant> data = item->data();
     if (!data.contains("iconName") && data["iconPixmap"].value<QPixmap>().isNull()) {
-        Q_ASSERT(qobject_cast<KFileItemModel*>(model()));
-        KFileItemModel* fileItemModel = static_cast<KFileItemModel*>(model());
+        Q_ASSERT(qobject_cast<KFileItemModel *>(model()));
+        KFileItemModel *fileItemModel = static_cast<KFileItemModel *>(model());
 
         const KFileItem fileItem = fileItemModel->fileItem(item->index());
         QString iconName = fileItem.iconName();
@@ -257,18 +245,18 @@ void KFileItemListView::onItemLayoutChanged(ItemLayout current, ItemLayout previ
     triggerVisibleIndexRangeUpdate();
 }
 
-void KFileItemListView::onModelChanged(KItemModelBase* current, KItemModelBase* previous)
+void KFileItemListView::onModelChanged(KItemModelBase *current, KItemModelBase *previous)
 {
-    Q_ASSERT(qobject_cast<KFileItemModel*>(current));
+    Q_ASSERT(qobject_cast<KFileItemModel *>(current));
     KStandardItemListView::onModelChanged(current, previous);
 
     delete m_modelRolesUpdater;
     m_modelRolesUpdater = nullptr;
 
     if (current) {
-        m_modelRolesUpdater = new KFileItemModelRolesUpdater(static_cast<KFileItemModel*>(current), this);
+        m_modelRolesUpdater = new KFileItemModelRolesUpdater(static_cast<KFileItemModel *>(current), this);
         m_modelRolesUpdater->setIconSize(availableIconSize());
-        m_modelRolesUpdater->setScanDirectories(scanDirectories());
+        m_modelRolesUpdater->setDevicePixelRatio(KItemViewsUtils::devicePixelRatio(this));
 
         applyRolesToModel();
     }
@@ -280,7 +268,7 @@ void KFileItemListView::onScrollOrientationChanged(Qt::Orientation current, Qt::
     triggerVisibleIndexRangeUpdate();
 }
 
-void KFileItemListView::onItemSizeChanged(const QSizeF& current, const QSizeF& previous)
+void KFileItemListView::onItemSizeChanged(const QSizeF &current, const QSizeF &previous)
 {
     Q_UNUSED(current)
     Q_UNUSED(previous)
@@ -293,13 +281,13 @@ void KFileItemListView::onScrollOffsetChanged(qreal current, qreal previous)
     triggerVisibleIndexRangeUpdate();
 }
 
-void KFileItemListView::onVisibleRolesChanged(const QList<QByteArray>& current, const QList<QByteArray>& previous)
+void KFileItemListView::onVisibleRolesChanged(const QList<QByteArray> &current, const QList<QByteArray> &previous)
 {
     KStandardItemListView::onVisibleRolesChanged(current, previous);
     applyRolesToModel();
 }
 
-void KFileItemListView::onStyleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous)
+void KFileItemListView::onStyleOptionChanged(const KItemListStyleOption &current, const KItemListStyleOption &previous)
 {
     KStandardItemListView::onStyleOptionChanged(current, previous);
     triggerIconSizeUpdate();
@@ -328,25 +316,49 @@ void KFileItemListView::onTransactionEnd()
     // 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.
-    const bool timerActive = m_updateVisibleIndexRangeTimer->isActive() ||
-                             m_updateIconSizeTimer->isActive();
+    const bool timerActive = m_updateVisibleIndexRangeTimer->isActive() || m_updateIconSizeTimer->isActive();
     if (!timerActive) {
         m_modelRolesUpdater->setPaused(false);
     }
 }
 
-void KFileItemListView::resizeEvent(QGraphicsSceneResizeEventevent)
+void KFileItemListView::resizeEvent(QGraphicsSceneResizeEvent *event)
 {
     KStandardItemListView::resizeEvent(event);
     triggerVisibleIndexRangeUpdate();
 }
 
-void KFileItemListView::slotItemsRemoved(const KItemRangeList& itemRanges)
+void KFileItemListView::focusInEvent(QFocusEvent *event)
+{
+    Q_UNUSED(event)
+    updateSelectedWidgets();
+}
+
+void KFileItemListView::focusOutEvent(QFocusEvent *event)
+{
+    Q_UNUSED(event)
+    updateSelectedWidgets();
+}
+
+void KFileItemListView::updateSelectedWidgets()
+{
+    const auto visibleWidgets = visibleItemListWidgets();
+    for (KItemListWidget *widget : visibleWidgets) {
+        if (widget->isSelected()) {
+            auto w = qobject_cast<KFileItemListWidget *>(widget);
+            if (w) {
+                w->forceUpdate();
+            }
+        }
+    }
+}
+
+void KFileItemListView::slotItemsRemoved(const KItemRangeList &itemRanges)
 {
     KStandardItemListView::slotItemsRemoved(itemRanges);
 }
 
-void KFileItemListView::slotSortRoleChanged(const QByteArray& current, const QByteArray& previous)
+void KFileItemListView::slotSortRoleChanged(const QByteArray &current, const QByteArray &previous)
 {
     const QByteArray sortRole = model()->sortRole();
     if (!visibleRoles().contains(sortRole)) {
@@ -404,6 +416,7 @@ void KFileItemListView::updateIconSize()
     }
 
     m_modelRolesUpdater->setIconSize(availableIconSize());
+    m_modelRolesUpdater->setDevicePixelRatio(KItemViewsUtils::devicePixelRatio(this));
 
     // Update the visible index range (which has most likely changed after the
     // icon size change) before unpausing m_modelRolesUpdater.
@@ -420,8 +433,8 @@ void KFileItemListView::applyRolesToModel()
         return;
     }
 
-    Q_ASSERT(qobject_cast<KFileItemModel*>(model()));
-    KFileItemModel* fileItemModel = static_cast<KFileItemModel*>(model());
+    Q_ASSERT(qobject_cast<KFileItemModel *>(model()));
+    KFileItemModel *fileItemModel = static_cast<KFileItemModel *>(model());
 
     // KFileItemModel does not distinct between "visible" and "invisible" roles.
     // Add all roles that are mandatory for having a working KFileItemListView:
@@ -439,8 +452,9 @@ void KFileItemListView::applyRolesToModel()
         roles.insert("expandedParentsCount");
     }
 
-    // Assure that the role that is used for sorting will be determined
+    // Assure that the roles used for sorting and grouping will be determined
     roles.insert(fileItemModel->sortRole());
+    roles.insert(fileItemModel->groupRole());
 
     fileItemModel->setRoles(roles);
     m_modelRolesUpdater->setRoles(roles);
@@ -448,7 +462,7 @@ void KFileItemListView::applyRolesToModel()
 
 QSize KFileItemListView::availableIconSize() const
 {
-    const KItemListStyleOptionoption = styleOption();
+    const KItemListStyleOption &option = styleOption();
     const int iconSize = option.iconSize;
     if (itemLayout() == IconsLayout) {
         const int maxIconWidth = itemSize().width() - 2 * option.padding;
@@ -458,3 +472,4 @@ QSize KFileItemListView::availableIconSize() const
     return QSize(iconSize, iconSize);
 }
 
+#include "moc_kfileitemlistview.cpp"