from PyQt5 import QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtGui import QStandardItem, QStandardItemModel from ArtNet.gui.dialogs.category_modify_dialog.category_modify_dialog import Ui_category_modify_dialog class CategoryModDialog(QtWidgets.QDialog): def __init__(self, parent=None, delete_category: bool = False): super().__init__(parent) self.parent = parent self.ui = Ui_category_modify_dialog() self.ui.setupUi(self) self.name_valid: bool = False self.all_categories: list = None self.default_style = self.ui.category_name_line.styleSheet() self.delete_mode: bool = delete_category if delete_category: self.ui.dialog_topic.setText("Delete Category") else: self.ui.dialog_topic.setText("Create Category") self.ui.category_name_line.textChanged.connect(self.on_category_name_change) self.set_all_categories() def set_all_categories(self): """ Populate the category list with all categories if name line is empty. Otherwise fuzzy search for fitting categories :return: """ self.all_categories = self.parent.get_categories(self.ui.category_name_line.text(), all_if_empty=True) categories = [] for i in range(len(self.all_categories)): categories.append(self.all_categories[i]) self.all_categories = categories item_model = QStandardItemModel(self.ui.other_categories_list) for category in self.all_categories: item = QStandardItem(category) item_model.appendRow(item) self.ui.other_categories_list.setModel(item_model) def on_category_name_change(self): # TODO mark input red if it is a taken name (or if it isn't in deletion mode) self.set_all_categories() self.ui.category_name_line.setStyleSheet(self.default_style) self.name_valid = True if self.delete_mode: if self.ui.category_name_line.text() not in self.all_categories: self.ui.category_name_line.setStyleSheet("color: red") self.name_valid = False else: if self.ui.category_name_line.text() in self.all_categories: self.ui.category_name_line.setStyleSheet("color: red") self.name_valid = False def exec_(self) -> dict: if super(CategoryModDialog, self).exec_() == QtWidgets.QDialog.Rejected or not self.name_valid: return None return {"name": self.ui.category_name_line.text()}