From 938a31670f5f1fe61911f554e88c6689ed14ea30 2017-12-14 16:34:12 From: Thibaud Rabillard Date: 2017-12-14 16:34:12 Subject: [PATCH] Edition of catalogues from the inspector --- diff --git a/gui/include/Catalogue/CatalogueInspectorWidget.h b/gui/include/Catalogue/CatalogueInspectorWidget.h index c049a81..24d27e1 100644 --- a/gui/include/Catalogue/CatalogueInspectorWidget.h +++ b/gui/include/Catalogue/CatalogueInspectorWidget.h @@ -1,6 +1,7 @@ #ifndef SCIQLOP_CATALOGUEINSPECTORWIDGET_H #define SCIQLOP_CATALOGUEINSPECTORWIDGET_H +#include #include #include @@ -14,6 +15,10 @@ class DBEvent; class CatalogueInspectorWidget : public QWidget { Q_OBJECT +signals: + void catalogueUpdated(const std::shared_ptr &catalogue); + void eventUpdated(const std::shared_ptr &event); + public: explicit CatalogueInspectorWidget(QWidget *parent = 0); virtual ~CatalogueInspectorWidget(); @@ -31,6 +36,9 @@ public slots: private: Ui::CatalogueInspectorWidget *ui; + + class CatalogueInspectorWidgetPrivate; + spimpl::unique_impl_ptr impl; }; #endif // SCIQLOP_CATALOGUEINSPECTORWIDGET_H diff --git a/gui/include/Catalogue/CatalogueSideBarWidget.h b/gui/include/Catalogue/CatalogueSideBarWidget.h index f762c3b..0af2b26 100644 --- a/gui/include/Catalogue/CatalogueSideBarWidget.h +++ b/gui/include/Catalogue/CatalogueSideBarWidget.h @@ -2,6 +2,7 @@ #define SCIQLOP_CATALOGUESIDEBARWIDGET_H #include +#include #include #include @@ -11,6 +12,8 @@ namespace Ui { class CatalogueSideBarWidget; } +Q_DECLARE_LOGGING_CATEGORY(LOG_CatalogueSideBarWidget) + class CatalogueSideBarWidget : public QWidget { Q_OBJECT @@ -25,6 +28,8 @@ public: explicit CatalogueSideBarWidget(QWidget *parent = 0); virtual ~CatalogueSideBarWidget(); + void setCatalogueChanges(const std::shared_ptr &catalogue, bool hasChanges); + private: Ui::CatalogueSideBarWidget *ui; diff --git a/gui/include/Catalogue/CatalogueTreeWidgetItem.h b/gui/include/Catalogue/CatalogueTreeWidgetItem.h index 60ea055..a8b4f14 100644 --- a/gui/include/Catalogue/CatalogueTreeWidgetItem.h +++ b/gui/include/Catalogue/CatalogueTreeWidgetItem.h @@ -18,8 +18,13 @@ public: /// Returns the catalogue represented by the item std::shared_ptr catalogue() const; + /// Displays or hides the save and cancel buttons indicating that the catalogue has unsaved + /// changes void setHasChanges(bool value); + /// Refreshes the data displayed by the item from the catalogue + void refresh(); + private: class CatalogueTreeWidgetItemPrivate; spimpl::unique_impl_ptr impl; diff --git a/gui/src/Catalogue/CatalogueExplorer.cpp b/gui/src/Catalogue/CatalogueExplorer.cpp index 43c1b1c..7a1d992 100644 --- a/gui/src/Catalogue/CatalogueExplorer.cpp +++ b/gui/src/Catalogue/CatalogueExplorer.cpp @@ -48,6 +48,9 @@ CatalogueExplorer::CatalogueExplorer(QWidget *parent) ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty); } }); + + connect(ui->inspector, &CatalogueInspectorWidget::catalogueUpdated, + [this](auto catalogue) { ui->catalogues->setCatalogueChanges(catalogue, true); }); } CatalogueExplorer::~CatalogueExplorer() diff --git a/gui/src/Catalogue/CatalogueInspectorWidget.cpp b/gui/src/Catalogue/CatalogueInspectorWidget.cpp index e605cc8..033ce5c 100644 --- a/gui/src/Catalogue/CatalogueInspectorWidget.cpp +++ b/gui/src/Catalogue/CatalogueInspectorWidget.cpp @@ -6,11 +6,32 @@ #include #include +struct CatalogueInspectorWidget::CatalogueInspectorWidgetPrivate { + std::shared_ptr m_DisplayedCatalogue = nullptr; + std::shared_ptr m_DisplayedEvent = nullptr; +}; + CatalogueInspectorWidget::CatalogueInspectorWidget(QWidget *parent) - : QWidget(parent), ui(new Ui::CatalogueInspectorWidget) + : QWidget(parent), + ui(new Ui::CatalogueInspectorWidget), + impl{spimpl::make_unique_impl()} { ui->setupUi(this); showPage(Page::Empty); + + connect(ui->leCatalogueName, &QLineEdit::editingFinished, [this]() { + if (ui->leCatalogueName->text() != impl->m_DisplayedCatalogue->getName()) { + impl->m_DisplayedCatalogue->setName(ui->leCatalogueName->text()); + emit this->catalogueUpdated(impl->m_DisplayedCatalogue); + } + }); + + connect(ui->leCatalogueAuthor, &QLineEdit::editingFinished, [this]() { + if (ui->leCatalogueAuthor->text() != impl->m_DisplayedCatalogue->getAuthor()) { + impl->m_DisplayedCatalogue->setAuthor(ui->leCatalogueAuthor->text()); + emit this->catalogueUpdated(impl->m_DisplayedCatalogue); + } + }); } CatalogueInspectorWidget::~CatalogueInspectorWidget() @@ -30,6 +51,10 @@ CatalogueInspectorWidget::Page CatalogueInspectorWidget::currentPage() const void CatalogueInspectorWidget::setEvent(const std::shared_ptr &event) { + impl->m_DisplayedEvent = event; + + blockSignals(true); + showPage(Page::EventProperties); ui->leEventName->setText(event->getName()); ui->leEventMission->setText(event->getMission()); @@ -46,11 +71,19 @@ void CatalogueInspectorWidget::setEvent(const std::shared_ptr &event) ui->dateTimeEventTStart->setDateTime(DateUtils::dateTime(event->getTStart())); ui->dateTimeEventTEnd->setDateTime(DateUtils::dateTime(event->getTEnd())); + + blockSignals(false); } void CatalogueInspectorWidget::setCatalogue(const std::shared_ptr &catalogue) { + impl->m_DisplayedCatalogue = catalogue; + + blockSignals(true); + showPage(Page::CatalogueProperties); ui->leCatalogueName->setText(catalogue->getName()); ui->leCatalogueAuthor->setText(catalogue->getAuthor()); + + blockSignals(false); } diff --git a/gui/src/Catalogue/CatalogueSideBarWidget.cpp b/gui/src/Catalogue/CatalogueSideBarWidget.cpp index 4951da3..97850e5 100644 --- a/gui/src/Catalogue/CatalogueSideBarWidget.cpp +++ b/gui/src/Catalogue/CatalogueSideBarWidget.cpp @@ -10,6 +10,8 @@ #include +Q_LOGGING_CATEGORY(LOG_CatalogueSideBarWidget, "CatalogueSideBarWidget") + constexpr auto ALL_EVENT_ITEM_TYPE = QTreeWidgetItem::UserType; constexpr auto TRASH_ITEM_TYPE = QTreeWidgetItem::UserType + 1; @@ -24,6 +26,9 @@ struct CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate { QTreeWidgetItem *getDatabaseItem(const QString &name, QTreeWidget *treeWidget); void addCatalogueItem(const std::shared_ptr &catalogue, QTreeWidgetItem *parentDatabaseItem); + + CatalogueTreeWidgetItem *getCatalogueItem(const std::shared_ptr &catalogue, + QTreeWidget *treeWidget) const; }; CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) @@ -97,6 +102,14 @@ CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) connect(ui->treeWidget, &QTreeWidget::itemClicked, emitSelection); connect(ui->treeWidget, &QTreeWidget::currentItemChanged, emitSelection); + connect(ui->treeWidget, &QTreeWidget::itemChanged, + [emitSelection, this](auto item, auto column) { + auto selectedItems = ui->treeWidget->selectedItems(); + qDebug() << "ITEM CHANGED" << column; + if (selectedItems.contains(item) && column == 0) { + emitSelection(); + } + }); ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this, @@ -108,6 +121,15 @@ CatalogueSideBarWidget::~CatalogueSideBarWidget() delete ui; } +void CatalogueSideBarWidget::setCatalogueChanges(const std::shared_ptr &catalogue, + bool hasChanges) +{ + if (auto catalogueItem = impl->getCatalogueItem(catalogue, ui->treeWidget)) { + catalogueItem->setHasChanges(hasChanges); + catalogueItem->refresh(); + } +} + void CatalogueSideBarWidget::onContextMenuRequested(const QPoint &pos) { QMenu menu{this}; @@ -196,3 +218,30 @@ void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addCatalogueItem( catalogueItem->setIcon(0, QIcon{":/icones/catalogue.png"}); parentDatabaseItem->addChild(catalogueItem); } + +CatalogueTreeWidgetItem *CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::getCatalogueItem( + const std::shared_ptr &catalogue, QTreeWidget *treeWidget) const +{ + for (auto i = 0; i < treeWidget->topLevelItemCount(); ++i) { + auto item = treeWidget->topLevelItem(i); + if (item->type() == DATABASE_ITEM_TYPE) { + for (auto j = 0; j < item->childCount(); ++j) { + auto childItem = item->child(j); + if (childItem->type() == CATALOGUE_ITEM_TYPE) { + auto catalogueItem = static_cast(childItem); + if (catalogueItem->catalogue() == catalogue) { + return catalogueItem; + } + } + else { + qCWarning(LOG_CatalogueSideBarWidget()) << "getCatalogueItem: Invalid tree " + "structure. A database item should " + "only contain catalogues."; + Q_ASSERT(false); + } + } + } + } + + return nullptr; +} diff --git a/gui/src/Catalogue/CatalogueTreeWidgetItem.cpp b/gui/src/Catalogue/CatalogueTreeWidgetItem.cpp index ac2a607..afa3cef 100644 --- a/gui/src/Catalogue/CatalogueTreeWidgetItem.cpp +++ b/gui/src/Catalogue/CatalogueTreeWidgetItem.cpp @@ -8,6 +8,9 @@ const auto VALIDATION_BUTTON_ICON_SIZE = 12; +/// 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; @@ -63,31 +66,38 @@ std::shared_ptr CatalogueTreeWidgetItem::catalogue() const 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); + if (treeWidget()->itemWidget(this, APPLY_CANCEL_BUTTONS_COLUMN) == nullptr) { + 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, APPLY_CANCEL_BUTTONS_COLUMN, {widet}); + } } else { // Note: the widget is destroyed - treeWidget()->setItemWidget(this, 1, nullptr); + treeWidget()->setItemWidget(this, APPLY_CANCEL_BUTTONS_COLUMN, nullptr); } } + +void CatalogueTreeWidgetItem::refresh() +{ + emitDataChanged(); +}