diff --git a/rare/components/tabs/settings/widgets/wrappers.py b/rare/components/tabs/settings/widgets/wrappers.py index 01f2a4fe..fac8e727 100644 --- a/rare/components/tabs/settings/widgets/wrappers.py +++ b/rare/components/tabs/settings/widgets/wrappers.py @@ -2,7 +2,7 @@ import platform as pf import shlex import shutil from logging import getLogger -from typing import Optional +from typing import Optional, Tuple from PyQt5.QtCore import pyqtSignal, QSize, Qt, QMimeData, pyqtSlot, QCoreApplication from PyQt5.QtGui import QDrag, QDropEvent, QDragEnterEvent, QDragMoveEvent, QFont, QMouseEvent, QShowEvent @@ -17,12 +17,13 @@ from PyQt5.QtWidgets import ( QScrollArea, QAction, QToolButton, - QMenu, QDialog, QStackedWidget, QPushButton, + QMenu, QDialog, QStackedWidget, QPushButton, QLineEdit, QVBoxLayout, ) from rare.models.wrapper import Wrapper from rare.shared import RareCore from rare.utils.misc import icon +from rare.widgets.dialogs import ButtonDialog, dialog_title_game if pf.system() in {"Linux", "FreeBSD"}: from rare.utils.runners import proton @@ -30,8 +31,45 @@ if pf.system() in {"Linux", "FreeBSD"}: logger = getLogger("WrapperSettings") -class WrapperDialog(QDialog): - pass +class WrapperDialog(ButtonDialog): + result_ready = pyqtSignal(bool, str) + + def __init__(self, wrapper_name, wrapper_command, parent=None): + super(WrapperDialog, self).__init__(parent=parent) + if wrapper_name: + header = self.tr("Edit wrapper") + else: + header = self.tr("Add wrapper") + self.setWindowTitle(header) + + title_label = QLabel(f"

{dialog_title_game(header, wrapper_name)}

", self) + self.line_edit = QLineEdit(wrapper_command, self) + self.line_edit.textChanged.connect(self.__on_text_changed) + + layout = QVBoxLayout() + layout.addWidget(title_label) + layout.addWidget(self.line_edit) + + self.setCentralLayout(layout) + + self.accept_button.setText(self.tr("Save")) + self.accept_button.setIcon(icon("fa.edit")) + self.accept_button.setEnabled(False) + + self.result: Tuple = () + + @pyqtSlot(str) + def __on_text_changed(self, text: str): + self.accept_button.setEnabled(bool(text)) + + def done_handler(self): + self.result_ready.emit(*self.result) + + def accept_handler(self): + self.result = (True, self.line_edit.text()) + + def reject_handler(self): + self.result = (False, self.line_edit.text()) class WrapperWidget(QFrame): @@ -54,9 +92,9 @@ class WrapperWidget(QFrame): image_lbl.setPixmap(icon("mdi.drag-vertical").pixmap(QSize(20, 20))) edit_action = QAction("Edit", parent=self) - edit_action.triggered.connect(self.__edit) + edit_action.triggered.connect(self.__on_edit) delete_action = QAction("Delete", parent=self) - delete_action.triggered.connect(self.__delete) + delete_action.triggered.connect(self.__on_delete) manage_menu = QMenu(parent=self) manage_menu.addActions([edit_action, delete_action]) @@ -88,19 +126,18 @@ class WrapperWidget(QFrame): return self.wrapper @pyqtSlot() - def __delete(self) -> None: + def __on_delete(self) -> None: self.delete_wrapper.emit(self.wrapper) self.deleteLater() @pyqtSlot() - def __edit(self) -> None: - dialog = QInputDialog(self) - dialog.setWindowTitle(f"{self.tr('Edit wrapper')} - {QCoreApplication.instance().applicationName()}") - dialog.setLabelText(self.tr("Edit wrapper command")) - dialog.setTextValue(self.wrapper.command) - accepted = dialog.exec() - command = dialog.textValue() - dialog.deleteLater() + def __on_edit(self) -> None: + dialog = WrapperDialog(self.wrapper.name, self.wrapper.command, self) + dialog.result_ready.connect(self.__on_edit_result) + dialog.show() + + @pyqtSlot(bool, str) + def __on_edit_result(self, accepted: bool, command: str): if accepted and command: new_wrapper = Wrapper(command=shlex.split(command)) self.update_wrapper.emit(self.wrapper, new_wrapper) @@ -137,7 +174,7 @@ class WrapperSettings(QWidget): self.widget_stack.addWidget(self.no_wrapper_label) self.add_button = QPushButton(self.tr("Add wrapper"), self) - self.add_button.clicked.connect(self.__on_add_button_pressed) + self.add_button.clicked.connect(self.__on_add) self.wrapper_scroll.horizontalScrollBar().rangeChanged.connect(self.adjust_scrollarea) @@ -198,14 +235,14 @@ class WrapperSettings(QWidget): self.wrappers.set_game_wrapper_list(self.app_name, wrappers) @pyqtSlot() - def __on_add_button_pressed(self): - dialog = QInputDialog(self) - dialog.setWindowTitle(f"{self.tr('Add wrapper')} - {QCoreApplication.instance().applicationName()}") - dialog.setLabelText(self.tr("Enter wrapper command")) - accepted = dialog.exec() - command = dialog.textValue() - dialog.deleteLater() - if accepted: + def __on_add(self) -> None: + dialog = WrapperDialog("", "", self) + dialog.result_ready.connect(self.__on_add_result) + dialog.show() + + @pyqtSlot(bool, str) + def __on_add_result(self, accepted: bool, command: str): + if accepted and command: wrapper = Wrapper(shlex.split(command)) self.add_user_wrapper(wrapper)