diff options
| author | Akseli Lahtinen <[email protected]> | 2025-02-24 18:39:22 +0000 |
|---|---|---|
| committer | Akseli Lahtinen <[email protected]> | 2025-02-24 18:39:22 +0000 |
| commit | a27443d904bc220615f2c4e8df74187b0c806d8a (patch) | |
| tree | 420ff120b30bb2492a363abf9ddf80a8697d3ad9 /src/kitemviews | |
| parent | 69c4792928edef91b5aea06772d02eb0f7c873b4 (diff) | |
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
Diffstat (limited to 'src/kitemviews')
| -rw-r--r-- | src/kitemviews/kitemlistview.cpp | 16 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistview.h | 8 | ||||
| -rw-r--r-- | src/kitemviews/private/kitemlistviewlayouter.cpp | 9 | ||||
| -rw-r--r-- | src/kitemviews/private/kitemlistviewlayouter.h | 8 |
4 files changed, 40 insertions, 1 deletions
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<ItemInfo> m_itemInfos; + int m_statusBarOffset; + friend class KItemListControllerTest; }; |
