diff --git a/gui/include/Catalogue/CatalogueTreeWidgetItem.h b/gui/include/Catalogue/CatalogueTreeWidgetItem.h index e4771dc..95be5d6 100644 --- a/gui/include/Catalogue/CatalogueTreeWidgetItem.h +++ b/gui/include/Catalogue/CatalogueTreeWidgetItem.h @@ -14,8 +14,11 @@ public: QVariant data(int column, int role) const override; void setData(int column, int role, const QVariant &value) override; + /// Returns the catalogue represented by the item DBCatalogue catalogue() const; + void setHasChanges(bool value); + private: class CatalogueTreeWidgetItemPrivate; spimpl::unique_impl_ptr impl; diff --git a/gui/resources/icones/discard.png b/gui/resources/icones/discard.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc6b097e9fa0c1093924faeca285fd4cf9c262d GIT binary patch literal 1864 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 zohpImp-f1t9HZicones/allEvents.png icones/trash.png icones/database.png + icones/save.png + icones/discard.png diff --git a/gui/src/Catalogue/CatalogueSideBarWidget.cpp b/gui/src/Catalogue/CatalogueSideBarWidget.cpp index af2aa46..68d6659 100644 --- a/gui/src/Catalogue/CatalogueSideBarWidget.cpp +++ b/gui/src/Catalogue/CatalogueSideBarWidget.cpp @@ -35,6 +35,11 @@ CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) ui->setupUi(this); impl->configureTreeWidget(ui->treeWidget); + ui->treeWidget->setColumnCount(2); + ui->treeWidget->header()->setStretchLastSection(false); + ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents); + ui->treeWidget->header()->setSectionResizeMode(0, QHeaderView::Stretch); + auto emitSelection = [this]() { auto selectedItems = ui->treeWidget->selectedItems(); @@ -145,7 +150,6 @@ void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::configureTreeWidget( auto separator = new QFrame{treeWidget}; separator->setFrameShape(QFrame::HLine); - auto separatorItem = new QTreeWidgetItem{}; separatorItem->setFlags(Qt::NoItemFlags); treeWidget->addTopLevelItem(separatorItem); diff --git a/gui/src/Catalogue/CatalogueTreeWidgetItem.cpp b/gui/src/Catalogue/CatalogueTreeWidgetItem.cpp index 9a11ea6..8bffae8 100644 --- a/gui/src/Catalogue/CatalogueTreeWidgetItem.cpp +++ b/gui/src/Catalogue/CatalogueTreeWidgetItem.cpp @@ -1,5 +1,12 @@ #include "Catalogue/CatalogueTreeWidgetItem.h" +#include + +#include +#include + +const auto VALIDATION_BUTTON_ICON_SIZE = 12; + struct CatalogueTreeWidgetItem::CatalogueTreeWidgetItemPrivate { DBCatalogue m_Catalogue; @@ -17,12 +24,14 @@ CatalogueTreeWidgetItem::CatalogueTreeWidgetItem(DBCatalogue catalogue, int type QVariant CatalogueTreeWidgetItem::data(int column, int role) const { - switch (role) { - case Qt::EditRole: // fallthrough - case Qt::DisplayRole: - return impl->m_Catalogue.getName(); - default: - break; + if (column == 0) { + switch (role) { + case Qt::EditRole: // fallthrough + case Qt::DisplayRole: + return impl->m_Catalogue.getName(); + default: + break; + } } return QTreeWidgetItem::data(column, role); @@ -32,8 +41,11 @@ void CatalogueTreeWidgetItem::setData(int column, int role, const QVariant &valu { if (role == Qt::EditRole && column == 0) { auto newName = value.toString(); - setText(0, newName); - impl->m_Catalogue.setName(newName); + if (newName != impl->m_Catalogue.getName()) { + setText(0, newName); + impl->m_Catalogue.setName(newName); + setHasChanges(true); + } } else { QTreeWidgetItem::setData(column, role, value); @@ -44,3 +56,35 @@ DBCatalogue CatalogueTreeWidgetItem::catalogue() const { return impl->m_Catalogue; } + +void CatalogueTreeWidgetItem::setHasChanges(bool value) +{ + if (value) { + auto widet = new QWidget{treeWidget()}; + + auto layout = new QHBoxLayout{widet}; + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + + auto btnValid = new QToolButton{widet}; + btnValid->setIcon(QIcon{":/icones/save"}); + btnValid->setIconSize(QSize{VALIDATION_BUTTON_ICON_SIZE, VALIDATION_BUTTON_ICON_SIZE}); + btnValid->setAutoRaise(true); + QObject::connect(btnValid, &QToolButton::clicked, [this]() { setHasChanges(false); }); + layout->addWidget(btnValid); + + auto btnDiscard = new QToolButton{widet}; + btnDiscard->setIcon(QIcon{":/icones/discard"}); + btnDiscard->setIconSize(QSize{VALIDATION_BUTTON_ICON_SIZE, VALIDATION_BUTTON_ICON_SIZE}); + btnDiscard->setAutoRaise(true); + QObject::connect(btnDiscard, &QToolButton::clicked, [this]() { setHasChanges(false); }); + layout->addWidget(btnDiscard); + + treeWidget()->setItemWidget(this, 1, {widet}); + treeWidget()->resizeColumnToContents(1); + } + else { + // Note: the widget is destroyed + treeWidget()->setItemWidget(this, 1, nullptr); + } +}