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:
@@ -172,6 +172,19 @@ class PlaylistManagerPage(QtWidgets.QWidget):
|
||||
self._status.setText("Cancelling…")
|
||||
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:
|
||||
self._sync_all_btn.setEnabled(not 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.
|
||||
self._list.setEnabled(True)
|
||||
# But freeze editing while a sync is running to avoid racey config edits.
|
||||
for i in range(self._list.count()):
|
||||
item = self._list.item(i)
|
||||
w = self._list.itemWidget(item)
|
||||
if isinstance(w, _PlaylistCard):
|
||||
w.set_editing_enabled(not running)
|
||||
for card in self._iter_cards():
|
||||
card.set_editing_enabled(not running)
|
||||
|
||||
@QtCore.Slot()
|
||||
def _add_playlist(self) -> None:
|
||||
@@ -227,13 +237,8 @@ class PlaylistManagerPage(QtWidgets.QWidget):
|
||||
|
||||
def _table_to_playlists(self) -> list[dict[str, Any]]:
|
||||
playlists: list[dict[str, Any]] = []
|
||||
for i in range(self._list.count()):
|
||||
item = self._list.item(i)
|
||||
w = self._list.itemWidget(item)
|
||||
if not isinstance(w, _PlaylistCard):
|
||||
continue
|
||||
pl = w.to_dict()
|
||||
playlists.append(pl)
|
||||
for card in self._iter_cards():
|
||||
playlists.append(card.to_dict())
|
||||
return playlists
|
||||
|
||||
@QtCore.Slot()
|
||||
@@ -254,20 +259,14 @@ class PlaylistManagerPage(QtWidgets.QWidget):
|
||||
self._status.setText(f"Failed to save config: {exc}")
|
||||
|
||||
def _reindex_cards(self) -> None:
|
||||
for i in range(self._list.count()):
|
||||
item = self._list.item(i)
|
||||
w = self._list.itemWidget(item)
|
||||
if isinstance(w, _PlaylistCard):
|
||||
w.set_index(i)
|
||||
for i, card in enumerate(self._iter_cards()):
|
||||
card.set_index(i)
|
||||
|
||||
def _validate_all(self, *, show_status: bool) -> bool:
|
||||
ok = True
|
||||
for i in range(self._list.count()):
|
||||
item = self._list.item(i)
|
||||
w = self._list.itemWidget(item)
|
||||
if isinstance(w, _PlaylistCard):
|
||||
errs = w.validate()
|
||||
w.set_status("; ".join(errs) if errs else "")
|
||||
for card in self._iter_cards():
|
||||
errs = card.validate()
|
||||
card.set_status("; ".join(errs) if errs else "")
|
||||
if errs:
|
||||
ok = False
|
||||
if not ok and show_status:
|
||||
@@ -298,22 +297,25 @@ class PlaylistManagerPage(QtWidgets.QWidget):
|
||||
pid = payload.get("playlist_id")
|
||||
total = payload.get("actions_total")
|
||||
self._sync_state.setText(f"Sync started: {pid} ({total} actions)")
|
||||
self._set_card_status(str(pid or ""), "running")
|
||||
self._set_active_card(str(pid or ""), running=True, paused=False)
|
||||
playlist_id = str(pid or "")
|
||||
self._set_card_status(playlist_id, "running")
|
||||
self._set_active_card(playlist_id, running=True, paused=False)
|
||||
elif name == "SyncSummary":
|
||||
pid = payload.get("playlist_id")
|
||||
dur = payload.get("duration_s")
|
||||
counts = payload.get("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")
|
||||
if ls:
|
||||
self._set_card_last_sync(str(pid or ""), str(ls))
|
||||
self._set_card_last_sync(playlist_id, str(ls))
|
||||
elif name == "SyncFinished":
|
||||
pid = payload.get("playlist_id")
|
||||
self._sync_state.setText(f"Sync finished: {pid}")
|
||||
self._set_card_status(str(pid or ""), "finished")
|
||||
self._set_active_card(str(pid or ""), running=False, paused=False)
|
||||
playlist_id = str(pid or "")
|
||||
self._set_card_status(playlist_id, "finished")
|
||||
self._set_active_card(playlist_id, running=False, paused=False)
|
||||
self.set_running(False)
|
||||
elif name == "SyncError":
|
||||
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)
|
||||
|
||||
def _set_card_progress(self, playlist_id: str, progress: float) -> None:
|
||||
for i in range(self._list.count()):
|
||||
item = self._list.item(i)
|
||||
w = self._list.itemWidget(item)
|
||||
if isinstance(w, _PlaylistCard) and w.playlist_id() == playlist_id:
|
||||
w.set_progress(progress)
|
||||
card = self._card_for_playlist_id(playlist_id)
|
||||
if card is not None:
|
||||
card.set_progress(progress)
|
||||
|
||||
def _set_card_status(self, playlist_id: str, text: str) -> None:
|
||||
for i in range(self._list.count()):
|
||||
item = self._list.item(i)
|
||||
w = self._list.itemWidget(item)
|
||||
if isinstance(w, _PlaylistCard):
|
||||
if w.playlist_id() == playlist_id:
|
||||
w.set_status(text)
|
||||
card = self._card_for_playlist_id(playlist_id)
|
||||
if card is not None:
|
||||
card.set_status(text)
|
||||
|
||||
def _set_card_last_sync(self, playlist_id: str, last_sync: str) -> None:
|
||||
for i in range(self._list.count()):
|
||||
item = self._list.item(i)
|
||||
w = self._list.itemWidget(item)
|
||||
if isinstance(w, _PlaylistCard) and w.playlist_id() == playlist_id:
|
||||
w.set_last_sync(last_sync)
|
||||
card = self._card_for_playlist_id(playlist_id)
|
||||
if card is not None:
|
||||
card.set_last_sync(last_sync)
|
||||
|
||||
def _set_active_card(self, playlist_id: str, *, running: bool, paused: bool) -> None:
|
||||
for i in range(self._list.count()):
|
||||
item = self._list.item(i)
|
||||
w = self._list.itemWidget(item)
|
||||
if not isinstance(w, _PlaylistCard):
|
||||
continue
|
||||
is_active = w.playlist_id() == playlist_id
|
||||
w.set_active(is_active and running)
|
||||
if is_active:
|
||||
w.set_paused(paused)
|
||||
card = self._card_for_playlist_id(playlist_id)
|
||||
if card is None:
|
||||
return
|
||||
card.set_active(running)
|
||||
card.set_paused(paused)
|
||||
|
||||
|
||||
class _PlaylistCard(QtWidgets.QFrame):
|
||||
|
||||
Reference in New Issue
Block a user