From a27443d904bc220615f2c4e8df74187b0c806d8a Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 24 Feb 2025 18:39:22 +0000 Subject: Add smaller statusbar and set it as default - Statusbar has three modes: Small, FullWidth and Disabled - FullWidth is the original statusbar - Small is the new default statusbar - This statusbar overlays on top of the items instead of taking space - It changes size according to content - Disabled turns statusbar completely off - Zoom slider and space information is only shown in full-width statusbar - Space information is now always on - If user navigates with keyboard, or scrolls to selection, the scrolling will take the statusbar into account - This makes sure the statusbar does not cover any items Related discussion: https://invent.kde.org/system/dolphin/-/issues/50 --- src/kitemviews/kitemlistview.cpp | 16 +++++++++++++++- src/kitemviews/kitemlistview.h | 8 ++++++++ src/kitemviews/private/kitemlistviewlayouter.cpp | 9 +++++++++ src/kitemviews/private/kitemlistviewlayouter.h | 8 ++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) (limited to 'src/kitemviews') diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 369415f1b..c56785c36 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -106,6 +106,7 @@ KItemListView::KItemListView(QGraphicsWidget *parent) , m_header(nullptr) , m_headerWidget(nullptr) , m_indicatorAnimation(nullptr) + , m_statusBarOffset(0) , m_dropIndicator() , m_sizeHintResolver(nullptr) { @@ -192,7 +193,7 @@ qreal KItemListView::scrollOffset() const qreal KItemListView::maximumScrollOffset() const { - return m_layouter->maximumScrollOffset(); + return m_layouter->maximumScrollOffset() + m_statusBarOffset; } void KItemListView::setItemOffset(qreal offset) @@ -554,6 +555,9 @@ void KItemListView::scrollToItem(int index, ViewItemPosition viewItemPosition) const qreal headerHeight = m_headerWidget->size().height(); viewGeometry.adjust(0, headerHeight, 0, 0); } + if (m_statusBarOffset != 0) { + viewGeometry.adjust(0, 0, 0, -m_statusBarOffset); + } QRectF currentRect = itemRect(index); if (layoutDirection() == Qt::RightToLeft && scrollOrientation() == Qt::Horizontal) { @@ -829,6 +833,16 @@ void KItemListView::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt } } +void KItemListView::setStatusBarOffset(int offset) +{ + if (m_statusBarOffset != offset) { + m_statusBarOffset = offset; + if (m_layouter) { + m_layouter->setStatusBarOffset(offset); + } + } +} + QVariant KItemListView::itemChange(GraphicsItemChange change, const QVariant &value) { if (change == QGraphicsItem::ItemSceneHasChanged && scene()) { diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index 30ce4d871..7fb3344b4 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -302,6 +302,12 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; + /** + * Set the bottom offset for moving the view so that the small overlayed statusbar + * won't cover any items by accident. + */ + void setStatusBarOffset(int offset); + Q_SIGNALS: void scrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous); void scrollOffsetChanged(qreal current, qreal previous); @@ -776,6 +782,8 @@ private: QPropertyAnimation *m_indicatorAnimation; + int m_statusBarOffset; + // When dragging items into the view where the sort-role of the model // is empty, a visual indicator should be shown during dragging where // the dropping will happen. This indicator is specified by an index diff --git a/src/kitemviews/private/kitemlistviewlayouter.cpp b/src/kitemviews/private/kitemlistviewlayouter.cpp index 99a95d98c..3ed2343a8 100644 --- a/src/kitemviews/private/kitemlistviewlayouter.cpp +++ b/src/kitemviews/private/kitemlistviewlayouter.cpp @@ -40,6 +40,7 @@ KItemListViewLayouter::KItemListViewLayouter(KItemListSizeHintResolver *sizeHint , m_groupHeaderHeight(0) , m_groupHeaderMargin(0) , m_itemInfos() + , m_statusBarOffset(0) { Q_ASSERT(m_sizeHintResolver); } @@ -341,6 +342,13 @@ void KItemListViewLayouter::markAsDirty() m_dirty = true; } +void KItemListViewLayouter::setStatusBarOffset(int offset) +{ + if (m_statusBarOffset != offset) { + m_statusBarOffset = offset; + } +} + #ifndef QT_NO_DEBUG bool KItemListViewLayouter::isDirty() { @@ -378,6 +386,7 @@ void KItemListViewLayouter::doLayout() itemSize.transpose(); itemMargin.transpose(); size.transpose(); + size.rwidth() -= m_statusBarOffset; if (grouped) { // In the horizontal scrolling case all groups are aligned diff --git a/src/kitemviews/private/kitemlistviewlayouter.h b/src/kitemviews/private/kitemlistviewlayouter.h index 77d59c947..fed541a4c 100644 --- a/src/kitemviews/private/kitemlistviewlayouter.h +++ b/src/kitemviews/private/kitemlistviewlayouter.h @@ -154,6 +154,12 @@ public: return m_columnCount; } + /** + * Set the bottom offset for moving the view so that the small overlayed statusbar + * won't cover any items by accident. + */ + void setStatusBarOffset(int offset); + #ifndef QT_NO_DEBUG /** * @return True if the layouter has been marked as dirty and hence has @@ -219,6 +225,8 @@ private: }; QVector m_itemInfos; + int m_statusBarOffset; + friend class KItemListControllerTest; }; -- cgit v1.3