redid the queue table + added better skipping in the queue

This commit is contained in:
JISAUAY committed 2025-09-08 14:07:22 -05:00
1 parent ce58103295
commit 9ac286bda4
1 file changed
+57 -29
+57 -29
View File
@@ -349,22 +349,61 @@ class CoverArtPixels(Container):
class QueueTable(Widget): class QueueTable(Widget):
def render(self) -> RenderResult: BINDINGS = [
table = Table() ("p", "play_queue_song()", "Play")
table.add_column("Title") ]
table.add_column("Album")
table.add_column("Artist")
table.add_column("Plays")
table.add_column("Duration")
table.add_column("Bitrate")
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) queue.extend(app.song_queue)
for song in queue: self.song_ids = []
table.add_row(song.title, song.album, song.artist, str(song.playCount), str(song.duration), str(song.bitRate)) 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 # Fine to be a static renderable because it's not big enough to need a scroll
class NowPlayingInfo(Container): class NowPlayingInfo(Container):
@@ -425,32 +464,19 @@ class MainView(Screen):
yield ProgressBar() yield ProgressBar()
with Vertical(classes="column"): with Vertical(classes="column"):
yield Label("Queue") yield Label("Queue")
yield DataTable(id="queue", cursor_type='row') yield QueueTable(id="queue")
yield Footer() yield Footer()
def on_mount(self) -> None: def on_mount(self) -> None:
app.sub_title = "Overview" app.sub_title = "Overview"
queueTable: DataTable = self.query_one(DataTable)
queueTable.add_columns("Title", "Album", "Artist", "Plays", "Duration", "Bitrate")
@on(events.ScreenResume) @on(events.ScreenResume)
def screen_resumed(self, event: events.ScreenResume) -> None: def screen_resumed(self, event: events.ScreenResume) -> None:
app.sub_title = "Overview" app.sub_title = "Overview"
self.update_queue() queue_table = self.query_one(QueueTable)
queue_table.update_queue()
app.update_now_playing() 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): class TextualSubpyPlayer(App):
BINDINGS = [ BINDINGS = [
("r", "rewind()", "⏪"), ("r", "rewind()", "⏪"),
@@ -600,7 +626,9 @@ class TextualSubpyPlayer(App):
def update_queue_table(self) -> None: def update_queue_table(self) -> None:
if isinstance(self.screen, MainView): if isinstance(self.screen, MainView):
logging.debug("Updating queue through app") 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: def update_user_queue(self, song: SubSonic.Song) -> None:
self.user_queue.append(song) self.user_queue.append(song)