From 028c38b1b6b23d799e653b1c6319587e8eeaf00b Mon Sep 17 00:00:00 2001 From: EKNr1 Date: Sat, 25 Jan 2025 17:21:43 +0100 Subject: [PATCH] OOPed the way playlist views are created. --- wobuzz/command_line.py | 2 +- wobuzz/gui.py | 2 +- wobuzz/library/library.py | 63 ++------------------------------------- wobuzz/player/playlist.py | 5 ++-- wobuzz/player/track.py | 5 +++- wobuzz/ui/playlist.py | 28 ++++++++++++++++- wobuzz/ui/track.py | 23 ++++++++++++++ 7 files changed, 61 insertions(+), 67 deletions(-) create mode 100644 wobuzz/ui/track.py diff --git a/wobuzz/command_line.py b/wobuzz/command_line.py index cd6db53..f9d42cb 100644 --- a/wobuzz/command_line.py +++ b/wobuzz/command_line.py @@ -24,7 +24,7 @@ def main(): app.library.temporary_playlist.load_from_paths(arguments.track) app.player.current_playlist = app.library.temporary_playlist - app.library.create_playlist_views() + app.library.load_playlist_views() sys.exit(app.qt_app.exec()) diff --git a/wobuzz/gui.py b/wobuzz/gui.py index e787724..6595057 100644 --- a/wobuzz/gui.py +++ b/wobuzz/gui.py @@ -40,5 +40,5 @@ class GUI: def on_track_change(self, previous_track, track): self.track_control.on_track_change(previous_track, track) - self.app.library.on_track_change(previous_track, track) + self.app.player.current_playlist.view.on_track_change(previous_track, track) diff --git a/wobuzz/library/library.py b/wobuzz/library/library.py index 26ab0f5..ade85c6 100644 --- a/wobuzz/library/library.py +++ b/wobuzz/library/library.py @@ -22,72 +22,13 @@ class Library: self.temporary_playlist = Playlist(self.app, "Temporary Playlist") self.playlists = [self.temporary_playlist] - self.play_icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart) - - def create_playlist_views(self): + def load_playlist_views(self): for library_dock in self.library_docks: playlist_tabs: QTabWidget = library_dock.library.playlist_tabs playlist_tabs.playlists = {} for playlist in self.playlists: - playlist_view = self.create_playlist_view(playlist) - playlist_tabs.playlists[playlist.title] = playlist_view + playlist_view = PlaylistView(playlist) playlist_tabs.addTab(playlist_view, playlist.title) - def create_playlist_view(self, playlist: Playlist): - view = PlaylistView(playlist) - - view.itemActivated.connect(self.on_track_activation) - - num_tracks = len(playlist.tracks) - - i = 0 - - while i < num_tracks: - track = playlist.tracks[i] - - track_item = QTreeWidgetItem(view) - - track_item.setFlags( - Qt.ItemFlag.ItemIsEnabled | - Qt.ItemFlag.ItemIsSelectable | - Qt.ItemFlag.ItemIsDragEnabled - ) - - track_item.track = track - track_item.setText(2, track.tags.title) - track_item.setText(3, track.tags.artist) - track_item.setText(4, track.tags.album) - track_item.setText(5, str(i + 1)) - - i += 1 - - return view - - def on_track_activation(self, item, column): - index = item.treeWidget().indexOfTopLevelItem(item) - self.app.player.play_track_in_playlist(index) - - def get_track_tree_item(self, track, playlist_view: PlaylistView): - index = self.app.player.current_playlist.tracks.index(track) - item = playlist_view.topLevelItem(index) - - return item - - def get_playing_playlist_view(self): - view = self.main_library_dock.library.playlist_tabs.playlists[self.app.player.current_playlist.title] - - return view - - def on_track_change(self, previous_track, track): - playing_playlist_view = self.get_playing_playlist_view() - - if previous_track: - item = self.get_track_tree_item(previous_track, playing_playlist_view) - item.setIcon(0, QIcon(None)) - - if track: - item = self.get_track_tree_item(track, playing_playlist_view) - item.setIcon(0, self.play_icon) - diff --git a/wobuzz/player/playlist.py b/wobuzz/player/playlist.py index 2c1a9d2..182487b 100644 --- a/wobuzz/player/playlist.py +++ b/wobuzz/player/playlist.py @@ -13,6 +13,7 @@ class Playlist: self.tracks: list[Track] = [] self.current_track_index = 0 self.current_track: Track | None = None + self.view = None def load_from_paths(self, paths): i = 0 @@ -21,7 +22,7 @@ class Playlist: path = paths[i] if os.path.isfile(path): - self.tracks.append(Track(self.app, path, cache=i==0)) # first track is cached + self.tracks.append(Track(self.app, i, path, cache=i==0)) # first track is cached i += 1 @@ -47,7 +48,7 @@ class Playlist: continue - self.tracks.append(Track(self.app, line, cache=i==0)) # first track is cached + self.tracks.append(Track(self.app, i, line, cache=i==0)) # first track is cached i += 1 diff --git a/wobuzz/player/track.py b/wobuzz/player/track.py index 04ee851..e1a9994 100644 --- a/wobuzz/player/track.py +++ b/wobuzz/player/track.py @@ -18,8 +18,9 @@ class Track: Class containing data for a track like file path, raw data... """ - def __init__(self, app, path: str, property_string: str=None, cache: bool=False): + def __init__(self, app, index: int, path: str, property_string: str=None, cache: bool=False): self.app = app + self.index_custom_sort = index self.path = path self.property_string = property_string @@ -30,6 +31,8 @@ class Track: self.sound = None self.duration = 0 + self.item = None + if cache: self.cache() diff --git a/wobuzz/ui/playlist.py b/wobuzz/ui/playlist.py index c235cf0..be7e113 100644 --- a/wobuzz/ui/playlist.py +++ b/wobuzz/ui/playlist.py @@ -1,8 +1,9 @@ #!/usr/bin/python3 from PyQt6.QtCore import pyqtSignal -from PyQt6.QtGui import QDropEvent +from PyQt6.QtGui import QDropEvent, QIcon from PyQt6.QtWidgets import QTreeWidget, QAbstractItemView +from .track import TrackItem class PlaylistView(QTreeWidget): @@ -12,12 +13,17 @@ class PlaylistView(QTreeWidget): super().__init__(parent) self.playlist = playlist + self.app = playlist.app + + playlist.view = self self.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove) self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) self.setColumnCount(4) + self.play_icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart) + headers = [ "", "#", @@ -29,6 +35,10 @@ class PlaylistView(QTreeWidget): self.setHeaderLabels(headers) + self.load_tracks() + + self.itemActivated.connect(self.on_track_activation) + def update_track_numbers(self): pass @@ -41,3 +51,19 @@ class PlaylistView(QTreeWidget): event.accept() + def load_tracks(self): + for track in self.playlist.tracks: + track_item = TrackItem(track, self) + + def on_track_activation(self, item, column): + index = self.indexOfTopLevelItem(item) + self.app.player.play_track_in_playlist(index) + + def on_track_change(self, previous_track, track): + # unmark the previous track and mark the current track as playing + if previous_track: + previous_track.item.setIcon(0, QIcon(None)) + + if track: + track.item.setIcon(0, self.play_icon) + diff --git a/wobuzz/ui/track.py b/wobuzz/ui/track.py new file mode 100644 index 0000000..2471efa --- /dev/null +++ b/wobuzz/ui/track.py @@ -0,0 +1,23 @@ +#!/usr/bin/python3 + +from PyQt6.QtCore import Qt +from PyQt6.QtWidgets import QTreeWidgetItem + + +class TrackItem(QTreeWidgetItem): + def __init__(self, track, parent=None): + super().__init__(parent) + + self.track = track + track.item = self + + self.setFlags( + Qt.ItemFlag.ItemIsEnabled | + Qt.ItemFlag.ItemIsSelectable | + Qt.ItemFlag.ItemIsDragEnabled + ) + + self.setText(2, track.tags.title) + self.setText(3, track.tags.artist) + self.setText(4, track.tags.album) + self.setText(5, str(track.index_custom_sort)) \ No newline at end of file