[vlc-commits] [Git][videolan/vlc][master] 3 commits: qml: add ViewDragAutoScrollHandler
Hugo Beauzée-Luyssen (@chouquette)
gitlab at videolan.org
Mon Jan 10 08:56:10 UTC 2022
Hugo Beauzée-Luyssen pushed to branch master at VideoLAN / VLC
Commits:
564f1389 by Fatih Uzunoglu at 2022-01-10T08:41:10+00:00
qml: add ViewDragAutoScrollHandler
- - - - -
fce6c5d4 by Fatih Uzunoglu at 2022-01-10T08:41:10+00:00
qml: use ViewDragAutoScrollHandler in ToolbarEditor
- - - - -
88c1e530 by Fatih Uzunoglu at 2022-01-10T08:41:10+00:00
qml: use ViewDragAutoScrollHandler in Playlist
- - - - -
9 changed files:
- modules/gui/qt/Makefile.am
- modules/gui/qt/dialogs/toolbar/qml/EditorDNDDelegate.qml
- modules/gui/qt/dialogs/toolbar/qml/ToolbarEditor.qml
- modules/gui/qt/dialogs/toolbar/qml/ToolbarEditorButtonList.qml
- modules/gui/qt/playlist/qml/PlaylistDelegate.qml
- modules/gui/qt/playlist/qml/PlaylistListView.qml
- + modules/gui/qt/util/qml/ViewDragAutoScrollHandler.qml
- modules/gui/qt/vlc.qrc
- modules/gui/qt/widgets/qml/KeyNavigableListView.qml
Changes:
=====================================
modules/gui/qt/Makefile.am
=====================================
@@ -847,6 +847,7 @@ libqt_plugin_la_QML = \
gui/qt/util/qml/SelectableDelegateModel.qml \
gui/qt/util/qml/MultipleBinding.qml \
gui/qt/util/qml/FlickableScrollHandler.qml \
+ gui/qt/util/qml/ViewDragAutoScrollHandler.qml \
gui/qt/widgets/qml/ActionButtonOverlay.qml \
gui/qt/widgets/qml/ActionButtonPrimary.qml \
gui/qt/widgets/qml/BannerTabButton.qml \
=====================================
modules/gui/qt/dialogs/toolbar/qml/EditorDNDDelegate.qml
=====================================
@@ -56,11 +56,13 @@ Control {
drag.onActiveChanged: {
if (drag.active) {
+ dragAutoScrollHandler.dragItem = loader
root.dragStarted(controlId)
removeInfoRectVisible = true
drag.target.Drag.start()
} else {
+ dragAutoScrollHandler.dragItem = null
drag.target.Drag.drop()
removeInfoRectVisible = false
root.dragStopped(controlId)
@@ -154,11 +156,6 @@ Control {
Drag.source: control
- onXChanged: {
- if (Drag.active)
- root.handleScroll(this)
- }
-
onLoaded: {
item.paintOnly = true
item.enabled = false
=====================================
modules/gui/qt/dialogs/toolbar/qml/ToolbarEditor.qml
=====================================
@@ -24,6 +24,7 @@ import org.videolan.vlc 0.1
import "qrc:///style/"
import "qrc:///widgets/" as Widgets
+import "qrc:///util/" as Util
Rectangle{
id: root
@@ -269,75 +270,14 @@ Rectangle{
x: -1
y: -1
- onXChanged: {
- if (Drag.active)
- handleScroll(this)
+ Drag.onActiveChanged: {
+ dragAutoScrollHandler.dragItem = Drag.active ? this : null
}
}
- function handleScroll(dragItem) {
- var view = _viewThatContainsDrag
+ Util.ViewDragAutoScrollHandler {
+ id: dragAutoScrollHandler
- if (view === undefined || view === null) {
- if (!!scrollAnimation.target)
- view = scrollAnimation.target
- else
- return
- }
-
- var dragItemX = dragItem.x
- var viewPos = view.mapToItem(root, view.x, view.y)
-
- var margin = VLCStyle.dp(25, VLCStyle.scale)
-
- var leftMark = (viewPos.x + margin)
- var rightMark = (viewPos.x + view.width - margin)
-
- scrollAnimation.target = view
- scrollAnimation.dragItem = dragItem
-
- if (!view.contains(view.mapFromItem(root, dragItemX, dragItem.y))) {
- scrollAnimation.direction = 0
- } else {
- if (!view.atXBeginning && dragItemX <= leftMark) {
- scrollAnimation.direction = -1
- } else if (!view.atXEnd && dragItemX >= rightMark) {
- scrollAnimation.direction = 1
- } else {
- scrollAnimation.direction = 0
- }
- }
- }
-
- SmoothedAnimation {
- id: scrollAnimation
-
- property var dragItem
- property int direction: 0 // -1: left, 0: stop, 1: right
-
- onDirectionChanged: {
- if (direction === 0)
- stop()
- }
-
- to: {
- if (direction === -1)
- 0
- else if (direction === 1 && !!target)
- target.contentWidth - target.width + target.footerItem.width
- else
- 0
- }
-
- running: {
- if (!!dragItem && (direction === -1 || direction === 1))
- dragItem.Drag.active
- else
- false
- }
-
- property: "contentX"
- velocity: VLCStyle.dp(150, VLCStyle.scale)
- reversingMode: SmoothedAnimation.Immediate
+ view: _viewThatContainsDrag ? _viewThatContainsDrag : null
}
}
=====================================
modules/gui/qt/dialogs/toolbar/qml/ToolbarEditorButtonList.qml
=====================================
@@ -127,7 +127,7 @@ GridView {
drag.onActiveChanged: {
if (drag.active) {
- root.dragStarted(mIndex)
+ dragStarted(mIndex)
buttonDragItem.text = PlayerControlbarControls.controlList[model.index].label
buttonDragItem.Drag.source = this
@@ -137,7 +137,7 @@ GridView {
} else {
buttonDragItem.Drag.drop()
- root.dragStopped(mIndex)
+ dragStopped(mIndex)
GridView.delayRemove = false
}
=====================================
modules/gui/qt/playlist/qml/PlaylistDelegate.qml
=====================================
@@ -272,7 +272,7 @@ T.Control {
// FIXME: Override dragItem's position
var pos = mapToItem(dragItem.parent, mouseX, mouseY)
dragItem.x = pos.x + VLCStyle.dp(15)
- dragItem.y = pos.y // y should be changed after x
+ dragItem.y = pos.y
}
}
}
=====================================
modules/gui/qt/playlist/qml/PlaylistListView.qml
=====================================
@@ -162,45 +162,6 @@ Control {
return {"title": item.title, "cover": item.artwork}
}))
}
-
- property int _scrollingDirection: 0
-
- onYChanged: {
- var dragItemY = dragItem.y
- var viewY = root.mapFromItem(listView, listView.x, listView.y).y
-
- var margin = VLCStyle.dp(20, VLCStyle.scale)
-
- var topDiff = (viewY + margin) - dragItemY
- var bottomDiff = dragItemY - (viewY + listView.height - toolbar.height - margin)
-
- if (topDiff > 0)
- _scrollingDirection = -1
- else if (bottomDiff > 0)
- _scrollingDirection = 1
- else
- _scrollingDirection = 0
- }
-
- SmoothedAnimation {
- id: upAnimation
- target: listView
- property: "contentY"
- to: 0
- running: dragItem._scrollingDirection === -1 && dragItem.visible && !target.listView.atYBeginning
-
- velocity: VLCStyle.dp(225, VLCStyle.scale)
- }
-
- SmoothedAnimation {
- id: downAnimation
- target: listView
- property: "contentY"
- to: target.contentHeight - target.height + target.footerItem.height
- running: dragItem._scrollingDirection === 1 && dragItem.visible && !target.listView.atYEnd
-
- velocity: VLCStyle.dp(225, VLCStyle.scale)
- }
}
PlaylistContextMenu {
@@ -328,14 +289,11 @@ Control {
playlistId: MainCtx.mainPlaylist
}
+ dragAutoScrollDragItem: dragItem
+
fadeColor: background.usingAcrylic ? undefined
: background.alternativeColor
- Binding on fadeColor {
- when: downAnimation.running || upAnimation.running
- value: undefined
- }
-
property int shiftIndex: -1
property PlaylistDelegate delegateContainsDrag: null
=====================================
modules/gui/qt/util/qml/ViewDragAutoScrollHandler.qml
=====================================
@@ -0,0 +1,138 @@
+/*****************************************************************************
+ * Copyright (C) 2021 VLC authors and VideoLAN
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * ( at your option ) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+import QtQuick 2.11
+import QtQuick.Controls 2.4
+
+import "qrc:///style/"
+
+QtObject {
+ id: root
+
+ property Flickable view: null
+ property Item dragItem: null
+
+ property int orientation: (view && view.orientation !== undefined) ? view.orientation
+ : Qt.Vertical
+ property real margin: VLCStyle.dp(20)
+
+ readonly property bool scrolling: animation.running // for convenience
+ property alias scrollingDirection: animation.direction
+
+ property alias velocity: animation.velocity
+
+ enum Direction {
+ Forward,
+ Backward,
+ None // not scrolling
+ }
+
+ readonly property SmoothedAnimation _animation: SmoothedAnimation {
+ id: animation
+ target: root.view
+ property: root.orientation === Qt.Vertical ? "contentY"
+ : "contentX"
+ reversingMode: SmoothedAnimation.Immediate
+ easing.type: Easing.OutQuad
+
+ velocity: VLCStyle.dp(200)
+ maximumEasingTime: 1000
+
+ readonly property Timer _timer: Timer {
+ interval: 100
+ }
+
+ readonly property ScrollBar _scrollBar: (root.view) ? ((root.orientation === Qt.Vertical) ? root.view.ScrollBar.vertical
+ : root.view.ScrollBar.horizontal)
+ : null
+
+ readonly property int direction: {
+ if (!root.dragItem || !root.view)
+ return ViewDragAutoScrollHandler.Direction.None
+
+ if (!root.dragItem.visible || !root.view.visible)
+ return ViewDragAutoScrollHandler.Direction.None
+
+ var pos = root.view.mapFromItem(root.dragItem.parent,
+ root.dragItem.x,
+ root.dragItem.y)
+
+ var size, mark
+ if (root.orientation === Qt.Vertical) {
+ size = root.view.height
+ mark = pos.y
+ } else {
+ size = root.view.width
+ mark = pos.x
+ }
+
+ if (size < root.margin * 2.5)
+ return ViewDragAutoScrollHandler.Direction.None
+
+ if (mark < root.margin)
+ return ViewDragAutoScrollHandler.Direction.Backward
+ else if (mark > (size - root.margin))
+ return ViewDragAutoScrollHandler.Direction.Forward
+ else
+ return ViewDragAutoScrollHandler.Direction.None
+ }
+
+ Component.onCompleted: {
+ // prevent direction to bounce
+ _timer.triggered.connect(directionChangedHandler)
+ }
+
+ onDirectionChanged: {
+ _timer.start()
+ }
+
+ function directionChangedHandler() {
+ if (direction === ViewDragAutoScrollHandler.Direction.None) {
+ running = false
+
+ if (_scrollBar)
+ _scrollBar.active = false // TODO: Use Binding Qt >=5.14
+ } else if (!running) {
+ var _to
+
+ if (direction === ViewDragAutoScrollHandler.Direction.Backward) {
+ _to = 0
+ } else if (direction === ViewDragAutoScrollHandler.Direction.Forward) {
+ // FIXME: Is there a better way to calculate extents?
+ _to = ((root.orientation === Qt.Vertical) ? root.view.contentHeight - root.view.height
+ : root.view.contentWidth - root.view.width)
+ if (root.view.footerItem !== undefined
+ && root.view.footerItem
+ && root.view.footerPositioning === 0 /* inline positioning */)
+ _to += (root.orientation === Qt.Vertical) ? root.view.footerItem.height
+ : root.view.footerItem.width
+ if (root.view.headerItem !== undefined
+ && root.view.headerItem
+ && root.view.headerPositioning === 0 /* inline positioning */)
+ _to += (root.orientation === Qt.Vertical) ? root.view.headerItem.height
+ : root.view.headerItem.width
+ }
+
+ to = _to
+ running = true
+
+ if (_scrollBar)
+ _scrollBar.active = true // TODO: Use Binding Qt >= 5.14
+ }
+ }
+ }
+}
=====================================
modules/gui/qt/vlc.qrc
=====================================
@@ -28,6 +28,7 @@
<file alias="Helpers.js">util/qml/Helpers.js</file>
<file alias="MultipleBinding.qml">util/qml/MultipleBinding.qml</file>
<file alias="FlickableScrollHandler.qml">util/qml/FlickableScrollHandler.qml</file>
+ <file alias="ViewDragAutoScrollHandler.qml">util/qml/ViewDragAutoScrollHandler.qml</file>
</qresource>
<qresource prefix="/toolbar">
<file alias="faster.svg">pixmaps/faster.svg</file>
=====================================
modules/gui/qt/widgets/qml/KeyNavigableListView.qml
=====================================
@@ -22,6 +22,7 @@ import QtGraphicalEffects 1.0
import org.videolan.vlc 0.1
import "qrc:///style/"
+import "qrc:///util/" as Util
import "qrc:///util/Helpers.js" as Helpers
import "qrc:///util/" as Util
@@ -99,6 +100,10 @@ FocusScope {
property alias buttonLeft: buttonLeft
property alias buttonRight: buttonRight
+ property alias dragAutoScrollDragItem: dragAutoScrollHandler.dragItem
+ property alias dragAutoScrollMargin: dragAutoScrollHandler.margin
+ property alias dragAutoScrolling: dragAutoScrollHandler.scrolling
+
// Signals
signal selectionUpdated(int keyModifiers, int oldIndex, int newIndex)
@@ -287,6 +292,12 @@ FocusScope {
}
}
+ Util.ViewDragAutoScrollHandler {
+ id: dragAutoScrollHandler
+
+ view: view
+ }
+
// NOTE: We always want a valid 'currentIndex' by default.
onCountChanged: if (count && currentIndex === -1) currentIndex = 0
@@ -399,7 +410,8 @@ FocusScope {
readonly property bool requestShow: !view.firstVisibleItem ||
(!view.firstVisibleItem.activeFocus &&
// TODO: Qt >5.12 use HoverHandler within the fade:
- !Helpers.get(view.firstVisibleItem, "hovered", false))
+ !Helpers.get(view.firstVisibleItem, "hovered", false)) &&
+ (dragAutoScrollHandler.scrollingDirection !== Util.ViewDragAutoScrollHandler.Backward)
state: (!!listview_id.fadeColor &&
view._fadeRectEnoughSize &&
@@ -473,7 +485,8 @@ FocusScope {
readonly property bool requestShow: !view.lastVisibleItem ||
(!view.lastVisibleItem.activeFocus &&
// TODO: Qt >5.12 use HoverHandler within the fade:
- !Helpers.get(view.lastVisibleItem, "hovered", false))
+ !Helpers.get(view.lastVisibleItem, "hovered", false)) &&
+ (dragAutoScrollHandler.scrollingDirection !== Util.ViewDragAutoScrollHandler.Forward)
state: (!!listview_id.fadeColor &&
view._fadeRectEnoughSize &&
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/09d668bf47e14470affd8fbc331a11ae797a5088...88c1e5301673dd0c63f74f727408ed22eebb25e4
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/09d668bf47e14470affd8fbc331a11ae797a5088...88c1e5301673dd0c63f74f727408ed22eebb25e4
You're receiving this email because of your account on code.videolan.org.
More information about the vlc-commits
mailing list