import os import platform from logging import getLogger from PyQt5.QtCore import pyqtSignal, QThreadPool from PyQt5.QtWidgets import QWidget, QMessageBox from legendary.models.game import Game, InstalledGame from rare import shared from rare.ui.components.tabs.games.game_info.game_info import Ui_GameInfo from rare.utils.legendary_utils import VerifyWorker from rare.utils.models import InstallOptionsModel from rare.utils.steam_grades import SteamWorker from rare.utils.utils import get_size, get_pixmap logger = getLogger("GameInfo") class GameInfo(QWidget, Ui_GameInfo): igame: InstalledGame game: Game = None verify_threads = dict() verification_finished = pyqtSignal(InstalledGame) uninstalled = pyqtSignal(str) def __init__(self, parent, game_utils): super(GameInfo, self).__init__(parent=parent) self.setupUi(self) self.core = shared.core self.signals = shared.signals self.game_utils = game_utils if platform.system() == "Windows": self.lbl_grade.setVisible(False) self.grade.setVisible(False) else: self.steam_worker = SteamWorker(self.core) self.steam_worker.signals.rating_signal.connect(self.grade.setText) self.steam_worker.setAutoDelete(False) self.game_actions_stack.setCurrentIndex(0) self.install_button.setText(self.tr("Link to Origin/Launch")) self.game_actions_stack.resize(self.game_actions_stack.minimumSize()) self.uninstall_button.clicked.connect(self.uninstall) self.verify_button.clicked.connect(self.verify) self.repair_button.clicked.connect(self.repair) self.verify_pool = QThreadPool() self.verify_pool.setMaxThreadCount(2) def uninstall(self): if self.game_utils.uninstall_game(self.game.app_name): self.game_utils.update_list.emit(self.game.app_name) self.uninstalled.emit(self.game.app_name) def repair(self): repair_file = os.path.join(self.core.lgd.get_tmp_path(), f'{self.game.app_name}.repair') if not os.path.exists(repair_file): QMessageBox.warning(self, "Warning", self.tr( "Repair file does not exist or game does not need a repair. Please verify game first")) return self.signals.install_game.emit(InstallOptionsModel(app_name=self.game.app_name, repair=True, update=True)) def verify(self): if not os.path.exists(self.igame.install_path): logger.error("Path does not exist") QMessageBox.warning(self, "Warning", self.tr("Installation path of {} does not exist. Cannot verify").format( self.igame.title)) return self.verify_widget.setCurrentIndex(1) verify_worker = VerifyWorker(self.core, self.game.app_name) verify_worker.signals.status.connect(self.verify_staistics) verify_worker.signals.summary.connect(self.finish_verify) self.verify_progress.setValue(0) self.verify_threads[self.game.app_name] = verify_worker self.verify_pool.start(verify_worker) def verify_staistics(self, progress): # checked, max, app_name if progress[2] == self.game.app_name: self.verify_progress.setValue(progress[0] * 100 // progress[1]) def finish_verify(self, failed, missing, app_name): if failed == missing == 0: QMessageBox.information(self, "Summary", "Game was verified successfully. No missing or corrupt files found") igame = self.core.get_installed_game(app_name) if igame.needs_verification: igame.needs_verification = False self.core.lgd.set_installed_game(self.igame.app_name, igame) self.verification_finished.emit(igame) else: ans = QMessageBox.question(self, "Summary", self.tr( 'Verification failed, {} file(s) corrupted, {} file(s) are missing. Do you want to repair them?').format( failed, missing), QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if ans == QMessageBox.Yes: self.signals.install_game.emit(InstallOptionsModel(app_name=self.game.app_name, repair=True, update=True)) self.verify_widget.setCurrentIndex(0) self.verify_threads.pop(app_name) def update_game(self, game: Game): self.game = game self.igame = self.core.get_installed_game(game.app_name) self.game_title.setText(f'