diff --git a/rare/components/dialogs/install_dialog.py b/rare/components/dialogs/install_dialog.py index 7bd6d493..05f6763c 100644 --- a/rare/components/dialogs/install_dialog.py +++ b/rare/components/dialogs/install_dialog.py @@ -25,7 +25,7 @@ from rare.utils import config_helper class InstallDialog(QDialog, Ui_InstallDialog): result_ready = pyqtSignal(InstallQueueItemModel) - def __init__(self, dl_item: InstallQueueItemModel, update=False, silent=False, parent=None): + def __init__(self, dl_item: InstallQueueItemModel, update=False, repair=False, silent=False, parent=None): super(InstallDialog, self).__init__(parent) self.setupUi(self) self.setAttribute(Qt.WA_DeleteOnClose, True) @@ -44,6 +44,7 @@ class InstallDialog(QDialog, Ui_InstallDialog): self.game_path = self.game.metadata.get("customAttributes", {}).get("FolderName", {}).get("value", "") self.update = update + self.repair = repair self.silent = silent self.options_changed = False diff --git a/rare/components/tabs/games/game_info/game_info.py b/rare/components/tabs/games/game_info/game_info.py index 1cbce502..9f8fa904 100644 --- a/rare/components/tabs/games/game_info/game_info.py +++ b/rare/components/tabs/games/game_info/game_info.py @@ -85,7 +85,7 @@ class GameInfo(QWidget, Ui_GameInfo): if self.args.offline: self.repair_button.setDisabled(True) else: - self.repair_button.clicked.connect(lambda: self.repair(self.igame)) + self.repair_button.clicked.connect(self.repair) self.install_button.clicked.connect(lambda: self.game_utils.launch_game(self.game.app_name)) @@ -117,46 +117,78 @@ class GameInfo(QWidget, Ui_GameInfo): self.game_utils.update_list.emit(self.game.app_name) self.uninstalled.emit(self.game.app_name) - @pyqtSlot(InstalledGame) - def repair(self, igame: InstalledGame): - game = self.core.get_game(igame.app_name) - repair_file = os.path.join(self.core.lgd.get_tmp_path(), f"{igame.app_name}.repair") + @pyqtSlot() + def repair(self): + """ This function is to be called from the button only """ + repair_file = os.path.join(self.core.lgd.get_tmp_path(), f"{self.igame.app_name}.repair") if not os.path.exists(repair_file): QMessageBox.warning( self, - "Warning", + self.tr("Error - {}").format(self.igame.title), self.tr( "Repair file does not exist or game does not need a repair. Please verify game first" ), ) return - update = igame.version != game.app_version(igame.platform) + self.repair_game(self.igame) + + def repair_game(self, igame: InstalledGame): + game = self.core.get_game(igame.app_name) + ans = False + if igame.version != game.app_version(igame.platform): + ans = QMessageBox.question( + self, + self.tr("Repair and update?"), + self.tr( + "There is an update for {} from {} to {}." + "Do you want to update the game while repairing it?" + ).format(igame.title, igame.version, game.app_version(igame.platform)), + ) == QMessageBox.Yes self.signals.install_game.emit( - InstallOptionsModel(app_name=self.game.app_name, repair_mode=True, repair_and_update=update, update=True) + InstallOptionsModel( + app_name=igame.app_name, repair_mode=True, repair_and_update=ans, update=True + ) ) + @pyqtSlot() def verify(self): + """ This function is to be called from the button only """ if not os.path.exists(self.igame.install_path): - logger.error("Path does not exist") + logger.error(f"Installation path {self.igame.install_path} for {self.igame.title} does not exist") QMessageBox.warning( self, - "Warning", - self.tr("Installation path of {} does not exist. Cannot verify").format(self.igame.title), + self.tr("Error - {}").format(self.igame.title), + self.tr("Installation path for {} does not exist. Cannot continue.").format(self.igame.title), ) return + self.verify_game(self.igame) + + def verify_game(self, igame: InstalledGame): self.verify_widget.setCurrentIndex(1) - verify_worker = VerifyWorker(self.game.app_name) + verify_worker = VerifyWorker(igame.app_name) verify_worker.signals.status.connect(self.verify_status) verify_worker.signals.result.connect(self.verify_result) verify_worker.signals.error.connect(self.verify_error) self.verify_progress.setValue(0) - self.verify_threads[self.game.app_name] = verify_worker + self.verify_threads[igame.app_name] = verify_worker self.verify_pool.start(verify_worker) self.move_button.setEnabled(False) + def verify_cleanup(self, app_name: str): + self.verify_widget.setCurrentIndex(0) + self.verify_threads.pop(app_name) + self.move_button.setEnabled(True) + self.verify_button.setEnabled(True) + @pyqtSlot(str, str) def verify_error(self, app_name, message): - pass + self.verify_cleanup(app_name) + igame = self.core.get_installed_game(app_name) + QMessageBox.warning( + self, + self.tr("Error - {}").format(igame.title), + message + ) @pyqtSlot(str, int, int, float, float) def verify_status(self, app_name, num, total, percentage, speed): @@ -166,36 +198,30 @@ class GameInfo(QWidget, Ui_GameInfo): @pyqtSlot(str, bool, int, int) def verify_result(self, app_name, success, failed, missing): + self.verify_cleanup(app_name) + self.repair_button.setDisabled(success) igame = self.core.get_installed_game(app_name) if success: QMessageBox.information( self, self.tr("Summary - {}").format(igame.title), - self.tr("Game has been verified successfully. No missing or corrupt files found").format(igame.title), + self.tr("{} has been verified successfully. " + "No missing or corrupt files found").format(igame.title), ) - if igame.needs_verification: - igame.needs_verification = False - self.core.lgd.set_installed_game(igame.app_name, igame) - self.verification_finished.emit(igame) - elif failed == missing == -1: - QMessageBox.warning(self, self.tr("Warning - {}").format(igame.title), self.tr("Something went wrong")) - + self.verification_finished.emit(igame) else: ans = QMessageBox.question( self, self.tr("Summary - {}").format(igame.title), self.tr( - "Verification failed, {} file(s) corrupted, {} file(s) are missing. Do you want to repair them?" + "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.repair(igame) - self.verify_widget.setCurrentIndex(0) - self.verify_threads.pop(app_name) - self.move_button.setEnabled(True) - self.verify_button.setEnabled(True) + self.repair_game(igame) @pyqtSlot(str) def move_game(self, dest_path): @@ -326,7 +352,9 @@ class GameInfo(QWidget, Ui_GameInfo): self.uninstall_button.setDisabled(False) self.verify_button.setDisabled(False) if not self.args.offline: - self.repair_button.setDisabled(False) + self.repair_button.setDisabled( + not os.path.exists(os.path.join(self.core.lgd.get_tmp_path(), f"{self.igame.app_name}.repair")) + ) self.game_actions_stack.setCurrentIndex(0) try: diff --git a/rare/components/tabs/games/game_widgets/installed_icon_widget.py b/rare/components/tabs/games/game_widgets/installed_icon_widget.py index 9904084c..f6b84680 100644 --- a/rare/components/tabs/games/game_widgets/installed_icon_widget.py +++ b/rare/components/tabs/games/game_widgets/installed_icon_widget.py @@ -43,7 +43,7 @@ class InstalledIconWidget(BaseInstalledWidget): minilayout.setSpacing(0) miniwidget.setLayout(minilayout) - self.title_label = ElideLabel(f"