From 51799ab33a99fde982cad80251734a166a090894 Mon Sep 17 00:00:00 2001
From: Matthias Puchner <github@mpuchner.de>
Date: Mon, 22 Nov 2021 14:33:57 +0100
Subject: [PATCH] mv toggle action creation to ActionFactory instead of
 improper place (in toggled widget)

---
 GUI/Util/ActionFactory.cpp                    | 14 +++++++++++++
 GUI/Util/ActionFactory.h                      |  7 +++++++
 GUI/View/Compare/FitComparisonWidget.cpp      |  6 +++++-
 GUI/View/Compare/FitComparisonWidget.h        |  1 +
 GUI/View/Compare/FitComparisonWidget1D.cpp    |  6 +++++-
 GUI/View/Compare/FitComparisonWidget1D.h      |  1 +
 GUI/View/Intensity/IntensityDataWidget.cpp    |  7 ++++++-
 GUI/View/Intensity/IntensityDataWidget.h      |  1 +
 GUI/View/Mask/MaskEditorActions.cpp           |  6 ++----
 .../PropertyEditor/ItemPropertyWidget.cpp     | 20 +------------------
 GUI/View/PropertyEditor/ItemPropertyWidget.h  |  8 --------
 GUI/View/SpecularData/SpecularDataWidget.cpp  |  6 +++++-
 GUI/View/SpecularData/SpecularDataWidget.h    |  1 +
 13 files changed, 49 insertions(+), 35 deletions(-)

diff --git a/GUI/Util/ActionFactory.cpp b/GUI/Util/ActionFactory.cpp
index c599a3f5dc2..6987927d820 100644
--- a/GUI/Util/ActionFactory.cpp
+++ b/GUI/Util/ActionFactory.cpp
@@ -44,3 +44,17 @@ QAction* ActionFactory::createShowInRealSpaceAction(QObject* parent, const QStri
 
     return action;
 }
+
+QAction* ActionFactory::createTogglePropertiesPanelAction(QObject* parent, QWidget* toggledWidget)
+{
+    auto* action = new QAction(parent);
+    action->setText("Properties");
+    action->setIcon(QIcon(":/images/dock-right.svg"));
+    action->setToolTip("Toggle properties panel");
+    action->setCheckable(true);
+
+    if (toggledWidget)
+        QObject::connect(action, &QAction::triggered, toggledWidget, &QWidget::setVisible);
+
+    return action;
+}
diff --git a/GUI/Util/ActionFactory.h b/GUI/Util/ActionFactory.h
index a3f74a4bbfb..13d41aaf42c 100644
--- a/GUI/Util/ActionFactory.h
+++ b/GUI/Util/ActionFactory.h
@@ -20,6 +20,7 @@
 class QAction;
 class QObject;
 class QString;
+class QWidget;
 
 //! Factory to create commonly used actions
 class ActionFactory {
@@ -44,6 +45,12 @@ public:
     static QAction* createShowInRealSpaceAction(QObject* parent, const QString& what,
                                                 std::function<void()> slot = nullptr);
 
+    //! Create "toggle properties panel" action.
+    //!
+    //! If toggledWidget is given, it will be shown/hidden when the actions changes its state.
+    static QAction* createTogglePropertiesPanelAction(QObject* parent,
+                                                      QWidget* toggledWidget = nullptr);
+
 private:
     ActionFactory() = default;
 };
diff --git a/GUI/View/Compare/FitComparisonWidget.cpp b/GUI/View/Compare/FitComparisonWidget.cpp
index 06d4a9731cf..bf3d8e2454f 100644
--- a/GUI/View/Compare/FitComparisonWidget.cpp
+++ b/GUI/View/Compare/FitComparisonWidget.cpp
@@ -17,6 +17,7 @@
 #include "GUI/Model/Data/RealDataItem.h"
 #include "GUI/Model/Fit/FitSuiteItem.h"
 #include "GUI/Model/Job/JobItem.h"
+#include "GUI/Util/ActionFactory.h"
 #include "GUI/View/Compare/FitComparisonController.h"
 #include "GUI/View/Compare/FitFlowWidget.h"
 #include "GUI/View/Intensity/ColorMap.h"
@@ -66,6 +67,9 @@ FitComparisonWidget::FitComparisonWidget(QWidget* parent)
     m_resetViewAction->setToolTip("Reset View");
     connect(m_resetViewAction, &QAction::triggered, this, &FitComparisonWidget::onResetViewAction);
 
+    m_togglePropertiesAction =
+        ActionFactory::createTogglePropertiesPanelAction(this, m_propertyWidget);
+
     m_propertyWidget->setVisible(false);
 }
 
@@ -73,7 +77,7 @@ FitComparisonWidget::~FitComparisonWidget() = default;
 
 QList<QAction*> FitComparisonWidget::actionList()
 {
-    return QList<QAction*>() << m_resetViewAction << m_propertyWidget->actionList();
+    return QList<QAction*>() << m_resetViewAction << m_togglePropertiesAction;
 }
 
 void FitComparisonWidget::subscribeToItem()
diff --git a/GUI/View/Compare/FitComparisonWidget.h b/GUI/View/Compare/FitComparisonWidget.h
index f4d558c22e1..b4ff768df15 100644
--- a/GUI/View/Compare/FitComparisonWidget.h
+++ b/GUI/View/Compare/FitComparisonWidget.h
@@ -62,6 +62,7 @@ private:
     ItemPropertyWidget* m_propertyWidget;
 
     QAction* m_resetViewAction;
+    QAction* m_togglePropertiesAction;
     FitComparisonController2D* m_comparisonController;
 };
 
diff --git a/GUI/View/Compare/FitComparisonWidget1D.cpp b/GUI/View/Compare/FitComparisonWidget1D.cpp
index 061bfb12d3f..a5ddc2f560f 100644
--- a/GUI/View/Compare/FitComparisonWidget1D.cpp
+++ b/GUI/View/Compare/FitComparisonWidget1D.cpp
@@ -17,6 +17,7 @@
 #include "GUI/Model/Data/RealDataItem.h"
 #include "GUI/Model/Fit/FitSuiteItem.h"
 #include "GUI/Model/Job/JobItem.h"
+#include "GUI/Util/ActionFactory.h"
 #include "GUI/View/Compare/FitComparisonViewController.h"
 #include "GUI/View/Compare/FitFlowWidget.h"
 #include "GUI/View/Intensity/Plot1D.h"
@@ -65,6 +66,9 @@ FitComparisonWidget1D::FitComparisonWidget1D(QWidget* parent)
     connect(m_resetViewAction, &QAction::triggered, this,
             &FitComparisonWidget1D::onResetViewAction);
 
+    m_togglePropertiesAction =
+        ActionFactory::createTogglePropertiesPanelAction(this, m_propertyWidget);
+
     m_propertyWidget->setVisible(false);
 }
 
@@ -72,7 +76,7 @@ FitComparisonWidget1D::~FitComparisonWidget1D() = default;
 
 QList<QAction*> FitComparisonWidget1D::actionList()
 {
-    return QList<QAction*>() << m_resetViewAction << m_propertyWidget->actionList();
+    return QList<QAction*>() << m_resetViewAction << m_togglePropertiesAction;
 }
 
 void FitComparisonWidget1D::subscribeToItem()
diff --git a/GUI/View/Compare/FitComparisonWidget1D.h b/GUI/View/Compare/FitComparisonWidget1D.h
index 17f157e85e4..cb601e160f9 100644
--- a/GUI/View/Compare/FitComparisonWidget1D.h
+++ b/GUI/View/Compare/FitComparisonWidget1D.h
@@ -55,6 +55,7 @@ private:
     ItemPropertyWidget* m_propertyWidget;
 
     QAction* m_resetViewAction;
+    QAction* m_togglePropertiesAction;
     FitComparison1DViewController* m_comparisonController;
 };
 
diff --git a/GUI/View/Intensity/IntensityDataWidget.cpp b/GUI/View/Intensity/IntensityDataWidget.cpp
index 323be672082..3f5fb48b20b 100644
--- a/GUI/View/Intensity/IntensityDataWidget.cpp
+++ b/GUI/View/Intensity/IntensityDataWidget.cpp
@@ -15,6 +15,7 @@
 #include "GUI/View/Intensity/IntensityDataWidget.h"
 #include "GUI/Model/Data/DataItemUtils.h"
 #include "GUI/Model/Data/IntensityDataItem.h"
+#include "GUI/Util/ActionFactory.h"
 #include "GUI/View/Intensity/IntensityDataCanvas.h"
 #include "GUI/View/Intensity/IntensityDataFFTPresenter.h"
 #include "GUI/View/PropertyEditor/ItemPropertyWidget.h"
@@ -48,6 +49,10 @@ IntensityDataWidget::IntensityDataWidget(QWidget* parent)
     connect(m_fftPresenter, &IntensityDataFFTPresenter::fftActionRequest, this,
             &IntensityDataWidget::onFFTAction);
 
+    m_togglePropertiesAction =
+        ActionFactory::createTogglePropertiesPanelAction(this, m_propertyWidget);
+
+
     m_propertyWidget->setVisible(false);
 }
 
@@ -62,7 +67,7 @@ void IntensityDataWidget::setItem(SessionItem* jobItem)
 QList<QAction*> IntensityDataWidget::actionList()
 {
     return m_intensityCanvas->actionList() + m_fftPresenter->actionList()
-           + m_propertyWidget->actionList();
+           + QList<QAction*>{m_togglePropertiesAction};
 }
 
 void IntensityDataWidget::onContextMenuRequest(const QPoint& point)
diff --git a/GUI/View/Intensity/IntensityDataWidget.h b/GUI/View/Intensity/IntensityDataWidget.h
index 0a9a610118e..a962c0f837e 100644
--- a/GUI/View/Intensity/IntensityDataWidget.h
+++ b/GUI/View/Intensity/IntensityDataWidget.h
@@ -49,6 +49,7 @@ private:
     IntensityDataCanvas* m_intensityCanvas;
     ItemPropertyWidget* m_propertyWidget;
     IntensityDataFFTPresenter* m_fftPresenter;
+    QAction* m_togglePropertiesAction;
 };
 
 #endif // BORNAGAIN_GUI_VIEW_INTENSITY_INTENSITYDATAWIDGET_H
diff --git a/GUI/View/Mask/MaskEditorActions.cpp b/GUI/View/Mask/MaskEditorActions.cpp
index c0c626cbb5a..486616215dc 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/Data/MaskItems.h"
 #include "GUI/Model/Session/SessionModel.h"
+#include "GUI/Util/ActionFactory.h"
 #include <QAction>
 #include <QItemSelectionModel>
 #include <QMenu>
@@ -27,7 +28,6 @@ MaskEditorActions::MaskEditorActions(QWidget* parent)
     , m_deleteMaskAction(new QAction("Remove mask", parent))
     , m_resetViewAction(new QAction(this))
     , m_savePlotAction(new QAction(this))
-    , m_togglePanelAction(new QAction(this))
     , m_maskModel(nullptr)
     , m_selectionModel(nullptr)
 
@@ -62,9 +62,7 @@ MaskEditorActions::MaskEditorActions(QWidget* parent)
     m_savePlotAction->setToolTip("Save Plot");
     connect(m_savePlotAction, &QAction::triggered, this, &MaskEditorActions::savePlotRequest);
 
-    m_togglePanelAction->setText("Properties");
-    m_togglePanelAction->setIcon(QIcon(":/images/dock-right.svg"));
-    m_togglePanelAction->setToolTip("Toggle Property Panel");
+    m_togglePanelAction = ActionFactory::createTogglePropertiesPanelAction(this);
     connect(m_togglePanelAction, &QAction::triggered, this,
             &MaskEditorActions::propertyPanelRequest);
 }
diff --git a/GUI/View/PropertyEditor/ItemPropertyWidget.cpp b/GUI/View/PropertyEditor/ItemPropertyWidget.cpp
index 41320f72a95..2fdbff645cc 100644
--- a/GUI/View/PropertyEditor/ItemPropertyWidget.cpp
+++ b/GUI/View/PropertyEditor/ItemPropertyWidget.cpp
@@ -19,9 +19,7 @@
 #include <QVBoxLayout>
 
 ItemPropertyWidget::ItemPropertyWidget(QWidget* parent)
-    : SessionItemWidget(parent)
-    , m_togglePanelAction(new QAction(this))
-    , m_componentEditor(new ComponentTreeView)
+    : SessionItemWidget(parent), m_componentEditor(new ComponentTreeView)
 {
     setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
     setWindowTitle("Properties");
@@ -33,12 +31,6 @@ ItemPropertyWidget::ItemPropertyWidget(QWidget* parent)
     mainLayout->setSpacing(0);
     mainLayout->addWidget(m_componentEditor);
     setLayout(mainLayout);
-
-    m_togglePanelAction->setText("Properties");
-    m_togglePanelAction->setIcon(QIcon(":/images/dock-right.svg"));
-    m_togglePanelAction->setToolTip("Toggle property panel");
-    m_togglePanelAction->setCheckable(true);
-    connect(m_togglePanelAction, &QAction::toggled, this, &ItemPropertyWidget::onTogglePanelAction);
 }
 
 QSize ItemPropertyWidget::sizeHint() const
@@ -53,16 +45,6 @@ QSize ItemPropertyWidget::minimumSizeHint() const
                  GUI::Util::Style::PropertyPanelWidth());
 }
 
-QList<QAction*> ItemPropertyWidget::actionList()
-{
-    return QList<QAction*>() << m_togglePanelAction;
-}
-
-void ItemPropertyWidget::onTogglePanelAction(bool toggled)
-{
-    setVisible(toggled);
-}
-
 void ItemPropertyWidget::subscribeToItem()
 {
     m_componentEditor->setItem(currentItem());
diff --git a/GUI/View/PropertyEditor/ItemPropertyWidget.h b/GUI/View/PropertyEditor/ItemPropertyWidget.h
index 1683e71c7ce..83b80b2fb27 100644
--- a/GUI/View/PropertyEditor/ItemPropertyWidget.h
+++ b/GUI/View/PropertyEditor/ItemPropertyWidget.h
@@ -17,9 +17,7 @@
 
 #include "GUI/View/Common/SessionItemWidget.h"
 
-class IntensityDataItem;
 class ComponentTreeView;
-class SessionItem;
 
 //! The ItemPropertyWidget shows ComponentTree for given Item.
 
@@ -31,18 +29,12 @@ public:
     QSize sizeHint() const override;
     QSize minimumSizeHint() const override;
 
-    QList<QAction*> actionList() override;
-
-public slots:
-    void onTogglePanelAction(bool toggled);
-
 protected:
     void subscribeToItem() override;
     void unsubscribeFromItem() override;
     void contextMenuEvent(QContextMenuEvent*) override;
 
 private:
-    QAction* m_togglePanelAction;
     ComponentTreeView* m_componentEditor;
 };
 
diff --git a/GUI/View/SpecularData/SpecularDataWidget.cpp b/GUI/View/SpecularData/SpecularDataWidget.cpp
index bb4e70bbb2b..2da0e572cde 100644
--- a/GUI/View/SpecularData/SpecularDataWidget.cpp
+++ b/GUI/View/SpecularData/SpecularDataWidget.cpp
@@ -15,6 +15,7 @@
 #include "GUI/View/SpecularData/SpecularDataWidget.h"
 #include "GUI/Model/Data/DataItemUtils.h"
 #include "GUI/Model/Data/SpecularDataItem.h"
+#include "GUI/Util/ActionFactory.h"
 #include "GUI/View/PropertyEditor/ItemPropertyWidget.h"
 #include "GUI/View/SpecularData/SpecularDataCanvas.h"
 #include <QBoxLayout>
@@ -43,6 +44,9 @@ SpecularDataWidget::SpecularDataWidget(QWidget* parent)
     connect(m_intensity_canvas, &SpecularDataCanvas::customContextMenuRequested, this,
             &SpecularDataWidget::onContextMenuRequest);
 
+    m_togglePropertiesAction =
+        ActionFactory::createTogglePropertiesPanelAction(this, m_property_widget);
+
     m_property_widget->setVisible(false);
 }
 
@@ -55,7 +59,7 @@ void SpecularDataWidget::setItem(SessionItem* jobItem)
 
 QList<QAction*> SpecularDataWidget::actionList()
 {
-    return m_intensity_canvas->actionList() + m_property_widget->actionList();
+    return m_intensity_canvas->actionList() + QList<QAction*>{m_togglePropertiesAction};
 }
 
 void SpecularDataWidget::onContextMenuRequest(const QPoint& point)
diff --git a/GUI/View/SpecularData/SpecularDataWidget.h b/GUI/View/SpecularData/SpecularDataWidget.h
index c871b073ee4..8a26e660ac9 100644
--- a/GUI/View/SpecularData/SpecularDataWidget.h
+++ b/GUI/View/SpecularData/SpecularDataWidget.h
@@ -39,6 +39,7 @@ private:
 
     SpecularDataCanvas* m_intensity_canvas;
     ItemPropertyWidget* m_property_widget;
+    QAction* m_togglePropertiesAction;
 };
 
 #endif // BORNAGAIN_GUI_VIEW_SPECULARDATA_SPECULARDATAWIDGET_H
-- 
GitLab