Add clear button; Disable buttons when function unavailable

This commit is contained in:
Andreas Tsouchlos 2024-01-04 14:13:46 +01:00
parent f4b73064ff
commit ba6b6c2e4a
2 changed files with 72 additions and 12 deletions

View File

@ -90,6 +90,8 @@ class MainWindow(QMainWindow):
= self.findChild(QPushButton, "deleteCategoryButton") = self.findChild(QPushButton, "deleteCategoryButton")
self._apply_button \ self._apply_button \
= self.findChild(QPushButton, "applyCategoryButton") = self.findChild(QPushButton, "applyCategoryButton")
self._clear_button \
= self.findChild(QPushButton, "clearCategoryButton")
self._list_widget \ self._list_widget \
= self.findChild(QListWidget, "categoryListWidget") = self.findChild(QListWidget, "categoryListWidget")
self._table_view \ self._table_view \
@ -101,6 +103,7 @@ class MainWindow(QMainWindow):
self._create_button.clicked.connect(self._handle_create_click) self._create_button.clicked.connect(self._handle_create_click)
self._delete_button.clicked.connect(self._handle_delete_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._apply_button.clicked.connect(self._handle_apply_click)
self._list_widget.itemActivated.connect(self._handle_item_double_click) self._list_widget.itemActivated.connect(self._handle_item_double_click)
@ -110,6 +113,9 @@ class MainWindow(QMainWindow):
header.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) header.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
header.customContextMenuRequested.connect(self._header_right_clicked) 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): def set_statement_data(self, df: pd.DataFrame):
if 'category' not in df.columns: if 'category' not in df.columns:
df['category'] = [' '] * len(df.index) df['category'] = [' '] * len(df.index)
@ -132,6 +138,13 @@ class MainWindow(QMainWindow):
self._show_warnings(df) self._show_warnings(df)
self._update_categories_from_dataframe(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: def get_statement_data(self) -> pd.DataFrame:
return self._table_view.model().sourceModel().get_dataframe() return self._table_view.model().sourceModel().get_dataframe()
@ -294,6 +307,9 @@ class MainWindow(QMainWindow):
df = self.get_statement_data() df = self.get_statement_data()
df.loc[df['category'] == selected_item.text(), 'category'] = ' ' df.loc[df['category'] == selected_item.text(), 'category'] = ' '
def _handle_clear_click(self):
self._assign_category(' ')
def _assign_category(self, category: str): def _assign_category(self, category: str):
indexes = self._table_view.selectionModel().selectedRows() indexes = self._table_view.selectionModel().selectedRows()
@ -320,6 +336,38 @@ class MainWindow(QMainWindow):
df = self.get_statement_data() df = self.get_statement_data()
df.to_csv(filename, index=False) 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): def show_main_window(df: pd.DataFrame = None):
app = QApplication(sys.argv) app = QApplication(sys.argv)
@ -336,9 +384,6 @@ def main():
import os import os
os.chdir("../") os.chdir("../")
categories = ["Food", "Rent & Utilities", "Hobbies", "Education",
"Transportation", "Social Life", "Other"]
df = pd.read_csv("res/bank_statement_2023_categorized_renamed.csv") df = pd.read_csv("res/bank_statement_2023_categorized_renamed.csv")
show_main_window(df) show_main_window(df)

View File

@ -52,6 +52,9 @@
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QPushButton" name="createCategoryButton"> <widget class="QPushButton" name="createCategoryButton">
<property name="toolTip">
<string>Create new category</string>
</property>
<property name="text"> <property name="text">
<string>Create</string> <string>Create</string>
</property> </property>
@ -59,6 +62,12 @@
</item> </item>
<item> <item>
<widget class="QPushButton" name="deleteCategoryButton"> <widget class="QPushButton" name="deleteCategoryButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Delete selected category</string>
</property>
<property name="text"> <property name="text">
<string>Delete</string> <string>Delete</string>
</property> </property>
@ -76,20 +85,26 @@
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<spacer name="horizontalSpacer"> <widget class="QPushButton" name="clearCategoryButton">
<property name="orientation"> <property name="enabled">
<enum>Qt::Horizontal</enum> <bool>false</bool>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="toolTip">
<size> <string>Clear category field of selected transactions</string>
<width>40</width>
<height>20</height>
</size>
</property> </property>
</spacer> <property name="text">
<string>Clear</string>
</property>
</widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="applyCategoryButton"> <widget class="QPushButton" name="applyCategoryButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Apply selected category to selected transactions</string>
</property>
<property name="text"> <property name="text">
<string>Apply</string> <string>Apply</string>
</property> </property>