Menú d'opcions: ocultar no descarregats i comprovar actualitzacions, amb persistència
This commit is contained in:
@@ -5,6 +5,7 @@ from __future__ import annotations
|
||||
from pathlib import Path
|
||||
|
||||
from PySide6.QtCore import QThreadPool, Qt
|
||||
from PySide6.QtGui import QAction
|
||||
from PySide6.QtWidgets import (
|
||||
QMainWindow,
|
||||
QPlainTextEdit,
|
||||
@@ -15,7 +16,8 @@ from PySide6.QtWidgets import (
|
||||
)
|
||||
|
||||
from ..config import Config, Game
|
||||
from ..workers import DownloadWorker, RunWorker
|
||||
from ..settings import load_settings, save_settings
|
||||
from ..workers import CheckUpdatesWorker, DownloadWorker, RunWorker
|
||||
from .game_row import GameRow
|
||||
|
||||
APP_NAME = "Jail Launcher"
|
||||
@@ -27,6 +29,7 @@ class MainWindow(QMainWindow):
|
||||
super().__init__(parent)
|
||||
self.config = config
|
||||
self.root = root
|
||||
self.settings = load_settings()
|
||||
self.pool = QThreadPool.globalInstance()
|
||||
self.rows: dict[str, GameRow] = {}
|
||||
# Mantener referencias a los workers en vuelo: si no, Python los recolecta
|
||||
@@ -37,6 +40,8 @@ class MainWindow(QMainWindow):
|
||||
self.setWindowTitle(WINDOW_TITLE)
|
||||
self.resize(720, 640)
|
||||
|
||||
self._build_menu()
|
||||
|
||||
splitter = QSplitter(Qt.Vertical)
|
||||
|
||||
# --- Lista de juegos con scroll ---
|
||||
@@ -68,6 +73,66 @@ class MainWindow(QMainWindow):
|
||||
|
||||
self.setCentralWidget(splitter)
|
||||
|
||||
# Estado persistido: marcas de update + filtro de ocultar no descargados.
|
||||
for game_id in self.settings.updates_pending:
|
||||
if game_id in self.rows:
|
||||
self.rows[game_id].set_update_available(True)
|
||||
self._apply_filter()
|
||||
|
||||
# --------------------------------------------------------------- menú
|
||||
|
||||
def _build_menu(self) -> None:
|
||||
menu = self.menuBar().addMenu("Opciones")
|
||||
|
||||
self.action_hide = QAction("Ocultar juegos no descargados", self, checkable=True)
|
||||
self.action_hide.setChecked(self.settings.hide_not_downloaded)
|
||||
self.action_hide.toggled.connect(self._on_toggle_hide)
|
||||
menu.addAction(self.action_hide)
|
||||
|
||||
self.action_check = QAction("Comprobar actualizaciones", self)
|
||||
self.action_check.triggered.connect(self._check_updates)
|
||||
menu.addAction(self.action_check)
|
||||
|
||||
def _on_toggle_hide(self, checked: bool) -> None:
|
||||
self.settings.hide_not_downloaded = checked
|
||||
save_settings(self.settings)
|
||||
self._apply_filter()
|
||||
|
||||
def _apply_filter(self) -> None:
|
||||
hide = self.action_hide.isChecked()
|
||||
for row in self.rows.values():
|
||||
row.setVisible(not (hide and not row.is_installed()))
|
||||
|
||||
# ------------------------------------------------------ comprobar updates
|
||||
|
||||
def _check_updates(self) -> None:
|
||||
self.action_check.setEnabled(False)
|
||||
self._log("=== Comprobando actualizaciones ===")
|
||||
worker = CheckUpdatesWorker(self.root, self.config.games)
|
||||
worker.signals.log.connect(self._log)
|
||||
worker.signals.result.connect(self._mark_update)
|
||||
worker.signals.finished.connect(self._check_done)
|
||||
worker.signals.error.connect(self._check_error)
|
||||
self._track(worker)
|
||||
self.pool.start(worker)
|
||||
|
||||
def _mark_update(self, game_id: str, has_update: bool) -> None:
|
||||
row = self.rows.get(game_id)
|
||||
if row is not None:
|
||||
row.set_update_available(has_update)
|
||||
pending = set(self.settings.updates_pending)
|
||||
pending.add(game_id) if has_update else pending.discard(game_id)
|
||||
self.settings.updates_pending = sorted(pending)
|
||||
save_settings(self.settings)
|
||||
|
||||
def _check_done(self, _payload) -> None:
|
||||
self.action_check.setEnabled(True)
|
||||
self._log("=== Comprobación de actualizaciones terminada ===")
|
||||
|
||||
def _check_error(self, msg: str) -> None:
|
||||
self.action_check.setEnabled(True)
|
||||
self._log(f"!!! Error comprobando actualizaciones: {msg}")
|
||||
|
||||
# --------------------------------------------------------------- helpers
|
||||
|
||||
def _log(self, text: str) -> None:
|
||||
@@ -99,7 +164,13 @@ class MainWindow(QMainWindow):
|
||||
self._log(f"=== {game.name}: descarga completada ===")
|
||||
row = self.rows[game.id]
|
||||
row.set_busy(False)
|
||||
row.refresh()
|
||||
row.set_update_available(False) # recién traído del remoto → al día
|
||||
if game.id in self.settings.updates_pending:
|
||||
self.settings.updates_pending = [
|
||||
g for g in self.settings.updates_pending if g != game.id
|
||||
]
|
||||
save_settings(self.settings)
|
||||
self._apply_filter() # un juego antes no instalado puede aparecer ahora
|
||||
|
||||
def _on_run(self, game: Game) -> None:
|
||||
row = self.rows[game.id]
|
||||
|
||||
Reference in New Issue
Block a user