From 2e287944f098de8377acf0cb42cf6cde6a9ea588 Mon Sep 17 00:00:00 2001 From: Mikhail Svechnikov <svechnikovmv@gmail.com> Date: Fri, 10 Feb 2023 15:09:27 +0100 Subject: [PATCH] restore project notification about changed state --- GUI/View/Mask/MaskEditorActions.cpp | 4 ++ GUI/View/Mask/MaskEditorPropertyPanel.cpp | 39 ++++++++++--------- GUI/View/Mask/MaskGraphicsScene.cpp | 20 +++++++++- GUI/View/Mask/MaskGraphicsScene.h | 2 + .../Projection/ProjectionsEditorActions.cpp | 2 + 5 files changed, 46 insertions(+), 21 deletions(-) diff --git a/GUI/View/Mask/MaskEditorActions.cpp b/GUI/View/Mask/MaskEditorActions.cpp index 874b2a580e0..13eaccfa8de 100644 --- a/GUI/View/Mask/MaskEditorActions.cpp +++ b/GUI/View/Mask/MaskEditorActions.cpp @@ -15,6 +15,7 @@ #include "GUI/View/Mask/MaskEditorActions.h" #include "GUI/Model/Device/MaskItems.h" #include "GUI/Model/Model/SessionModel.h" +#include "GUI/Model/Project/ProjectDocument.h" #include "GUI/Util/ActionFactory.h" #include <QAction> #include <QItemSelectionModel> @@ -112,6 +113,7 @@ void MaskEditorActions::onDeleteMaskAction() m_maskContainerModel->removeMaskAt(indexes.back().row()); indexes = m_selectionModel->selectedIndexes(); } + gProjectDocument.value()->setModified(); } //! Performs switch of mask value for all selected items (true -> false, false -> true) @@ -123,6 +125,7 @@ void MaskEditorActions::onToggleMaskValueAction() if (MaskItem* item = m_maskContainerModel->itemForIndex(itemIndex)) item->setMaskValue(!item->maskValue()); } + gProjectDocument.value()->setModified(); } void MaskEditorActions::onBringToFrontAction() @@ -160,6 +163,7 @@ void MaskEditorActions::changeMaskStackingOrder(MaskEditorFlags::Stacking value) m_maskContainerModel->moveMask(row, new_row); } } + gProjectDocument.value()->setModified(); } //! Returns true if at least one of MaskItems in the selection can be moved one level up diff --git a/GUI/View/Mask/MaskEditorPropertyPanel.cpp b/GUI/View/Mask/MaskEditorPropertyPanel.cpp index 9ff6e8cb7a4..b4954fb8caa 100644 --- a/GUI/View/Mask/MaskEditorPropertyPanel.cpp +++ b/GUI/View/Mask/MaskEditorPropertyPanel.cpp @@ -16,12 +16,12 @@ #include "GUI/Model/Data/IntensityDataItem.h" #include "GUI/Model/Device/MaskItems.h" #include "GUI/Model/Model/SessionModel.h" +#include "GUI/Model/Project/ProjectDocument.h" #include "GUI/View/Common/DoubleSpinBox.h" #include "GUI/View/Plot2D/IntensityDataPropertyWidget.h" #include "GUI/View/Tool/EditUtil.h" #include "GUI/View/Tool/GroupBoxCollapser.h" #include "GUI/View/Tool/LayoutUtils.h" - #include <QCheckBox> #include <QFormLayout> #include <QGroupBox> @@ -175,12 +175,12 @@ void MaskEditorPropertyPanel::createMaskEditorUI() auto* maskItem = m_currentMaskItem; // shorthand // -- mask value (only if not RoI) if (!dynamic_cast<RegionOfInterestItem*>(maskItem)) { - const auto maskValueGetter = [=] { return maskItem->maskValue(); }; - const auto maskValueSetter = [=](bool b) { maskItem->setMaskValue(b); }; + const auto maskValueGetter = [maskItem] { return maskItem->maskValue(); }; + const auto maskValueSetter = [maskItem](bool b) { maskItem->setMaskValue(b); }; addMaskCheckBox("Mask value", maskValueGetter, maskValueSetter); } // -- mask visibility - const auto visibilityValueGetter = [=] { return maskItem->isVisibleValue(); }; + const auto visibilityValueGetter = [maskItem] { return maskItem->isVisibleValue(); }; const auto visibilityValueSetter = [=](bool b) { m_inhibitSelectionChange = true; maskItem->setIsVisibleValue(b); @@ -191,46 +191,47 @@ void MaskEditorPropertyPanel::createMaskEditorUI() // -- name (only if not RoI) if (!dynamic_cast<RegionOfInterestItem*>(maskItem)) { auto* edit = new QLineEdit(maskItem->maskName(), m_maskPropertiesLayout->parentWidget()); - connect(edit, &QLineEdit::textEdited, [=](const QString& t) { maskItem->setMaskName(t); }); + connect(edit, &QLineEdit::textEdited, [maskItem](const QString& t) { maskItem->setMaskName(t); }); + connect(edit, &QLineEdit::editingFinished, [] { gProjectDocument.value()->setModified(); }); m_maskPropertiesLayout->addRow("Name:", edit); } if (auto* c = dynamic_cast<RectangleItem*>(maskItem)) { addMaskSpinBox( - "xlow", [=] { return c->xLow(); }, [=](double v) { c->setXLow(v); }, + "xlow", [c] { return c->xLow(); }, [c](double v) { c->setXLow(v); }, RealLimits::limitless()); addMaskSpinBox( - "ylow", [=] { return c->yLow(); }, [=](double v) { c->setYLow(v); }, + "ylow", [c] { return c->yLow(); }, [c](double v) { c->setYLow(v); }, RealLimits::limitless()); addMaskSpinBox( - "xup", [=] { return c->xUp(); }, [=](double v) { c->setXUp(v); }, + "xup", [c] { return c->xUp(); }, [c](double v) { c->setXUp(v); }, RealLimits::limitless()); addMaskSpinBox( - "yup", [=] { return c->yUp(); }, [=](double v) { c->setYUp(v); }, + "yup", [c] { return c->yUp(); }, [c](double v) { c->setYUp(v); }, RealLimits::limitless()); } else if (auto* c = dynamic_cast<EllipseItem*>(maskItem)) { addMaskSpinBox( - "X center", [=] { return c->xCenter(); }, [=](double v) { c->setXCenter(v); }, + "X center", [c] { return c->xCenter(); }, [c](double v) { c->setXCenter(v); }, RealLimits::limitless()); addMaskSpinBox( - "Y center", [=] { return c->yCenter(); }, [=](double v) { c->setYCenter(v); }, + "Y center", [c] { return c->yCenter(); }, [c](double v) { c->setYCenter(v); }, RealLimits::limitless()); addMaskSpinBox( - "X radius", [=] { return c->xRadius(); }, [=](double v) { c->setXRadius(v); }, + "X radius", [c] { return c->xRadius(); }, [c](double v) { c->setXRadius(v); }, RealLimits::nonnegative()); addMaskSpinBox( - "Y radius", [=] { return c->yRadius(); }, [=](double v) { c->setYRadius(v); }, + "Y radius", [c] { return c->yRadius(); }, [c](double v) { c->setYRadius(v); }, RealLimits::nonnegative()); addMaskSpinBox( - "Angle", [=] { return c->angle(); }, [=](double v) { c->setAngle(v); }, + "Angle", [c] { return c->angle(); }, [c](double v) { c->setAngle(v); }, RealLimits::limitless()); } else if (auto* c = dynamic_cast<VerticalLineItem*>(maskItem)) addMaskSpinBox( - "X position", [=] { return c->posX(); }, [=](double v) { c->setPosX(v); }, + "X position", [c] { return c->posX(); }, [c](double v) { c->setPosX(v); }, RealLimits::limitless()); else if (auto* c = dynamic_cast<HorizontalLineItem*>(maskItem)) addMaskSpinBox( - "Y position", [=] { return c->posY(); }, [=](double v) { c->setPosY(v); }, + "Y position", [c] { return c->posY(); }, [c](double v) { c->setPosY(v); }, RealLimits::limitless()); } @@ -243,7 +244,7 @@ void MaskEditorPropertyPanel::addMaskSpinBox(const QString& label, function<doub spinBox->setValue(getter()); connect(spinBox, &QDoubleSpinBox::valueChanged, this, - [=](double newValue) { setter(newValue); }); + [setter](double newVal) { setter(newVal); gProjectDocument.value()->setModified(); }); connect(m_currentMaskItem, &MaskItem::maskGeometryChanged, spinBox, [=] { QSignalBlocker b(spinBox); spinBox->setValue(getter()); @@ -257,9 +258,9 @@ void MaskEditorPropertyPanel::addMaskCheckBox(const QString& title, function<boo { auto* checkBox = new QCheckBox(title, m_maskPropertiesLayout->parentWidget()); checkBox->setChecked(getter()); - connect(checkBox, &QCheckBox::stateChanged, [=]() { setter(checkBox->isChecked()); }); + connect(checkBox, &QCheckBox::stateChanged, this, [setter, checkBox]() { setter(checkBox->isChecked()); gProjectDocument.value()->setModified(); }); - connect(m_currentMaskItem, &MaskItem::maskVisibilityChanged, this, [=]() { + connect(m_currentMaskItem, &MaskItem::maskVisibilityChanged, this, [checkBox, getter]() { QSignalBlocker b(checkBox); checkBox->setChecked(getter()); }); diff --git a/GUI/View/Mask/MaskGraphicsScene.cpp b/GUI/View/Mask/MaskGraphicsScene.cpp index 342736ceecf..5146edcee99 100644 --- a/GUI/View/Mask/MaskGraphicsScene.cpp +++ b/GUI/View/Mask/MaskGraphicsScene.cpp @@ -18,6 +18,7 @@ #include "GUI/Model/Data/ProjectionItems.h" #include "GUI/Model/Device/MaskItems.h" #include "GUI/Model/MakeItem/ItemFactory.h" +#include "GUI/Model/Project/ProjectDocument.h" #include "GUI/Util/Error.h" #include "GUI/View/Mask/ColorMapSceneAdaptor.h" #include "GUI/View/Mask/MaskGraphicsProxy.h" @@ -235,6 +236,9 @@ void MaskGraphicsScene::onSceneSelectionChanged() m_block_selection = true; + if (!m_selectionModel) + return; + m_selectionModel->clearSelection(); for (QGraphicsItem* graphicsItem : selectedItems()) { @@ -250,6 +254,9 @@ void MaskGraphicsScene::onSceneSelectionChanged() void MaskGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent* event) { + if (Qt::LeftButton) + m_mouse_is_pressed = true; + if (event->buttons() & Qt::RightButton) { if (isDrawingInProgress()) cancelCurrentDrawing(); @@ -294,6 +301,8 @@ void MaskGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent* event) void MaskGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { + m_mouse_is_pressed = false; + if (isDrawingInProgress()) { if (m_context.isRectangleShapeMode()) { clearSelection(); @@ -420,6 +429,12 @@ IShape2DView* MaskGraphicsScene::addViewForItem(MaskItemObject* item) return view; } +void MaskGraphicsScene::onMaskMove() +{ + if(m_mouse_is_pressed) + gProjectDocument.value()->setModified(); // manual mask movement +} + //! Removes single view from scene. void MaskGraphicsScene::removeItemViewFromScene(MaskItemObject *item) @@ -543,7 +558,9 @@ bool MaskGraphicsScene::isDrawingInProgress() const void MaskGraphicsScene::setDrawingInProgress(bool value) { m_context.setDrawingInProgress(value); - if (!value) + if (value) + gProjectDocument.value()->setModified(); // manual mask creation + else m_currentItem = nullptr; } @@ -691,7 +708,6 @@ void MaskGraphicsScene::processLineItem(QGraphicsSceneMouseEvent* event) m_maskContainerItem->updateMaskNames(); dynamic_cast<MaskItem*>(m_currentItem)->setMaskValue(m_context.getMaskValue()); - subscribeMaskItem(m_currentItem); emit lineItemProcessed(); setDrawingInProgress(false); diff --git a/GUI/View/Mask/MaskGraphicsScene.h b/GUI/View/Mask/MaskGraphicsScene.h index c1e6ef6cebf..aa6c89bb58d 100644 --- a/GUI/View/Mask/MaskGraphicsScene.h +++ b/GUI/View/Mask/MaskGraphicsScene.h @@ -68,6 +68,7 @@ private slots: void onSessionSelectionChanged(const QItemSelection& /* selected */, const QItemSelection& /* deselected */); void onSceneSelectionChanged(); + void onMaskMove(); protected: void mousePressEvent(QGraphicsSceneMouseEvent* event) override; @@ -117,6 +118,7 @@ private: MaskGraphicsProxy* m_proxy = nullptr; QSharedPointer<ISceneAdaptor> m_adaptor; bool m_block_selection = false; + bool m_mouse_is_pressed = false; IntensityDataItem* m_intensityItem = nullptr; MaskItemObject* m_currentItem = nullptr; QPointF m_currentMousePosition; diff --git a/GUI/View/Projection/ProjectionsEditorActions.cpp b/GUI/View/Projection/ProjectionsEditorActions.cpp index e4381961da7..af2d15549ec 100644 --- a/GUI/View/Projection/ProjectionsEditorActions.cpp +++ b/GUI/View/Projection/ProjectionsEditorActions.cpp @@ -16,6 +16,7 @@ #include "GUI/Model/Data/IntensityDataItem.h" #include "GUI/Model/Data/ProjectionItems.h" #include "GUI/Model/Model/SessionModel.h" +#include "GUI/Model/Project/ProjectDocument.h" #include "GUI/View/Projection/SaveProjectionsAssistant.h" #include <QAction> #include <QItemSelectionModel> @@ -77,6 +78,7 @@ void ProjectionsEditorActions::onDeleteAction() m_maskContainerModel->removeMaskAt(indexes.back().row()); indexes = m_selectionModel->selectedIndexes(); } + gProjectDocument.value()->setModified(); } //! Performs saving of projections in ascii file -- GitLab