diff --git a/wobuzz/gui.py b/wobuzz/gui.py index 300f3e1..107d85f 100644 --- a/wobuzz/gui.py +++ b/wobuzz/gui.py @@ -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 diff --git a/wobuzz/ui/library.py b/wobuzz/ui/library.py index 5bce076..0a3e7f7 100644 --- a/wobuzz/ui/library.py +++ b/wobuzz/ui/library.py @@ -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") diff --git a/wobuzz/ui/library_dock.py b/wobuzz/ui/library_dock.py index 404667b..825d6d3 100644 --- a/wobuzz/ui/library_dock.py +++ b/wobuzz/ui/library_dock.py @@ -17,6 +17,8 @@ class LibraryDock(QDockWidget): Qt.DockWidgetArea.BottomDockWidgetArea ) + self.setAcceptDrops(True) + self.library_widget = Library(library, self) self.setWidget(self.library_widget) diff --git a/wobuzz/ui/playlist.py b/wobuzz/ui/playlist.py index fc4122c..4f63809 100644 --- a/wobuzz/ui/playlist.py +++ b/wobuzz/ui/playlist.py @@ -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() diff --git a/wobuzz/ui/playlist_tabs.py b/wobuzz/ui/playlist_tabs.py new file mode 100644 index 0000000..b657f74 --- /dev/null +++ b/wobuzz/ui/playlist_tabs.py @@ -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) +