2021-03-10 09:57:54 +13:00
|
|
|
import os
|
|
|
|
|
2021-04-10 21:27:40 +12:00
|
|
|
from PyQt5.QtCore import QSettings
|
2021-04-09 22:08:28 +12:00
|
|
|
from PyQt5.QtWidgets import QWidget, QLabel, QVBoxLayout, QComboBox, QFileDialog, QPushButton, QMessageBox, QLineEdit, \
|
2021-04-10 21:27:40 +12:00
|
|
|
QScrollArea, QCheckBox
|
2021-03-10 09:57:54 +13:00
|
|
|
|
2021-04-10 21:27:40 +12:00
|
|
|
from custom_legendary.core import LegendaryCore
|
|
|
|
from custom_legendary.models.game import InstalledGame, Game
|
2021-04-08 08:42:30 +12:00
|
|
|
from rare.components.tabs.settings.linux import LinuxSettings
|
|
|
|
from rare.components.tabs.settings.settings_widget import SettingsWidget
|
2021-04-08 08:39:23 +12:00
|
|
|
from rare.utils.extra_widgets import PathEdit
|
2021-03-10 09:57:54 +13:00
|
|
|
|
|
|
|
|
2021-04-09 22:08:28 +12:00
|
|
|
class GameSettings(QScrollArea):
|
2021-03-10 09:57:54 +13:00
|
|
|
game: Game
|
|
|
|
igame: InstalledGame
|
2021-04-10 21:27:40 +12:00
|
|
|
|
2021-03-14 23:00:06 +13:00
|
|
|
# variable to no update when changing game
|
2021-03-11 23:59:12 +13:00
|
|
|
change = False
|
|
|
|
|
2021-04-18 04:58:18 +12:00
|
|
|
def __init__(self, core: LegendaryCore, parent):
|
|
|
|
super(GameSettings, self).__init__(parent=parent)
|
2021-03-10 09:57:54 +13:00
|
|
|
self.core = core
|
2021-04-09 22:08:28 +12:00
|
|
|
self.widget = QWidget()
|
2021-04-10 21:27:40 +12:00
|
|
|
self.settings = QSettings()
|
2021-04-09 22:08:28 +12:00
|
|
|
self.setWidgetResizable(True)
|
2021-03-10 09:57:54 +13:00
|
|
|
self.layout = QVBoxLayout()
|
|
|
|
self.title = QLabel("Error")
|
|
|
|
self.layout.addWidget(self.title)
|
2021-03-14 23:00:06 +13:00
|
|
|
|
|
|
|
self.offline = QComboBox()
|
|
|
|
self.offline.addItems(["unset", "true", "false"])
|
|
|
|
self.offline_widget = SettingsWidget(self.tr("Launch Game offline"), self.offline)
|
2021-04-08 21:09:17 +12:00
|
|
|
self.offline.currentIndexChanged.connect(lambda x: self.update_combobox(x, "offline"))
|
2021-03-14 23:00:06 +13:00
|
|
|
|
|
|
|
self.skip_update = QComboBox()
|
|
|
|
self.skip_update.addItems(["unset", "true", "false"])
|
|
|
|
self.skip_update_widget = SettingsWidget(self.tr("Skip update check before launching"), self.skip_update)
|
|
|
|
self.layout.addWidget(self.skip_update_widget)
|
2021-04-08 21:09:17 +12:00
|
|
|
self.skip_update.currentIndexChanged.connect(lambda x: self.update_combobox(x, "skip_update_check"))
|
2021-03-14 23:00:06 +13:00
|
|
|
|
2021-04-10 22:34:45 +12:00
|
|
|
self.launch_params = QLineEdit("")
|
|
|
|
self.launch_params.setPlaceholderText(self.tr("Start parameter"))
|
|
|
|
self.launch_params_accept_button = QPushButton(self.tr("Save"))
|
|
|
|
self.launch_params_widget = SettingsWidget(self.tr("Launch parameters"), self.launch_params,
|
|
|
|
self.launch_params_accept_button)
|
|
|
|
self.layout.addWidget(self.launch_params_widget)
|
|
|
|
self.launch_params_accept_button.clicked.connect(lambda: self.save_line_edit("start_params", self.launch_params.text()))
|
|
|
|
|
2021-04-10 21:27:40 +12:00
|
|
|
self.cloud_sync = QCheckBox("Sync with cloud")
|
|
|
|
self.cloud_sync_widget = SettingsWidget(self.tr("Auto sync with cloud"), self.cloud_sync)
|
|
|
|
self.layout.addWidget(self.cloud_sync_widget)
|
|
|
|
self.cloud_sync.stateChanged.connect(lambda: self.settings.setValue(f"{self.game.app_name}/auto_sync_cloud",
|
|
|
|
self.cloud_sync.isChecked()))
|
|
|
|
|
2021-03-14 23:00:06 +13:00
|
|
|
self.layout.addWidget(self.offline_widget)
|
|
|
|
|
2021-03-27 06:04:29 +13:00
|
|
|
self.wrapper = QLineEdit("")
|
2021-04-10 22:34:45 +12:00
|
|
|
self.wrapper.setPlaceholderText("Wrapper")
|
2021-03-27 06:04:29 +13:00
|
|
|
self.wrapper_save_button = QPushButton(self.tr("Save"))
|
2021-04-10 22:34:45 +12:00
|
|
|
self.wrapper_save_button.clicked.connect(lambda: self.save_line_edit("wrapper", self.wrapper.text()))
|
2021-03-27 06:04:29 +13:00
|
|
|
self.wrapper_widget = SettingsWidget(self.tr("Wrapper (e.g. optirun)"), self.wrapper, self.wrapper_save_button)
|
|
|
|
self.layout.addWidget(self.wrapper_widget)
|
|
|
|
|
2021-03-10 09:57:54 +13:00
|
|
|
if os.name != "nt":
|
|
|
|
self.linux_settings = LinuxAppSettings(core)
|
|
|
|
self.layout.addWidget(self.linux_settings)
|
|
|
|
|
|
|
|
self.possible_proton_wrappers = []
|
2021-03-15 01:53:12 +13:00
|
|
|
try:
|
|
|
|
for i in os.listdir(os.path.expanduser("~/.steam/steam/steamapps/common")):
|
|
|
|
if i.startswith("Proton"):
|
|
|
|
wrapper = '"' + os.path.join(os.path.expanduser("~/.steam/steam/steamapps/common"), i,
|
2021-03-19 00:45:59 +13:00
|
|
|
"proton") + '" run'
|
2021-03-15 01:53:12 +13:00
|
|
|
self.possible_proton_wrappers.append(wrapper)
|
|
|
|
except FileNotFoundError as e:
|
2021-03-27 06:04:29 +13:00
|
|
|
print("Unable to find any Proton version")
|
|
|
|
|
2021-03-10 09:57:54 +13:00
|
|
|
self.select_proton = QComboBox()
|
|
|
|
self.select_proton.addItems(["Don't use Proton"] + self.possible_proton_wrappers)
|
|
|
|
self.select_proton.currentIndexChanged.connect(self.change_proton)
|
|
|
|
self.select_proton_widget = SettingsWidget(self.tr("Proton Wrapper"), self.select_proton)
|
2021-03-28 05:51:38 +13:00
|
|
|
self.linux_settings.layout.addWidget(self.select_proton_widget)
|
|
|
|
|
2021-03-10 09:57:54 +13:00
|
|
|
self.proton_prefix = PathEdit("x", QFileDialog.DirectoryOnly)
|
|
|
|
self.proton_prefix_accept_button = QPushButton(self.tr("Save"))
|
|
|
|
self.proton_prefix_accept_button.clicked.connect(self.update_prefix)
|
2021-03-11 23:59:12 +13:00
|
|
|
self.proton_prefix_widget = SettingsWidget(self.tr("Proton prefix"), self.proton_prefix,
|
|
|
|
self.proton_prefix_accept_button)
|
2021-03-28 05:51:38 +13:00
|
|
|
self.linux_settings.layout.addWidget(self.proton_prefix_widget)
|
2021-03-10 09:57:54 +13:00
|
|
|
|
2021-03-14 23:00:06 +13:00
|
|
|
# startparams, skip_update_check
|
2021-03-10 09:57:54 +13:00
|
|
|
|
|
|
|
self.layout.addStretch(1)
|
2021-04-09 22:08:28 +12:00
|
|
|
self.widget.setLayout(self.layout)
|
|
|
|
self.setWidget(self.widget)
|
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 != "":
|
2021-03-27 06:04:29 +13:00
|
|
|
if not self.game.app_name in self.core.lgd.config.sections():
|
2021-04-10 22:34:45 +12:00
|
|
|
self.core.lgd.config.add_section(self.game.app_name)
|
|
|
|
self.core.lgd.config.set(self.game.app_name, option, value)
|
2021-03-27 06:04:29 +13:00
|
|
|
else:
|
2021-04-10 21:27:40 +12:00
|
|
|
if self.game.app_name in self.core.lgd.config.sections() and self.core.lgd.config.get(
|
2021-04-10 22:34:45 +12:00
|
|
|
f"{self.game.app_name}", option, fallback="") != "":
|
|
|
|
self.core.lgd.config.remove_option(self.game.app_name, option)
|
2021-04-14 05:08:49 +12:00
|
|
|
if not self.core.lgd.config.get(self.game.app_name):
|
2021-03-27 06:04:29 +13:00
|
|
|
self.core.lgd.config.remove_section(self.game.app_name)
|
|
|
|
self.core.lgd.save_config()
|
|
|
|
|
2021-04-08 21:09:17 +12:00
|
|
|
def update_combobox(self, i, option):
|
2021-03-14 23:00:06 +13:00
|
|
|
if self.change:
|
|
|
|
# remove section
|
|
|
|
if i == 0:
|
|
|
|
if self.game.app_name in self.core.lgd.config.sections():
|
2021-04-08 21:09:17 +12:00
|
|
|
if self.core.lgd.config.get(f"{self.game.app_name}", option, fallback="") != "":
|
|
|
|
self.core.lgd.config.remove_option(self.game.app_name, option)
|
2021-03-14 23:00:06 +13:00
|
|
|
if self.core.lgd.config[self.game.app_name] == {}:
|
|
|
|
self.core.lgd.config.remove_section(self.game.app_name)
|
|
|
|
elif i == 1:
|
2021-04-10 22:34:45 +12:00
|
|
|
self.core.lgd.config.add_section(self.game.app_name)
|
2021-04-08 21:09:17 +12:00
|
|
|
self.core.lgd.config.set(self.game.app_name, option, "true")
|
2021-03-14 23:00:06 +13:00
|
|
|
elif i == 2:
|
2021-04-10 22:34:45 +12:00
|
|
|
self.core.lgd.config.add_section(self.game.app_name)
|
2021-04-08 21:09:17 +12:00
|
|
|
self.core.lgd.config.set(self.game.app_name, option, "false")
|
2021-03-14 23:00:06 +13:00
|
|
|
self.core.lgd.save_config()
|
|
|
|
|
2021-03-10 09:57:54 +13:00
|
|
|
def change_proton(self, i):
|
2021-03-11 23:59:12 +13:00
|
|
|
if self.change:
|
2021-03-14 23:00:06 +13:00
|
|
|
# Dont use Proton
|
2021-03-10 09:57:54 +13:00
|
|
|
if i == 0:
|
|
|
|
self.proton_prefix_widget.setVisible(False)
|
2021-03-27 06:04:29 +13:00
|
|
|
self.wrapper_widget.setVisible(True)
|
2021-03-10 09:57:54 +13:00
|
|
|
if f"{self.game.app_name}" in self.core.lgd.config.sections():
|
|
|
|
if self.core.lgd.config.get(f"{self.game.app_name}", "wrapper", fallback="") != "":
|
|
|
|
self.core.lgd.config.remove_option(self.game.app_name, "wrapper")
|
|
|
|
if self.core.lgd.config.get(f"{self.game.app_name}", "no_wine", fallback="") != "":
|
|
|
|
self.core.lgd.config.remove_option(self.game.app_name, "no_wine")
|
|
|
|
if self.core.lgd.config[self.game.app_name] == {}:
|
|
|
|
self.core.lgd.config.remove_section(self.game.app_name)
|
|
|
|
if f"{self.game.app_name}.env" in self.core.lgd.config.sections():
|
2021-03-11 23:59:12 +13:00
|
|
|
if self.core.lgd.config.get(f"{self.game.app_name}.env", "STEAM_COMPAT_DATA_PATH",
|
|
|
|
fallback="") != "":
|
2021-03-10 09:57:54 +13:00
|
|
|
self.core.lgd.config.remove_option(f"{self.game.app_name}.env", "STEAM_COMPAT_DATA_PATH")
|
|
|
|
if self.core.lgd.config[self.game.app_name + ".env"] == {}:
|
|
|
|
self.core.lgd.config.remove_section(self.game.app_name + ".env")
|
|
|
|
else:
|
|
|
|
self.proton_prefix_widget.setVisible(True)
|
2021-03-27 06:04:29 +13:00
|
|
|
self.wrapper_widget.setVisible(False)
|
2021-03-11 23:59:12 +13:00
|
|
|
wrapper = self.possible_proton_wrappers[i - 1]
|
2021-03-10 09:57:54 +13:00
|
|
|
if not self.game.app_name in self.core.lgd.config.sections():
|
|
|
|
self.core.lgd.config[self.game.app_name] = {}
|
|
|
|
if not self.game.app_name + ".env" in self.core.lgd.config.sections():
|
|
|
|
self.core.lgd.config[self.game.app_name + ".env"] = {}
|
|
|
|
self.core.lgd.config.set(self.game.app_name, "wrapper", wrapper)
|
|
|
|
self.core.lgd.config.set(self.game.app_name, "no_wine", "true")
|
2021-03-11 23:59:12 +13:00
|
|
|
self.core.lgd.config.set(self.game.app_name + ".env", "STEAM_COMPAT_DATA_PATH",
|
|
|
|
os.path.expanduser("~/.proton"))
|
2021-03-10 09:57:54 +13:00
|
|
|
self.proton_prefix.text_edit.setText(os.path.expanduser("~/.proton"))
|
2021-03-11 23:59:12 +13:00
|
|
|
|
|
|
|
# Dont use Wine
|
|
|
|
self.linux_settings.select_wine_exec.setText("")
|
2021-04-13 21:20:33 +12:00
|
|
|
self.linux_settings.save_setting(self.linux_settings.select_wine_exec, "wine_exec")
|
2021-03-11 23:59:12 +13:00
|
|
|
self.linux_settings.select_path.text_edit.setText("")
|
2021-04-13 21:20:33 +12:00
|
|
|
self.linux_settings.save_setting(self.linux_settings.select_path, "wine_prefix")
|
2021-03-11 23:59:12 +13:00
|
|
|
|
|
|
|
self.core.lgd.save_config()
|
2021-03-10 09:57:54 +13:00
|
|
|
|
|
|
|
def update_prefix(self):
|
|
|
|
text = self.proton_prefix.text()
|
|
|
|
if text == "":
|
|
|
|
text = os.path.expanduser("~/.proton")
|
|
|
|
self.proton_prefix.text_edit.setText(text)
|
|
|
|
if not os.path.exists(text):
|
|
|
|
try:
|
|
|
|
os.makedirs(text)
|
|
|
|
except PermissionError:
|
|
|
|
QMessageBox.warning(self, "Warning", self.tr("No permission to create folder"))
|
|
|
|
text = os.path.expanduser("~/.proton")
|
|
|
|
self.proton_prefix.text_edit.setText(text)
|
|
|
|
|
2021-03-11 23:59:12 +13:00
|
|
|
self.core.lgd.config.set(self.game.app_name + ".env", "STEAM_COMPAT_DATA_PATH", text)
|
2021-03-10 09:57:54 +13:00
|
|
|
self.core.lgd.save_config()
|
|
|
|
|
|
|
|
def update_game(self, app_name):
|
2021-03-11 23:59:12 +13:00
|
|
|
self.change = False
|
2021-03-10 09:57:54 +13:00
|
|
|
self.game = self.core.get_game(app_name)
|
|
|
|
self.igame = self.core.get_installed_game(app_name)
|
|
|
|
|
2021-03-14 23:00:06 +13:00
|
|
|
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_widget.setVisible(True)
|
|
|
|
else:
|
|
|
|
self.offline_widget.setVisible(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)
|
|
|
|
|
2021-03-27 06:04:29 +13:00
|
|
|
wrapper = self.core.lgd.config.get(self.game.app_name, "wrapper", fallback="")
|
|
|
|
self.wrapper.setText(wrapper)
|
|
|
|
|
2021-03-10 09:57:54 +13:00
|
|
|
self.title.setText(f"<h2>{self.game.app_title}</h2>")
|
|
|
|
if os.name != "nt":
|
|
|
|
self.linux_settings.update_game(app_name)
|
|
|
|
self.linux_settings.dxvk_widget.update_settings(app_name)
|
|
|
|
proton = self.core.lgd.config.get(f"{app_name}", "wrapper", fallback="").replace('"', "")
|
|
|
|
if proton != "":
|
2021-03-11 23:59:12 +13:00
|
|
|
self.proton_prefix_widget.setVisible(True)
|
|
|
|
self.select_proton.setCurrentText(f'"{proton.replace(" run", "")}" run')
|
2021-03-10 09:57:54 +13:00
|
|
|
proton_prefix = self.core.lgd.config.get(f"{app_name}.env", "STEAM_COMPAT_DATA_PATH",
|
2021-03-11 23:59:12 +13:00
|
|
|
fallback=self.tr(
|
|
|
|
"Please select path for proton prefix"))
|
2021-03-10 09:57:54 +13:00
|
|
|
self.proton_prefix.text_edit.setText(proton_prefix)
|
2021-03-27 06:04:29 +13:00
|
|
|
self.wrapper_widget.setVisible(False)
|
2021-03-10 09:57:54 +13:00
|
|
|
else:
|
|
|
|
self.select_proton.setCurrentIndex(0)
|
|
|
|
self.proton_prefix_widget.setVisible(False)
|
2021-03-27 06:04:29 +13:00
|
|
|
self.wrapper_widget.setVisible(True)
|
2021-04-10 21:27:40 +12:00
|
|
|
|
|
|
|
if not self.game.supports_cloud_saves:
|
|
|
|
self.cloud_sync_widget.setVisible(False)
|
|
|
|
else:
|
|
|
|
self.cloud_sync_widget.setVisible(True)
|
|
|
|
sync_cloud = self.settings.value(f"{self.game.app_name}/auto_sync_cloud", True, bool)
|
|
|
|
self.cloud_sync.setChecked(sync_cloud)
|
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-03-11 23:59:12 +13:00
|
|
|
self.change = True
|
2021-03-10 09:57:54 +13:00
|
|
|
|
|
|
|
|
|
|
|
class LinuxAppSettings(LinuxSettings):
|
|
|
|
def __init__(self, core):
|
|
|
|
super(LinuxAppSettings, self).__init__(core, "app")
|
|
|
|
|
|
|
|
def update_game(self, app_name):
|
|
|
|
self.name = app_name
|
|
|
|
self.select_path.text_edit.setText(self.core.lgd.config.get(self.name, "wine_prefix", fallback=""))
|
|
|
|
self.select_wine_exec.setText(self.core.lgd.config.get(self.name, "wine_executable", fallback=""))
|
|
|
|
self.dxvk_widget.name = app_name
|
|
|
|
self.dxvk_widget.more_settings_widget.name = app_name
|