feat: add 'f' key binding to toggle finished/unfinished status
This commit is contained in:
@@ -45,6 +45,7 @@ class Auditui(App):
|
|||||||
("ctrl+right", "next_chapter", "Next chapter"),
|
("ctrl+right", "next_chapter", "Next chapter"),
|
||||||
("up", "increase_speed", "Increase speed"),
|
("up", "increase_speed", "Increase speed"),
|
||||||
("down", "decrease_speed", "Decrease speed"),
|
("down", "decrease_speed", "Decrease speed"),
|
||||||
|
("f", "toggle_finished", "Mark finished/unfinished"),
|
||||||
("d", "toggle_download", "Download/Delete"),
|
("d", "toggle_download", "Download/Delete"),
|
||||||
("q", "quit", "Quit"),
|
("q", "quit", "Quit"),
|
||||||
]
|
]
|
||||||
@@ -310,6 +311,60 @@ class Auditui(App):
|
|||||||
if not self.playback.decrease_speed():
|
if not self.playback.decrease_speed():
|
||||||
self._no_playback_message()
|
self._no_playback_message()
|
||||||
|
|
||||||
|
def action_toggle_finished(self) -> None:
|
||||||
|
"""Toggle finished/unfinished status for the selected book."""
|
||||||
|
if not self.library_client:
|
||||||
|
self.update_status("Library client not available")
|
||||||
|
return
|
||||||
|
|
||||||
|
table = self.query_one(DataTable)
|
||||||
|
if table.row_count == 0:
|
||||||
|
self.update_status("No books available")
|
||||||
|
return
|
||||||
|
|
||||||
|
cursor_row = table.cursor_row
|
||||||
|
if cursor_row >= len(self.current_items):
|
||||||
|
self.update_status("Invalid selection")
|
||||||
|
return
|
||||||
|
|
||||||
|
selected_item = self.current_items[cursor_row]
|
||||||
|
asin = self.library_client.extract_asin(selected_item)
|
||||||
|
|
||||||
|
if not asin:
|
||||||
|
self.update_status("Could not get ASIN for selected book")
|
||||||
|
return
|
||||||
|
|
||||||
|
self._toggle_finished_async(asin)
|
||||||
|
|
||||||
|
@work(exclusive=True, thread=True)
|
||||||
|
def _toggle_finished_async(self, asin: str) -> None:
|
||||||
|
"""Toggle finished/unfinished status asynchronously."""
|
||||||
|
if not self.library_client:
|
||||||
|
return
|
||||||
|
|
||||||
|
selected_item = None
|
||||||
|
for item in self.current_items:
|
||||||
|
if self.library_client.extract_asin(item) == asin:
|
||||||
|
selected_item = item
|
||||||
|
break
|
||||||
|
|
||||||
|
if not selected_item:
|
||||||
|
return
|
||||||
|
|
||||||
|
is_currently_finished = self.library_client.is_finished(selected_item)
|
||||||
|
|
||||||
|
if is_currently_finished:
|
||||||
|
success = self.library_client.mark_as_unfinished(
|
||||||
|
asin, selected_item)
|
||||||
|
message = "Marked as unfinished" if success else "Failed to mark as unfinished"
|
||||||
|
else:
|
||||||
|
success = self.library_client.mark_as_finished(asin, selected_item)
|
||||||
|
message = "Marked as finished" if success else "Failed to mark as finished"
|
||||||
|
|
||||||
|
self.call_from_thread(self.update_status, message)
|
||||||
|
if success:
|
||||||
|
self.call_from_thread(self.fetch_library)
|
||||||
|
|
||||||
def _no_playback_message(self) -> None:
|
def _no_playback_message(self) -> None:
|
||||||
"""Show message when no playback is active."""
|
"""Show message when no playback is active."""
|
||||||
self.update_status("No playback active. Press Enter to play a book.")
|
self.update_status("No playback active. Press Enter to play a book.")
|
||||||
|
|||||||
Reference in New Issue
Block a user