Show wrapper widget for proton and mangohud with disabled button
This commit is contained in:
parent
01e7e6c463
commit
66ae7c614f
7 changed files with 55 additions and 43 deletions
|
@ -68,8 +68,10 @@ class MainWindow(QMainWindow):
|
|||
)
|
||||
|
||||
# enable kinetic scrolling
|
||||
exclude = ["wrapper_scroll_area"]
|
||||
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
|
||||
for combo_box in scroll_area.findChildren(QComboBox):
|
||||
|
|
|
@ -4,14 +4,14 @@ from logging import getLogger
|
|||
from pathlib import Path
|
||||
from typing import Tuple
|
||||
|
||||
from PyQt5.QtCore import QSettings, QThreadPool, Qt, QSize
|
||||
from PyQt5.QtCore import QSettings, QThreadPool, Qt
|
||||
from PyQt5.QtWidgets import (
|
||||
QWidget,
|
||||
QFileDialog,
|
||||
QMessageBox,
|
||||
QLabel,
|
||||
QPushButton,
|
||||
QSizePolicy, QHBoxLayout,
|
||||
QSizePolicy
|
||||
)
|
||||
from legendary.core import LegendaryCore
|
||||
from legendary.models.game import InstalledGame, Game
|
||||
|
@ -74,7 +74,7 @@ class GameSettings(QWidget, Ui_GameSettings):
|
|||
self.cloud_save_path_edit = PathEdit(
|
||||
"",
|
||||
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),
|
||||
save_func=self.save_save_path,
|
||||
)
|
||||
|
@ -116,6 +116,7 @@ class GameSettings(QWidget, Ui_GameSettings):
|
|||
file_type=QFileDialog.DirectoryOnly,
|
||||
edit_func=self.proton_prefix_edit,
|
||||
save_func=self.proton_prefix_save,
|
||||
placeholder=self.tr("Please select path for proton prefix")
|
||||
)
|
||||
self.proton_prefix_layout.addWidget(self.proton_prefix)
|
||||
|
||||
|
@ -318,8 +319,9 @@ class GameSettings(QWidget, Ui_GameSettings):
|
|||
else:
|
||||
self.linux_settings_widget.setVisible(True)
|
||||
|
||||
proton = self.wrapper_settings.extra_wrappers.get("proton", "").replace('"', "")
|
||||
if proton and "proton" in proton:
|
||||
proton = self.wrapper_settings.wrappers.get("proton", None)
|
||||
if proton:
|
||||
proton = proton.text.replace('"', "")
|
||||
self.proton_prefix.setEnabled(True)
|
||||
self.proton_wrapper.setCurrentText(
|
||||
f'"{proton.replace(" run", "")}" run'
|
||||
|
@ -327,7 +329,7 @@ class GameSettings(QWidget, Ui_GameSettings):
|
|||
proton_prefix = self.core.lgd.config.get(
|
||||
f"{app_name}.env",
|
||||
"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.linux_settings.wine_groupbox.setEnabled(False)
|
||||
|
|
|
@ -34,7 +34,7 @@ class EGLSyncGroup(QGroupBox, Ui_EGLSyncGroup):
|
|||
else:
|
||||
self.egl_path_edit = PathEdit(
|
||||
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"
|
||||
),
|
||||
file_type=QFileDialog.DirectoryOnly,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import re
|
||||
import shutil
|
||||
from logging import getLogger
|
||||
from typing import Dict
|
||||
from typing import Dict, List
|
||||
|
||||
from PyQt5.QtCore import pyqtSignal, QSettings, QSize, Qt, QMimeData
|
||||
from PyQt5.QtGui import QDrag, QDropEvent, QDragEnterEvent, QDragMoveEvent, QFont
|
||||
|
@ -24,12 +24,15 @@ extra_wrapper_regex = {
|
|||
class WrapperWidget(QFrame):
|
||||
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)
|
||||
if not show_text:
|
||||
show_text = text
|
||||
|
||||
self.setLayout(QHBoxLayout())
|
||||
self.text = text
|
||||
self.image_lbl = QLabel()
|
||||
self.text_lbl = QLabel(text)
|
||||
self.text_lbl = QLabel(show_text)
|
||||
self.text_lbl.setFont(QFont("monospace"))
|
||||
self.image_lbl.setPixmap(icon("mdi.drag-vertical").pixmap(QSize(20, 20)))
|
||||
self.layout().addWidget(self.image_lbl)
|
||||
|
@ -38,6 +41,9 @@ class WrapperWidget(QFrame):
|
|||
|
||||
self.delete_button = QPushButton(icon("ei.remove"), "")
|
||||
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.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
|
||||
|
@ -55,20 +61,20 @@ class WrapperWidget(QFrame):
|
|||
|
||||
class WrapperSettings(QFrame, Ui_WrapperSettings):
|
||||
wrappers: Dict[str, WrapperWidget] = dict()
|
||||
extra_wrappers: Dict[str, str] = dict()
|
||||
app_name: str
|
||||
|
||||
def __init__(self):
|
||||
super(WrapperSettings, self).__init__()
|
||||
self.setupUi(self)
|
||||
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.scroll_content.deleteLater()
|
||||
self.scroll_content = WrapperContainer(
|
||||
save_cb=self.save, parent=self.scroll_area)
|
||||
self.scroll_area.setWidget(self.scroll_content)
|
||||
self.scroll_area.setProperty("noBorder", 1)
|
||||
save_cb=self.save, parent=self.wrapper_scroll_area
|
||||
)
|
||||
self.wrapper_scroll_area.setWidget(self.scroll_content)
|
||||
self.wrapper_scroll_area.setProperty("noBorder", 1)
|
||||
|
||||
self.core = shared.LegendaryCoreSingleton()
|
||||
|
||||
|
@ -81,10 +87,9 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
|
|||
return " ".join(self.get_wrapper_list())
|
||||
|
||||
def get_wrapper_list(self):
|
||||
data = list(self.extra_wrappers.values())
|
||||
for n in range(self.scroll_content.layout().count()):
|
||||
data: List[str] = []
|
||||
for w in self.wrappers.values():
|
||||
# Get the widget at each index in turn.
|
||||
w = self.scroll_content.layout().itemAt(n).widget()
|
||||
try:
|
||||
data.append(w.text)
|
||||
except AttributeError:
|
||||
|
@ -98,12 +103,12 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
|
|||
self.add_wrapper(wrapper)
|
||||
|
||||
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():
|
||||
if re.match(extra_wrapper, text):
|
||||
self.extra_wrappers[key] = text
|
||||
if not from_load:
|
||||
self.save()
|
||||
return
|
||||
show_text = key
|
||||
|
||||
# validate
|
||||
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"))
|
||||
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? "),
|
||||
QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.No:
|
||||
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)
|
||||
|
||||
widget = WrapperWidget(text, self.scroll_content)
|
||||
widget = WrapperWidget(text, show_text, self.scroll_content)
|
||||
self.scroll_content.layout().addWidget(widget)
|
||||
widget.delete_wrapper.connect(self.delete_wrapper)
|
||||
self.scroll_content.layout().addWidget(widget)
|
||||
self.wrappers[text] = widget
|
||||
|
||||
self.wrappers[show_text] = widget
|
||||
|
||||
if not from_load:
|
||||
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()
|
||||
if widget:
|
||||
self.wrappers.pop(text)
|
||||
widget.deleteLater()
|
||||
|
||||
if not self.wrappers:
|
||||
self.widget_stack.setCurrentIndex(1)
|
||||
|
@ -144,7 +152,7 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
|
|||
|
||||
def save(self):
|
||||
# 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")
|
||||
self.settings.remove(f"{self.app_name}/wrapper")
|
||||
else:
|
||||
|
@ -156,7 +164,6 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
|
|||
for i in self.wrappers.values():
|
||||
i.deleteLater()
|
||||
self.wrappers.clear()
|
||||
self.extra_wrappers.clear()
|
||||
|
||||
wrappers = self.settings.value(f"{self.app_name}/wrapper", [], str)
|
||||
|
||||
|
@ -173,6 +180,7 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
|
|||
self.widget_stack.setCurrentIndex(1)
|
||||
else:
|
||||
self.widget_stack.setCurrentIndex(0)
|
||||
|
||||
self.save()
|
||||
|
||||
|
||||
|
|
|
@ -23,22 +23,22 @@ class Ui_WrapperSettings(object):
|
|||
self.placeholder.setObjectName("placeholder")
|
||||
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.placeholder)
|
||||
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.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.scroll_area.sizePolicy().hasHeightForWidth())
|
||||
self.scroll_area.setSizePolicy(sizePolicy)
|
||||
self.scroll_area.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.scroll_area.setWidgetResizable(True)
|
||||
self.scroll_area.setObjectName("scroll_area")
|
||||
sizePolicy.setHeightForWidth(self.wrapper_scroll_area.sizePolicy().hasHeightForWidth())
|
||||
self.wrapper_scroll_area.setSizePolicy(sizePolicy)
|
||||
self.wrapper_scroll_area.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.wrapper_scroll_area.setWidgetResizable(True)
|
||||
self.wrapper_scroll_area.setObjectName("wrapper_scroll_area")
|
||||
self.scroll_content = QtWidgets.QWidget()
|
||||
self.scroll_content.setGeometry(QtCore.QRect(0, 0, 286, 68))
|
||||
self.scroll_content.setObjectName("scroll_content")
|
||||
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.scroll_content)
|
||||
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
|
||||
self.scroll_area.setWidget(self.scroll_content)
|
||||
self.horizontalLayout_2.addWidget(self.scroll_area)
|
||||
self.wrapper_scroll_area.setWidget(self.scroll_content)
|
||||
self.horizontalLayout_2.addWidget(self.wrapper_scroll_area)
|
||||
self.widget_stack.addWidget(self.placeholder)
|
||||
self.label_page = QtWidgets.QWidget()
|
||||
self.label_page.setObjectName("label_page")
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
<widget class="QWidget" name="placeholder">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scroll_area">
|
||||
<widget class="QScrollArea" name="wrapper_scroll_area">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
|
|
|
@ -299,7 +299,7 @@ class PathEdit(IndicatorLineEdit):
|
|||
file_type: QFileDialog.FileType = QFileDialog.AnyFile,
|
||||
type_filter: str = "",
|
||||
name_filter: str = "",
|
||||
ph_text: str = "",
|
||||
placeholder: str = "",
|
||||
edit_func: Callable[[str], Tuple[bool, str, str]] = None,
|
||||
save_func: Callable[[str], None] = None,
|
||||
horiz_policy: QSizePolicy = QSizePolicy.Expanding,
|
||||
|
@ -318,7 +318,7 @@ class PathEdit(IndicatorLineEdit):
|
|||
self.completer.setModel(self.compl_model)
|
||||
super(PathEdit, self).__init__(
|
||||
text=path,
|
||||
ph_text=ph_text,
|
||||
ph_text=placeholder,
|
||||
completer=self.completer,
|
||||
edit_func=edit_func,
|
||||
save_func=save_func,
|
||||
|
|
Loading…
Reference in a new issue