From 8b829e5a69508d5a1faee2316dfc59601f077036 Mon Sep 17 00:00:00 2001 From: Jan Feil <11638228+jfeil@users.noreply.github.com> Date: Tue, 22 Mar 2022 00:04:53 +0100 Subject: [PATCH] Add option to close dialog without deleting filter --- res/filter_editor.ui | 2 +- src/filter_editor.py | 16 +++++++++++----- src/main_application.py | 18 +++++++++++++----- src/ui_filter_editor.py | 5 ++--- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/res/filter_editor.ui b/res/filter_editor.ui index 8028ab5..fdf1c81 100644 --- a/res/filter_editor.ui +++ b/res/filter_editor.ui @@ -20,7 +20,7 @@ Qt::Horizontal - QDialogButtonBox::Discard|QDialogButtonBox::Save + QDialogButtonBox::Cancel|QDialogButtonBox::Discard|QDialogButtonBox::Save diff --git a/src/filter_editor.py b/src/filter_editor.py index f641e91..60684f4 100644 --- a/src/filter_editor.py +++ b/src/filter_editor.py @@ -20,6 +20,7 @@ def __init__(self, filter_configuration: Dict[str, QuestionParameters], self.ui.buttonBox.clicked.connect(self.__handle_buttonbox) self.filter = None + self.result = None self.filter_configuration = filter_configuration @@ -32,7 +33,10 @@ def __init__(self, filter_configuration: Dict[str, QuestionParameters], self.setWindowTitle("Filter bearbeiten") dict_key, filter_option, filter_value = current_filter index = list(self.filter_configuration).index(dict_key) - self.ui.combobox_column.setCurrentIndex(index) + if index == self.ui.combobox_column.currentIndex(): + self.__update_filteroptions(self.ui.combobox_column.currentIndex()) + else: + self.ui.combobox_column.setCurrentIndex(index) index = self.filter_configuration[dict_key].filter_options.index(filter_option) self.ui.combobox_filteroption.setCurrentIndex(index) self.__set_filter_data(filter_value) @@ -41,11 +45,13 @@ def __init__(self, filter_configuration: Dict[str, QuestionParameters], self.__update_filteroptions(self.ui.combobox_column.currentIndex()) def __handle_buttonbox(self, button: QPushButton): - button_role = self.ui.buttonBox.buttonRole(button) - if button_role == QDialogButtonBox.ButtonRole.DestructiveRole: - self.reject() - elif button_role == QDialogButtonBox.ButtonRole.AcceptRole: + self.result = self.ui.buttonBox.buttonRole(button) + if self.result == QDialogButtonBox.ButtonRole.DestructiveRole: + self.accept() + elif self.result == QDialogButtonBox.ButtonRole.AcceptRole: self.accept() + elif self.result == QDialogButtonBox.ButtonRole.RejectRole: + self.reject() def __set_filter_data(self, data) -> None: _, parameters, _ = self.__current_selection_state() diff --git a/src/main_application.py b/src/main_application.py index 1fddf72..4adefc8 100644 --- a/src/main_application.py +++ b/src/main_application.py @@ -7,7 +7,7 @@ from PySide6.QtCore import QCoreApplication, Qt from PySide6.QtCore import QSortFilterProxyModel from PySide6.QtWidgets import QMainWindow, QWidget, QTreeWidgetItem, QFileDialog, QApplication, QMessageBox, QDialog, \ - QListWidgetItem + QListWidgetItem, QDialogButtonBox from bs4 import BeautifulSoup from . import controller, document_builder @@ -200,22 +200,30 @@ def add_filter(self, list_entry: Union[QListWidgetItem, bool] = False): for i in range(first_ruletab.columnCount()): properties.update(first_ruletab.headerData(i, Qt.Horizontal, Qt.UserRole)) editor = FilterEditor(filter_configuration=properties, current_filter=current_configuration) - return_val = editor.exec() - if return_val == QDialog.Rejected: + editor.exec() + if editor.result == QDialogButtonBox.ButtonRole.DestructiveRole: + # Closed via Discard if not edit_mode: return else: RuleSortFilterProxyModel.filters.pop(index) self.ui.filter_list.takeItem(index) del list_entry - elif return_val == QDialog.Accepted: + elif editor.result == QDialogButtonBox.ButtonRole.AcceptRole: + # Closed via Save if not edit_mode: RuleSortFilterProxyModel.filters += [(editor.create_filter(), editor.current_configuration())] self.ui.filter_list.addItem(QListWidgetItem(f"Filter {self.ui.filter_list.count() + 1}")) else: RuleSortFilterProxyModel.filters[index] = (editor.create_filter(), editor.current_configuration()) + elif editor.result == QDialogButtonBox.ButtonRole.RejectRole: + # Closed via Cancel + return + elif editor.result is None: + # Closed via X + return else: - raise ValueError("Invalid response") + raise ValueError(f"Invalid response {editor.result}") self.refresh_column_filter() def refresh_column_filter(self): diff --git a/src/ui_filter_editor.py b/src/ui_filter_editor.py index 5694a97..cf7375a 100644 --- a/src/ui_filter_editor.py +++ b/src/ui_filter_editor.py @@ -12,7 +12,6 @@ from PySide6.QtWidgets import (QComboBox, QDialogButtonBox, QGridLayout, QLabel, QSizePolicy, QSpacerItem) - class Ui_FilterEditor(object): def setupUi(self, FilterEditor): if not FilterEditor.objectName(): @@ -23,7 +22,7 @@ def setupUi(self, FilterEditor): self.buttonBox = QDialogButtonBox(FilterEditor) self.buttonBox.setObjectName(u"buttonBox") self.buttonBox.setOrientation(Qt.Horizontal) - self.buttonBox.setStandardButtons(QDialogButtonBox.Discard | QDialogButtonBox.Save) + self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Discard | QDialogButtonBox.Save) self.gridLayout.addWidget(self.buttonBox, 4, 1, 1, 1) @@ -61,7 +60,6 @@ def setupUi(self, FilterEditor): self.buttonBox.rejected.connect(FilterEditor.reject) QMetaObject.connectSlotsByName(FilterEditor) - # setupUi def retranslateUi(self, FilterEditor): @@ -70,3 +68,4 @@ def retranslateUi(self, FilterEditor): self.label_filter.setText(QCoreApplication.translate("FilterEditor", u"Filter", None)) self.label_filteroption.setText(QCoreApplication.translate("FilterEditor", u"Filteroption", None)) # retranslateUi +