diff --git a/banking_breakdown/ui/main_window.py b/banking_breakdown/ui/main_window.py index 2db10b8..b55974f 100644 --- a/banking_breakdown/ui/main_window.py +++ b/banking_breakdown/ui/main_window.py @@ -41,11 +41,10 @@ class MainWindow(QMainWindow): # Set up QTableView model self._pandas_model = PandasModel(self) - self._proxyModel = QSortFilterProxyModel(self) - self._proxyModel.setSourceModel(self._pandas_model) - self._table_view.setModel(self._proxyModel) - self._proxyModel.setDynamicSortFilter(True) - self._proxyModel.setSortRole(Qt.ItemDataRole.EditRole) + self._proxy_model = QSortFilterProxyModel(self) + self._proxy_model.setSourceModel(self._pandas_model) + self._table_view.setModel(self._proxy_model) + self._proxy_model.setSortRole(Qt.ItemDataRole.EditRole) # Set event handlers @@ -61,6 +60,7 @@ class MainWindow(QMainWindow): header.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) header.customContextMenuRequested.connect( self._handle_header_right_click) + header.sectionClicked.connect(self._handle_header_left_click) self._list_widget.itemSelectionChanged.connect( self._handle_list_selection_changed) @@ -110,6 +110,9 @@ class MainWindow(QMainWindow): def _update_categories_from_dataframe(self): df = self._pandas_model.get_dataframe() + if 'category' not in df.columns: + df['category'] = [' '] * len(df.index) + df_categories = df['category'].unique() current_categories = [self._list_widget.item(x).text() for x in range(self._list_widget.count())] @@ -154,6 +157,11 @@ class MainWindow(QMainWindow): # Event handlers # + def _handle_header_left_click(self, logical_index): + self._proxy_model.sort(logical_index, + self._table_view.horizontalHeader() + .sortIndicatorOrder()) + def _handle_header_right_click(self, pos): column = self._table_view.horizontalHeader().logicalIndexAt(pos) @@ -185,10 +193,15 @@ class MainWindow(QMainWindow): f"Are you sure you want to delete" f" category '{selected_item.text()}'?") + df = self._pandas_model.get_dataframe() + + if 'category' not in df.columns: + df['category'] = [' '] * len(df.index) + if button == QMessageBox.StandardButton.Yes: - self._list_widget.takeItem(self._list_widget.row(selected_item)) - df = self.get_statement_data() df.loc[df['category'] == selected_item.text(), 'category'] = ' ' + self._list_widget.takeItem(self._list_widget.row(selected_item)) + self._pandas_model.set_dataframe(df) def _handle_clear_click(self): self._assign_category(' ') @@ -201,7 +214,6 @@ class MainWindow(QMainWindow): df = self._pandas_model.get_dataframe() df.loc[row_indices, 'category'] = category - self._pandas_model.set_dataframe(df) def _handle_apply_click(self): diff --git a/banking_breakdown/ui/pandas_model.py b/banking_breakdown/ui/pandas_model.py index 9d703c1..f8371bf 100644 --- a/banking_breakdown/ui/pandas_model.py +++ b/banking_breakdown/ui/pandas_model.py @@ -1,7 +1,7 @@ import numpy import pandas as pd from PyQt6 import QtCore -from PyQt6.QtCore import Qt, QModelIndex +from PyQt6.QtCore import Qt, QModelIndex, QSortFilterProxyModel def _get_str_dataframe(df: pd.DataFrame) -> pd.DataFrame: diff --git a/res/main_window.ui b/res/main_window.ui index d6a7858..2a2b799 100644 --- a/res/main_window.ui +++ b/res/main_window.ui @@ -127,8 +127,11 @@ QAbstractItemView::SelectRows - true + false + + true + true