[vlc-commits] [Git][videolan/vlc][master] 3 commits: qml: use hover handlers in `FadingEdgeForListView`
Steve Lhomme (@robUx4)
gitlab at videolan.org
Sat Feb 8 13:57:27 UTC 2025
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
5f1d6f6a by Fatih Uzunoglu at 2025-02-08T13:32:13+00:00
qml: use hover handlers in `FadingEdgeForListView`
This makes it possible to detect hovering better,
as `firstVisibleItem` and `lastVisibleItem` do not
work well at all times.
- - - - -
8af08453 by Fatih Uzunoglu at 2025-02-08T13:32:13+00:00
qml: introduce `Helpers::itemIntersects(Item, rect)`
- - - - -
bf5e2572 by Fatih Uzunoglu at 2025-02-08T13:32:13+00:00
qml: get rid of `firstVisibleItem` and `lastVisibleItem` in `FadingEdgeForListView.qml`
These properties are not reliable.
- - - - -
2 changed files:
- modules/gui/qt/util/qml/Helpers.qml
- modules/gui/qt/widgets/qml/FadingEdgeForListView.qml
Changes:
=====================================
modules/gui/qt/util/qml/Helpers.qml
=====================================
@@ -115,4 +115,13 @@ QtObject {
return (obj?.length !== undefined) ?? false
}
+ // Similar to Item::contains(), but accepts area (rectangle):
+ function itemIntersects(item: Item, area: rect) : bool {
+ if (!item)
+ return false
+ if (area.width <= 0.0 || area.height <= 0.0)
+ return false
+ return !(((item.x < (area.x + area.width)) && ((item.x + item.width) > area.x)) &&
+ ((item.y < (area.y + area.height)) && ((item.y + item.height) > area.y)))
+ }
}
=====================================
modules/gui/qt/widgets/qml/FadingEdgeForListView.qml
=====================================
@@ -50,62 +50,27 @@ FadingEdge {
// FIXME: Delegate with variable size
readonly property Item delegateItem: (listView.count > 0) ? listView.itemAtIndex(0) : null
- readonly property Item firstVisibleItem: {
- if (transitionsRunning || !delegateItem)
- return null
-
- let margin = 0 // -root.beginningMargin
- if (orientation === Qt.Vertical) {
- // if (headerItem && headerItem.visible && headerPositioning === ListView.OverlayHeader)
- // margin += headerItem.height
-
- return listView.itemAt(sourceX + (delegateItem.x + delegateItem.width / 2),
- sourceY + margin - beginningMargin + listView.spacing)
- } else {
- // if (headerItem && headerItem.visible && headerPositioning === ListView.OverlayHeader)
- // margin += headerItem.width
-
- return listView.itemAt(sourceX + margin - beginningMargin + listView.spacing,
- sourceY + (delegateItem.y + delegateItem.height / 2))
- }
- }
-
- readonly property Item lastVisibleItem: {
- if (transitionsRunning || !delegateItem)
- return null
-
- let margin = 0 // -root.endMargin
- if (orientation === Qt.Vertical) {
- // if (footerItem && footerItem.visible && footerPositioning === ListView.OverlayFooter)
- // margin += footerItem.height
-
- return listView.itemAt(sourceX + (delegateItem.x + delegateItem.width / 2),
- sourceY + listView.height - margin + endMargin - listView.spacing - 1)
- } else {
- // if (footerItem && footerItem.visible && footerPositioning === ListView.OverlayFooter)
- // margin += footerItem.width
-
- return listView.itemAt(sourceX + listView.width - margin + endMargin - listView.spacing - 1,
- sourceY + (delegateItem.y + delegateItem.height / 2))
- }
- }
readonly property bool _fadeRectEnoughSize: (orientation === Qt.Vertical ? listView.height
: listView.width) > (fadeSize * 2 + VLCStyle.dp(25))
+ readonly property rect _currentItemMappedRect: listView.currentItem ? Qt.rect(listView.currentItem.x - sourceX,
+ listView.currentItem.y - sourceY,
+ listView.currentItem.width,
+ listView.currentItem.height)
+ : Qt.rect(-1, -1, -1, -1)
+
enableBeginningFade: _fadeRectEnoughSize &&
+ !beginningHoverHandler.hovered &&
(orientation === Qt.Vertical ? !listView.atYBeginning
: !listView.atXBeginning) &&
- (!firstVisibleItem ||
- (!firstVisibleItem.activeFocus &&
- !(firstVisibleItem?.hovered ?? true)))
+ Helpers.itemIntersects(beginningArea, _currentItemMappedRect)
enableEndFade: _fadeRectEnoughSize &&
+ !endHoverHandler.hovered &&
(orientation === Qt.Vertical ? !listView.atYEnd
: !listView.atXEnd) &&
- (!lastVisibleItem ||
- (!lastVisibleItem.activeFocus &&
- !(lastVisibleItem?.hovered ?? true)))
+ Helpers.itemIntersects(endArea, _currentItemMappedRect)
Binding on enableBeginningFade {
when: !!listView.headerItem && (listView.headerPositioning !== ListView.InlineHeader)
@@ -116,4 +81,58 @@ FadingEdge {
when: !!listView.footerItem && (listView.footerPositioning !== ListView.InlineFooter)
value: false
}
+
+ Item {
+ id: beginningArea
+
+ z: 99
+ parent: root.listView
+
+ anchors {
+ top: parent.top
+ left: parent.left
+
+ topMargin: (orientation === Qt.Vertical) ? beginningMargin : undefined
+ leftMargin: (orientation === Qt.Horizontal) ? beginningMargin : undefined
+
+ bottom: (orientation === Qt.Horizontal) ? parent.bottom : undefined
+ right: (orientation === Qt.Vertical) ? parent.right : undefined
+ }
+
+ implicitWidth: fadeSize
+ implicitHeight: fadeSize
+
+ HoverHandler {
+ id: beginningHoverHandler
+
+ grabPermissions: PointerHandler.ApprovesTakeOverByAnything
+ }
+ }
+
+ Item {
+ id: endArea
+
+ z: 99
+ parent: root.listView
+
+ anchors {
+ bottom: parent.bottom
+ right: parent.right
+
+ bottomMargin: (orientation === Qt.Vertical) ? beginningMargin : undefined
+ rightMargin: (orientation === Qt.Horizontal) ? beginningMargin : undefined
+
+ top: (orientation === Qt.Horizontal) ? parent.top : undefined
+ left: (orientation === Qt.Vertical) ? parent.left : undefined
+ }
+
+ implicitWidth: fadeSize
+ implicitHeight: fadeSize
+
+ HoverHandler {
+ id: endHoverHandler
+
+ grabPermissions: PointerHandler.ApprovesTakeOverByAnything
+ }
+ }
}
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/0c06c384bc443ba37aae11a96e28fd6abf821b96...bf5e2572b11e14157fff91d63990aec71c5c1640
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/0c06c384bc443ba37aae11a96e28fd6abf821b96...bf5e2572b11e14157fff91d63990aec71c5c1640
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