From 58c9e692317b08bc8c19b9b8fe49857e3f91230f Mon Sep 17 00:00:00 2001 From: Dummerle <44114474+Dummerle@users.noreply.github.com> Date: Tue, 1 Mar 2022 21:16:45 +0100 Subject: [PATCH] Add MangoHud Settings + move some settings widgets to extra folder --- .../tabs/games/game_info/game_settings.py | 9 +- rare/components/tabs/settings/legendary.py | 4 +- rare/components/tabs/settings/linux.py | 6 +- rare/components/tabs/settings/rare.py | 2 +- .../settings/settings_widgets/__init__.py | 0 .../settings/{ => settings_widgets}/eos.py | 0 .../settings/settings_widgets/mangohud.py | 99 +++++++++++++++++++ .../settings_widgets/overlay_settings.py | 2 +- .../settings/{ => settings_widgets}/rpc.py | 0 .../ubisoft_activation.py | 0 .../{ => settings_widgets}/wrapper.py | 7 +- 11 files changed, 120 insertions(+), 9 deletions(-) create mode 100644 rare/components/tabs/settings/settings_widgets/__init__.py rename rare/components/tabs/settings/{ => settings_widgets}/eos.py (100%) create mode 100644 rare/components/tabs/settings/settings_widgets/mangohud.py rename rare/components/tabs/settings/{ => settings_widgets}/rpc.py (100%) rename rare/components/tabs/settings/{ => settings_widgets}/ubisoft_activation.py (100%) rename rare/components/tabs/settings/{ => settings_widgets}/wrapper.py (93%) diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index b9e9a7ad..4f87b6e7 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -17,7 +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.components.tabs.settings.settings_widgets.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 @@ -137,6 +137,10 @@ class GameSettings(QWidget, Ui_GameSettings): self.linux_settings_widget.setVisible(False) self.game_settings_contents_layout.setAlignment(Qt.AlignTop) + self.linux_settings.mangohud.set_wrapper_activated.connect( + lambda active: self.wrapper_settings.add_wrapper("mangohud") + if active else self.wrapper_settings.delete_wrapper("mangohud")) + def compute_save_path(self): if ( self.core.is_installed(self.game.app_name) @@ -364,5 +368,6 @@ class LinuxAppSettings(LinuxSettings): self.wine_prefix.setText(self.load_prefix()) self.wine_exec.setText(self.load_setting(self.name, "wine_executable")) - self.dxvk.name = app_name self.dxvk.load_settings(self.name) + + self.mangohud.load_settings(self.name) diff --git a/rare/components/tabs/settings/legendary.py b/rare/components/tabs/settings/legendary.py index 48a23de6..cb3a0c1f 100644 --- a/rare/components/tabs/settings/legendary.py +++ b/rare/components/tabs/settings/legendary.py @@ -6,8 +6,8 @@ from PyQt5.QtCore import Qt, QRunnable, QObject, pyqtSignal, QThreadPool from PyQt5.QtWidgets import QSizePolicy, QWidget, QFileDialog, QMessageBox from rare.shared import LegendaryCoreSingleton -from rare.components.tabs.settings.eos import EosWidget -from rare.components.tabs.settings.ubisoft_activation import UbiActivationHelper +from rare.components.tabs.settings.settings_widgets.eos import EosWidget +from rare.components.tabs.settings.settings_widgets.ubisoft_activation import UbiActivationHelper from rare.ui.components.tabs.settings.legendary import Ui_LegendarySettings from rare.utils.extra_widgets import PathEdit, IndicatorLineEdit from rare.utils.utils import get_size diff --git a/rare/components/tabs/settings/linux.py b/rare/components/tabs/settings/linux.py index 00aadb69..f3617e09 100644 --- a/rare/components/tabs/settings/linux.py +++ b/rare/components/tabs/settings/linux.py @@ -4,6 +4,7 @@ from logging import getLogger from PyQt5.QtWidgets import QFileDialog, QWidget from rare.components.tabs.settings.settings_widgets.dxvk import DxvkSettings +from rare.components.tabs.settings.settings_widgets.mangohud import MangoHudSettings from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton from rare.ui.components.tabs.settings.linux import Ui_LinuxSettings @@ -26,7 +27,7 @@ class LinuxSettings(QWidget, Ui_LinuxSettings): self.wine_prefix = PathEdit( self.load_prefix(), file_type=QFileDialog.DirectoryOnly, - edit_func=lambda path: (os.path.isdir(path), path, PathEdit.reasons.dir_not_exist), + edit_func=lambda path: (os.path.isdir(path) or not path, path, PathEdit.reasons.dir_not_exist), save_func=self.save_prefix, ) self.prefix_layout.addWidget(self.wine_prefix) @@ -46,6 +47,9 @@ class LinuxSettings(QWidget, Ui_LinuxSettings): self.dxvk = DxvkSettings() self.overlay_layout.addWidget(self.dxvk) + self.mangohud = MangoHudSettings() + self.overlay_layout.addWidget(self.mangohud) + def load_prefix(self) -> str: return self.load_setting( f"{self.name}.env", diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index ef205665..504b0b3f 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -8,7 +8,7 @@ from PyQt5.QtCore import QSettings, Qt from PyQt5.QtWidgets import QWidget, QMessageBox from rare.shared import LegendaryCoreSingleton -from rare.components.tabs.settings.rpc import RPCSettings +from rare.components.tabs.settings.settings_widgets.rpc import RPCSettings from rare.ui.components.tabs.settings.rare import Ui_RareSettings from rare.utils import utils from rare.utils.paths import cache_dir diff --git a/rare/components/tabs/settings/settings_widgets/__init__.py b/rare/components/tabs/settings/settings_widgets/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/rare/components/tabs/settings/eos.py b/rare/components/tabs/settings/settings_widgets/eos.py similarity index 100% rename from rare/components/tabs/settings/eos.py rename to rare/components/tabs/settings/settings_widgets/eos.py diff --git a/rare/components/tabs/settings/settings_widgets/mangohud.py b/rare/components/tabs/settings/settings_widgets/mangohud.py new file mode 100644 index 00000000..8126609b --- /dev/null +++ b/rare/components/tabs/settings/settings_widgets/mangohud.py @@ -0,0 +1,99 @@ +from enum import Enum + +from PyQt5.QtCore import QCoreApplication, pyqtSignal + +from rare.shared import LegendaryCoreSingleton +from .overlay_settings import OverlaySettings, CustomOption, ActivationStates +from rare.utils import config_helper + +position_values = ["default", "top-left", "top-right", "middle-left", "middle-right", "bottom-left", + "bottom-right", "top-center"] + + +class MangoHudSettings(OverlaySettings): + + set_wrapper_activated = pyqtSignal(bool) + + def __init__(self): + super(MangoHudSettings, self).__init__( + [ + ("fps", QCoreApplication.translate("MangoSettings", "FPS")), + ("frame_timing", QCoreApplication.translate("MangoSettings", "Frame Time")), + ("cpu_stats", QCoreApplication.translate("MangoSettings", "CPU Load")), + ("gpu_stats", QCoreApplication.translate("MangoSettings", "GPU Load")), + ("cpu_temp", QCoreApplication.translate("MangoSettings", "CPU Temp")), + ("gpu_temp", QCoreApplication.translate("MangoSettings", "GPU Temp")), + ("ram", QCoreApplication.translate("MangoSettings", "Memory usage")), + ("vram", QCoreApplication.translate("MangoSettings", "VRAM usage")), + ("time", QCoreApplication.translate("MangoSettings", "Local Time")), + ("version", QCoreApplication.translate("MangoSettings", "MangoHud Version")), + ("arch", QCoreApplication.translate("MangoSettings", "System architecture")), + ("histogram", QCoreApplication.translate("MangoSettings", "FPS Graph")), + ("gpu_name", QCoreApplication.translate("MangoSettings", "GPU Name")), + ("cpu_power", QCoreApplication.translate("MangoSettings", "CPU Power consumption")), + ("gpu_power", QCoreApplication.translate("MangoSettings", "GPU Power consumption")), + ], + [ + ( + CustomOption.number_input("font_size", 24, is_float=False), + QCoreApplication.translate("MangoSettings", "Font size") + ), + ( + CustomOption.select_input("position", position_values), + QCoreApplication.translate("MangoSettings", "Position") + ) + ], + "MANGOHUD_CONFIG", "no_display", set_activation_state=self.set_activation_state + ) + self.core = LegendaryCoreSingleton() + self.setTitle(self.tr("MangoHud Settings")) + self.gb_options.setTitle(self.tr("Custom options")) + + def load_settings(self, name: str): + self.settings_updatable = False + self.name = name + # override + cfg = self.core.lgd.config.get(f"{name}.env", "MANGOHUD_CONFIG", fallback="") + activated = "mangohud" in self.core.lgd.config.get(name, "wrapper", fallback="") + if not activated: + self.settings_updatable = False + self.gb_options.setDisabled(True) + for i, checkbox in enumerate(list(self.checkboxes.values())): + checkbox.setChecked(i < 4) + self.show_overlay_combo.setCurrentIndex(0) + self.settings_updatable = True + return + super(MangoHudSettings, self).load_settings(name) + self.settings_updatable = False + self.show_overlay_combo.setCurrentIndex(2) + self.gb_options.setDisabled(False) + for var_name, checkbox in list(self.checkboxes.items())[:4]: + checkbox.setChecked(f"{var_name}=0" not in cfg) + self.settings_updatable = True + + def set_activation_state(self, state: Enum): + if state in [ActivationStates.DEFAULT, ActivationStates.HIDDEN]: + self.set_wrapper_activated.emit(False) + self.gb_options.setDisabled(True) + + elif state == ActivationStates.ACTIVATED: + cfg = self.core.lgd.config.get(f"{self.name}.env", "MANGOHUD_CONFIG", fallback="") + + split_config = cfg.split(",") + for name in list(self.checkboxes.keys())[:4]: + if name in split_config: + split_config.remove(name) + cfg = ",".join(split_config) + + for var_name, checkbox in list(self.checkboxes.items())[:4]: # first three are by default activated + if not checkbox.isChecked(): + if cfg: + cfg += f",{var_name}=0" + else: + cfg = f"{var_name}=0" + if cfg: + config_helper.add_option(f"{self.name}.env", "MANGOHUD_CONFIG", cfg) + else: + config_helper.remove_option(f"{self.name}.env", "MANGOHUD_CONFIG") + + self.set_wrapper_activated.emit(True) diff --git a/rare/components/tabs/settings/settings_widgets/overlay_settings.py b/rare/components/tabs/settings/settings_widgets/overlay_settings.py index edeba598..421b6c84 100644 --- a/rare/components/tabs/settings/settings_widgets/overlay_settings.py +++ b/rare/components/tabs/settings/settings_widgets/overlay_settings.py @@ -179,4 +179,4 @@ class OverlaySettings(QGroupBox, Ui_OverlaySettings): self.gb_options.setDisabled(False) - self.settings_updatable = True \ No newline at end of file + self.settings_updatable = True diff --git a/rare/components/tabs/settings/rpc.py b/rare/components/tabs/settings/settings_widgets/rpc.py similarity index 100% rename from rare/components/tabs/settings/rpc.py rename to rare/components/tabs/settings/settings_widgets/rpc.py diff --git a/rare/components/tabs/settings/ubisoft_activation.py b/rare/components/tabs/settings/settings_widgets/ubisoft_activation.py similarity index 100% rename from rare/components/tabs/settings/ubisoft_activation.py rename to rare/components/tabs/settings/settings_widgets/ubisoft_activation.py diff --git a/rare/components/tabs/settings/wrapper.py b/rare/components/tabs/settings/settings_widgets/wrapper.py similarity index 93% rename from rare/components/tabs/settings/wrapper.py rename to rare/components/tabs/settings/settings_widgets/wrapper.py index de7e4d29..84082250 100644 --- a/rare/components/tabs/settings/wrapper.py +++ b/rare/components/tabs/settings/settings_widgets/wrapper.py @@ -82,12 +82,15 @@ class WrapperSettings(QGroupBox, Ui_WrapperSettings): widget.deleteLater() self.wrappers.pop(text) - if len(self.wrappers) == 0: + if self.wrappers: self.widget_stack.setCurrentIndex(1) self.save() def save(self): - config_helper.add_option(self.app_name, "wrapper", self.get_wrapper_string()) + if len(self.wrappers) == 0 and len(self.extra_wrappers) == 0: + config_helper.remove_option(self.app_name, "wrapper") + else: + config_helper.add_option(self.app_name, "wrapper", self.get_wrapper_string()) def load_settings(self, app_name): self.app_name = app_name