diff --git a/rare/components/main_window.py b/rare/components/main_window.py index fd9e4539..82b384c7 100644 --- a/rare/components/main_window.py +++ b/rare/components/main_window.py @@ -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): diff --git a/rare/components/tabs/games/game_info/game_settings.py b/rare/components/tabs/games/game_info/game_settings.py index e4c43209..9b84db4c 100644 --- a/rare/components/tabs/games/game_info/game_settings.py +++ b/rare/components/tabs/games/game_info/game_settings.py @@ -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) diff --git a/rare/components/tabs/games/import_sync/egl_sync_group.py b/rare/components/tabs/games/import_sync/egl_sync_group.py index 0d32d13a..c10a5ab0 100644 --- a/rare/components/tabs/games/import_sync/egl_sync_group.py +++ b/rare/components/tabs/games/import_sync/egl_sync_group.py @@ -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, diff --git a/rare/components/tabs/settings/widgets/wrapper.py b/rare/components/tabs/settings/widgets/wrapper.py index 97517a57..fc0d255b 100644 --- a/rare/components/tabs/settings/widgets/wrapper.py +++ b/rare/components/tabs/settings/widgets/wrapper.py @@ -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() diff --git a/rare/ui/components/tabs/settings/wrapper.py b/rare/ui/components/tabs/settings/wrapper.py index 6f281c93..d5682f6e 100644 --- a/rare/ui/components/tabs/settings/wrapper.py +++ b/rare/ui/components/tabs/settings/wrapper.py @@ -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") diff --git a/rare/ui/components/tabs/settings/wrapper.ui b/rare/ui/components/tabs/settings/wrapper.ui index 9cf66adb..7f017f7f 100644 --- a/rare/ui/components/tabs/settings/wrapper.ui +++ b/rare/ui/components/tabs/settings/wrapper.ui @@ -22,7 +22,7 @@ - + 0 diff --git a/rare/utils/extra_widgets.py b/rare/utils/extra_widgets.py index 61f99c27..66b4fcc0 100644 --- a/rare/utils/extra_widgets.py +++ b/rare/utils/extra_widgets.py @@ -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,