From ecdafd3c1c9e15cd2c7a6e3a651f94c08a9b3f2b Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Thu, 17 Aug 2023 12:33:49 +0300 Subject: [PATCH] Wrappers: Allow wrapper editing on double-click. Internally this works by removing the old wrapper and adding a new wrapper int the same index. --- .../tabs/settings/widgets/wrapper.py | 61 ++++++++++++++----- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/rare/components/tabs/settings/widgets/wrapper.py b/rare/components/tabs/settings/widgets/wrapper.py index a5e72e8c..899678ff 100644 --- a/rare/components/tabs/settings/widgets/wrapper.py +++ b/rare/components/tabs/settings/widgets/wrapper.py @@ -35,12 +35,13 @@ class Wrapper: class WrapperWidget(QFrame): + update_wrapper = pyqtSignal(str, str) delete_wrapper = pyqtSignal(str) def __init__(self, text: str, show_text=None, parent=None): super(WrapperWidget, self).__init__(parent=parent) if not show_text: - show_text = text.split(" ")[0] + show_text = text.split()[0] self.setFrameShape(QFrame.StyledPanel) self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed) @@ -53,8 +54,10 @@ class WrapperWidget(QFrame): self.setToolTip(text) self.delete_button = QPushButton(icon("ei.remove"), "", parent=self) - if show_text in extra_wrapper_regex.keys(): - self.delete_button.setDisabled(True) + self.unmanaged = show_text in extra_wrapper_regex.keys() + self.delete_button.setDisabled(self.unmanaged) + self.text_lbl.setDisabled(self.unmanaged) + if self.unmanaged: self.delete_button.setToolTip(self.tr("Disable in settings")) else: self.delete_button.setToolTip(self.tr("Remove")) @@ -74,8 +77,9 @@ class WrapperWidget(QFrame): def delete(self): self.delete_wrapper.emit(self.text) - def mouseMoveEvent(self, e): - if e.buttons() == Qt.LeftButton: + def mouseMoveEvent(self, a0: QMouseEvent) -> None: + if a0.buttons() == Qt.LeftButton: + a0.accept() drag = QDrag(self) mime = QMimeData() drag.setMimeData(mime) @@ -84,7 +88,17 @@ class WrapperWidget(QFrame): def mouseDoubleClickEvent(self, a0: QMouseEvent) -> None: if a0.button() == Qt.LeftButton: a0.accept() - pass # self.edit + if self.unmanaged: + return + dialog = QInputDialog(self) + dialog.setWindowTitle(f"{self.tr('Edit wrapper')} - {QCoreApplication.instance().applicationName()}") + dialog.setLabelText(self.tr("Edit wrapper command")) + dialog.setTextValue(self.text) + accepted = dialog.exec() + wrapper = dialog.textValue() + dialog.deleteLater() + if accepted: + self.update_wrapper.emit(self.text, wrapper) class WrapperSettings(QWidget, Ui_WrapperSettings): @@ -152,15 +166,16 @@ class WrapperSettings(QWidget, Ui_WrapperSettings): return [w.text for w in wrappers] def add_button_pressed(self): - header = self.tr("Add wrapper") - wrapper, done = QInputDialog.getText( - self, f"{header} - {QCoreApplication.instance().applicationName()}", self.tr("Insert wrapper executable") - ) - if not done: - return - self.add_wrapper(wrapper) + dialog = QInputDialog(self) + dialog.setWindowTitle(f"{self.tr('Add wrapper')} - {QCoreApplication.instance().applicationName()}") + dialog.setLabelText(self.tr("Enter wrapper command")) + accepted = dialog.exec() + wrapper = dialog.textValue() + dialog.deleteLater() + if accepted: + self.add_wrapper(wrapper) - def add_wrapper(self, text: str, from_load=False): + def add_wrapper(self, text: str, position: int = -1, from_load: bool = False): if text == "mangohud" and self.wrappers.get("mangohud"): return show_text = "" @@ -199,18 +214,25 @@ class WrapperSettings(QWidget, Ui_WrapperSettings): widget.deleteLater() widget = WrapperWidget(text, show_text, self.scroll_content) - self.scroll_content.layout().addWidget(widget) + if position < 0: + self.scroll_content.layout().addWidget(widget) + else: + self.scroll_content.layout().insertWidget(position, widget) self.adjust_scrollarea( self.wrapper_scroll.horizontalScrollBar().minimum(), self.wrapper_scroll.horizontalScrollBar().maximum() ) + widget.update_wrapper.connect(self.update_wrapper) widget.delete_wrapper.connect(self.delete_wrapper) + self.wrappers[show_text] = widget if not from_load: self.save() + @pyqtSlot(str) def delete_wrapper(self, text: str): + text = text.split()[0] widget = self.wrappers.get(text, None) if widget: self.wrappers.pop(text) @@ -222,6 +244,13 @@ class WrapperSettings(QWidget, Ui_WrapperSettings): self.save() + @pyqtSlot(str, str) + def update_wrapper(self, old: str, new: str): + key = old.split()[0] + idx = self.scroll_content.layout().indexOf(self.wrappers[key]) + self.delete_wrapper(key) + self.add_wrapper(new, position=idx) + def save(self): # save wrappers twice, to support wrappers with spaces if len(self.wrappers) == 0: @@ -246,7 +275,7 @@ class WrapperSettings(QWidget, Ui_WrapperSettings): wrappers = pattern.split(cfg)[1::2] for wrapper in wrappers: - self.add_wrapper(wrapper, True) + self.add_wrapper(wrapper, from_load=True) if not self.wrappers: self.wrapper_scroll.setMaximumHeight(self.label_page.sizeHint().height())