X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ffe01ee8407559f46171bfea4aa6f21e37f945fb..15e0c2a98f480f203ce168b6fa9a2e1f2b0ed8f8:/src/kitemviews/kfileitemlistview.cpp diff --git a/src/kitemviews/kfileitemlistview.cpp b/src/kitemviews/kfileitemlistview.cpp index 9833b395f..d763fe287 100644 --- a/src/kitemviews/kfileitemlistview.cpp +++ b/src/kitemviews/kfileitemlistview.cpp @@ -9,38 +9,39 @@ #include "kfileitemlistwidget.h" #include "kfileitemmodel.h" #include "kfileitemmodelrolesupdater.h" +#include "private/kitemviewsutils.h" #include "private/kpixmapmodifier.h" #include #include #include -#include -#include #include #include +#include +#include // #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 QStringList& list) +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); @@ -185,7 +173,7 @@ QPixmap KFileItemListView::createDragPixmap(const KItemSet& indexes) const if (pixmap.isNull()) { QIcon icon = QIcon::fromTheme(model()->data(index).value("iconName").toString()); if (icon.isNull()) { - icon = QIcon::fromTheme("unknown"); + icon = QIcon::fromTheme(QStringLiteral("unknown")); } if (!icon.isNull()) { pixmap = icon.pixmap(size, size); @@ -213,20 +201,27 @@ QPixmap KFileItemListView::createDragPixmap(const KItemSet& indexes) const return dragPixmap; } -KItemListWidgetCreatorBase* KFileItemListView::defaultWidgetCreator() const +void KFileItemListView::setHoverSequenceState(const QUrl &itemUrl, int seqIdx) +{ + if (m_modelRolesUpdater) { + m_modelRolesUpdater->setHoverSequenceState(itemUrl, seqIdx); + } +} + +KItemListWidgetCreatorBase *KFileItemListView::defaultWidgetCreator() const { return new KItemListWidgetCreator(); } -void KFileItemListView::initializeItemListWidget(KItemListWidget* item) +void KFileItemListView::initializeItemListWidget(KItemListWidget *item) { KStandardItemListView::initializeItemListWidget(item); // Make sure that the item has an icon. QHash data = item->data(); if (!data.contains("iconName") && data["iconPixmap"].value().isNull()) { - Q_ASSERT(qobject_cast(model())); - KFileItemModel* fileItemModel = static_cast(model()); + Q_ASSERT(qobject_cast(model())); + KFileItemModel *fileItemModel = static_cast(model()); const KFileItem fileItem = fileItemModel->fileItem(item->index()); QString iconName = fileItem.iconName(); @@ -250,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(current)); + Q_ASSERT(qobject_cast(current)); KStandardItemListView::onModelChanged(current, previous); delete m_modelRolesUpdater; m_modelRolesUpdater = nullptr; if (current) { - m_modelRolesUpdater = new KFileItemModelRolesUpdater(static_cast(current), this); + m_modelRolesUpdater = new KFileItemModelRolesUpdater(static_cast(current), this); m_modelRolesUpdater->setIconSize(availableIconSize()); - m_modelRolesUpdater->setScanDirectories(scanDirectories()); + m_modelRolesUpdater->setDevicePixelRatio(KItemViewsUtils::devicePixelRatio(this)); applyRolesToModel(); } @@ -273,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 ¤t, const QSizeF &previous) { Q_UNUSED(current) Q_UNUSED(previous) @@ -286,13 +281,13 @@ void KFileItemListView::onScrollOffsetChanged(qreal current, qreal previous) triggerVisibleIndexRangeUpdate(); } -void KFileItemListView::onVisibleRolesChanged(const QList& current, const QList& previous) +void KFileItemListView::onVisibleRolesChanged(const QList ¤t, const QList &previous) { KStandardItemListView::onVisibleRolesChanged(current, previous); applyRolesToModel(); } -void KFileItemListView::onStyleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous) +void KFileItemListView::onStyleOptionChanged(const KItemListStyleOption ¤t, const KItemListStyleOption &previous) { KStandardItemListView::onStyleOptionChanged(current, previous); triggerIconSizeUpdate(); @@ -321,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(QGraphicsSceneResizeEvent* event) +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(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 ¤t, const QByteArray &previous) { const QByteArray sortRole = model()->sortRole(); if (!visibleRoles().contains(sortRole)) { @@ -397,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. @@ -413,8 +433,8 @@ void KFileItemListView::applyRolesToModel() return; } - Q_ASSERT(qobject_cast(model())); - KFileItemModel* fileItemModel = static_cast(model()); + Q_ASSERT(qobject_cast(model())); + KFileItemModel *fileItemModel = static_cast(model()); // KFileItemModel does not distinct between "visible" and "invisible" roles. // Add all roles that are mandatory for having a working KFileItemListView: @@ -441,7 +461,7 @@ void KFileItemListView::applyRolesToModel() QSize KFileItemListView::availableIconSize() const { - const KItemListStyleOption& option = styleOption(); + const KItemListStyleOption &option = styleOption(); const int iconSize = option.iconSize; if (itemLayout() == IconsLayout) { const int maxIconWidth = itemSize().width() - 2 * option.padding; @@ -451,3 +471,4 @@ QSize KFileItemListView::availableIconSize() const return QSize(iconSize, iconSize); } +#include "moc_kfileitemlistview.cpp"