1
0
Fork 0
mirror of synced 2024-06-26 18:20:50 +12:00
Rare/rare/components/tabs/settings/widgets/proton.py

116 lines
4.3 KiB
Python
Raw Normal View History

2022-03-15 07:21:03 +13:00
import os
from logging import getLogger
from pathlib import Path
from typing import Tuple
from PyQt5.QtCore import pyqtSignal
2022-03-15 07:21:03 +13:00
from PyQt5.QtWidgets import QGroupBox, QFileDialog
from rare.components.tabs.settings import LinuxSettings
from rare.shared import LegendaryCoreSingleton
2022-03-15 07:21:03 +13:00
from rare.ui.components.tabs.settings.proton import Ui_ProtonSettings
from rare.utils import config_helper, proton
from rare.widgets.indicator_edit import PathEdit, IndicatorReasonsCommon
from .wrapper import WrapperSettings
2022-03-15 07:21:03 +13:00
logger = getLogger("Proton")
2022-03-29 10:14:11 +13:00
class ProtonSettings(QGroupBox):
# str: option key
environ_changed = pyqtSignal(str)
2022-03-15 07:21:03 +13:00
app_name: str
changeable = True
2022-03-15 07:21:03 +13:00
def __init__(self, linux_settings: LinuxSettings, wrapper_settings: WrapperSettings):
super(ProtonSettings, self).__init__()
self.ui = Ui_ProtonSettings()
self.ui.setupUi(self)
2022-03-15 07:21:03 +13:00
self._linux_settings = linux_settings
self._wrapper_settings = wrapper_settings
self.core = LegendaryCoreSingleton()
self.possible_proton_combos = proton.find_proton_combos()
2022-03-15 07:21:03 +13:00
self.ui.proton_combo.addItems(self.possible_proton_combos)
self.ui.proton_combo.currentIndexChanged.connect(self.change_proton)
2022-03-15 07:21:03 +13:00
self.proton_prefix = PathEdit(
file_mode=QFileDialog.DirectoryOnly,
2022-03-15 07:21:03 +13:00
edit_func=self.proton_prefix_edit,
save_func=self.proton_prefix_save,
placeholder=self.tr("Please select path for proton prefix")
)
self.ui.prefix_layout.addWidget(self.proton_prefix)
2022-03-15 07:21:03 +13:00
def change_proton(self, i):
if not self.changeable:
return
# First combo box entry: Don't use Proton
if i == 0:
self._wrapper_settings.delete_wrapper("proton")
config_helper.remove_option(self.app_name, "no_wine")
config_helper.remove_option(f"{self.app_name}.env", "STEAM_COMPAT_DATA_PATH")
self.environ_changed.emit("STEAM_COMPAT_DATA_PATH")
config_helper.remove_option(f"{self.app_name}.env", "STEAM_COMPAT_CLIENT_INSTALL_PATH")
self.environ_changed.emit("STEAM_COMPAT_CLIENT_INSTALL_PATH")
self.proton_prefix.setEnabled(False)
self.proton_prefix.setText("")
self._linux_settings.ui.wine_groupbox.setEnabled(True)
else:
self.proton_prefix.setEnabled(True)
self._linux_settings.ui.wine_groupbox.setEnabled(False)
wrapper = self.possible_proton_combos[i - 1]
self._wrapper_settings.add_wrapper(wrapper)
config_helper.add_option(self.app_name, "no_wine", "true")
config_helper.add_option(
f"{self.app_name}.env",
"STEAM_COMPAT_CLIENT_INSTALL_PATH",
str(Path.home().joinpath(".steam", "steam"))
)
self.environ_changed.emit("STEAM_COMPAT_CLIENT_INSTALL_PATH")
self.proton_prefix.setText(os.path.expanduser("~/.proton"))
# Don't use Wine
self._linux_settings.wine_exec.setText("")
self._linux_settings.wine_prefix.setText("")
2022-03-15 07:21:03 +13:00
config_helper.save_config()
def proton_prefix_edit(self, text: str) -> Tuple[bool, str, int]:
2022-03-15 07:21:03 +13:00
if not text:
return False, text, IndicatorReasonsCommon.EMPTY
2022-03-15 07:21:03 +13:00
parent_dir = os.path.dirname(text)
return os.path.exists(parent_dir), text, IndicatorReasonsCommon.DIR_NOT_EXISTS
2022-03-15 07:21:03 +13:00
def proton_prefix_save(self, text: str):
if not text:
return
2022-03-15 07:21:03 +13:00
config_helper.add_option(
f"{self.app_name}.env", "STEAM_COMPAT_DATA_PATH", text
)
self.environ_changed.emit("STEAM_COMPAT_DATA_PATH")
2022-03-15 07:21:03 +13:00
config_helper.save_config()
def load_settings(self, app_name: str, proton: str):
self.changeable = False
self.app_name = app_name
proton = proton.replace('"', "")
self.proton_prefix.setEnabled(bool(proton))
if proton:
self.ui.proton_combo.setCurrentText(
f'"{proton.replace(" run", "")}" run'
)
else:
self.ui.proton_combo.setCurrentIndex(0)
proton_prefix = self.core.lgd.config.get(
f"{app_name}.env",
"STEAM_COMPAT_DATA_PATH",
fallback="",
)
self.proton_prefix.setText(proton_prefix)
self.changeable = True