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')