[vlc-commits] [Git][videolan/vlc][master] qml: layout in Grid View such that view top row is preserved

Steve Lhomme (@robUx4) gitlab at videolan.org
Mon Jul 29 07:05:47 UTC 2024



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
4f774de3 by Prince Gupta at 2024-07-29T06:43:31+00:00
qml: layout in Grid View such that view top row is preserved

- - - - -


1 changed file:

- modules/gui/qt/widgets/qml/ExpandGridView.qml


Changes:

=====================================
modules/gui/qt/widgets/qml/ExpandGridView.qml
=====================================
@@ -120,6 +120,10 @@ FocusScope {
     property var _currentRange: [0,0]
     property var _delayedChildrenMap: ({})
 
+    property int _anchoredIdx: -1
+    property real _anchoredIdxFraction: 1
+    property real _anchoredIdxUpdate: 0
+
     // Aliases
 
     property alias contentHeight: flickable.contentHeight
@@ -174,15 +178,14 @@ FocusScope {
             flickable.layout(true)
     }
 
-    onHeightChanged: flickable.layout(false)
-
-    onContentWidthChanged: flickable.layout(true)
-    onContentHeightChanged: flickable.layout(true)
+    onHeightChanged: _anchoredLayout(false)
+    onContentWidthChanged: _anchoredLayout(true)
+    onContentHeightChanged: _anchoredLayout(true)
 
     // NOTE: Update on contentLeftMargin since we depend on this for item placements.
-    onContentLeftMarginChanged: flickable.layout(true)
+    onContentLeftMarginChanged: _anchoredLayout(true)
 
-    onDisplayMarginEndChanged: flickable.layout(false)
+    onDisplayMarginEndChanged: _anchoredLayout(false)
 
     onModelChanged: _onModelCountChanged()
 
@@ -351,6 +354,36 @@ FocusScope {
 
     // Functions
 
+    // layouts such that views indexes are preserved during a resize
+    function _anchoredLayout(forceLayout) {
+        if (_currentRange[0] === _currentRange[1])
+            return
+
+        // fix anchor for some duration, so that index remains
+        // same during whole resize operation
+        const dirty = (Date.now() - _anchoredIdxUpdate) > VLCStyle.duration_veryLong
+
+        if (dirty || (_anchoredIdx < 0) || (_anchoredIdx >= _count)) {
+            _anchoredIdx = _currentRange?.[0] ?? 0
+            const item = _getItem(_anchoredIdx)
+            _anchoredIdxFraction = (item.y - flickable.contentY) / cellHeight
+        }
+
+        // reset timer for each call, this allows preserving anchor for extened duration
+        _anchoredIdxUpdate = Date.now()
+
+        let y = 0 // by default show full view including header
+        if (_anchoredIdx !== 0)
+            y = getItemPos(_anchoredIdx)[1] + (cellHeight * _anchoredIdxFraction)
+
+        const previousContentY = flickable.contentY
+        const maxY = Math.max(0, flickable.contentHeight - height)
+
+        flickable.contentY = Helpers.clamp(y, 0, maxY)
+        if (forceLayout || (previousContentY === flickable.contentY))
+            flickable.layout(forceLayout)
+    }
+
     // NOTE: This function is useful to set the currentItem without losing the visual focus.
     function setCurrentItem(index) {
         if (currentIndex === index)



View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/4f774de3500856147388635a72e9ecc867e0d2cc

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/4f774de3500856147388635a72e9ecc867e0d2cc
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list