1
0
Fork 0
mirror of synced 2024-06-22 04:20:25 +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
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):

View file

@ -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)

View file

@ -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,

View file

@ -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()

View file

@ -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")

View file

@ -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>

View file

@ -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,