Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • Thrillseekr/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
400 results
Show changes
Commits on Source (8)
......@@ -103,6 +103,17 @@ MainTableView {
sortModel: (availableRowWidth < VLCStyle.colWidth(4)) ? _modelSmall
: _modelMedium
listView.acceptDropFunc: function(index, drop) {
// FIXME: The DnD API seems quite poorly designed in this file.
// Why does it ask for both index and "before"
// When index + 1 is essentially the same as
// before being false?
// What is "delegate" and why is it passed in applyDrop()?
// We have to come up with a shim function here...
return applyDrop(drop, index - 1, null, false)
}
//---------------------------------------------------------------------------------------------
// Events
//---------------------------------------------------------------------------------------------
......@@ -151,7 +162,7 @@ MainTableView {
//---------------------------------------------------------------------------------------------
// Drop interface
function isDroppable(drop, index) {
listView.isDropAcceptableFunc: function(drop, index) {
if (drop.source === dragItem) {
return Helpers.itemsMovable(selectionModel.sortedSelectedIndexesFlat, index)
} else if (Helpers.isValidInstanceOf(drop.source, Widgets.DragItem)) {
......@@ -164,9 +175,9 @@ MainTableView {
}
function applyDrop(drop, index, delegate, before) {
if (root.isDroppable(drop, index + (before ? 0 : 1)) === false) {
if (listView.isDropAcceptableFunc(drop, index + (before ? 0 : 1)) === false) {
root.hideLine(delegate)
return
return Promise.resolve()
}
const item = drop.source;
......@@ -176,27 +187,31 @@ MainTableView {
// NOTE: Move implementation.
if (dragItem === item) {
model.move(selectionModel.selectedRows(), destinationIndex)
root.forceActiveFocus()
root.hideLine(delegate)
// NOTE: Dropping medialibrary content into the playlist.
} else if (Helpers.isValidInstanceOf(item, Widgets.DragItem)) {
item.getSelectedInputItem()
.then(inputItems => {
model.insert(inputItems, destinationIndex)
})
return item.getSelectedInputItem()
.then(inputItems => {
model.insert(inputItems, destinationIndex)
})
.then(() => { root.forceActiveFocus(); root.hideLine(delegate); })
} else if (drop.hasUrls) {
const urlList = []
for (let url in drop.urls)
urlList.push(drop.urls[url])
model.insert(urlList, destinationIndex)
}
root.forceActiveFocus()
root.forceActiveFocus()
root.hideLine(delegate)
}
root.hideLine(delegate)
return Promise.resolve()
}
function _dropUpdatePosition(drag, index, delegate, before) {
if (root.isDroppable(drag, index + (before ? 0 : 1)) === false) {
if (listView.isDropAcceptableFunc(drag, index + (before ? 0 : 1)) === false) {
root.hideLine(delegate)
return
}
......
......@@ -67,50 +67,6 @@ T.Pane {
enabled: root.enabled
}
function isDropAcceptable(drop, index) {
if (drop.source === dragItem)
return Helpers.itemsMovable(selectionModel.sortedSelectedIndexesFlat, index)
else if (Helpers.isValidInstanceOf(drop.source, Widgets.DragItem))
return true
else if (drop.hasUrls)
return true
else
return false
}
function acceptDrop(index, drop) {
const item = drop.source;
// NOTE: Move implementation.
if (dragItem === item) {
model.moveItemsPre(root.selectionModel.sortedSelectedIndexesFlat, index);
listView.forceActiveFocus();
// NOTE: Dropping medialibrary content into the queue.
} else if (Helpers.isValidInstanceOf(item, Widgets.DragItem)) {
return item.getSelectedInputItem().then((inputItems) => {
if (!Helpers.isArray(inputItems) || inputItems.length === 0) {
console.warn("can't convert items to input items");
return
}
MainPlaylistController.insert(index, inputItems, false)
}).then(() => { listView.forceActiveFocus(); })
// NOTE: Dropping an external item (i.e. filesystem) into the queue.
} else if (drop.hasUrls) {
const urlList = [];
for (let url in drop.urls)
urlList.push(drop.urls[url]);
MainPlaylistController.insert(index, urlList, false);
// NOTE This is required otherwise backend may handle the drop as well yielding double addition.
drop.accept(Qt.IgnoreAction);
listView.forceActiveFocus();
}
return Promise.resolve()
}
Widgets.DragItem {
id: dragItem
......@@ -254,23 +210,54 @@ T.Pane {
model: root.model
Binding on fadingEdge.enableBeginningFade {
when: (autoScroller.scrollingDirection === ViewDragAutoScrollHandler.Direction.Backward)
value: false
}
fadingEdge.backgroundColor: (root.background && (root.background.color.a >= 1.0)) ? root.background.color
: "transparent"
Binding on fadingEdge.enableEndFade {
when: (autoScroller.scrollingDirection === ViewDragAutoScrollHandler.Direction.Forward)
value: false
isDropAcceptableFunc: function(drop, index) {
if (drop.source === dragItem)
return Helpers.itemsMovable(selectionModel.sortedSelectedIndexesFlat, index)
else if (Helpers.isValidInstanceOf(drop.source, Widgets.DragItem))
return true
else if (drop.hasUrls)
return true
else
return false
}
fadingEdge.backgroundColor: (root.background && (root.background.color.a >= 1.0)) ? root.background.color
: "transparent"
acceptDropFunc: function(index, drop) {
const item = drop.source;
// NOTE: Move implementation.
if (dragItem === item) {
model.moveItemsPre(root.selectionModel.sortedSelectedIndexesFlat, index);
listView.forceActiveFocus();
// NOTE: Dropping medialibrary content into the queue.
} else if (Helpers.isValidInstanceOf(item, Widgets.DragItem)) {
return item.getSelectedInputItem().then((inputItems) => {
if (!Helpers.isArray(inputItems) || inputItems.length === 0) {
console.warn("can't convert items to input items");
return
}
MainPlaylistController.insert(index, inputItems, false)
}).then(() => { listView.forceActiveFocus(); })
// NOTE: Dropping an external item (i.e. filesystem) into the queue.
} else if (drop.hasUrls) {
const urlList = [];
for (let url in drop.urls)
urlList.push(drop.urls[url]);
MainPlaylistController.insert(index, urlList, false);
// NOTE This is required otherwise backend may handle the drop as well yielding double addition.
drop.accept(Qt.IgnoreAction);
listView.forceActiveFocus();
}
contentWidth: width
return Promise.resolve()
}
property int shiftIndex: -1
property Item itemContainsDrag: null
onShowContextMenu: (globalPos) => {
contextMenu.popup(-1, globalPos)
......@@ -290,127 +277,6 @@ T.Pane {
}
}
ViewDragAutoScrollHandler {
id: autoScroller
view: listView
dragging: !!listView.itemContainsDrag && listView.itemContainsDrag !== listView.footerItem
dragPosProvider: function () {
const source = listView.itemContainsDrag
const point = source.drag
return listView.mapFromItem(source, point.x, point.y)
}
}
footer: Item {
implicitWidth: parent.width
Binding on implicitHeight {
delayed: true
value: Math.max(VLCStyle.icon_normal, listView.height - y)
}
property alias firstItemIndicatorVisible: firstItemIndicator.visible
readonly property bool containsDrag: dropArea.containsDrag
readonly property point drag: Qt.point(dropArea.drag.x, dropArea.drag.y)
onContainsDragChanged: {
if (root.model.count > 0) {
listView.updateItemContainsDrag(this, containsDrag)
} else if (!containsDrag && listView.itemContainsDrag === this) {
// In case model count is changed somehow while
// containsDrag is set
listView.updateItemContainsDrag(this, false)
}
}
Rectangle {
id: firstItemIndicator
anchors.fill: parent
anchors.margins: VLCStyle.margin_small
border.width: VLCStyle.dp(2)
border.color: theme.accent
color: "transparent"
visible: (root.model.count === 0 && (dropArea.containsDrag || dropArea.dropOperationOngoing))
opacity: 0.8
Widgets.IconLabel {
anchors.centerIn: parent
text: VLCIcons.add
font.pixelSize: VLCStyle.fontHeight_xxxlarge
color: theme.accent
}
}
DropArea {
id: dropArea
anchors.fill: parent
property bool dropOperationOngoing: false
onEntered: (drag) => {
if(!root.isDropAcceptable(drag, root.model.count)) {
drag.accepted = false
return
}
}
onDropped: (drop) => {
dropOperationOngoing = true
root.acceptDrop(root.model.count, drop)
.then(() => { dropOperationOngoing = false })
}
}
}
Rectangle {
id: dropIndicator
parent: listView.itemContainsDrag
z: 99
anchors {
left: !!parent ? parent.left : undefined
right: !!parent ? parent.right : undefined
top: !!parent ? (parent.bottomContainsDrag === true ? parent.bottom : parent.top)
: undefined
}
implicitHeight: VLCStyle.dp(1)
visible: !!parent
color: theme.accent
}
function updateItemContainsDrag(item, set) {
if (set) {
// This callLater is needed because in Qt 5.15,
// an item might set itemContainsDrag, before
// the owning item releases it.
Qt.callLater(function() {
if (itemContainsDrag)
console.debug(item + " set itemContainsDrag before it was released!")
itemContainsDrag = item
})
} else {
if (itemContainsDrag !== item)
console.debug(item + " released itemContainsDrag that is not owned!")
itemContainsDrag = null
}
}
delegate: PlaylistDelegate {
id: delegate
......@@ -421,30 +287,12 @@ T.Pane {
dragItem: root.dragItem
isDropAcceptable: root.isDropAcceptable
acceptDrop: root.acceptDrop
isDropAcceptable: listView.isDropAcceptableFunc
acceptDrop: listView.acceptDropFunc
onContainsDragChanged: listView.updateItemContainsDrag(this, containsDrag)
}
add: Transition {
OpacityAnimator {
from: 0.0
to: 1.0
duration: VLCStyle.duration_long
easing.type: Easing.OutSine
}
}
displaced: Transition {
NumberAnimation {
// TODO: Use YAnimator >= Qt 6.0 (QTBUG-66475)
property: "y"
duration: VLCStyle.duration_long
easing.type: Easing.OutSine
}
}
Keys.onDeletePressed: model.removeItems(selectionModel.selectedIndexesFlat)
Navigation.parentItem: root
......
......@@ -24,6 +24,7 @@ import Qt5Compat.GraphicalEffects
import VLC.MainInterface
import VLC.Style
import VLC.Util
import VLC.Widgets
ListView {
id: root
......@@ -37,6 +38,13 @@ ListView {
model: root.model
}
// Optional property for drop indicator placement and auto scroll feature:
property var itemContainsDrag: undefined
// Optional functions for the optional drag accessory footer:
property var isDropAcceptableFunc
property var acceptDropFunc
// Private
property bool _keyPressed: false
......@@ -48,6 +56,8 @@ ListView {
// if the effect is not wanted.
property alias fadingEdge: fadingEdge
property alias autoScrollDirection: viewDragAutoScrollHandlerLoader.scrollingDirection
//forward view properties
property alias buttonLeft: buttonLeft
......@@ -88,8 +98,117 @@ ListView {
section.criteria: ViewSection.FullString
section.delegate: sectionHeading
// Content width is set to the width by default
// If the delegate does not obey it, calculate
// the content width appropriately.
contentWidth: width
footer: !!root.acceptDropFunc ? footerDragAccessoryComponent : null
Component {
id: footerDragAccessoryComponent
Item {
id: footerItem
implicitWidth: root.contentWidth
Binding on implicitHeight {
delayed: true
value: Math.max(VLCStyle.icon_normal, root.height - y - (root.headerItem?.height ?? 0))
}
property alias firstItemIndicatorVisible: firstItemIndicator.visible
readonly property bool containsDrag: dropArea.containsDrag
readonly property bool topContainsDrag: containsDrag
readonly property bool bottomContainsDrag: false
onContainsDragChanged: {
if (root.model.count > 0) {
root.updateItemContainsDrag(this, containsDrag)
} else if (!containsDrag && root.itemContainsDrag === this) {
// In case model count is changed somehow while
// containsDrag is set
root.updateItemContainsDrag(this, false)
}
}
property alias drag: dropArea.drag
Rectangle {
id: firstItemIndicator
anchors.fill: parent
anchors.margins: VLCStyle.margin_small
border.width: VLCStyle.dp(2)
border.color: theme.accent
color: "transparent"
visible: (root.model.count === 0 && (dropArea.containsDrag || dropArea.dropOperationOngoing))
opacity: 0.8
IconLabel {
anchors.centerIn: parent
text: VLCIcons.add
font.pixelSize: VLCStyle.fontHeight_xxxlarge
color: theme.accent
}
}
DropArea {
id: dropArea
anchors.fill: parent
property bool dropOperationOngoing: false
onEntered: function(drag) {
if (!root.isDropAcceptableFunc || !root.isDropAcceptableFunc(drag, root.model.rowCount())
|| !root.acceptDropFunc) {
drag.accepted = false
return
}
drag.accepted = true
}
onDropped: function(drop) {
console.assert(!!root.acceptDropFunc)
dropOperationOngoing = true
root.acceptDropFunc(root.model.count, drop)
.then(() => { dropOperationOngoing = false })
}
}
}
}
Accessible.role: Accessible.List
add: Transition {
OpacityAnimator {
from: 0.0 // QTBUG-66475
to: 1.0
duration: VLCStyle.duration_long
easing.type: Easing.OutSine
}
}
displaced: Transition {
NumberAnimation {
// TODO: Use YAnimator >= Qt 6.0 (QTBUG-66475)
property: "y"
duration: VLCStyle.duration_long
easing.type: Easing.OutSine
}
}
// Events
// NOTE: We always want a valid 'currentIndex' by default.
......@@ -165,6 +284,23 @@ ListView {
selectionModel.updateSelection(modifiers, oldIndex, newIndex)
}
function updateItemContainsDrag(item, set) {
if (set) {
// This callLater is needed because in Qt 5.15,
// an item might set itemContainsDrag, before
// the owning item releases it.
Qt.callLater(function() {
if (itemContainsDrag)
console.debug(item + " set itemContainsDrag before it was released!")
itemContainsDrag = item
})
} else {
if (itemContainsDrag !== item)
console.debug(item + " released itemContainsDrag that is not owned!")
itemContainsDrag = null
}
}
Keys.onPressed: (event) => {
let newIndex = -1
......@@ -263,6 +399,34 @@ ListView {
listView: root
backgroundColor: theme.bg.primary
Binding on enableBeginningFade {
when: (root.autoScrollDirection === ViewDragAutoScrollHandler.Direction.Backward)
value: false
}
Binding on enableEndFade {
when: (root.autoScrollDirection === ViewDragAutoScrollHandler.Direction.Forward)
value: false
}
}
Loader {
id: viewDragAutoScrollHandlerLoader
active: root.itemContainsDrag !== undefined
readonly property int scrollingDirection: item ? item.scrollingDirection : -1
sourceComponent: ViewDragAutoScrollHandler {
view: root
dragging: root.itemContainsDrag !== null
dragPosProvider: function () {
const source = root.itemContainsDrag
const point = source.drag
return root.mapFromItem(source, point.x, point.y)
}
}
}
Component {
......@@ -330,6 +494,39 @@ ListView {
}
}
Rectangle {
id: dropIndicator
parent: {
const item = root.itemContainsDrag
if (!item || item.topContainsDrag === undefined || item.bottomContainsDrag === undefined)
return null
return item
}
z: 99
anchors {
left: !!parent ? parent.left : undefined
right: !!parent ? parent.right : undefined
top: {
if (parent === null)
return undefined
else if (parent.topContainsDrag === true)
return parent.top
else if (parent.bottomContainsDrag === true)
return parent.bottom
else
return undefined
}
}
implicitHeight: VLCStyle.dp(1)
visible: !!parent
color: theme.accent
}
// FIXME: We probably need to upgrade these RoundButton(s) eventually. And we probably need
// to have some kind of animation when switching pages.
......
......@@ -242,8 +242,6 @@ FocusScope {
anchors.fill: parent
contentWidth: root.width - root.contentLeftMargin - root.contentRightMargin
focus: true
headerPositioning: ListView.OverlayHeader
......@@ -449,6 +447,8 @@ FocusScope {
tableDelegate.forceActiveFocus(focusReason)
}
onContainsDragChanged: view.updateItemContainsDrag(this, containsDrag)
Connections {
target: selectionModel
......
......@@ -37,6 +37,8 @@ T.Control {
required property bool acceptDrop
readonly property bool dragActive: dragHandler.active
property alias containsDrag: dropArea.containsDrag
property alias drag: dropArea.drag
required property real fixedColumnWidth
required property real weightedColumnWidth
......@@ -281,6 +283,8 @@ T.Control {
}
DropArea {
id: dropArea
enabled: delegate.acceptDrop
anchors.fill: parent
......