1
0
Fork 0
mirror of synced 2024-06-26 10:11:19 +12:00
Rare/rare/components/tabs/games/game_info/game_settings.py

196 lines
8.2 KiB
Python
Raw Normal View History

2021-03-10 09:57:54 +13:00
import os
import platform
2021-11-11 07:00:15 +13:00
from logging import getLogger
2021-03-10 09:57:54 +13:00
from PyQt5.QtCore import Qt, QThreadPool
from PyQt5.QtWidgets import QSizePolicy, QPushButton, QLabel, QFileDialog, QMessageBox
from legendary.models.game import Game, InstalledGame
from rare.components.tabs.settings import DefaultGameSettings
from rare.components.tabs.settings.widgets.pre_launch import PreLaunchSettings
from rare.models.game import RareGame
from rare.shared.workers.wine_resolver import WineResolver
from rare.utils import config_helper
from rare.widgets.indicator_edit import PathEdit, IndicatorReasonsCommon
from rare.widgets.side_tab import SideTabContents
from rare.utils.misc import icon, get_raw_save_path
2021-03-10 09:57:54 +13:00
logger = getLogger("GameSettings")
2021-03-10 09:57:54 +13:00
class GameSettings(DefaultGameSettings, SideTabContents):
2021-03-10 09:57:54 +13:00
game: Game
igame: InstalledGame
2021-04-10 21:27:40 +12:00
def __init__(self, parent=None):
super(GameSettings, self).__init__(False, parent=parent)
2022-03-15 11:29:54 +13:00
self.pre_launch_settings = PreLaunchSettings()
self.launch_settings_group.layout().addRow(
QLabel(self.tr("Pre-launch command")), self.pre_launch_settings
2022-03-15 11:29:54 +13:00
)
2021-12-24 22:09:50 +13:00
self.cloud_save_path_edit = PathEdit(
"",
file_type=QFileDialog.DirectoryOnly,
placeholder=self.tr("Cloud save path"),
edit_func=lambda text: (True, text, IndicatorReasonsCommon.VALID)
if os.path.exists(text)
else (False, text, IndicatorReasonsCommon.DIR_NOT_EXISTS),
2021-12-24 22:09:50 +13:00
save_func=self.save_save_path,
)
self.cloud_layout.addRow(QLabel(self.tr("Save path")), self.cloud_save_path_edit)
2021-11-04 10:18:03 +13:00
self.compute_save_path_button = QPushButton(icon("fa.magic"), self.tr("Auto compute save path"))
self.compute_save_path_button.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
2021-11-04 10:18:03 +13:00
self.compute_save_path_button.clicked.connect(self.compute_save_path)
self.cloud_layout.addRow(None, self.compute_save_path_button)
2021-10-24 12:47:49 +13:00
self.offline.currentIndexChanged.connect(lambda x: self.update_combobox(x, "offline"))
self.skip_update.currentIndexChanged.connect(lambda x: self.update_combobox(x, "skip_update_check"))
self.cloud_sync.stateChanged.connect(
2021-12-24 22:09:50 +13:00
lambda: self.settings.setValue(
f"{self.game.app_name}/auto_sync_cloud", self.cloud_sync.isChecked()
)
)
self.override_exe_edit.textChanged.connect(lambda text: self.save_line_edit("override_exe", text))
self.launch_params.textChanged.connect(lambda x: self.save_line_edit("start_params", x))
2021-03-27 06:04:29 +13:00
self.game_settings_layout.setAlignment(Qt.AlignTop)
2021-10-24 12:47:49 +13:00
2021-11-04 10:18:03 +13:00
def compute_save_path(self):
if self.core.is_installed(self.game.app_name) and self.game.supports_cloud_saves:
2021-11-04 10:18:03 +13:00
try:
new_path = self.core.get_save_path(self.game.app_name)
except Exception as e:
2021-11-11 07:00:15 +13:00
logger.warning(str(e))
resolver = WineResolver(self.core, get_raw_save_path(self.game), self.game.app_name)
if not resolver.wine_env.get("WINEPREFIX"):
self.cloud_save_path_edit.setText("")
QMessageBox.warning(self, "Warning", "No wine prefix selected. Please set it in settings")
return
2021-11-11 07:00:15 +13:00
self.cloud_save_path_edit.setText(self.tr("Loading"))
self.cloud_save_path_edit.setDisabled(True)
self.compute_save_path_button.setDisabled(True)
2021-11-17 10:54:23 +13:00
app_name = self.game.app_name[:]
resolver.signals.result_ready.connect(lambda x: self.wine_resolver_finished(x, app_name))
2021-11-11 07:00:15 +13:00
QThreadPool.globalInstance().start(resolver)
2021-11-04 10:18:03 +13:00
return
else:
self.cloud_save_path_edit.setText(new_path)
2021-11-04 10:18:03 +13:00
2021-11-17 10:54:23 +13:00
def wine_resolver_finished(self, path, app_name):
logger.info(f"Wine resolver finished for {app_name}. Computed save path: {path}")
2021-11-17 10:54:23 +13:00
if app_name == self.game.app_name:
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("")
2021-12-24 22:09:50 +13:00
QMessageBox.warning(
None,
"Error",
self.tr("Error while launching {}. No permission to create {}").format(
self.game.app_title, path
),
2021-12-24 22:09:50 +13:00
)
2021-11-17 10:54:23 +13:00
return
if not path:
self.cloud_save_path_edit.setText("")
2021-11-11 07:00:15 +13:00
return
2021-11-17 10:54:23 +13:00
self.cloud_save_path_edit.setText(path)
elif path:
2021-11-17 10:54:23 +13:00
igame = self.core.get_installed_game(app_name)
igame.save_path = path
self.core.lgd.set_installed_game(app_name, igame)
2021-11-11 07:00:15 +13:00
2021-10-24 12:47:49 +13:00
def save_save_path(self, text):
2021-11-11 07:00:15 +13:00
if self.game.supports_cloud_saves and self.change:
2021-10-24 12:47:49 +13:00
self.igame.save_path = text
self.core.lgd.set_installed_game(self.igame.app_name, self.igame)
2021-03-10 09:57:54 +13:00
2021-04-10 22:34:45 +12:00
def save_line_edit(self, option, value):
if value:
config_helper.add_option(self.game.app_name, option, value)
2021-03-27 06:04:29 +13:00
else:
config_helper.remove_option(self.game.app_name, option)
config_helper.save_config()
2021-03-27 06:04:29 +13:00
2021-11-11 07:00:15 +13:00
if option == "wine_prefix":
if self.game.supports_cloud_saves:
self.compute_save_path()
2021-04-08 21:09:17 +12:00
def update_combobox(self, i, option):
if self.change:
# remove section
if i:
if i == 1:
config_helper.add_option(self.game.app_name, option, "true")
if i == 2:
config_helper.add_option(self.game.app_name, option, "false")
else:
config_helper.remove_option(self.game.app_name, option)
config_helper.save_config()
def load_settings(self, rgame: RareGame):
2021-03-11 23:59:12 +13:00
self.change = False
# FIXME: Use RareGame for the rest of the code
app_name = rgame.app_name
super(GameSettings, self).load_settings(app_name)
self.game = rgame.game
self.igame = rgame.igame
if self.igame:
if self.igame.can_run_offline:
offline = self.core.lgd.config.get(self.game.app_name, "offline", fallback="unset")
if offline == "true":
self.offline.setCurrentIndex(1)
elif offline == "false":
self.offline.setCurrentIndex(2)
else:
self.offline.setCurrentIndex(0)
self.offline.setEnabled(True)
else:
self.offline.setEnabled(False)
else:
self.offline.setEnabled(False)
skip_update = self.core.lgd.config.get(self.game.app_name, "skip_update_check", fallback="unset")
if skip_update == "true":
self.skip_update.setCurrentIndex(1)
elif skip_update == "false":
self.skip_update.setCurrentIndex(2)
else:
self.skip_update.setCurrentIndex(0)
self.set_title.emit(self.game.app_title)
if platform.system() != "Windows":
if self.igame and self.igame.platform == "Mac":
self.linux_settings_widget.setVisible(False)
else:
self.linux_settings_widget.setVisible(True)
2021-04-10 21:27:40 +12:00
if not self.game.supports_cloud_saves:
self.cloud_group.setEnabled(False)
2021-10-24 12:47:49 +13:00
self.cloud_save_path_edit.setText("")
2021-04-10 21:27:40 +12:00
else:
self.cloud_group.setEnabled(True)
sync_cloud = self.settings.value(f"{self.game.app_name}/auto_sync_cloud", True, bool)
2021-04-10 21:27:40 +12:00
self.cloud_sync.setChecked(sync_cloud)
if hasattr(self.igame, "save_path") and self.igame.save_path:
2021-10-24 12:47:49 +13:00
self.cloud_save_path_edit.setText(self.igame.save_path)
else:
self.cloud_save_path_edit.setText("")
2021-04-10 22:34:45 +12:00
self.launch_params.setText(self.core.lgd.config.get(self.game.app_name, "start_params", fallback=""))
2021-12-24 22:09:50 +13:00
self.override_exe_edit.setText(
self.core.lgd.config.get(self.game.app_name, "override_exe", fallback="")
)
2022-03-15 11:29:54 +13:00
self.pre_launch_settings.load_settings(app_name)
2021-03-11 23:59:12 +13:00
self.change = True