redid the queue table + added better skipping in the queue
This commit is contained in:
1 parent
ce58103295
commit
9ac286bda4
1 file changed
+57
-29
+57
-29
@@ -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)
|
||||||
|
|||||||
Reference in new issue
Block a user