1
0
mirror of https://github.com/darkzoul5/YoutubePlaylistSync.git synced 2026-07-04 12:54:08 +03:00

refactor: simplify playlist card management in gui

This commit is contained in:
2026-06-19 14:51:29 +03:00
parent 789457828c
commit c1a2227da8
+47 -56
View File
@@ -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,22 +259,16 @@ 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): if errs:
errs = w.validate() ok = False
w.set_status("; ".join(errs) if errs else "")
if errs:
ok = False
if not ok and show_status: if not ok and show_status:
self._status.setText("Fix invalid playlists before saving/syncing.") self._status.setText("Fix invalid playlists before saving/syncing.")
return ok return ok
@@ -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):