#include "Catalogue/CatalogueTreeWidgetItem.h" #include #include #include #include #include /// Column in the tree widget where the apply and cancel buttons must appear const auto APPLY_CANCEL_BUTTONS_COLUMN = 1; struct CatalogueTreeWidgetItem::CatalogueTreeWidgetItemPrivate { std::shared_ptr m_Catalogue; CatalogueTreeWidgetItemPrivate(std::shared_ptr catalogue) : m_Catalogue(catalogue) { } }; CatalogueTreeWidgetItem::CatalogueTreeWidgetItem(std::shared_ptr catalogue, int type) : QTreeWidgetItem(type), impl{spimpl::make_unique_impl(catalogue)} { setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable); } QVariant CatalogueTreeWidgetItem::data(int column, int role) const { if (column == 0) { switch (role) { case Qt::EditRole: // fallthrough case Qt::DisplayRole: return impl->m_Catalogue->getName(); default: break; } } return QTreeWidgetItem::data(column, role); } void CatalogueTreeWidgetItem::setData(int column, int role, const QVariant &value) { if (role == Qt::EditRole && column == 0) { auto newName = value.toString(); if (newName != impl->m_Catalogue->getName()) { setText(0, newName); impl->m_Catalogue->setName(newName); sqpApp->catalogueController().updateCatalogue(impl->m_Catalogue); setHasChanges(true); } } else { QTreeWidgetItem::setData(column, role, value); } } std::shared_ptr CatalogueTreeWidgetItem::catalogue() const { return impl->m_Catalogue; } void CatalogueTreeWidgetItem::setHasChanges(bool value) { if (value) { if (!hasChanges()) { auto widget = CatalogueExplorerHelper::buildValidationWidget( treeWidget(), [this]() { setHasChanges(false); }, [this]() { setHasChanges(false); }); treeWidget()->setItemWidget(this, APPLY_CANCEL_BUTTONS_COLUMN, widget); } } else { // Note: the widget is destroyed treeWidget()->setItemWidget(this, APPLY_CANCEL_BUTTONS_COLUMN, nullptr); } } bool CatalogueTreeWidgetItem::hasChanges() { return treeWidget()->itemWidget(this, APPLY_CANCEL_BUTTONS_COLUMN) != nullptr; } void CatalogueTreeWidgetItem::refresh() { emitDataChanged(); }