1
0
Fork 0
mirror of synced 2024-09-28 23:41:29 +12:00

Show wrapper widget for proton and mangohud with disabled button

This commit is contained in:
Dummerle 2022-03-13 17:20:55 +01:00
parent 01e7e6c463
commit 66ae7c614f
No known key found for this signature in database
GPG key ID: AB68CC59CA39F2F1
7 changed files with 55 additions and 43 deletions

View file

@ -68,8 +68,10 @@ class MainWindow(QMainWindow):
) )
# enable kinetic scrolling # enable kinetic scrolling
exclude = ["wrapper_scroll_area"]
for scroll_area in self.findChildren(QScrollArea): for scroll_area in self.findChildren(QScrollArea):
QScroller.grabGesture(scroll_area.viewport(), QScroller.LeftMouseButtonGesture) if scroll_area.objectName() not in exclude:
QScroller.grabGesture(scroll_area.viewport(), QScroller.LeftMouseButtonGesture)
# fix scrolling # fix scrolling
for combo_box in scroll_area.findChildren(QComboBox): for combo_box in scroll_area.findChildren(QComboBox):

View file

@ -4,14 +4,14 @@ from logging import getLogger
from pathlib import Path from pathlib import Path
from typing import Tuple from typing import Tuple
from PyQt5.QtCore import QSettings, QThreadPool, Qt, QSize from PyQt5.QtCore import QSettings, QThreadPool, Qt
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QWidget, QWidget,
QFileDialog, QFileDialog,
QMessageBox, QMessageBox,
QLabel, QLabel,
QPushButton, QPushButton,
QSizePolicy, QHBoxLayout, QSizePolicy
) )
from legendary.core import LegendaryCore from legendary.core import LegendaryCore
from legendary.models.game import InstalledGame, Game from legendary.models.game import InstalledGame, Game
@ -74,7 +74,7 @@ class GameSettings(QWidget, Ui_GameSettings):
self.cloud_save_path_edit = PathEdit( self.cloud_save_path_edit = PathEdit(
"", "",
file_type=QFileDialog.DirectoryOnly, file_type=QFileDialog.DirectoryOnly,
ph_text=self.tr("Cloud save path"), placeholder=self.tr("Cloud save path"),
edit_func=lambda text: (os.path.exists(text), text, PathEdit.reasons.dir_not_exist), edit_func=lambda text: (os.path.exists(text), text, PathEdit.reasons.dir_not_exist),
save_func=self.save_save_path, save_func=self.save_save_path,
) )
@ -116,6 +116,7 @@ class GameSettings(QWidget, Ui_GameSettings):
file_type=QFileDialog.DirectoryOnly, file_type=QFileDialog.DirectoryOnly,
edit_func=self.proton_prefix_edit, edit_func=self.proton_prefix_edit,
save_func=self.proton_prefix_save, save_func=self.proton_prefix_save,
placeholder=self.tr("Please select path for proton prefix")
) )
self.proton_prefix_layout.addWidget(self.proton_prefix) self.proton_prefix_layout.addWidget(self.proton_prefix)
@ -318,8 +319,9 @@ class GameSettings(QWidget, Ui_GameSettings):
else: else:
self.linux_settings_widget.setVisible(True) self.linux_settings_widget.setVisible(True)
proton = self.wrapper_settings.extra_wrappers.get("proton", "").replace('"', "") proton = self.wrapper_settings.wrappers.get("proton", None)
if proton and "proton" in proton: if proton:
proton = proton.text.replace('"', "")
self.proton_prefix.setEnabled(True) self.proton_prefix.setEnabled(True)
self.proton_wrapper.setCurrentText( self.proton_wrapper.setCurrentText(
f'"{proton.replace(" run", "")}" run' f'"{proton.replace(" run", "")}" run'
@ -327,7 +329,7 @@ class GameSettings(QWidget, Ui_GameSettings):
proton_prefix = self.core.lgd.config.get( proton_prefix = self.core.lgd.config.get(
f"{app_name}.env", f"{app_name}.env",
"STEAM_COMPAT_DATA_PATH", "STEAM_COMPAT_DATA_PATH",
fallback=self.tr("Please select path for proton prefix"), fallback=Path.home().joinpath(".proton"),
) )
self.proton_prefix.setText(proton_prefix) self.proton_prefix.setText(proton_prefix)
self.linux_settings.wine_groupbox.setEnabled(False) self.linux_settings.wine_groupbox.setEnabled(False)

View file

@ -34,7 +34,7 @@ class EGLSyncGroup(QGroupBox, Ui_EGLSyncGroup):
else: else:
self.egl_path_edit = PathEdit( self.egl_path_edit = PathEdit(
path=self.core.egl.programdata_path, path=self.core.egl.programdata_path,
ph_text=self.tr( placeholder=self.tr(
"Path to the Wine prefix where EGL is installed, or the Manifests folder" "Path to the Wine prefix where EGL is installed, or the Manifests folder"
), ),
file_type=QFileDialog.DirectoryOnly, file_type=QFileDialog.DirectoryOnly,

View file

@ -1,7 +1,7 @@
import re import re
import shutil import shutil
from logging import getLogger from logging import getLogger
from typing import Dict from typing import Dict, List
from PyQt5.QtCore import pyqtSignal, QSettings, QSize, Qt, QMimeData from PyQt5.QtCore import pyqtSignal, QSettings, QSize, Qt, QMimeData
from PyQt5.QtGui import QDrag, QDropEvent, QDragEnterEvent, QDragMoveEvent, QFont from PyQt5.QtGui import QDrag, QDropEvent, QDragEnterEvent, QDragMoveEvent, QFont
@ -24,12 +24,15 @@ extra_wrapper_regex = {
class WrapperWidget(QFrame): class WrapperWidget(QFrame):
delete_wrapper = pyqtSignal(str) delete_wrapper = pyqtSignal(str)
def __init__(self, text: str, parent=None): def __init__(self, text: str, show_text=None, parent=None):
super(WrapperWidget, self).__init__(parent=parent) super(WrapperWidget, self).__init__(parent=parent)
if not show_text:
show_text = text
self.setLayout(QHBoxLayout()) self.setLayout(QHBoxLayout())
self.text = text self.text = text
self.image_lbl = QLabel() self.image_lbl = QLabel()
self.text_lbl = QLabel(text) self.text_lbl = QLabel(show_text)
self.text_lbl.setFont(QFont("monospace")) self.text_lbl.setFont(QFont("monospace"))
self.image_lbl.setPixmap(icon("mdi.drag-vertical").pixmap(QSize(20, 20))) self.image_lbl.setPixmap(icon("mdi.drag-vertical").pixmap(QSize(20, 20)))
self.layout().addWidget(self.image_lbl) self.layout().addWidget(self.image_lbl)
@ -38,6 +41,9 @@ class WrapperWidget(QFrame):
self.delete_button = QPushButton(icon("ei.remove"), "") self.delete_button = QPushButton(icon("ei.remove"), "")
self.layout().addWidget(self.delete_button) self.layout().addWidget(self.delete_button)
if show_text in extra_wrapper_regex.keys():
self.delete_button.setDisabled(True)
self.delete_button.setToolTip(self.tr("Disable it in settings"))
self.delete_button.clicked.connect(self.delete) self.delete_button.clicked.connect(self.delete)
self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed) self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
@ -55,20 +61,20 @@ class WrapperWidget(QFrame):
class WrapperSettings(QFrame, Ui_WrapperSettings): class WrapperSettings(QFrame, Ui_WrapperSettings):
wrappers: Dict[str, WrapperWidget] = dict() wrappers: Dict[str, WrapperWidget] = dict()
extra_wrappers: Dict[str, str] = dict()
app_name: str app_name: str
def __init__(self): def __init__(self):
super(WrapperSettings, self).__init__() super(WrapperSettings, self).__init__()
self.setupUi(self) self.setupUi(self)
self.setProperty("frameShape", 6) self.setProperty("frameShape", 6)
self.widget_stack.insertWidget(0, self.scroll_area) self.widget_stack.insertWidget(0, self.wrapper_scroll_area)
self.placeholder.deleteLater() self.placeholder.deleteLater()
self.scroll_content.deleteLater() self.scroll_content.deleteLater()
self.scroll_content = WrapperContainer( self.scroll_content = WrapperContainer(
save_cb=self.save, parent=self.scroll_area) save_cb=self.save, parent=self.wrapper_scroll_area
self.scroll_area.setWidget(self.scroll_content) )
self.scroll_area.setProperty("noBorder", 1) self.wrapper_scroll_area.setWidget(self.scroll_content)
self.wrapper_scroll_area.setProperty("noBorder", 1)
self.core = shared.LegendaryCoreSingleton() self.core = shared.LegendaryCoreSingleton()
@ -81,10 +87,9 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
return " ".join(self.get_wrapper_list()) return " ".join(self.get_wrapper_list())
def get_wrapper_list(self): def get_wrapper_list(self):
data = list(self.extra_wrappers.values()) data: List[str] = []
for n in range(self.scroll_content.layout().count()): for w in self.wrappers.values():
# Get the widget at each index in turn. # Get the widget at each index in turn.
w = self.scroll_content.layout().itemAt(n).widget()
try: try:
data.append(w.text) data.append(w.text)
except AttributeError: except AttributeError:
@ -98,12 +103,12 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
self.add_wrapper(wrapper) self.add_wrapper(wrapper)
def add_wrapper(self, text: str, from_load=False): def add_wrapper(self, text: str, from_load=False):
if text == "mangohud" and self.wrappers.get("mangohud"):
return
show_text = text
for key, extra_wrapper in extra_wrapper_regex.items(): for key, extra_wrapper in extra_wrapper_regex.items():
if re.match(extra_wrapper, text): if re.match(extra_wrapper, text):
self.extra_wrappers[key] = text show_text = key
if not from_load:
self.save()
return
# validate # validate
if not text.strip(): # is empty if not text.strip(): # is empty
@ -113,29 +118,32 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
QMessageBox.warning(self, "Warning", self.tr("Wrapper is already in the list")) QMessageBox.warning(self, "Warning", self.tr("Wrapper is already in the list"))
return return
if not shutil.which(text.split()[0]): if show_text != "proton" and not shutil.which(text.split()[0]):
if QMessageBox.question(self, "Warning", self.tr("Wrapper is not in $PATH. Ignore? "), if QMessageBox.question(self, "Warning", self.tr("Wrapper is not in $PATH. Ignore? "),
QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.No: QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.No:
return return
if text == "proton":
QMessageBox.warning(self, "Warning", self.tr("Do not insert proton manually. Add it in proton settings"))
return
self.widget_stack.setCurrentIndex(0) self.widget_stack.setCurrentIndex(0)
widget = WrapperWidget(text, self.scroll_content) widget = WrapperWidget(text, show_text, self.scroll_content)
self.scroll_content.layout().addWidget(widget) self.scroll_content.layout().addWidget(widget)
widget.delete_wrapper.connect(self.delete_wrapper) widget.delete_wrapper.connect(self.delete_wrapper)
self.scroll_content.layout().addWidget(widget) self.scroll_content.layout().addWidget(widget)
self.wrappers[text] = widget
self.wrappers[show_text] = widget
if not from_load: if not from_load:
self.save() self.save()
def delete_wrapper(self, text: str): def delete_wrapper(self, text: str):
widget = self.wrappers.get(text, None) widget = self.wrappers.get(text, None)
if not widget and self.extra_wrappers.get(text, None): if widget:
self.extra_wrappers.pop(text)
elif widget:
widget.deleteLater()
self.wrappers.pop(text) self.wrappers.pop(text)
widget.deleteLater()
if not self.wrappers: if not self.wrappers:
self.widget_stack.setCurrentIndex(1) self.widget_stack.setCurrentIndex(1)
@ -144,7 +152,7 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
def save(self): def save(self):
# save wrappers twice, to support wrappers with spaces # save wrappers twice, to support wrappers with spaces
if len(self.wrappers) == 0 and len(self.extra_wrappers) == 0: if len(self.wrappers) == 0:
config_helper.remove_option(self.app_name, "wrapper") config_helper.remove_option(self.app_name, "wrapper")
self.settings.remove(f"{self.app_name}/wrapper") self.settings.remove(f"{self.app_name}/wrapper")
else: else:
@ -156,7 +164,6 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
for i in self.wrappers.values(): for i in self.wrappers.values():
i.deleteLater() i.deleteLater()
self.wrappers.clear() self.wrappers.clear()
self.extra_wrappers.clear()
wrappers = self.settings.value(f"{self.app_name}/wrapper", [], str) wrappers = self.settings.value(f"{self.app_name}/wrapper", [], str)
@ -173,6 +180,7 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
self.widget_stack.setCurrentIndex(1) self.widget_stack.setCurrentIndex(1)
else: else:
self.widget_stack.setCurrentIndex(0) self.widget_stack.setCurrentIndex(0)
self.save() self.save()

View file

@ -23,22 +23,22 @@ class Ui_WrapperSettings(object):
self.placeholder.setObjectName("placeholder") self.placeholder.setObjectName("placeholder")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.placeholder) self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.placeholder)
self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.scroll_area = QtWidgets.QScrollArea(self.placeholder) self.wrapper_scroll_area = QtWidgets.QScrollArea(self.placeholder)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.scroll_area.sizePolicy().hasHeightForWidth()) sizePolicy.setHeightForWidth(self.wrapper_scroll_area.sizePolicy().hasHeightForWidth())
self.scroll_area.setSizePolicy(sizePolicy) self.wrapper_scroll_area.setSizePolicy(sizePolicy)
self.scroll_area.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.wrapper_scroll_area.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.scroll_area.setWidgetResizable(True) self.wrapper_scroll_area.setWidgetResizable(True)
self.scroll_area.setObjectName("scroll_area") self.wrapper_scroll_area.setObjectName("wrapper_scroll_area")
self.scroll_content = QtWidgets.QWidget() self.scroll_content = QtWidgets.QWidget()
self.scroll_content.setGeometry(QtCore.QRect(0, 0, 286, 68)) self.scroll_content.setGeometry(QtCore.QRect(0, 0, 286, 68))
self.scroll_content.setObjectName("scroll_content") self.scroll_content.setObjectName("scroll_content")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.scroll_content) self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.scroll_content)
self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.scroll_area.setWidget(self.scroll_content) self.wrapper_scroll_area.setWidget(self.scroll_content)
self.horizontalLayout_2.addWidget(self.scroll_area) self.horizontalLayout_2.addWidget(self.wrapper_scroll_area)
self.widget_stack.addWidget(self.placeholder) self.widget_stack.addWidget(self.placeholder)
self.label_page = QtWidgets.QWidget() self.label_page = QtWidgets.QWidget()
self.label_page.setObjectName("label_page") self.label_page.setObjectName("label_page")

View file

@ -22,7 +22,7 @@
<widget class="QWidget" name="placeholder"> <widget class="QWidget" name="placeholder">
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<widget class="QScrollArea" name="scroll_area"> <widget class="QScrollArea" name="wrapper_scroll_area">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>

View file

@ -299,7 +299,7 @@ class PathEdit(IndicatorLineEdit):
file_type: QFileDialog.FileType = QFileDialog.AnyFile, file_type: QFileDialog.FileType = QFileDialog.AnyFile,
type_filter: str = "", type_filter: str = "",
name_filter: str = "", name_filter: str = "",
ph_text: str = "", placeholder: str = "",
edit_func: Callable[[str], Tuple[bool, str, str]] = None, edit_func: Callable[[str], Tuple[bool, str, str]] = None,
save_func: Callable[[str], None] = None, save_func: Callable[[str], None] = None,
horiz_policy: QSizePolicy = QSizePolicy.Expanding, horiz_policy: QSizePolicy = QSizePolicy.Expanding,
@ -318,7 +318,7 @@ class PathEdit(IndicatorLineEdit):
self.completer.setModel(self.compl_model) self.completer.setModel(self.compl_model)
super(PathEdit, self).__init__( super(PathEdit, self).__init__(
text=path, text=path,
ph_text=ph_text, ph_text=placeholder,
completer=self.completer, completer=self.completer,
edit_func=edit_func, edit_func=edit_func,
save_func=save_func, save_func=save_func,