From ce8cefe7600b19893e052a3fd1fa10ed1ab78f37 Mon Sep 17 00:00:00 2001
From: Fatih Uzunoglu <fuzun54@outlook.com>
Date: Tue, 25 Mar 2025 03:12:07 +0200
Subject: [PATCH] qml: fix symptomatic binding loop in `FadingEdgeForListView`

This fixes the symptomatic binding loop introduced in
8e2b2ac6.
---
 .../qt/widgets/qml/FadingEdgeForListView.qml  | 32 ++++++++++---------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/modules/gui/qt/widgets/qml/FadingEdgeForListView.qml b/modules/gui/qt/widgets/qml/FadingEdgeForListView.qml
index 6d093293d64f..a935ee8bba5d 100644
--- a/modules/gui/qt/widgets/qml/FadingEdgeForListView.qml
+++ b/modules/gui/qt/widgets/qml/FadingEdgeForListView.qml
@@ -60,25 +60,27 @@ FadingEdge {
                                                                                   listView.currentItem.height)
                                                                         : Qt.rect(-1, -1, -1, -1)
 
-    enableBeginningFade: _fadeRectEnoughSize &&
-                         !beginningHoverHandler.hovered &&
-                         (orientation === Qt.Vertical ? !listView.atYBeginning
-                                                      : !listView.atXBeginning) &&
-                         Helpers.itemIntersects(beginningArea, _currentItemMappedRect)
-
-    enableEndFade: _fadeRectEnoughSize &&
-                   !endHoverHandler.hovered &&
-                   (orientation === Qt.Vertical ? !listView.atYEnd
-                                                : !listView.atXEnd) &&
-                   Helpers.itemIntersects(endArea, _currentItemMappedRect)
+    readonly property bool _disableBeginningFade: (!!listView.headerItem && (listView.headerPositioning !== ListView.InlineHeader)) ||
+                                                  !_fadeRectEnoughSize ||
+                                                  (orientation === Qt.Vertical ? listView.atYBeginning
+                                                                               : listView.atXBeginning) ||
+                                                  !Helpers.itemIntersects(beginningArea, _currentItemMappedRect)
+
+    readonly property bool _disableEndFade: (!!listView.footerItem && (listView.footerPositioning !== ListView.InlineFooter)) ||
+                                            !_fadeRectEnoughSize ||
+                                            (orientation === Qt.Vertical ? listView.atYEnd
+                                                                         : listView.atXEnd) ||
+                                            !Helpers.itemIntersects(endArea, _currentItemMappedRect)
 
     Binding on enableBeginningFade {
-        when: !!listView.headerItem && (listView.headerPositioning !== ListView.InlineHeader)
+        // This explicit binding is to override `enableBeginningFade` when it is not feasible to have fading edge.
+        when: root._disableBeginningFade || beginningHoverHandler.hovered
         value: false
     }
 
     Binding on enableEndFade {
-        when: !!listView.footerItem && (listView.footerPositioning !== ListView.InlineFooter)
+        // This explicit binding is to override `enableEndFade` when it is not feasible to have fading edge.
+        when: root._disableEndFade || endHoverHandler.hovered
         value: false
     }
 
@@ -88,7 +90,7 @@ FadingEdge {
         z: 99
         parent: root.listView
 
-        visible: root.enableBeginningFade
+        visible: !root._disableBeginningFade
 
         anchors {
             top: parent.top
@@ -117,7 +119,7 @@ FadingEdge {
         z: 99
         parent: root.listView
 
-        visible: root.enableEndFade
+        visible: !root._disableEndFade
 
         anchors {
             bottom: parent.bottom
-- 
GitLab