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):
self.app = app
self.dropped = []
self.window = MainWindow(app)
self.settings = self.window.settings
self.track_control = self.window.track_control

View file

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

View file

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

View file

@ -3,6 +3,8 @@
from PyQt6.QtCore import pyqtSignal
from PyQt6.QtGui import QDropEvent, QIcon
from PyQt6.QtWidgets import QTreeWidget, QAbstractItemView
from matplotlib.dates import TUESDAY
from .track import TrackItem
@ -18,6 +20,7 @@ class PlaylistView(QTreeWidget):
playlist.view = self
self.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove)
#self.setAcceptDrops(True)
self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
self.setColumnCount(4)
@ -58,13 +61,39 @@ class PlaylistView(QTreeWidget):
self.app.player.cache_next_track()
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)
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()

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)