Enabled drag and drop between PlaylistViews.

This commit is contained in:
The Wobbler 2025-01-25 22:41:29 +01:00
parent 31e72c25d3
commit 744d050bac
5 changed files with 66 additions and 6 deletions

View file

@ -9,6 +9,8 @@ class GUI:
def __init__(self, app): def __init__(self, app):
self.app = app self.app = app
self.dropped = []
self.window = MainWindow(app) self.window = MainWindow(app)
self.settings = self.window.settings self.settings = self.window.settings
self.track_control = self.window.track_control self.track_control = self.window.track_control

View file

@ -1,8 +1,8 @@
#!/usr/bin/python3 #!/usr/bin/python3
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QIcon from PyQt6.QtGui import QIcon
from PyQt6.QtWidgets import QToolBox, QLabel, QTabWidget, QToolButton from PyQt6.QtWidgets import QToolBox, QLabel, QTabWidget, QToolButton
from .playlist_tabs import PlaylistTabs
class Library(QToolBox): class Library(QToolBox):
@ -11,8 +11,7 @@ class Library(QToolBox):
self.library = library self.library = library
self.playlist_tabs = QTabWidget() self.playlist_tabs = PlaylistTabs()
self.playlist_tabs.setMovable(True)
self.addItem(self.playlist_tabs, "Playlists") self.addItem(self.playlist_tabs, "Playlists")

View file

@ -17,6 +17,8 @@ class LibraryDock(QDockWidget):
Qt.DockWidgetArea.BottomDockWidgetArea Qt.DockWidgetArea.BottomDockWidgetArea
) )
self.setAcceptDrops(True)
self.library_widget = Library(library, self) self.library_widget = Library(library, self)
self.setWidget(self.library_widget) self.setWidget(self.library_widget)

View file

@ -3,6 +3,8 @@
from PyQt6.QtCore import pyqtSignal from PyQt6.QtCore import pyqtSignal
from PyQt6.QtGui import QDropEvent, QIcon from PyQt6.QtGui import QDropEvent, QIcon
from PyQt6.QtWidgets import QTreeWidget, QAbstractItemView from PyQt6.QtWidgets import QTreeWidget, QAbstractItemView
from matplotlib.dates import TUESDAY
from .track import TrackItem from .track import TrackItem
@ -18,6 +20,7 @@ class PlaylistView(QTreeWidget):
playlist.view = self playlist.view = self
self.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove) self.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove)
#self.setAcceptDrops(True)
self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
self.setColumnCount(4) self.setColumnCount(4)
@ -58,13 +61,39 @@ class PlaylistView(QTreeWidget):
self.app.player.cache_next_track() self.app.player.cache_next_track()
def dropEvent(self, event: QDropEvent): def dropEvent(self, event: QDropEvent):
items = self.selectedItems() # dragged items are always selected items # receive items that were dropped and create new items from its tracks (new items bc. widgets can only have
# one parent)
if event.source() == self:
items = self.selectedItems() # dragged items are always selected items
self.itemDropped.emit(self, items) self.itemDropped.emit(self, items)
self.on_user_sort()
else:
items = self.app.gui.dropped
i = 0
for item in items:
track = item.track
track_item = TrackItem(track, i, self)
i += 1
super().dropEvent(event) super().dropEvent(event)
self.on_user_sort() event.accept()
def dragEnterEvent(self, event):
# store dragged items in gui.dropped, so the other playlist can receive it
if event.source() == self:
items = self.selectedItems()
self.app.gui.dropped = items
super().dragEnterEvent(event)
event.accept() event.accept()

View file

@ -0,0 +1,28 @@
#!/usr/bin/python3
from PyQt6.QtGui import QDragEnterEvent
from PyQt6.QtWidgets import QTabWidget, QTabBar
class PlaylistTabs(QTabWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setTabBar(PlaylistTabBar(self))
self.setMovable(True)
self.setAcceptDrops(True)
class PlaylistTabBar(QTabBar):
def __init__(self, parent=None):
super().__init__(parent)
self.tab_widget = parent
self.setAcceptDrops(True)
def dragEnterEvent(self, event: QDragEnterEvent):
tab = self.tabAt(event.position().toPoint())
self.tab_widget.setCurrentIndex(tab)