From ba6b6c2e4a54549b9f3f153a03d4b53e333156f3 Mon Sep 17 00:00:00 2001 From: Andreas Tsouchlos Date: Thu, 4 Jan 2024 14:13:46 +0100 Subject: [PATCH] Add clear button; Disable buttons when function unavailable --- banking_breakdown/ui.py | 51 ++++++++++++++++++++++++++++++++++++++--- res/main_window.ui | 33 ++++++++++++++++++-------- 2 files changed, 72 insertions(+), 12 deletions(-) diff --git a/banking_breakdown/ui.py b/banking_breakdown/ui.py index 8d4499f..6762989 100644 --- a/banking_breakdown/ui.py +++ b/banking_breakdown/ui.py @@ -90,6 +90,8 @@ class MainWindow(QMainWindow): = self.findChild(QPushButton, "deleteCategoryButton") self._apply_button \ = self.findChild(QPushButton, "applyCategoryButton") + self._clear_button \ + = self.findChild(QPushButton, "clearCategoryButton") self._list_widget \ = self.findChild(QListWidget, "categoryListWidget") self._table_view \ @@ -101,6 +103,7 @@ class MainWindow(QMainWindow): self._create_button.clicked.connect(self._handle_create_click) self._delete_button.clicked.connect(self._handle_delete_click) + self._clear_button.clicked.connect(self._handle_clear_click) self._apply_button.clicked.connect(self._handle_apply_click) self._list_widget.itemActivated.connect(self._handle_item_double_click) @@ -110,6 +113,9 @@ class MainWindow(QMainWindow): header.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) header.customContextMenuRequested.connect(self._header_right_clicked) + self._list_widget.itemSelectionChanged.connect( + self._handle_list_selection_changed) + def set_statement_data(self, df: pd.DataFrame): if 'category' not in df.columns: df['category'] = [' '] * len(df.index) @@ -132,6 +138,13 @@ class MainWindow(QMainWindow): self._show_warnings(df) self._update_categories_from_dataframe(df) + # Upon reloading the data, the selection is cleared but no signal + # is generated. Manually call the signal handler + self._handle_table_selection_changed() + + self._table_view.selectionModel().selectionChanged.connect( + self._handle_table_selection_changed) + def get_statement_data(self) -> pd.DataFrame: return self._table_view.model().sourceModel().get_dataframe() @@ -294,6 +307,9 @@ class MainWindow(QMainWindow): df = self.get_statement_data() df.loc[df['category'] == selected_item.text(), 'category'] = ' ' + def _handle_clear_click(self): + self._assign_category(' ') + def _assign_category(self, category: str): indexes = self._table_view.selectionModel().selectedRows() @@ -320,6 +336,38 @@ class MainWindow(QMainWindow): df = self.get_statement_data() df.to_csv(filename, index=False) + def _check_enable_delete_button(self): + if len(self._list_widget.selectedItems()) > 0: + self._delete_button.setEnabled(True) + else: + self._delete_button.setEnabled(False) + + def _check_enable_clear_button(self): + if len(self._table_view.selectionModel().selectedRows()) > 0: + self._clear_button.setEnabled(True) + else: + self._clear_button.setEnabled(False) + + def _check_enable_apply_button(self): + if ((len(self._table_view.selectionModel().selectedRows()) > 0) + and (len(self._list_widget.selectedItems()) > 0)): + self._apply_button.setEnabled(True) + else: + self._apply_button.setEnabled(False) + + def _handle_list_selection_changed(self): + self._check_enable_delete_button() + self._check_enable_apply_button() + + def _handle_table_selection_changed(self): + self._check_enable_clear_button() + self._check_enable_apply_button() + + +# +# Other functions +# + def show_main_window(df: pd.DataFrame = None): app = QApplication(sys.argv) @@ -336,9 +384,6 @@ def main(): import os os.chdir("../") - categories = ["Food", "Rent & Utilities", "Hobbies", "Education", - "Transportation", "Social Life", "Other"] - df = pd.read_csv("res/bank_statement_2023_categorized_renamed.csv") show_main_window(df) diff --git a/res/main_window.ui b/res/main_window.ui index a7ae5cb..d6a7858 100644 --- a/res/main_window.ui +++ b/res/main_window.ui @@ -52,6 +52,9 @@ + + Create new category + Create @@ -59,6 +62,12 @@ + + false + + + Delete selected category + Delete @@ -76,20 +85,26 @@ - - - Qt::Horizontal + + + false - - - 40 - 20 - + + Clear category field of selected transactions - + + Clear + + + + false + + + Apply selected category to selected transactions + Apply