diff --git a/textual1/app.py b/textual1/app.py index d177024..4abaed2 100644 --- a/textual1/app.py +++ b/textual1/app.py @@ -349,22 +349,61 @@ class CoverArtPixels(Container): class QueueTable(Widget): - def render(self) -> RenderResult: - table = Table() - table.add_column("Title") - table.add_column("Album") - table.add_column("Artist") - table.add_column("Plays") - table.add_column("Duration") - table.add_column("Bitrate") + BINDINGS = [ + ("p", "play_queue_song()", "Play") + ] - queue: list[SubSonic.Song] = app.user_queue + song_ids: list[str] = [] + selected_row_key: int = 0 + + def compose(self) -> ComposeResult: + yield DataTable(id="songsqueue", cursor_type='row') + + def on_mount(self) -> None: + table = self.query_one(DataTable) + table.add_columns("Title", "Album", "Artist", "Plays", "Duration") + self.update_queue() + + def update_queue(self) -> None: + table = self.query_one(DataTable) + table.clear() + queue: list[SubSonic.Song] = app.user_queue.copy() queue.extend(app.song_queue) - for song in queue: - table.add_row(song.title, song.album, song.artist, str(song.playCount), str(song.duration), str(song.bitRate)) + self.song_ids = [] + for i, song in enumerate(queue): + table.add_row(song.title, song.album, song.artist, str(song.playCount), str(song.duration), key=str(i)) + self.song_ids.append(song.id) + + @on(DataTable.RowHighlighted) + def set_selected_row_key(self, e: DataTable.RowHighlighted) -> None: + if e.row_key.value: + self.selected_row_key = int(e.row_key.value) + + def action_play_queue_song(self) -> None: + # Reconstruct the queue to get the selected song object + queue: list[SubSonic.Song] = app.user_queue.copy() + queue.extend(app.song_queue) + + if self.selected_row_key >= len(queue): + return # Avoid index out of bounds + + song_to_play = queue[self.selected_row_key] + + # The new queue is everything after the selected song + new_queue = queue[self.selected_row_key + 1:] + + # Play the song + app.play_song(song_to_play) + + # The user queue is cleared, and the song queue is the rest of the songs + app.user_queue = [] + app.song_queue = new_queue + + # Update the visual queue table + self.update_queue() + - return table # Fine to be a static renderable because it's not big enough to need a scroll class NowPlayingInfo(Container): @@ -425,32 +464,19 @@ class MainView(Screen): yield ProgressBar() with Vertical(classes="column"): yield Label("Queue") - yield DataTable(id="queue", cursor_type='row') + yield QueueTable(id="queue") yield Footer() def on_mount(self) -> None: app.sub_title = "Overview" - queueTable: DataTable = self.query_one(DataTable) - queueTable.add_columns("Title", "Album", "Artist", "Plays", "Duration", "Bitrate") @on(events.ScreenResume) def screen_resumed(self, event: events.ScreenResume) -> None: app.sub_title = "Overview" - self.update_queue() + queue_table = self.query_one(QueueTable) + queue_table.update_queue() app.update_now_playing() - def update_queue(self) -> None: - table = self.query_one(DataTable) - table.clear() - - queue: list[SubSonic.Song] = [] - queue.extend(app.user_queue) - queue.extend(app.song_queue) - - for song in queue: - table.add_row(song.title, song.album, song.artist, song.playCount, song.duration, song.bitRate) - - class TextualSubpyPlayer(App): BINDINGS = [ ("r", "rewind()", "⏪"), @@ -600,7 +626,9 @@ class TextualSubpyPlayer(App): def update_queue_table(self) -> None: if isinstance(self.screen, MainView): logging.debug("Updating queue through app") - self.screen.update_queue() + queue_table = self.screen.query_one(QueueTable) + + queue_table.update_queue() def update_user_queue(self, song: SubSonic.Song) -> None: self.user_queue.append(song)