1
0
Fork 0
mirror of synced 2024-06-22 04:20:25 +12:00

Update Wrapper settings

This commit is contained in:
Dummerle 2022-02-27 00:14:47 +01:00
parent 66c29f5a2f
commit d1df48e837
No known key found for this signature in database
GPG key ID: AB68CC59CA39F2F1
6 changed files with 359 additions and 166 deletions

View file

@ -17,6 +17,7 @@ from legendary.core import LegendaryCore
from legendary.models.game import InstalledGame, Game
from rare.components.tabs.settings.linux import LinuxSettings
from rare.components.tabs.settings.wrapper import WrapperSettings
from rare.ui.components.tabs.games.game_info.game_settings import Ui_GameSettings
from rare.utils import config_helper
from rare.utils.extra_widgets import PathEdit
@ -64,6 +65,12 @@ class GameSettings(QWidget, Ui_GameSettings):
self.core = core
self.settings = QSettings()
self.wrapper_settings = WrapperSettings()
self.launch_settings_groupbox.layout().addRow(
QLabel("Wrapper"), self.wrapper_settings
)
self.cloud_save_path_edit = PathEdit(
"",
file_type=QFileDialog.DirectoryOnly,
@ -98,10 +105,6 @@ class GameSettings(QWidget, Ui_GameSettings):
self.launch_params.textChanged.connect(
lambda x: self.save_line_edit("start_params", x)
)
self.wrapper.textChanged.connect(lambda x: self.save_line_edit("wrapper", x))
self.override_exe_edit.textChanged.connect(
lambda x: self.save_line_edit("override_exe", x)
)
if platform.system() != "Windows":
self.possible_proton_wrappers = find_proton_wrappers()
@ -218,9 +221,9 @@ class GameSettings(QWidget, Ui_GameSettings):
def change_proton(self, i):
if self.change:
# Dont use Proton
# First combo box entry: Don't use Proton
if i == 0:
config_helper.remove_option(self.game.app_name, "wrapper")
self.wrapper_settings.delete_wrapper("proton")
config_helper.remove_option(self.game.app_name, "no_wine")
config_helper.remove_option(f"{self.game.app_name}.env", "STEAM_COMPAT_DATA_PATH")
config_helper.remove_option(f"{self.game.app_name}.env", "STEAM_COMPAT_CLIENT_INSTALL_PATH")
@ -228,20 +231,14 @@ class GameSettings(QWidget, Ui_GameSettings):
self.proton_prefix.setEnabled(False)
# lk: TODO: This has to be fixed properly.
# lk: It happens because of the widget update. Mask it for now behind disabling the save button
self.wrapper.setText(
self.core.lgd.config.get(
f"{self.game.app_name}", "wrapper", fallback=""
)
)
self.wrapper.setEnabled(True)
self.linux_settings.wine_groupbox.setEnabled(True)
else:
self.proton_prefix.setEnabled(True)
self.wrapper.setEnabled(False)
self.linux_settings.wine_groupbox.setEnabled(False)
wrapper = self.possible_proton_wrappers[i - 1]
config_helper.add_option(self.game.app_name, "wrapper", wrapper)
self.wrapper_settings.add_wrapper(wrapper)
config_helper.add_option(self.game.app_name, "no_wine", "true")
config_helper.add_option(
f"{self.game.app_name}.env",
@ -307,10 +304,8 @@ class GameSettings(QWidget, Ui_GameSettings):
else:
self.skip_update.setCurrentIndex(0)
wrapper = self.core.lgd.config.get(self.game.app_name, "wrapper", fallback="")
self.wrapper.setText(wrapper)
self.game_title.setText(f"<h2>{self.game.app_title}</h2>")
self.wrapper_settings.load_settings(app_name)
if platform.system() != "Windows":
self.linux_settings.update_game(app_name)
@ -319,9 +314,7 @@ class GameSettings(QWidget, Ui_GameSettings):
else:
self.linux_settings_widget.setVisible(True)
proton = self.core.lgd.config.get(
f"{app_name}", "wrapper", fallback=""
).replace('"', "")
proton = self.wrapper_settings.extra_wrappers.get("proton", "").replace('"', "")
if proton and "proton" in proton:
self.proton_prefix.setEnabled(True)
self.proton_wrapper.setCurrentText(
@ -333,12 +326,10 @@ class GameSettings(QWidget, Ui_GameSettings):
fallback=self.tr("Please select path for proton prefix"),
)
self.proton_prefix.setText(proton_prefix)
self.wrapper.setEnabled(False)
self.linux_settings.wine_groupbox.setEnabled(False)
else:
self.proton_wrapper.setCurrentIndex(0)
self.proton_prefix.setEnabled(False)
self.wrapper.setEnabled(True)
self.linux_settings.wine_groupbox.setEnabled(True)
if not self.game.supports_cloud_saves:

View file

@ -0,0 +1,113 @@
import re
from logging import getLogger
from typing import Dict
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QGroupBox, QHBoxLayout, QLabel, QPushButton, QInputDialog, QFrame, QWidget
from rare import shared
from rare.ui.components.tabs.settings.wrapper import Ui_WrapperSettings
from rare.utils import config_helper
from rare.utils.extra_widgets import FlowLayout
from rare.utils.utils import icon
logger = getLogger("Wrapper Settings")
extra_wrapper_regex = {
"proton": "\".*proton\" run", # proton
"mangohud": "mangohud" # mangohud
}
class WrapperWidget(QGroupBox):
delete_wrapper = pyqtSignal(str)
def __init__(self, text: str):
super(WrapperWidget, self).__init__()
self.setLayout(QHBoxLayout())
self.text = text
self.layout().addWidget(QLabel(text))
self.delete_button = QPushButton(icon("ei.remove"), "")
self.layout().addWidget(self.delete_button)
self.delete_button.clicked.connect(self.delete)
def delete(self):
self.delete_wrapper.emit(self.text)
class WrapperSettings(QGroupBox, Ui_WrapperSettings):
wrappers: Dict[str, WrapperWidget] = dict()
extra_wrappers: Dict[str, str] = dict()
app_name: str
def __init__(self):
super(WrapperSettings, self).__init__("Wrapper")
self.setupUi(self)
self.widgets.setLayout(FlowLayout())
self.core = shared.core
self.add_button.clicked.connect(self.add_button_pressed)
def get_wrapper_string(self):
return " ".join(list(self.extra_wrappers.values()) + list(self.wrappers.keys()))
def add_button_pressed(self):
wrapper, done = QInputDialog.getText(self, "Input Dialog", self.tr("Insert name of wrapper"))
if not done:
return
self.add_wrapper(wrapper)
def add_wrapper(self, text: str):
for key, extra_wrapper in extra_wrapper_regex.items():
if re.match(extra_wrapper, text):
self.extra_wrappers[key] = text
self.save()
return
widget = WrapperWidget(text)
widget.delete_wrapper.connect(self.delete_wrapper)
self.widgets.layout().addWidget(widget)
self.wrappers[text] = widget
self.widget_stack.setCurrentIndex(0)
# flow layout bug
self.widgets.update()
self.save()
def delete_wrapper(self, text: str):
widget = self.wrappers.get(text, None)
if not widget and self.extra_wrappers.get(text, None):
self.extra_wrappers.pop(text)
elif widget:
widget.deleteLater()
self.wrappers.pop(text)
if len(self.wrappers) == 0:
self.widget_stack.setCurrentIndex(1)
self.save()
def save(self):
config_helper.add_option(self.app_name, "wrapper", self.get_wrapper_string())
def load_settings(self, app_name):
self.app_name = app_name
for i in self.wrappers.values():
i.deleteLater()
self.wrappers.clear()
self.extra_wrappers.clear()
wrapper_config = self.core.lgd.config.get(app_name, "wrapper", fallback="")
pattern = re.compile(r'''((?:[^ "']|"[^"]*"|'[^']*')+)''')
wrappers = pattern.split(wrapper_config)[1::2]
if not wrappers:
self.widget_stack.setCurrentIndex(1)
return
else:
self.widget_stack.setCurrentIndex(0)
for wrapper in wrappers:
if wrapper.strip('"').endswith("proton"):
wrapper = f"{wrapper} run"
if wrapper == "run":
continue
self.add_wrapper(wrapper)

View file

@ -80,19 +80,12 @@ class Ui_GameSettings(object):
self.launch_params.setMinimumSize(QtCore.QSize(400, 0))
self.launch_params.setObjectName("launch_params")
self.launch_settings_layout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.launch_params)
self.wrapper_label = QtWidgets.QLabel(self.launch_settings_group)
self.wrapper_label.setObjectName("wrapper_label")
self.launch_settings_layout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.wrapper_label)
self.wrapper = QtWidgets.QLineEdit(self.launch_settings_group)
self.wrapper.setMinimumSize(QtCore.QSize(400, 0))
self.wrapper.setObjectName("wrapper")
self.launch_settings_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.wrapper)
self.override_exe_label = QtWidgets.QLabel(self.launch_settings_group)
self.override_exe_label.setObjectName("override_exe_label")
self.launch_settings_layout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.override_exe_label)
self.launch_settings_layout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.override_exe_label)
self.override_exe_edit = QtWidgets.QLineEdit(self.launch_settings_group)
self.override_exe_edit.setObjectName("override_exe_edit")
self.launch_settings_layout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.override_exe_edit)
self.launch_settings_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.override_exe_edit)
self.game_settings_contents_layout.addWidget(self.launch_settings_group)
self.cloud_group = QtWidgets.QGroupBox(self.game_settings_contents)
self.cloud_group.setObjectName("cloud_group")
@ -157,8 +150,6 @@ class Ui_GameSettings(object):
self.offline.setItemText(2, _translate("GameSettings", "No"))
self.launch_params_label.setText(_translate("GameSettings", "Launch parameters"))
self.launch_params.setPlaceholderText(_translate("GameSettings", "parameters"))
self.wrapper_label.setText(_translate("GameSettings", "Wrapper"))
self.wrapper.setPlaceholderText(_translate("GameSettings", "e.g. optirun"))
self.override_exe_label.setText(_translate("GameSettings", "Override Exe"))
self.override_exe_edit.setPlaceholderText(_translate("GameSettings", "Relative path to launch executable"))
self.cloud_group.setTitle(_translate("GameSettings", "Cloud Saves"))

View file

@ -65,141 +65,121 @@
</property>
<item>
<widget class="QGroupBox" name="launch_settings_group">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Launch Settings</string>
</property>
<layout class="QFormLayout" name="launch_settings_layout">
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="skip_update_label">
<property name="text">
<string>Skip update check</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="skip_update">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Default</string>
</property>
<property name="title">
<string>Launch Settings</string>
</item>
<item>
<property name="text">
<string>Yes</string>
</property>
<layout class="QFormLayout" name="launch_settings_layout">
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="skip_update_label">
<property name="text">
<string>Skip update check</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="skip_update">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Default</string>
</property>
</item>
<item>
<property name="text">
<string>Yes</string>
</property>
</item>
<item>
<property name="text">
<string>No</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="offline_label">
<property name="text">
<string>Offline mode</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="offline">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Default</string>
</property>
</item>
<item>
<property name="text">
<string>Yes</string>
</property>
</item>
<item>
<property name="text">
<string>No</string>
</property>
</item>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="launch_params_label">
<property name="text">
<string>Launch parameters</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="launch_params">
<property name="minimumSize">
<size>
<width>400</width>
<height>0</height>
</size>
</property>
<property name="placeholderText">
<string>parameters</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="wrapper_label">
<property name="text">
<string>Wrapper</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="wrapper">
<property name="minimumSize">
<size>
<width>400</width>
<height>0</height>
</size>
</property>
<property name="placeholderText">
<string>e.g. optirun</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="override_exe_label">
<property name="text">
<string>Override Exe</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="override_exe_edit">
<property name="placeholderText">
<string>Relative path to launch executable</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
</item>
<item>
<property name="text">
<string>No</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="offline_label">
<property name="text">
<string>Offline mode</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="offline">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Default</string>
</property>
</item>
<item>
<property name="text">
<string>Yes</string>
</property>
</item>
<item>
<property name="text">
<string>No</string>
</property>
</item>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="launch_params_label">
<property name="text">
<string>Launch parameters</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="launch_params">
<property name="minimumSize">
<size>
<width>400</width>
<height>0</height>
</size>
</property>
<property name="placeholderText">
<string>parameters</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="override_exe_label">
<property name="text">
<string>Override Exe</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="override_exe_edit">
<property name="placeholderText">
<string>Relative path to launch executable</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="cloud_group">
<property name="title">
<string>Cloud Saves</string>

View file

@ -0,0 +1,62 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'rare/ui/components/tabs/settings/wrapper.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_WrapperSettings(object):
def setupUi(self, WrapperSettings):
WrapperSettings.setObjectName("WrapperSettings")
WrapperSettings.resize(435, 123)
WrapperSettings.setWindowTitle("GroupBox")
self.horizontalLayout = QtWidgets.QHBoxLayout(WrapperSettings)
self.horizontalLayout.setObjectName("horizontalLayout")
self.widget_stack = QtWidgets.QStackedWidget(WrapperSettings)
self.widget_stack.setObjectName("widget_stack")
self.widgets = QtWidgets.QWidget()
self.widgets.setObjectName("widgets")
self.widget_stack.addWidget(self.widgets)
self.label_page = QtWidgets.QWidget()
self.label_page.setObjectName("label_page")
self.verticalLayout = QtWidgets.QVBoxLayout(self.label_page)
self.verticalLayout.setObjectName("verticalLayout")
self.no_wrapper_label = QtWidgets.QLabel(self.label_page)
self.no_wrapper_label.setObjectName("no_wrapper_label")
self.verticalLayout.addWidget(self.no_wrapper_label)
self.widget_stack.addWidget(self.label_page)
self.horizontalLayout.addWidget(self.widget_stack)
self.add_button = QtWidgets.QPushButton(WrapperSettings)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.add_button.sizePolicy().hasHeightForWidth())
self.add_button.setSizePolicy(sizePolicy)
self.add_button.setObjectName("add_button")
self.horizontalLayout.addWidget(self.add_button)
self.retranslateUi(WrapperSettings)
self.widget_stack.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(WrapperSettings)
def retranslateUi(self, WrapperSettings):
_translate = QtCore.QCoreApplication.translate
WrapperSettings.setTitle(_translate("WrapperSettings", "Wrapper"))
self.no_wrapper_label.setText(_translate("WrapperSettings", "No wrapper added"))
self.add_button.setText(_translate("WrapperSettings", "Add Wrapper"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
WrapperSettings = QtWidgets.QGroupBox()
ui = Ui_WrapperSettings()
ui.setupUi(WrapperSettings)
WrapperSettings.show()
sys.exit(app.exec_())

View file

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>WrapperSettings</class>
<widget class="QGroupBox" name="WrapperSettings">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>435</width>
<height>123</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">GroupBox</string>
</property>
<property name="title">
<string>Wrapper</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QStackedWidget" name="widget_stack">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="widgets"/>
<widget class="QWidget" name="label_page">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="no_wrapper_label">
<property name="text">
<string>No wrapper added</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QPushButton" name="add_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Add Wrapper</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>