1
0
Fork 0
mirror of synced 2024-06-29 03:31:06 +12:00
Rare/rare/components/tabs/settings/dxvk.py

231 lines
9.1 KiB
Python

from logging import getLogger
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QGroupBox
from PyQt5.QtWidgets import QWidget, QCheckBox, QVBoxLayout, QWidgetAction, QMenu, QToolButton, QHBoxLayout
from legendary.core import LegendaryCore
from rare.ui.components.tabs.settings.dxvk import Ui_DxvkSettings
logger = getLogger("DXVK Settings")
class DxvkSettings(QGroupBox, Ui_DxvkSettings):
def __init__(self, core: LegendaryCore, name=None):
super(DxvkSettings, self).__init__()
self.setupUi(self)
self.name = name if name is not None else "default"
self.core = core
self.dxvk_options_map = {
"devinfo": self.devinfo,
"fps": self.fps,
"frametime": self.frametime,
"memory": self.memory,
"gpuload": self.gpuload,
"version": self.version,
"api": self.api,
}
self.load_settings()
self.show_dxvk.currentIndexChanged.connect(self.store_settings)
for opt in self.dxvk_options_map:
self.dxvk_options_map[opt].stateChanged.connect(self.store_settings)
# Show HUD ComboBox
# System Default, index 0, removes DXVK_HUD to use setting from env
# Hidden , index 1, adds DXVK_HUD=0 to override system configuration
# Visible , index 2, adds DXVK_HUD=1 to override system configuration
# Custom Options, index 3, adds DXVK_HUD=devinfo,fps and enables the customization panel
def load_settings(self):
dxvk_options = self.core.lgd.config.get(f"{self.name}.env", "DXVK_HUD", fallback=None)
self.gb_dxvk_options.setDisabled(True)
if dxvk_options is not None:
if dxvk_options == "0":
self.show_dxvk.setCurrentIndex(1)
elif dxvk_options == "1":
self.show_dxvk.setCurrentIndex(2)
else:
self.show_dxvk.setCurrentIndex(3)
self.gb_dxvk_options.setDisabled(False)
for opt in dxvk_options.split(","):
try:
self.dxvk_options_map[opt].setChecked(True)
except KeyError:
print("Malformed DXVK Option: " + opt)
continue
else:
self.show_dxvk.setCurrentIndex(0)
def store_settings(self):
show_dxvk_index = self.show_dxvk.currentIndex()
if show_dxvk_index:
if f"{self.name}.env" not in self.core.lgd.config.sections():
print("add section dxvk")
self.core.lgd.config.add_section(f"{self.name}.env")
if show_dxvk_index == 1:
self.core.lgd.config[f"{self.name}.env"]["DXVK_HUD"] = "0"
if show_dxvk_index == 2:
self.core.lgd.config[f"{self.name}.env"]["DXVK_HUD"] = "1"
if show_dxvk_index == 3:
dxvk_options = []
for opt in self.dxvk_options_map:
if self.dxvk_options_map[opt].isChecked():
dxvk_options.append(opt)
if not dxvk_options:
# Check if this is the first activation
stored = self.core.lgd.config.get(f"{self.name}.env", "DXVK_HUD", fallback=None)
if stored not in [None, "0", "1"]:
self.core.lgd.config[f"{self.name}.env"]["DXVK_HUD"] = "0"
else:
dxvk_options = ["devinfo", "fps"]
# Check again if dxvk_options changed due to first activation
if dxvk_options:
self.core.lgd.config[f"{self.name}.env"]["DXVK_HUD"] = ",".join(dxvk_options)
else:
if self.core.lgd.config.get(f"{self.name}.env", "DXVK_HUD", fallback=None) is not None:
self.core.lgd.config.remove_option(f"{self.name}.env", "DXVK_HUD")
if not self.core.lgd.config[f"{self.name}.env"]:
self.core.lgd.config.remove_section(f"{self.name}.env")
self.core.lgd.save_config()
self.load_settings()
class DxvkWidget(QGroupBox):
def __init__(self, core: LegendaryCore, name=None):
super(DxvkWidget, self).__init__()
self.core = core
self.setObjectName("settings_widget")
self.dxvk_settings = {
"fps": [False, "Fps"],
"gpuload": [False, self.tr("GPU usage")],
"memory": [False, self.tr("Used Memory")],
"devinfo": [False, self.tr("Device info")],
"version": [False, self.tr("DXVK version")],
"api": [False, self.tr("D3D Level of application")],
"frametime": [False, self.tr("Frame time graph")]
}
self.name = name
self.layout = QVBoxLayout()
self.child_layout = QHBoxLayout()
self.setTitle(self.tr("dxvk settings"))
self.show_dxvk = QCheckBox("Show Dxvk HUD")
self.more_settings = QToolButton()
dxvk_hud = self.core.lgd.config.get(f"{self.name}.env", "DXVK_HUD", fallback="")
self.more_settings.setDisabled(not dxvk_hud == "")
if dxvk_hud:
for s in dxvk_hud.split(","):
self.dxvk_settings[s][0] = True
self.more_settings.setPopupMode(QToolButton.InstantPopup)
self.more_settings.setMenu(QMenu())
self.more_settings.setText("More DXVK settings")
action = QWidgetAction(self)
self.more_settings_widget = DxvkMoreSettingsWidget(self.dxvk_settings, self.core)
self.more_settings_widget.show_dxvk.connect(lambda x: self.show_dxvk.setChecked(x))
action.setDefaultWidget(self.more_settings_widget)
self.more_settings.menu().addAction(action)
self.show_dxvk.stateChanged.connect(self.update_dxvk_active)
self.show_dxvk.setChecked(not dxvk_hud == "")
self.child_layout.addWidget(self.show_dxvk)
self.child_layout.addWidget(self.more_settings)
self.layout.addLayout(self.child_layout)
self.setLayout(self.layout)
def update_settings(self, app_name):
self.name = app_name
dxvk_hud = self.core.lgd.config.get(f"{self.name}.env", "DXVK_HUD", fallback="")
if dxvk_hud:
self.more_settings.setDisabled(False)
for s in dxvk_hud.split(","):
self.dxvk_settings[s][0] = True
else:
self.show_dxvk.setChecked(False)
self.more_settings.setDisabled(True)
def update_dxvk_active(self):
if self.show_dxvk.isChecked():
if not f"{self.name}.env" in self.core.lgd.config.sections():
print("add section dxvk")
self.core.lgd.config.add_section(f"{self.name}.env")
self.more_settings.setDisabled(False)
for i in self.more_settings_widget.settings:
if i in ["fps", "gpuload"]:
self.more_settings_widget.settings[i][0] = True
self.core.lgd.config[f"{self.name}.env"]["DXVK_HUD"] = "fps,gpuload"
for w in self.more_settings_widget.widgets:
if w.tag == "fps" or w.tag == "gpuload":
w.setChecked(True)
else:
w.setChecked(False)
else:
self.more_settings.setDisabled(True)
if not self.core.lgd.config.get(f"{self.name}.env", "DXVK_HUD", fallback="") == "":
self.core.lgd.config.remove_option(f"{self.name}.env", "DXVK_HUD")
if not self.core.lgd.config[f"{self.name}.env"]:
self.core.lgd.config.remove_section(f"{self.name}.env")
self.core.lgd.save_config()
class DxvkMoreSettingsWidget(QWidget):
show_dxvk = pyqtSignal(bool)
def __init__(self, settings: dict, core: LegendaryCore):
super(DxvkMoreSettingsWidget, self).__init__()
self.layout = QVBoxLayout()
self.name = "default"
self.widgets = []
self.core = core
self.settings = settings
for i in settings:
widget = CheckBox(i, settings[i])
widget.signal.connect(self.change)
self.layout.addWidget(widget)
self.widgets.append(widget)
self.setLayout(self.layout)
def change(self, signal: list):
tag, checked = signal
self.settings[tag][0] = checked
sett = []
logger.debug(self.settings)
for i in self.settings:
check, _ = self.settings[i]
if check:
sett.append(i)
if len(sett) > 0:
self.core.lgd.config.set(f"{self.name}.env", "DXVK_HUD", ",".join(sett))
else:
self.core.lgd.config.remove_option(f"{self.name}.env", "DXVK_HUD")
self.show_dxvk.emit(False)
if not self.core.lgd.config.options(f"{self.name}.env"):
self.core.lgd.config.remove_section(f"{self.name}.env")
self.core.lgd.save_config()
class CheckBox(QCheckBox):
signal = pyqtSignal(tuple)
def __init__(self, tag, settings):
checked, text = settings
super(CheckBox, self).__init__(text)
self.setChecked(checked)
self.tag = tag
self.clicked.connect(lambda: self.signal.emit((self.tag, self.isChecked())))