#!/usr/bin/python3 from PyQt6.QtCore import pyqtSignal from PyQt6.QtGui import QDropEvent, QIcon from PyQt6.QtWidgets import QTreeWidget, QAbstractItemView from .track import TrackItem class PlaylistView(QTreeWidget): itemDropped = pyqtSignal(QTreeWidget, list) def __init__(self, playlist, parent=None): super().__init__(parent) self.playlist = playlist self.app = playlist.app playlist.view = self self.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove) #self.setAcceptDrops(True) self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) self.setColumnCount(4) self.play_icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart) headers = [ "", "#", "Title", "Artist", "Album", "# Custom Sorting" ] self.setHeaderLabels(headers) self.load_tracks() self.itemActivated.connect(self.on_track_activation) def on_user_sort(self): num_tracks = self.topLevelItemCount() i = 0 while i < num_tracks: track_item = self.topLevelItem(i) track = track_item.track track_item.index_user_sort = i track_item.setText(5, str(i + 1)) self.playlist.tracks[i] = track i += 1 self.app.player.cache_next_track() def dropEvent(self, event: QDropEvent): # 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) else: items = self.app.gui.dropped i = 0 for item in items: track = item.track self.playlist.tracks.append(track) track_item = TrackItem(track, i, self) i += 1 super().dropEvent(event) event.accept() self.on_user_sort() 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() def load_tracks(self): i = 0 for track in self.playlist.tracks: track_item = TrackItem(track, i, self) i += 1 if not self.topLevelItemCount() == 0: self.topLevelItem(0).setIcon(0, self.play_icon) def on_track_activation(self, item, column): if not self.app.player.current_playlist == self.playlist: self.app.player.current_playlist = self.playlist 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)