Implement category renaming

This commit is contained in:
Andreas Tsouchlos 2024-01-15 11:19:53 +01:00
parent f53a948c8f
commit 6c89dae2d1
3 changed files with 68 additions and 1 deletions

View File

@ -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()

View File

@ -60,6 +60,36 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="renameCategoryButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Rename selected category</string>
</property>
<property name="text">
<string>Rename</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="deleteCategoryButton">
<property name="enabled">

View File

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