From 6da30b7eabc0414edb791b4f2d07eb4367d2ba62 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <svechnikovmv@gmail.com>
Date: Mon, 13 Feb 2023 12:15:38 +0100
Subject: [PATCH] moving projection switches tab

---
 .../IntensityDataProjectionsWidget.cpp        | 18 +++++++------
 .../Projection/ProjectionsEditorCanvas.cpp    | 25 +++++++++++--------
 GUI/View/Projection/ProjectionsEditorCanvas.h |  3 +++
 3 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/GUI/View/Projection/IntensityDataProjectionsWidget.cpp b/GUI/View/Projection/IntensityDataProjectionsWidget.cpp
index 423dfcc30a0..b6111069bbc 100644
--- a/GUI/View/Projection/IntensityDataProjectionsWidget.cpp
+++ b/GUI/View/Projection/IntensityDataProjectionsWidget.cpp
@@ -114,7 +114,7 @@ void IntensityDataProjectionsWidget::setup_connections()
 {
     // tool panel request is propagated from editorActions to this MaskEditor
     connect(m_editorActions, &ProjectionsEditorActions::resetViewRequest, m_projectionsCanvas,
-            &ProjectionsEditorCanvas::onResetViewRequest);
+            &ProjectionsEditorCanvas::onResetViewRequest, Qt::UniqueConnection);
 
     // tool panel request is propagated from editorActions to this MaskEditor
     connect(m_editorActions, &ProjectionsEditorActions::propertyPanelRequest,
@@ -122,27 +122,31 @@ void IntensityDataProjectionsWidget::setup_connections()
 
     // selection/drawing activity is propagated from Toolbar to graphics scene
     connect(m_toolbar, &ProjectionsToolbar::activityModeChanged, m_projectionsCanvas,
-            &ProjectionsEditorCanvas::onActivityModeChanged);
+            &ProjectionsEditorCanvas::onActivityModeChanged, Qt::UniqueConnection);
 
     // selection/drawing activity is propagated from Toolbar to Projections Widget
     connect(m_toolbar, &ProjectionsToolbar::activityModeChanged, m_projectionsWidget,
-            &ProjectionsWidget::onActivityModeChanged);
+            &ProjectionsWidget::onActivityModeChanged, Qt::UniqueConnection);
 
     // click on projections tab is propagated to tool bar
     connect(m_projectionsWidget, &ProjectionsWidget::changeActivityRequest, m_toolbar,
-            &ProjectionsToolbar::onProjectionTabChange);
+            &ProjectionsToolbar::onProjectionTabChange, Qt::UniqueConnection);
 
     // Delete request is propagated from canvas to actions
     connect(m_projectionsCanvas, &ProjectionsEditorCanvas::deleteSelectedRequest, m_editorActions,
-            &ProjectionsEditorActions::onDeleteAction);
+            &ProjectionsEditorActions::onDeleteAction, Qt::UniqueConnection);
+
+    // moving projection automatically switches projections tab
+    connect(m_projectionsCanvas, &ProjectionsEditorCanvas::changeProjectionsTabRequest, m_projectionsWidget,
+            &ProjectionsWidget::onActivityModeChanged, Qt::UniqueConnection);
 
     // space bar push (request for zoom mode) is propagated from graphics view to Toolbar
     connect(m_projectionsCanvas, &ProjectionsEditorCanvas::changeActivityRequest, m_toolbar,
-            &ProjectionsToolbar::onChangeActivityRequest);
+            &ProjectionsToolbar::onChangeActivityRequest, Qt::UniqueConnection);
 
     // ColorMap margins changed, canvas -> projection widget
     connect(m_projectionsCanvas, &ProjectionsEditorCanvas::marginsChanged, m_projectionsWidget,
-            &ProjectionsWidget::onMarginsChanged);
+            &ProjectionsWidget::onMarginsChanged, Qt::UniqueConnection);
 
     m_toolbar->onChangeActivityRequest(MaskEditorFlags::HORIZONTAL_LINE_MODE);
 }
diff --git a/GUI/View/Projection/ProjectionsEditorCanvas.cpp b/GUI/View/Projection/ProjectionsEditorCanvas.cpp
index 3c80a1703fc..4782eec59be 100644
--- a/GUI/View/Projection/ProjectionsEditorCanvas.cpp
+++ b/GUI/View/Projection/ProjectionsEditorCanvas.cpp
@@ -47,6 +47,10 @@ ProjectionsEditorCanvas::ProjectionsEditorCanvas(QWidget* parent)
             &ProjectionsEditorCanvas::changeActivityRequest);
     connect(m_view, &MaskGraphicsView::deleteSelectedRequest, this,
             &ProjectionsEditorCanvas::deleteSelectedRequest);
+
+    // automatically switch to the appropriate projection tab
+    connect(m_scene, &MaskGraphicsScene::lineItemMoved, this,
+            &ProjectionsEditorCanvas::onLineItemMoved, Qt::UniqueConnection);
 }
 
 void ProjectionsEditorCanvas::setContext(IntensityDataItem* intensityItem)
@@ -64,9 +68,9 @@ void ProjectionsEditorCanvas::setContext(IntensityDataItem* intensityItem)
 
     // notify ProjectionPlot about the changes
     connect(m_scene, &MaskGraphicsScene::lineItemProcessed, intensityItem,
-            &IntensityDataItem::projectionCreated, Qt::UniqueConnection);
+            &IntensityDataItem::projectionCreated, Qt::UniqueConnection);    
     connect(m_scene, &MaskGraphicsScene::lineItemMoved, intensityItem,
-            &IntensityDataItem::projectionPositionChanged, Qt::UniqueConnection);
+            &IntensityDataItem::projectionPositionChanged, Qt::UniqueConnection);    
     connect(m_scene, &MaskGraphicsScene::lineItemDeleted, intensityItem,
             &IntensityDataItem::projectionGone, Qt::UniqueConnection);
 
@@ -109,10 +113,6 @@ void ProjectionsEditorCanvas::onEnteringColorMap()
         m_liveProjection->setIsVisibleValue(false);
         m_liveProjection->setParent(this);
 
-        // TODO: correct this vvv
-        // m_liveProjection->setParentAndModel(
-        //     this, m_intensityDataItem->projectionContainerItem()->model());
-
         // notify ProjectionPlot about the changes
         connect(m_liveProjection, &MaskItem::maskGeometryChanged, m_intensityDataItem,
                 &IntensityDataItem::projectionPositionChanged, Qt::UniqueConnection);
@@ -131,11 +131,6 @@ void ProjectionsEditorCanvas::onLeavingColorMap()
     if (m_liveProjection) {
         disconnect(m_liveProjection, nullptr, m_intensityDataItem, nullptr);
         emit m_intensityDataItem->projectionGone(m_liveProjection);
-
-        // TODO: check if calling these SessionItem method is necessary
-        // m_liveProjection->itemParent()->takeRow(
-
-        //     m_liveProjection->itemParent()->rowOfChild(m_liveProjection));
         delete m_liveProjection;
         m_liveProjection = nullptr;
     }
@@ -174,6 +169,14 @@ void ProjectionsEditorCanvas::onActivityModeChanged(MaskEditorFlags::Activity va
     onLeavingColorMap();
 }
 
+void ProjectionsEditorCanvas::onLineItemMoved(MaskItemObject* sender)
+{
+    if(dynamic_cast<HorizontalLineItem*>(sender) && (m_currentActivity != MaskEditorFlags::VERTICAL_LINE_MODE))
+        emit changeProjectionsTabRequest(MaskEditorFlags::HORIZONTAL_LINE_MODE);
+    if(dynamic_cast<VerticalLineItem*>(sender) && (m_currentActivity != MaskEditorFlags::HORIZONTAL_LINE_MODE))
+        emit changeProjectionsTabRequest(MaskEditorFlags::VERTICAL_LINE_MODE);
+}
+
 void ProjectionsEditorCanvas::setColorMap(ColorMap* colorMap)
 {
     ASSERT(colorMap);
diff --git a/GUI/View/Projection/ProjectionsEditorCanvas.h b/GUI/View/Projection/ProjectionsEditorCanvas.h
index a051176b84b..ff675f21e38 100644
--- a/GUI/View/Projection/ProjectionsEditorCanvas.h
+++ b/GUI/View/Projection/ProjectionsEditorCanvas.h
@@ -27,6 +27,7 @@ class IntensityDataItem;
 class ColorMap;
 class PlotStatusLabel;
 class MaskItem;
+class MaskItemObject;
 
 //! Holds a graphics scene to draw projections on top of ColorMap. Being a part
 //! of ProjectionEditor, provides interaction logic between graphics scene and ProjectionsWidget.
@@ -46,6 +47,7 @@ public:
     void setSelectionModel(QItemSelectionModel* model);
 
 signals:
+    void changeProjectionsTabRequest(MaskEditorFlags::Activity);
     void changeActivityRequest(MaskEditorFlags::Activity);
     void deleteSelectedRequest();
     void marginsChanged(double left, double right);
@@ -58,6 +60,7 @@ public slots:
     void onActivityModeChanged(MaskEditorFlags::Activity value);
 
 private:
+    void onLineItemMoved(MaskItemObject *sender);
     void setColorMap(ColorMap* colorMap);
     void setConnected(bool isConnected);
 
-- 
GitLab