Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow wrappers to be enabled/disabled per-game without removing them #518

Draft
wants to merge 8 commits into
base: main
Choose a base branch
from
2 changes: 1 addition & 1 deletion .github/workflows/_job_cx-freeze-appimage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
run: |
sudo apt update
sudo apt install patchelf fakeroot
pip3 install --upgrade cx_freeze
pip3 install --upgrade cx_freeze ruff
- name: Install target dependencies
run: |
pip3 install -r misc/requirements.in
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/_job_cx-freeze-dmg.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
architecture: ${{ matrix.pyarch }}
- name: Install build dependencies
run: |
pip3 install --upgrade cx_freeze
pip3 install --upgrade cx_freeze ruff
- name: Install target dependencies
run: |
pip3 install -r misc/requirements.in
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/_job_cx-freeze-msi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
architecture: x64
- name: Install build dependencies
run: |
pip3 install --upgrade cx_freeze
pip3 install --upgrade cx_freeze ruff
- name: Install target dependencies
run: |
pip3 install -r misc/requirements.in
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/_job_nuitka-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
architecture: x64
- name: Install build dependencies
run: |
pip3 install nuitka
pip3 install nuitka ruff
- name: Install target dependencies
run: |
pip3 install -r misc/requirements.in
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/_job_nuitka-macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
architecture: ${{ matrix.pyarch }}
- name: Install build dependencies
run: |
pip3 install nuitka
pip3 install nuitka ruff
- name: Install target dependencies
run: |
pip3 install -r misc/requirements.in
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/_job_nuitka-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
architecture: x64
- name: Install build dependencies
run: |
pip3 install nuitka
pip3 install nuitka ruff
- name: Install target dependencies
run: |
pip3 install -r misc/requirements.in
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/_job_pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
- name: Install build dependencies
run: |
pip3 install --upgrade pip
pip3 install twine setuptools setuptools-scm PySide6-Essentials
pip3 install twine setuptools setuptools-scm ruff PySide6-Essentials
- name: Prepare
shell: bash
env:
Expand Down
17 changes: 12 additions & 5 deletions rare/components/tabs/library/details/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from PySide6.QtWidgets import QCheckBox, QFormLayout

from rare.components.tabs.settings.compat import CompatSettingsBase
from rare.components.tabs.settings.widgets.overlay import DxvkOverlaySettings, DxvkConfigSettings
from rare.components.tabs.settings.widgets.overlay import DxvkHudSettings, DxvkConfigSettings, DxvkNvapiDrsSettings
from rare.components.tabs.settings.widgets.runner import RunnerSettingsBase
from rare.components.tabs.settings.widgets.wine import WineSettings
from rare.models.game import RareGame
Expand Down Expand Up @@ -87,7 +87,7 @@ def load_settings(self, rgame: RareGame):
self.ctool.load_settings(rgame.app_name)


class LocalDxvkOverlaySettings(DxvkOverlaySettings):
class LocalDxvkHudSettings(DxvkHudSettings):
def load_settings(self, app_name: str):
self.app_name = app_name

Expand All @@ -96,21 +96,27 @@ class LocalDxvkConfigSettings(DxvkConfigSettings):
def load_settings(self, app_name: str):
self.app_name = app_name

class LocalDxvkNvapiDrsSettings(DxvkNvapiDrsSettings):
def load_settings(self, app_name: str):
self.app_name = app_name


class LocalCompatSettings(CompatSettingsBase):
def __init__(self, parent=None):
if pf.system() in {"Linux", "FreeBSD"}:
super(LocalCompatSettings, self).__init__(
dxvk_overlay_widget=LocalDxvkOverlaySettings,
dxvk_hud_widget=LocalDxvkHudSettings,
dxvk_config_widget=LocalDxvkConfigSettings,
dxvk_nvapi_drs_widget=LocalDxvkNvapiDrsSettings,
runner_widget=LocalRunnerSettings,
mangohud_widget=LocalMangoHudSettings,
parent=parent
)
else:
super(LocalCompatSettings, self).__init__(
dxvk_overlay_widget=LocalDxvkOverlaySettings,
dxvk_hud_widget=LocalDxvkHudSettings,
dxvk_config_widget=LocalDxvkConfigSettings,
dxvk_nvapi_drs_widget=LocalDxvkNvapiDrsSettings,
runner_widget=LocalRunnerSettings,
parent=parent
)
Expand All @@ -122,5 +128,6 @@ def load_settings(self, rgame: RareGame):
self.runner.load_settings(rgame)
if self.mangohud:
self.mangohud.load_settings(rgame.app_name)
self.dxvk_overlay.load_settings(rgame.app_name)
self.dxvk_hud.load_settings(rgame.app_name)
self.dxvk_config.load_settings(rgame.app_name)
self.dxvk_nvapi_drs.load_settings(rgame.app_name)
8 changes: 4 additions & 4 deletions rare/components/tabs/library/details/game.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ def showEvent(self, a0: QShowEvent):
@Slot(int)
def __skip_update_changed(self, index):
data = self.skip_update_combo.itemData(index, Qt.ItemDataRole.UserRole)
config.save_option(self.app_name, "skip_update_check", data)
config.adjust_option(self.app_name, "skip_update_check", data)

def __override_exe_edit_callback(self, path: str) -> Tuple[bool, str, int]:
if not path or self.igame is None:
Expand All @@ -114,15 +114,15 @@ def __override_exe_edit_callback(self, path: str) -> Tuple[bool, str, int]:
return True, path, IndicatorReasonsCommon.VALID

def __override_exe_save_callback(self, path: str):
config.save_option(self.app_name, "override_exe", path)
config.adjust_option(self.app_name, "override_exe", path)

@Slot(int)
def __offline_changed(self, index):
data = self.skip_update_combo.itemData(index, Qt.ItemDataRole.UserRole)
config.save_option(self.app_name, "offline", data)
config.adjust_option(self.app_name, "offline", data)

def __launch_params_changed(self, value) -> None:
config.save_option(self.app_name, "start_params", value)
config.adjust_option(self.app_name, "start_params", value)

def load_settings(self, rgame: RareGame):
self.game = rgame.game
Expand Down
21 changes: 14 additions & 7 deletions rare/components/tabs/settings/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from rare.shared import LegendaryCoreSingleton
from rare.utils import config_helper as config
from rare.widgets.side_tab import SideTabContents
from .widgets.overlay import DxvkOverlaySettings, DxvkConfigSettings
from .widgets.overlay import DxvkHudSettings, DxvkConfigSettings, DxvkNvapiDrsSettings
from .widgets.runner import RunnerSettingsBase, RunnerSettingsType
from .widgets.wine import WineSettings

Expand All @@ -28,8 +28,9 @@ class CompatSettingsBase(QWidget, SideTabContents):

def __init__(
self,
dxvk_overlay_widget: Type[DxvkOverlaySettings],
dxvk_hud_widget: Type[DxvkHudSettings],
dxvk_config_widget: Type[DxvkConfigSettings],
dxvk_nvapi_drs_widget: Type[DxvkNvapiDrsSettings],
runner_widget: Type['RunnerSettingsType'],
mangohud_widget: Type['MangoHudSettings'] = None,
parent=None
Expand All @@ -44,21 +45,25 @@ def __init__(
self.runner.environ_changed.connect(self.environ_changed)
self.runner.tool_enabled.connect(self.tool_enabled)

self.dxvk_overlay = dxvk_overlay_widget(self)
self.dxvk_overlay.environ_changed.connect(self.environ_changed)
self.dxvk_hud = dxvk_hud_widget(self)
self.dxvk_hud.environ_changed.connect(self.environ_changed)

self.dxvk_config = dxvk_config_widget(self)
self.dxvk_config.environ_changed.connect(self.environ_changed)

self.dxvk_nvapi_drs = dxvk_nvapi_drs_widget(self)
self.dxvk_nvapi_drs.environ_changed.connect(self.environ_changed)

self.mangohud = False
if mangohud_widget is not None:
self.mangohud = mangohud_widget(self)
self.mangohud.environ_changed.connect(self.environ_changed)

self.main_layout = QVBoxLayout(self)
self.main_layout.addWidget(self.runner)
self.main_layout.addWidget(self.dxvk_overlay)
self.main_layout.addWidget(self.dxvk_hud)
self.main_layout.addWidget(self.dxvk_config)
self.main_layout.addWidget(self.dxvk_nvapi_drs)
if mangohud_widget is not None:
self.main_layout.addWidget(self.mangohud)
self.main_layout.setAlignment(Qt.AlignmentFlag.AlignTop)
Expand All @@ -82,16 +87,18 @@ class GlobalCompatSettings(CompatSettingsBase):
def __init__(self, parent=None):
if pf.system() in {"Linux", "FreeBSD"}:
super(GlobalCompatSettings, self).__init__(
dxvk_overlay_widget=DxvkOverlaySettings,
dxvk_hud_widget=DxvkHudSettings,
dxvk_config_widget=DxvkConfigSettings,
dxvk_nvapi_drs_widget=DxvkNvapiDrsSettings,
runner_widget=GlobalRunnerSettings,
mangohud_widget=MangoHudSettings,
parent=parent
)
else:
super(GlobalCompatSettings, self).__init__(
dxvk_overlay_widget=DxvkOverlaySettings,
dxvk_hud_widget=DxvkHudSettings,
dxvk_config_widget=DxvkConfigSettings,
dxvk_nvapi_drs_widget=DxvkNvapiDrsSettings,
runner_widget=GlobalRunnerSettings,
parent=parent
)
7 changes: 5 additions & 2 deletions rare/components/tabs/settings/widgets/env_vars_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,18 @@ def __init__(self, core: LegendaryCore, parent=None):
self.__readonly = {
"DXVK_HUD",
"DXVK_CONFIG",
"DXVK_NVAPI_DRS_SETTINGS",
"MANGOHUD",
"MANGOHUD_CONFIG",
}
self.__readonly.update(get_wine_environment().keys())
if platform.system() in {"Linux", "FreeBSD"}:
self.__readonly.update(get_steam_environment().keys())
self.__readonly.update({
"__GL_SHADER_DISK_CACHE_PATH", "MESA_SHADER_CACHE_DIR",
"DXVK_STATE_CACHE_PATH", "VKD3D_SHADER_CACHE_PATH",
"__GL_SHADER_DISK_CACHE_PATH",
"MESA_SHADER_CACHE_DIR",
"DXVK_STATE_CACHE_PATH",
"VKD3D_SHADER_CACHE_PATH",
})
self.__default: str = "default"
self.__appname: str = None
Expand Down
6 changes: 3 additions & 3 deletions rare/components/tabs/settings/widgets/launch.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def tool_enabled(self):
@staticmethod
def __prelaunch_cmd_edit_callback(text: str) -> Tuple[bool, str, int]:
if not text.strip():
return True, text, IndicatorReasonsCommon.VALID
return True, text, IndicatorReasonsCommon.UNDEFINED
if not os.path.isfile(text) and not shutil.which(text):
return False, text, IndicatorReasonsCommon.FILE_NOT_EXISTS
else:
Expand All @@ -100,12 +100,12 @@ def __prelauch_check_changed(self):
def __prelaunch_changed(self):
command = self.prelaunch_cmd.text().strip()
if not command:
config.save_option(self.app_name, "pre_launch_command", command)
config.adjust_option(self.app_name, "pre_launch_command", command)
config.remove_option(self.app_name, "pre_launch_wait")
return
command = shlex.quote(command)
arguments = self.prelaunch_args.text().strip()
config.save_option(self.app_name, "pre_launch_command", " ".join([command, arguments]))
config.adjust_option(self.app_name, "pre_launch_command", " ".join([command, arguments]))


LaunchSettingsType = TypeVar("LaunchSettingsType", bound=LaunchSettingsBase)
41 changes: 24 additions & 17 deletions rare/components/tabs/settings/widgets/overlay.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,10 +122,10 @@ def __init__(self, parent=None):
self.ui = Ui_OverlaySettings()
self.ui.setupUi(self)

self.ui.show_overlay_combo.addItem(self.tr("Global"), ActivationStates.GLOBAL)
self.ui.show_overlay_combo.addItem(self.tr("Disabled"), ActivationStates.DISABLED)
self.ui.show_overlay_combo.addItem(self.tr("Enabled (defaults)"), ActivationStates.DEFAULTS)
self.ui.show_overlay_combo.addItem(self.tr("Enabled (custom)"), ActivationStates.CUSTOM)
self.ui.overlay_state_combo.addItem(self.tr("Global"), ActivationStates.GLOBAL)
self.ui.overlay_state_combo.addItem(self.tr("Disabled"), ActivationStates.DISABLED)
self.ui.overlay_state_combo.addItem(self.tr("Enabled (defaults)"), ActivationStates.DEFAULTS)
self.ui.overlay_state_combo.addItem(self.tr("Enabled (custom)"), ActivationStates.CUSTOM)

self.envvar: Union[str, None] = None
self.force_disabled: Union[str, None] = None
Expand All @@ -138,12 +138,13 @@ def __init__(self, parent=None):
# self.values: Dict[str, Union[OverlayLineEdit, OverlayComboBox]] = {}

self.ui.options_group.setTitle(self.tr("Custom options"))
self.ui.show_overlay_combo.currentIndexChanged.connect(self.update_settings)
self.ui.overlay_state_combo.currentIndexChanged.connect(self.update_settings)

def setupWidget(
self,
grid_map: List[OverlayCheckBox],
form_map: List[Tuple[Union[OverlayLineEdit, OverlayComboBox], str]],
label: str,
envvar: str,
force_disabled: str,
force_defaults: str,
Expand All @@ -154,6 +155,8 @@ def setupWidget(
self.force_defaults = force_defaults
self.separator = separator

self.ui.overlay_state_label.setText(label)

for i, widget in enumerate(grid_map):
widget.setParent(self.ui.options_group)
self.ui.options_grid.addWidget(widget, i // 4, i % 4)
Expand All @@ -173,7 +176,7 @@ def update_settings_override(self, state: ActivationStates):
raise NotImplementedError

def update_settings(self):
current_state = self.ui.show_overlay_combo.currentData(Qt.ItemDataRole.UserRole)
current_state = self.ui.overlay_state_combo.currentData(Qt.ItemDataRole.UserRole)
self.ui.options_group.setEnabled(current_state == ActivationStates.CUSTOM)

if current_state == ActivationStates.GLOBAL:
Expand All @@ -198,7 +201,7 @@ def update_settings(self):
self.update_settings_override(current_state)

def setCurrentState(self, state: ActivationStates):
self.ui.show_overlay_combo.setCurrentIndex(self.ui.show_overlay_combo.findData(state, Qt.ItemDataRole.UserRole))
self.ui.overlay_state_combo.setCurrentIndex(self.ui.overlay_state_combo.findData(state, Qt.ItemDataRole.UserRole))
self.ui.options_group.setEnabled(state == ActivationStates.CUSTOM)

def showEvent(self, a0: QShowEvent):
Expand Down Expand Up @@ -237,9 +240,9 @@ def showEvent(self, a0: QShowEvent):
return super().showEvent(a0)


class DxvkOverlaySettings(OverlaySettings):
class DxvkHudSettings(OverlaySettings):
def __init__(self, parent=None):
super(DxvkOverlaySettings, self).__init__(parent=parent)
super(DxvkHudSettings, self).__init__(parent=parent)
self.setTitle(self.tr("DXVK HUD"))
grid = [
OverlayCheckBox("fps", self.tr("FPS")),
Expand All @@ -259,7 +262,7 @@ def __init__(self, parent=None):
(OverlayNumberInput("opacity", 1.0), self.tr("Opacity")),

]
self.setupWidget(grid, form, envvar="DXVK_HUD", force_disabled="0", force_defaults="1", separator=",")
self.setupWidget(grid, form, label=self.tr("Show HUD"), envvar="DXVK_HUD", force_disabled="0", force_defaults="1", separator=",")

def update_settings_override(self, state: ActivationStates):
pass
Expand All @@ -286,7 +289,7 @@ def __init__(self, parent=None):
(OverlaySelectInput("dxvk.tearFree", dxvk_config_trinary), "dxvk.tearFree"),

]
self.setupWidget(grid, form, envvar="DXVK_CONFIG", force_disabled="0", force_defaults="", separator=";")
self.setupWidget(grid, form, label=self.tr("Mode"), envvar="DXVK_CONFIG", force_disabled="0", force_defaults="", separator=";")

def update_settings_override(self, state: ActivationStates):
pass
Expand All @@ -313,13 +316,17 @@ def preset_range(start:str, end:str) -> Tuple[Tuple, ...]:
("default", "default"),
)
grid = [
OverlayCheckBox("ngx_dlss_sr_override", self.tr("Override Super Resolution"), values=("off", "on")),
OverlayCheckBox("ngx_dlss_sr_override", self.tr("Super Resolution override"), values=("off", "on")),
OverlayCheckBox("ngx_dlss_rr_override", self.tr("Ray Reconstruction override"), values=("off", "on")),
OverlayCheckBox("ngx_dlss_fg_override", self.tr("Frame Generation override"), values=("off", "on")),
]
form = [
(OverlaySelectInput("ngx_dlss_rr_override_render_preset_selection", ngx_rr_presets), "Override Ray Reconstruction Preset"),
(OverlaySelectInput("ngx_dlss_sr_override_render_preset_selection", ngx_sr_presets), "Override Super Resolution Preset"),
(OverlaySelectInput("ngx_dlss_sr_override_render_preset_selection", ngx_sr_presets),
"Super Resolution preset"),
(OverlaySelectInput("ngx_dlss_rr_override_render_preset_selection", ngx_rr_presets),
"Ray Reconstruction preset"),
]
self.setupWidget(grid, form, envvar="DXVK_NVAPI_DRS_SETTINGS", force_disabled="0", force_defaults="", separator=",")
self.setupWidget(grid, form, label=self.tr("Mode"), envvar="DXVK_NVAPI_DRS_SETTINGS", force_disabled="0", force_defaults="", separator=",")

def update_settings_override(self, state: ActivationStates):
pass
Expand Down Expand Up @@ -381,7 +388,7 @@ def __init__(self, parent=None):
(OverlayNumberInput("font_size", 24), self.tr("Font size")),
(OverlaySelectInput("position", mangohud_position), self.tr("Position")),
]
self.setupWidget(grid, form, "MANGOHUD_CONFIG", "no_display", "read_cfg", separator=",")
self.setupWidget(grid, form, label=self.tr("Show HUD"), envvar="MANGOHUD_CONFIG", force_disabled="no_display", force_defaults="read_cfg", separator=",")

def showEvent(self, a0: QShowEvent):
if a0.spontaneous():
Expand Down Expand Up @@ -428,7 +435,7 @@ def get_envvar(x, y, fallback):
app = QApplication(sys.argv)
dlg = QDialog()

dxvk_hud = DxvkOverlaySettings(dlg)
dxvk_hud = DxvkHudSettings(dlg)
dxvk_cfg = DxvkConfigSettings(dlg)
dxvk_nvapi_drs = DxvkNvapiDrsSettings(dlg)
mangohud = MangoHudSettings(dlg)
Expand Down
Loading