import logging from PyQt5 import QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtGui import QStandardItem, QStandardItemModel from ArtNet.gui.dialogs.collection_select_dialog.collection_select_dialog import Ui_Dialog from ArtNet.gui.dialogs.collection_modify_dialog.collection_dialog import CollectionModDialog class CollectionSelectDialog(QtWidgets.QDialog): def __init__(self, parent=None): super().__init__(parent) self.parent = parent self.__curr_searched_collections: list = None self.curr_collections = list() self.ui = Ui_Dialog() self.ui.setupUi(self) self.setWindowTitle("Select a Collection") self.ui.collection_name_line.textChanged.connect(self.on_search_params_changed) self.ui.presence_name_line.textChanged.connect(self.on_search_params_changed) self.ui.presence_domain_line.textChanged.connect(self.on_search_params_changed) self.ui.art_name_line.textChanged.connect(self.on_search_params_changed) self.ui.create_collection_button.clicked.connect(self.on_create_collection_clicked) self.ui.edit_collection_button.clicked.connect(self.on_edit_collection_clicked) self.ui.delete_collection_button.clicked.connect(self.on_delete_collection_clicked) def exec_(self, already_selected_collections: list) -> list: self.curr_collections = already_selected_collections self.on_search_params_changed() if super(CollectionSelectDialog, self).exec_() == QtWidgets.QDialog.Rejected: return None logging.debug(f"Finished collection selection dialog! User chose collections: {self.curr_collections}") return self.curr_collections def set_collection_search_result(self, collections: list): """ Set the collections in the list :param collections: :return: """ item_model = QStandardItemModel(self.ui.collection_list) self.__curr_searched_collections = list() for collection in collections: coll_id, coll_name, coll_desc, _, _, _, _ = collection collection_string = f"#{coll_id}:{coll_name}" self.__curr_searched_collections.append(collection) item = QStandardItem(collection_string) flags = Qt.ItemIsEnabled flags |= Qt.ItemIsUserCheckable item.setFlags(flags) item.setData(Qt.Unchecked, Qt.CheckStateRole) if self.curr_collections is not None and coll_id in [coll_id for coll_id, coll_name in self.curr_collections]: item.setCheckState(Qt.Checked) item_model.appendRow(item) item_model.itemChanged.connect(self.on_collection_search_item_changed) self.ui.collection_list.setModel(item_model) # callback methods def on_collection_search_item_changed(self, item: QStandardItem): coll_id = int(item.text().split(":")[0].split("#")[1]) coll_name = item.text().split(":")[1] if item.checkState() == Qt.Checked: self.curr_collections.append((coll_id, coll_name)) else: # unchecked self.curr_collections.remove((coll_id, coll_name)) self.set_collection_search_result(self.__curr_searched_collections) # unchecks previously checked collections def on_search_params_changed(self): coll_name = self.ui.collection_name_line.text() pr_name = self.ui.presence_name_line.text() pr_domain = self.ui.presence_domain_line.text() art_title = self.ui.art_name_line.text() result = self.parent.search_collections(collection_name=coll_name, presence_name=pr_name, presence_domain=pr_domain, art_name=art_title) self.set_collection_search_result(result) def on_create_collection_clicked(self): logging.info("Clicked on create collection button!") dialog = CollectionModDialog(self, edit_collection=True, db_connection=self.parent.main.db_connection) collection_data = dialog.exec_() if collection_data is None: return self.parent.create_collection(collection_data["name"], collection_data["description"]) self.on_search_params_changed() def on_edit_collection_clicked(self): logging.info("Clicked on edit collection button!") raise NotImplementedError # TODO def on_delete_collection_clicked(self): logging.info("Clicked on delete collection button!") raise NotImplementedError # TODO