vlc | branch: master | Fatih Uzunoglu <[email protected]> | Fri Jan 8 00:36:50 2021 +0300| [b0265018dc1f13634bc7a6807476ec92dfbaab6b] | committer: Pierre Lamot
qml: tightly couple PlaylistDelegate with PlaylistListView this allows us to fully eliminate property forwarding and explicit signal handling. it should not be a problem since the playlist delegate is expected to be used only within playlist view. Signed-off-by: Pierre Lamot <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b0265018dc1f13634bc7a6807476ec92dfbaab6b --- modules/gui/qt/playlist/qml/PlaylistDelegate.qml | 139 ++++++++++++----------- modules/gui/qt/playlist/qml/PlaylistListView.qml | 80 +------------ 2 files changed, 78 insertions(+), 141 deletions(-) diff --git a/modules/gui/qt/playlist/qml/PlaylistDelegate.qml b/modules/gui/qt/playlist/qml/PlaylistDelegate.qml index 5c8e35ab83..4762465992 100644 --- a/modules/gui/qt/playlist/qml/PlaylistDelegate.qml +++ b/modules/gui/qt/playlist/qml/PlaylistDelegate.qml @@ -30,44 +30,13 @@ import "qrc:///style/" Rectangle { id: delegate - // starts with an underscore to prevent the implicit delegate 'model' property - property var _model + readonly property int selectionLength: root.model.selectedCount - signal itemClicked(int button, int modifier, var globalMousePos) - signal itemDoubleClicked(int keys, int modifier, var globalMousePos) - signal dragStarting() + readonly property bool isLastItem: (index === listView.modelCount - 1) + readonly property bool selected : model.selected property alias hovered: mouse.containsMouse - property var dragitem: null - signal dropedMovedAt(int target, var drop) - - property int leftPadding: 0 - property int rightPadding: 0 - - property VLCColors colors: VLCStyle.colors - - // Should the cover be displayed - //property alias showCover: cover.visible - - // This item will become the parent of the dragged item during the drag operation - //property alias draggedItemParent: draggable_item.draggedItemParent - - height: artworkItem.height * 1.5 - - function showTooltip(binding) { - plInfoTooltip.close() - plInfoTooltip.text = Qt.binding(function() { return (textInfo.text + '\n' + textArtist.text); }) - plInfoTooltip.parent = textInfoColumn - if (_model.getSelection().length > 1 && binding) - plInfoTooltip.timeout = 2000 - else - plInfoTooltip.timeout = 0 - plInfoTooltip.visible = Qt.binding(function() { return ( (binding ? model.selected : delegate.hovered) && !overlayMenu.visible && - (textInfo.implicitWidth > textInfo.width || textArtist.implicitWidth > textArtist.width)); }) - - } - color: { if (selected) colors.plItemSelected @@ -78,22 +47,31 @@ Rectangle { else return "transparent" } - function isDropAcceptable(drop, index) { - console.assert(false, "parent should reimplement this function") - } + + height: artworkItem.height * 1.5 onHoveredChanged: { if(hovered) showTooltip(false) } - readonly property bool selected : model.selected - onSelectedChanged: { if(selected) showTooltip(true) } + function showTooltip(selectAction) { + plInfoTooltip.close() + plInfoTooltip.text = Qt.binding(function() { return (textInfo.text + '\n' + textArtist.text); }) + plInfoTooltip.parent = textInfoColumn + if (selectionLength > 1 && selectAction) + plInfoTooltip.timeout = 2000 + else + plInfoTooltip.timeout = 0 + plInfoTooltip.visible = Qt.binding(function() { return ( (selectAction ? selected : hovered) && !overlayMenu.visible && mainInterface.playlistVisible && + (textInfo.implicitWidth > textInfo.width || textArtist.implicitWidth > textArtist.width)); }) + } + Connections { target: listView @@ -118,32 +96,72 @@ Rectangle { MouseArea { id: mouse - anchors.fill: parent + + width: parent.width + implicitHeight: childrenRect.height + hoverEnabled: true acceptedButtons: acceptedButtons | Qt.RightButton - onClicked:{ - delegate.itemClicked(mouse.button, mouse.modifiers, this.mapToGlobal(mouse.x, mouse.y)); + onContainsMouseChanged: { + if (containsMouse) { + var bottomItemIndex = listView.listView.indexAt(delegate.width / 2, (listView.listView.contentY + listView.height) - 2) + var topItemIndex = listView.listView.indexAt(delegate.width / 2, listView.listView.contentY + 2) + + if(bottomItemIndex !== -1 && model.index >= bottomItemIndex - 1) + { + listView.fadeRectBottomHovered = Qt.binding(function() {return delegate.hovered}) + } + if(topItemIndex !== -1 && model.index <= topItemIndex + 1) + { + listView.fadeRectTopHovered = Qt.binding(function() {return delegate.hovered}) + } + } } + + onClicked: { + /* to receive keys events */ + listView.forceActiveFocus() + if (listView.mode === PlaylistListView.Mode.Move) { + var selectedIndexes = root.model.getSelection() + if (selectedIndexes.length === 0) + return + var preTarget = index + /* move to _above_ the clicked item if move up, but + * _below_ the clicked item if move down */ + if (preTarget > selectedIndexes[0]) + preTarget++ + listView.currentIndex = selectedIndexes[0] + root.model.moveItemsPre(selectedIndexes, preTarget) + return + } else if (listView.mode === PlaylistListView.Mode.Select) { + } else if (!(root.model.isSelected(index) && mouse.button === Qt.RightButton)) { + listView.updateSelection(mouse.modifiers, listView.currentIndex, index) + listView.currentIndex = index + } + + if (mouse.button === Qt.RightButton) + contextMenu.popup(index, this.mapToGlobal(mouse.x, mouse.y)) + } + onDoubleClicked: { - if (mouse.button !== Qt.RightButton) - delegate.itemDoubleClicked(mouse.buttons, mouse.modifiers, this.mapToGlobal(mouse.x, mouse.y)); + if (mouse.button !== Qt.RightButton && listView.mode === PlaylistListView.Mode.Normal) + mainPlaylistController.goTo(index, true) } drag.target: dragItem - property bool __rightButton : false - Connections { target: mouse.drag onActiveChanged: { - if (mouse.__rightButton) - return if (target.active) { - delegate.dragStarting() - dragItem.model = _model - dragItem.count = _model.getSelection().length + if (!root.model.isSelected(index)) { + /* the dragged item is not in the selection, replace the selection */ + root.model.setSelection([index]) + } + dragItem.model = root.model + dragItem.count = root.model.getSelection().length dragItem.visible = true } else { dragItem.Drag.drop() @@ -152,20 +170,9 @@ Rectangle { } } - onPressed: { - if (mouse.button === Qt.RightButton) - { - __rightButton = true - return - } - else - __rightButton = false - } - onPositionChanged: { - if (dragItem.visible) - { - var pos = this.mapToGlobal( mouseX, mouseY) + if (dragItem.visible) { + var pos = this.mapToGlobal(mouseX, mouseY) dragItem.updatePos(pos.x + VLCStyle.dp(15, VLCStyle.scale), pos.y) } } @@ -284,7 +291,7 @@ Rectangle { topDropIndicator.visible = false } onDropped: { - if (!isDropAcceptable(drop, model.index)) + if (!isDropAcceptable(drop, index)) return root.acceptDrop(index, drop) @@ -299,7 +306,7 @@ Rectangle { Layout.fillHeight: true function handleDropIndicators(visible) { - if ( index === _model.count - 1 ) + if (isLastItem) listView.footerItem.setDropIndicatorVisible(visible) else listView.setItemDropIndicatorVisible(index + 1, visible) diff --git a/modules/gui/qt/playlist/qml/PlaylistListView.qml b/modules/gui/qt/playlist/qml/PlaylistListView.qml index f7983b41d2..d51a947830 100644 --- a/modules/gui/qt/playlist/qml/PlaylistListView.qml +++ b/modules/gui/qt/playlist/qml/PlaylistListView.qml @@ -373,83 +373,13 @@ Widgets.NavigableFocusScope { delay: 750 } - delegate: Item { - implicitWidth: delegate.width - implicitHeight: childrenRect.height - - PlaylistDelegate { - /* - * implicit variables: - * - model: gives access to the values associated to PlaylistListModel roles - * - index: the index of this item in the list - */ - id: delegate - _model: root.model - width: root.width - z: 1 - leftPadding: root.leftPadding + VLCStyle.margin_normal - rightPadding: root.rightPadding + listView.scrollBarWidth - - onItemClicked : { - /* to receive keys events */ - listView.forceActiveFocus() - if (listView.mode === PlaylistListView.Mode.Move) { - var selectedIndexes = root.model.getSelection() - if (selectedIndexes.length === 0) - return - var preTarget = index - /* move to _above_ the clicked item if move up, but - * _below_ the clicked item if move down */ - if (preTarget > selectedIndexes[0]) - preTarget++ - listView.currentIndex = selectedIndexes[0] - root.model.moveItemsPre(selectedIndexes, preTarget) - return - } else if (listView.mode === PlaylistListView.Mode.Select) { - } else if (!(root.model.isSelected(index) && button === Qt.RightButton)) { - listView.updateSelection(modifier, listView.currentIndex, index) - listView.currentIndex = index - } - - if (button === Qt.RightButton) - contextMenu.popup(index, globalMousePos) - } - onItemDoubleClicked: { - if (listView.mode === PlaylistListView.Mode.Normal) - mainPlaylistController.goTo(index, true) - } + delegate: PlaylistDelegate { + id: delegate - colors: root.colors + // Instead of property forwarding, PlaylistDelegate is tightly coupled with PlaylistlistView + // since PlaylistDelegate is expected to be used only within PlaylistlistView - onDragStarting: { - if (!root.model.isSelected(index)) { - /* the dragged item is not in the selection, replace the selection */ - root.model.setSelection([index]) - } - } - - function isDropAcceptable(drop, index) { - return root.isDropAcceptable(drop, index) - } - - onDropedMovedAt: { - root.acceptDrop(target, drop) - } - - onHoveredChanged: { - var bottomItemIndex = listView.listView.indexAt(delegate.width / 2, (listView.listView.contentY + listView.height) - 2) - var topItemIndex = listView.listView.indexAt(delegate.width / 2, listView.listView.contentY + 2) - - if(bottomItemIndex !== -1 && model.index >= bottomItemIndex - 1) - { - listView.fadeRectBottomHovered = delegate.hovered - } - if(topItemIndex !== -1 && model.index <= topItemIndex + 1) - { - listView.fadeRectTopHovered = delegate.hovered - } - } - } + width: parent.width } add: Transition { _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
