From 3225d1b1ebb8919094b47f22bf64e74a14b4ddde Mon Sep 17 00:00:00 2001 From: Dummerle <44114474+Dummerle@users.noreply.github.com> Date: Wed, 10 Nov 2021 19:00:15 +0100 Subject: [PATCH] Update savepath on button click --- .gitignore | 1 + .../tabs/games/game_info/game_settings.py | 42 +++++++++++++++---- rare/components/tabs/settings/linux.py | 19 +-------- rare/utils/utils.py | 6 +++ 4 files changed, 43 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 866c5e7f..ffdd14eb 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ __pycache__ *.tar.gz /Rare.egg-info/ /venv +/venv310/ diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index cf391578..dfdf661c 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -1,16 +1,18 @@ import os import platform +from logging import getLogger from typing import Tuple -from PyQt5.QtCore import QSettings +from PyQt5.QtCore import QSettings, QThreadPool from PyQt5.QtWidgets import QWidget, QFileDialog, QMessageBox, QLabel, QVBoxLayout, QPushButton - from qtawesome import icon + from legendary.core import LegendaryCore from legendary.models.game import InstalledGame, Game from rare.components.tabs.settings.linux import LinuxSettings from rare.ui.components.tabs.games.game_info.game_settings import Ui_GameSettings from rare.utils.extra_widgets import PathEdit +from rare.utils.utils import WineResolver, get_raw_save_path def find_proton_wrappers(): @@ -35,6 +37,9 @@ def find_proton_wrappers(): return possible_proton_wrappers +logger = getLogger("GameSettings") + + class GameSettings(QWidget, Ui_GameSettings): game: Game igame: InstalledGame @@ -108,15 +113,34 @@ class GameSettings(QWidget, Ui_GameSettings): try: new_path = self.core.get_save_path(self.game.app_name) except Exception as e: - QMessageBox.warning(self, "Error", - self.tr("Could not compute save path for {}").format( - self.game.app_title) + "\n" + str( - e)) + logger.warning(str(e)) + self.cloud_save_path_edit.setText(self.tr("Loading")) + self.cloud_save_path_edit.setDisabled(True) + self.compute_save_path_button.setDisabled(True) + resolver = WineResolver(get_raw_save_path(self.game), self.game.app_name, self.core) + resolver.signals.result_ready.connect(self.wine_resolver_finished) + QThreadPool.globalInstance().start(resolver) return self.cloud_save_path_edit.setText(new_path) + def wine_resolver_finished(self, path): + self.cloud_save_path_edit.setDisabled(False) + self.compute_save_path_button.setDisabled(False) + if path and not os.path.exists(path): + try: + os.makedirs(path) + except PermissionError: + self.cloud_save_path_edit.setText("") + QMessageBox.warning(None, "Error", self.tr( + "Error while launching {}. No permission to create {}").format( + self.game.app_title, path)) + return + if not path: + return + self.cloud_save_path_edit.setText(path) + def save_save_path(self, text): - if self.game.supports_cloud_saves and not self.change: + if self.game.supports_cloud_saves and self.change: self.igame.save_path = text self.core.lgd.set_installed_game(self.igame.app_name, self.igame) @@ -134,6 +158,10 @@ class GameSettings(QWidget, Ui_GameSettings): self.core.lgd.save_config() self.sender().setEnabled(False) + if option == "wine_prefix": + if self.game.supports_cloud_saves: + self.compute_save_path() + def update_combobox(self, i, option): if self.change: # remove section diff --git a/rare/components/tabs/settings/linux.py b/rare/components/tabs/settings/linux.py index 108d299a..a6cb8480 100644 --- a/rare/components/tabs/settings/linux.py +++ b/rare/components/tabs/settings/linux.py @@ -1,7 +1,6 @@ -import os from logging import getLogger -from PyQt5.QtWidgets import QFileDialog, QWidget, QMessageBox +from PyQt5.QtWidgets import QFileDialog, QWidget from rare import shared from rare.components.tabs.settings.dxvk import DxvkSettings @@ -48,19 +47,3 @@ class LinuxSettings(QWidget, Ui_LinuxSettings): if self.core.lgd.config[self.name] == {}: self.core.lgd.config.remove_section(self.name) self.core.lgd.save_config() - - if setting_name == "wine_prefix": - if not os.path.isdir(text) or not os.path.exists(os.path.join(text, "user.reg")): - return - if self.name != "default": # if game - game = self.core.get_game(self.name) - if self.core.is_installed(self.name) and game.supports_cloud_saves: - try: - new_path = self.core.get_save_path(self.name) - except Exception as e: - QMessageBox.warning(self, "Error", self.tr("Could not compute save path for {}").format( - game.app_title) + "\n" + str(e)) - return - igame = self.core.get_installed_game(self.name) - igame.save_path = new_path - self.core.lgd.set_installed_game(self.name, igame) diff --git a/rare/utils/utils.py b/rare/utils/utils.py index ed272cf3..e4416452 100644 --- a/rare/utils/utils.py +++ b/rare/utils/utils.py @@ -13,6 +13,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QRunnable, QSettings, Qt from PyQt5.QtGui import QPalette, QColor, QPixmap, QImage from requests import HTTPError +from legendary.models.game import Game from .models import PathSpec # Windows @@ -434,3 +435,8 @@ class CloudWorker(QRunnable): except HTTPError(): result = None self.signals.result_ready.emit(result) + + +def get_raw_save_path(game: Game): + if game.supports_cloud_saves: + return game.metadata.get("customAttributes", {}).get("CloudSaveFolder", {}).get("value")