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,7 +68,9 @@ 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):
|
||||||
|
if scroll_area.objectName() not in exclude:
|
||||||
QScroller.grabGesture(scroll_area.viewport(), QScroller.LeftMouseButtonGesture)
|
QScroller.grabGesture(scroll_area.viewport(), QScroller.LeftMouseButtonGesture)
|
||||||
|
|
||||||
# fix scrolling
|
# fix scrolling
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue