mirror of
https://github.com/darkzoul5/YoutubePlaylistSync.git
synced 2026-07-04 21:04:01 +03:00
refactor: simplify playlist card management in gui
This commit is contained in:
@@ -172,6 +172,19 @@ class PlaylistManagerPage(QtWidgets.QWidget):
|
|||||||
self._status.setText("Cancelling…")
|
self._status.setText("Cancelling…")
|
||||||
self.cancel_requested.emit()
|
self.cancel_requested.emit()
|
||||||
|
|
||||||
|
def _iter_cards(self):
|
||||||
|
for i in range(self._list.count()):
|
||||||
|
item = self._list.item(i)
|
||||||
|
widget = self._list.itemWidget(item)
|
||||||
|
if isinstance(widget, _PlaylistCard):
|
||||||
|
yield widget
|
||||||
|
|
||||||
|
def _card_for_playlist_id(self, playlist_id: str) -> _PlaylistCard | None:
|
||||||
|
for card in self._iter_cards():
|
||||||
|
if card.playlist_id() == playlist_id:
|
||||||
|
return card
|
||||||
|
return None
|
||||||
|
|
||||||
def set_running(self, running: bool) -> None:
|
def set_running(self, running: bool) -> None:
|
||||||
self._sync_all_btn.setEnabled(not running)
|
self._sync_all_btn.setEnabled(not running)
|
||||||
self._cancel_btn.setEnabled(running)
|
self._cancel_btn.setEnabled(running)
|
||||||
@@ -181,11 +194,8 @@ class PlaylistManagerPage(QtWidgets.QWidget):
|
|||||||
# Keep the list enabled so per-card Pause/Cancel remains clickable.
|
# Keep the list enabled so per-card Pause/Cancel remains clickable.
|
||||||
self._list.setEnabled(True)
|
self._list.setEnabled(True)
|
||||||
# But freeze editing while a sync is running to avoid racey config edits.
|
# But freeze editing while a sync is running to avoid racey config edits.
|
||||||
for i in range(self._list.count()):
|
for card in self._iter_cards():
|
||||||
item = self._list.item(i)
|
card.set_editing_enabled(not running)
|
||||||
w = self._list.itemWidget(item)
|
|
||||||
if isinstance(w, _PlaylistCard):
|
|
||||||
w.set_editing_enabled(not running)
|
|
||||||
|
|
||||||
@QtCore.Slot()
|
@QtCore.Slot()
|
||||||
def _add_playlist(self) -> None:
|
def _add_playlist(self) -> None:
|
||||||
@@ -227,13 +237,8 @@ class PlaylistManagerPage(QtWidgets.QWidget):
|
|||||||
|
|
||||||
def _table_to_playlists(self) -> list[dict[str, Any]]:
|
def _table_to_playlists(self) -> list[dict[str, Any]]:
|
||||||
playlists: list[dict[str, Any]] = []
|
playlists: list[dict[str, Any]] = []
|
||||||
for i in range(self._list.count()):
|
for card in self._iter_cards():
|
||||||
item = self._list.item(i)
|
playlists.append(card.to_dict())
|
||||||
w = self._list.itemWidget(item)
|
|
||||||
if not isinstance(w, _PlaylistCard):
|
|
||||||
continue
|
|
||||||
pl = w.to_dict()
|
|
||||||
playlists.append(pl)
|
|
||||||
return playlists
|
return playlists
|
||||||
|
|
||||||
@QtCore.Slot()
|
@QtCore.Slot()
|
||||||
@@ -254,20 +259,14 @@ class PlaylistManagerPage(QtWidgets.QWidget):
|
|||||||
self._status.setText(f"Failed to save config: {exc}")
|
self._status.setText(f"Failed to save config: {exc}")
|
||||||
|
|
||||||
def _reindex_cards(self) -> None:
|
def _reindex_cards(self) -> None:
|
||||||
for i in range(self._list.count()):
|
for i, card in enumerate(self._iter_cards()):
|
||||||
item = self._list.item(i)
|
card.set_index(i)
|
||||||
w = self._list.itemWidget(item)
|
|
||||||
if isinstance(w, _PlaylistCard):
|
|
||||||
w.set_index(i)
|
|
||||||
|
|
||||||
def _validate_all(self, *, show_status: bool) -> bool:
|
def _validate_all(self, *, show_status: bool) -> bool:
|
||||||
ok = True
|
ok = True
|
||||||
for i in range(self._list.count()):
|
for card in self._iter_cards():
|
||||||
item = self._list.item(i)
|
errs = card.validate()
|
||||||
w = self._list.itemWidget(item)
|
card.set_status("; ".join(errs) if errs else "")
|
||||||
if isinstance(w, _PlaylistCard):
|
|
||||||
errs = w.validate()
|
|
||||||
w.set_status("; ".join(errs) if errs else "")
|
|
||||||
if errs:
|
if errs:
|
||||||
ok = False
|
ok = False
|
||||||
if not ok and show_status:
|
if not ok and show_status:
|
||||||
@@ -298,22 +297,25 @@ class PlaylistManagerPage(QtWidgets.QWidget):
|
|||||||
pid = payload.get("playlist_id")
|
pid = payload.get("playlist_id")
|
||||||
total = payload.get("actions_total")
|
total = payload.get("actions_total")
|
||||||
self._sync_state.setText(f"Sync started: {pid} ({total} actions)")
|
self._sync_state.setText(f"Sync started: {pid} ({total} actions)")
|
||||||
self._set_card_status(str(pid or ""), "running")
|
playlist_id = str(pid or "")
|
||||||
self._set_active_card(str(pid or ""), running=True, paused=False)
|
self._set_card_status(playlist_id, "running")
|
||||||
|
self._set_active_card(playlist_id, running=True, paused=False)
|
||||||
elif name == "SyncSummary":
|
elif name == "SyncSummary":
|
||||||
pid = payload.get("playlist_id")
|
pid = payload.get("playlist_id")
|
||||||
dur = payload.get("duration_s")
|
dur = payload.get("duration_s")
|
||||||
counts = payload.get("counts")
|
counts = payload.get("counts")
|
||||||
self._sync_state.setText(f"Sync summary: {pid} in {dur}s counts={counts}")
|
self._sync_state.setText(f"Sync summary: {pid} in {dur}s counts={counts}")
|
||||||
self._set_card_status(str(pid or ""), f"done in {dur}s")
|
playlist_id = str(pid or "")
|
||||||
|
self._set_card_status(playlist_id, f"done in {dur}s")
|
||||||
ls = payload.get("last_sync")
|
ls = payload.get("last_sync")
|
||||||
if ls:
|
if ls:
|
||||||
self._set_card_last_sync(str(pid or ""), str(ls))
|
self._set_card_last_sync(playlist_id, str(ls))
|
||||||
elif name == "SyncFinished":
|
elif name == "SyncFinished":
|
||||||
pid = payload.get("playlist_id")
|
pid = payload.get("playlist_id")
|
||||||
self._sync_state.setText(f"Sync finished: {pid}")
|
self._sync_state.setText(f"Sync finished: {pid}")
|
||||||
self._set_card_status(str(pid or ""), "finished")
|
playlist_id = str(pid or "")
|
||||||
self._set_active_card(str(pid or ""), running=False, paused=False)
|
self._set_card_status(playlist_id, "finished")
|
||||||
|
self._set_active_card(playlist_id, running=False, paused=False)
|
||||||
self.set_running(False)
|
self.set_running(False)
|
||||||
elif name == "SyncError":
|
elif name == "SyncError":
|
||||||
self._sync_state.setText(f"Sync error: {payload.get('error')}")
|
self._sync_state.setText(f"Sync error: {payload.get('error')}")
|
||||||
@@ -370,37 +372,26 @@ class PlaylistManagerPage(QtWidgets.QWidget):
|
|||||||
self._set_active_card(pid, running=True, paused=True)
|
self._set_active_card(pid, running=True, paused=True)
|
||||||
|
|
||||||
def _set_card_progress(self, playlist_id: str, progress: float) -> None:
|
def _set_card_progress(self, playlist_id: str, progress: float) -> None:
|
||||||
for i in range(self._list.count()):
|
card = self._card_for_playlist_id(playlist_id)
|
||||||
item = self._list.item(i)
|
if card is not None:
|
||||||
w = self._list.itemWidget(item)
|
card.set_progress(progress)
|
||||||
if isinstance(w, _PlaylistCard) and w.playlist_id() == playlist_id:
|
|
||||||
w.set_progress(progress)
|
|
||||||
|
|
||||||
def _set_card_status(self, playlist_id: str, text: str) -> None:
|
def _set_card_status(self, playlist_id: str, text: str) -> None:
|
||||||
for i in range(self._list.count()):
|
card = self._card_for_playlist_id(playlist_id)
|
||||||
item = self._list.item(i)
|
if card is not None:
|
||||||
w = self._list.itemWidget(item)
|
card.set_status(text)
|
||||||
if isinstance(w, _PlaylistCard):
|
|
||||||
if w.playlist_id() == playlist_id:
|
|
||||||
w.set_status(text)
|
|
||||||
|
|
||||||
def _set_card_last_sync(self, playlist_id: str, last_sync: str) -> None:
|
def _set_card_last_sync(self, playlist_id: str, last_sync: str) -> None:
|
||||||
for i in range(self._list.count()):
|
card = self._card_for_playlist_id(playlist_id)
|
||||||
item = self._list.item(i)
|
if card is not None:
|
||||||
w = self._list.itemWidget(item)
|
card.set_last_sync(last_sync)
|
||||||
if isinstance(w, _PlaylistCard) and w.playlist_id() == playlist_id:
|
|
||||||
w.set_last_sync(last_sync)
|
|
||||||
|
|
||||||
def _set_active_card(self, playlist_id: str, *, running: bool, paused: bool) -> None:
|
def _set_active_card(self, playlist_id: str, *, running: bool, paused: bool) -> None:
|
||||||
for i in range(self._list.count()):
|
card = self._card_for_playlist_id(playlist_id)
|
||||||
item = self._list.item(i)
|
if card is None:
|
||||||
w = self._list.itemWidget(item)
|
return
|
||||||
if not isinstance(w, _PlaylistCard):
|
card.set_active(running)
|
||||||
continue
|
card.set_paused(paused)
|
||||||
is_active = w.playlist_id() == playlist_id
|
|
||||||
w.set_active(is_active and running)
|
|
||||||
if is_active:
|
|
||||||
w.set_paused(paused)
|
|
||||||
|
|
||||||
|
|
||||||
class _PlaylistCard(QtWidgets.QFrame):
|
class _PlaylistCard(QtWidgets.QFrame):
|
||||||
|
|||||||
Reference in New Issue
Block a user