diff --git a/banking_breakdown/ui/main_window.py b/banking_breakdown/ui/main_window.py index 4d64607..3de6812 100644 --- a/banking_breakdown/ui/main_window.py +++ b/banking_breakdown/ui/main_window.py @@ -29,6 +29,8 @@ class MainWindow(QMainWindow): = self.findChild(QVBoxLayout, "warningLayout") self._create_button \ = self.findChild(QPushButton, "createCategoryButton") + self._rename_button \ + = self.findChild(QPushButton, "renameCategoryButton") self._delete_button \ = self.findChild(QPushButton, "deleteCategoryButton") self._apply_button \ @@ -59,6 +61,7 @@ class MainWindow(QMainWindow): # Set event handlers self._create_button.clicked.connect(self._handle_create_click) + self._rename_button.clicked.connect(self._handle_rename_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) @@ -176,6 +179,25 @@ class MainWindow(QMainWindow): callback=self._dataframe_update_callback) context.exec(self.sender().mapToGlobal(pos)) + def _handle_rename_click(self): + selected_item = self._list_widget.currentItem() + + new_name, flag = QInputDialog.getText(self, "Rename category", + "New name:", + text=selected_item.text()) + if not flag: + return + + current_items = [self._list_widget.item(x).text() for x + in range(self._list_widget.count())] + + if new_name not in current_items: + self._pandas_model.rename_category(selected_item.text(), new_name) + selected_item.setText(new_name) + else: + QMessageBox.warning(self, "No action performed", + f"Category '{new_name}' already exists.") + def _handle_create_click(self): new_name, flag = QInputDialog.getText(self, "Create category", "New category:", @@ -193,7 +215,7 @@ class MainWindow(QMainWindow): f"Category '{new_name}' already exists.") def _handle_delete_click(self): - selected_item = self._list_widget.selectedItems()[0] + selected_item = self._list_widget.currentItem() button = QMessageBox.question(self, "Delete category", f"Are you sure you want to delete" @@ -245,9 +267,16 @@ class MainWindow(QMainWindow): else: self._apply_button.setEnabled(False) + def _check_enable_rename_button(self): + if (len(self._list_widget.selectedItems()) > 0): + self._rename_button.setEnabled(True) + else: + self._rename_button.setEnabled(False) + def _handle_list_selection_changed(self): self._check_enable_delete_button() self._check_enable_apply_button() + self._check_enable_rename_button() def _handle_table_selection_changed(self): self._check_enable_clear_button() diff --git a/banking_breakdown/ui/main_window.ui b/banking_breakdown/ui/main_window.ui index 4a693eb..1aa41f5 100644 --- a/banking_breakdown/ui/main_window.ui +++ b/banking_breakdown/ui/main_window.ui @@ -60,6 +60,36 @@ + + + + false + + + Rename selected category + + + Rename + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + diff --git a/banking_breakdown/ui/pandas_model.py b/banking_breakdown/ui/pandas_model.py index 61d6825..47bef99 100644 --- a/banking_breakdown/ui/pandas_model.py +++ b/banking_breakdown/ui/pandas_model.py @@ -83,6 +83,14 @@ class PandasModel(QtCore.QAbstractTableModel): row_indices = self._data.loc[self._data['category'] == category].index self.assign_category(' ', row_indices) + def rename_category(self, old_name, new_name): + if 'category' not in self._data.columns: + self.create_column('category') + + row_indices = self._data.loc[self._data['category'] == old_name].index + self.assign_category(new_name, row_indices) + + def get_categories(self) -> typing.List[str]: if 'category' not in self._data.columns: self.create_column('category')