From 0ca14bdbb59a39ce1e67f7990f2d4ef2df64ef78 Mon Sep 17 00:00:00 2001
From: Matthias <github@mpuchner.de>
Date: Wed, 16 Dec 2020 09:19:37 +0100
Subject: [PATCH] reduce code complexity of job view

* reduce indirections
* reduce redundancy
* implementations in analogy to sample view
* rm job view docks class (integrated into jobview)
---
 GUI/coregui/Views/JobView.cpp                 |  75 +++++++++--
 GUI/coregui/Views/JobView.h                   |  18 ++-
 GUI/coregui/Views/JobWidgets/JobViewDocks.cpp | 118 ------------------
 GUI/coregui/Views/JobWidgets/JobViewDocks.h   |  65 ----------
 GUI/coregui/mainwindow/actionmanager.cpp      |   2 +-
 5 files changed, 82 insertions(+), 196 deletions(-)
 delete mode 100644 GUI/coregui/Views/JobWidgets/JobViewDocks.cpp
 delete mode 100644 GUI/coregui/Views/JobWidgets/JobViewDocks.h

diff --git a/GUI/coregui/Views/JobView.cpp b/GUI/coregui/Views/JobView.cpp
index a147feec21e..1d81b281caa 100644
--- a/GUI/coregui/Views/JobView.cpp
+++ b/GUI/coregui/Views/JobView.cpp
@@ -15,24 +15,29 @@
 #include "GUI/coregui/Views/JobView.h"
 #include "GUI/coregui/Models/JobItem.h"
 #include "GUI/coregui/Models/JobModel.h"
+#include "GUI/coregui/Views/CommonWidgets/DocksController.h"
+#include "GUI/coregui/Views/FitWidgets/FitActivityPanel.h"
+#include "GUI/coregui/Views/JobView.h"
+#include "GUI/coregui/Views/JobWidgets/JobMessagePanel.h"
 #include "GUI/coregui/Views/JobWidgets/JobOutputDataWidget.h"
 #include "GUI/coregui/Views/JobWidgets/JobProgressAssistant.h"
+#include "GUI/coregui/Views/JobWidgets/JobRealTimeWidget.h"
 #include "GUI/coregui/Views/JobWidgets/JobSelectorWidget.h"
-#include "GUI/coregui/Views/JobWidgets/JobViewDocks.h"
+#include "GUI/coregui/Views/JobWidgets/JobViewActivities.h"
 #include "GUI/coregui/Views/JobWidgets/JobViewFlags.h"
 #include "GUI/coregui/Views/JobWidgets/JobViewStatusBar.h"
 #include "GUI/coregui/mainwindow/mainwindow.h"
 #include <QMenu>
 
 JobView::JobView(MainWindow* mainWindow)
-    : m_docks(new JobViewDocks(this))
+    : m_docks(new DocksController(this))
     , m_statusBar(new JobViewStatusBar(mainWindow))
     , m_progressAssistant(new JobProgressAssistant(mainWindow))
     , m_currentItem(nullptr)
     , m_mainWindow(mainWindow) {
-    setObjectName("JobView");
-    m_docks->initViews(mainWindow->jobModel());
 
+    setObjectName("JobView");
+    createSubWindows();
     connectSignals();
 }
 
@@ -40,12 +45,23 @@ DocksController* JobView::docks() {
     return m_docks;
 }
 
+void JobView::addDockActionsToMenu(QMenu* menu) {
+    m_docks->addDockActionsToMenu(menu);
+
+    menu->addSeparator();
+
+    QAction* action = new QAction(menu);
+    action->setText("Reset to default layout");
+    connect(action, &QAction::triggered, this, &JobView::resetLayout);
+    menu->addAction(action);
+}
+
 void JobView::onFocusRequest(JobItem* jobItem) {
     if (jobItem->runInBackground())
         return;
 
-    if (jobItem != m_docks->jobSelector()->currentJobItem()) {
-        m_docks->jobSelector()->makeJobItemSelected(jobItem);
+    if (jobItem != m_jobSelector->currentJobItem()) {
+        m_jobSelector->makeJobItemSelected(jobItem);
         setAppropriateActivityForJob(jobItem);
     }
 
@@ -55,14 +71,23 @@ void JobView::onFocusRequest(JobItem* jobItem) {
 //! Sets docks visibility in accordance with required activity.
 
 void JobView::setActivity(int activity) {
-    m_docks->setActivity(activity);
+    QVector<JobViewFlags::Dock> docksToShow =
+        JobViewActivities::activeDocks(JobViewFlags::Activity(activity));
+
+    std::vector<int> docks_id;
+    for (auto x : docksToShow)
+        docks_id.push_back(static_cast<int>(x));
+
+    m_docks->setVisibleDocks(docks_id);
     emit activityChanged(activity);
 }
 
 //! Propagates change in JobItem's selection down into main widgets.
 
 void JobView::onSelectionChanged(JobItem* jobItem) {
-    m_docks->setItem(jobItem);
+    m_jobOutputDataWidget->setItem(jobItem);
+    m_jobRealTimeWidget->setItem(jobItem);
+    m_fitActivityPanel->setItem(jobItem);
 }
 
 void JobView::showEvent(QShowEvent* event) {
@@ -80,6 +105,31 @@ void JobView::hideEvent(QHideEvent* event) {
     QMainWindow::hideEvent(event);
 }
 
+void JobView::createSubWindows() {
+    m_jobOutputDataWidget = new JobOutputDataWidget(m_mainWindow->jobModel(), this);
+    m_jobSelector = new JobSelectorWidget(m_mainWindow->jobModel(), this);
+    m_jobRealTimeWidget = new JobRealTimeWidget(m_mainWindow->jobModel(), this);
+    m_fitActivityPanel = new FitActivityPanel(m_mainWindow->jobModel(), this);
+    m_jobMessagePanel = new JobMessagePanel(this);
+
+    m_docks->addWidget(JobViewFlags::JOB_LIST_DOCK, m_jobSelector, Qt::LeftDockWidgetArea);
+    m_docks->addWidget(JobViewFlags::REAL_TIME_DOCK, m_jobRealTimeWidget, Qt::RightDockWidgetArea);
+    m_docks->addWidget(JobViewFlags::FIT_PANEL_DOCK, m_fitActivityPanel, Qt::RightDockWidgetArea);
+    m_docks->addWidget(JobViewFlags::JOB_MESSAGE_DOCK, m_jobMessagePanel, Qt::BottomDockWidgetArea);
+
+    connect(m_jobMessagePanel, &JobMessagePanel::widgetHeightRequest, m_docks,
+            &DocksController::setDockHeightForWidget);
+    connect(m_jobMessagePanel, &JobMessagePanel::widgetCloseRequest, m_docks,
+            &DocksController::onWidgetCloseRequest);
+
+    m_fitActivityPanel->setRealTimeWidget(m_jobRealTimeWidget);
+    m_fitActivityPanel->setJobMessagePanel(m_jobMessagePanel);
+
+    setCentralWidget(m_jobOutputDataWidget);
+
+    resetLayout();
+}
+
 void JobView::connectSignals() {
     connectActivityRelated();
     connectJobRelated();
@@ -95,7 +145,7 @@ void JobView::connectActivityRelated() {
     connect(this, &JobView::activityChanged, m_statusBar, &JobViewStatusBar::onActivityChanged);
 
     // Activity was changed: this -> JobOutputDataWidget
-    connect(this, &JobView::activityChanged, m_docks->jobOutputDataWidget(),
+    connect(this, &JobView::activityChanged, m_jobOutputDataWidget,
             &JobOutputDataWidget::onActivityChanged);
 }
 
@@ -106,7 +156,7 @@ void JobView::connectJobRelated() {
     connect(m_mainWindow->jobModel(), &JobModel::focusRequest, this, &JobView::onFocusRequest);
 
     // JobItem selection: JobSelectorWidget -> this
-    connect(m_docks->jobSelector(), &JobSelectorWidget::selectionChanged, this,
+    connect(m_jobSelector, &JobSelectorWidget::selectionChanged, this,
             &JobView::onSelectionChanged);
 }
 
@@ -119,3 +169,8 @@ void JobView::setAppropriateActivityForJob(JobItem* jobItem) {
     if (jobItem->isValidForFitting())
         setActivity(JobViewFlags::FITTING_ACTIVITY);
 }
+
+void JobView::resetLayout() {
+    m_docks->onResetLayout();
+    setActivity(static_cast<int>(JobViewFlags::JOB_VIEW_ACTIVITY));
+}
diff --git a/GUI/coregui/Views/JobView.h b/GUI/coregui/Views/JobView.h
index eff998401b9..2e2e0717124 100644
--- a/GUI/coregui/Views/JobView.h
+++ b/GUI/coregui/Views/JobView.h
@@ -18,7 +18,12 @@
 #include <QMainWindow>
 
 class MainWindow;
-class JobViewDocks;
+class JobView;
+class JobSelectorWidget;
+class JobOutputDataWidget;
+class JobRealTimeWidget;
+class FitActivityPanel;
+class JobMessagePanel;
 class JobViewStatusBar;
 class JobProgressAssistant;
 class JobItem;
@@ -34,6 +39,7 @@ public:
     JobView(MainWindow* mainWindow);
 
     DocksController* docks();
+    void addDockActionsToMenu(QMenu* menu);
 
 signals:
     void focusRequest(int);
@@ -49,17 +55,25 @@ protected:
     virtual void hideEvent(QHideEvent* event);
 
 private:
+    void createSubWindows();
     void connectSignals();
     void connectActivityRelated();
     void connectJobRelated();
 
     void setAppropriateActivityForJob(JobItem* jobItem);
+    void resetLayout();
 
-    JobViewDocks* m_docks;
+    DocksController* m_docks;
     JobViewStatusBar* m_statusBar;
     JobProgressAssistant* m_progressAssistant;
     JobItem* m_currentItem;
     MainWindow* m_mainWindow;
+
+    JobSelectorWidget* m_jobSelector = nullptr;
+    JobOutputDataWidget* m_jobOutputDataWidget = nullptr;
+    JobRealTimeWidget* m_jobRealTimeWidget = nullptr;
+    FitActivityPanel* m_fitActivityPanel = nullptr;
+    JobMessagePanel* m_jobMessagePanel = nullptr;
 };
 
 #endif // BORNAGAIN_GUI_COREGUI_VIEWS_JOBVIEW_H
diff --git a/GUI/coregui/Views/JobWidgets/JobViewDocks.cpp b/GUI/coregui/Views/JobWidgets/JobViewDocks.cpp
deleted file mode 100644
index bb9bab59091..00000000000
--- a/GUI/coregui/Views/JobWidgets/JobViewDocks.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      GUI/coregui/Views/JobWidgets/JobViewDocks.cpp
-//! @brief     Implements class JobViewDocks
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "GUI/coregui/Views/JobWidgets/JobViewDocks.h"
-#include "GUI/coregui/Models/JobModel.h"
-#include "GUI/coregui/Views/FitWidgets/FitActivityPanel.h"
-#include "GUI/coregui/Views/JobView.h"
-#include "GUI/coregui/Views/JobWidgets/JobMessagePanel.h"
-#include "GUI/coregui/Views/JobWidgets/JobOutputDataWidget.h"
-#include "GUI/coregui/Views/JobWidgets/JobRealTimeWidget.h"
-#include "GUI/coregui/Views/JobWidgets/JobSelectorWidget.h"
-#include "GUI/coregui/Views/JobWidgets/JobViewActivities.h"
-#include <QDockWidget>
-
-namespace {
-const JobViewFlags::Activity default_activity = JobViewFlags::JOB_VIEW_ACTIVITY;
-}
-
-JobViewDocks::JobViewDocks(JobView* parent)
-    : DocksController(parent)
-    , m_jobSelector(nullptr)
-    , m_jobOutputDataWidget(nullptr)
-    , m_jobRealTimeWidget(nullptr)
-    , m_fitActivityPanel(nullptr)
-    , m_jobMessagePanel(nullptr)
-    , m_jobView(parent) {}
-
-void JobViewDocks::initViews(JobModel* jobModel) {
-    m_jobOutputDataWidget = new JobOutputDataWidget(jobModel, m_jobView);
-
-    m_jobSelector = new JobSelectorWidget(jobModel, m_jobView);
-    addWidget(JobViewFlags::JOB_LIST_DOCK, m_jobSelector, Qt::LeftDockWidgetArea);
-
-    m_jobRealTimeWidget = new JobRealTimeWidget(jobModel, m_jobView);
-    addWidget(JobViewFlags::REAL_TIME_DOCK, m_jobRealTimeWidget, Qt::RightDockWidgetArea);
-
-    m_fitActivityPanel = new FitActivityPanel(jobModel, m_jobView);
-    addWidget(JobViewFlags::FIT_PANEL_DOCK, m_fitActivityPanel, Qt::RightDockWidgetArea);
-
-    m_jobMessagePanel = new JobMessagePanel(m_jobView);
-    connect(m_jobMessagePanel, &JobMessagePanel::widgetHeightRequest, this,
-            &DocksController::setDockHeightForWidget);
-    connect(m_jobMessagePanel, &JobMessagePanel::widgetCloseRequest, this,
-            &JobViewDocks::onWidgetCloseRequest);
-
-    addWidget(JobViewFlags::JOB_MESSAGE_DOCK, m_jobMessagePanel, Qt::BottomDockWidgetArea);
-
-    m_fitActivityPanel->setRealTimeWidget(m_jobRealTimeWidget);
-    m_fitActivityPanel->setJobMessagePanel(m_jobMessagePanel);
-
-    m_jobView->setCentralWidget(m_jobOutputDataWidget);
-
-    onResetLayout();
-}
-
-JobRealTimeWidget* JobViewDocks::jobRealTimeWidget() {
-    return m_jobRealTimeWidget;
-}
-
-FitActivityPanel* JobViewDocks::fitActivityPanel() {
-    return m_fitActivityPanel;
-}
-
-JobSelectorWidget* JobViewDocks::jobSelector() {
-    return m_jobSelector;
-}
-
-JobOutputDataWidget* JobViewDocks::jobOutputDataWidget() {
-    return m_jobOutputDataWidget;
-}
-
-JobMessagePanel* JobViewDocks::jobMessagePanel() {
-    return m_jobMessagePanel;
-}
-
-//! Sets docks visibility so they match the activity flag.
-
-void JobViewDocks::setActivity(int activity) {
-    QVector<JobViewFlags::Dock> docksToShow =
-        JobViewActivities::activeDocks(JobViewFlags::Activity(activity));
-
-    std::vector<int> docks_id;
-    for (auto x : docksToShow)
-        docks_id.push_back(static_cast<int>(x));
-
-    setVisibleDocks(docks_id);
-}
-
-void JobViewDocks::setItem(JobItem* jobItem) {
-    jobOutputDataWidget()->setItem(jobItem);
-    jobRealTimeWidget()->setItem(jobItem);
-    fitActivityPanel()->setItem(jobItem);
-}
-
-//! Sets the state of JobView to the default.
-
-void JobViewDocks::onResetLayout() {
-    DocksController::onResetLayout();
-    setActivity(static_cast<int>(default_activity));
-}
-
-//! Shows/hides JobSelectorWidget.
-
-void JobViewDocks::onToggleJobSelector() {
-    auto selectorDock = findDock(JobViewFlags::JOB_LIST_DOCK);
-    selectorDock->setHidden(!selectorDock->isHidden());
-}
diff --git a/GUI/coregui/Views/JobWidgets/JobViewDocks.h b/GUI/coregui/Views/JobWidgets/JobViewDocks.h
deleted file mode 100644
index 74663bc9056..00000000000
--- a/GUI/coregui/Views/JobWidgets/JobViewDocks.h
+++ /dev/null
@@ -1,65 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      GUI/coregui/Views/JobWidgets/JobViewDocks.h
-//! @brief     Defines class JobViewDocks
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifndef BORNAGAIN_GUI_COREGUI_VIEWS_JOBWIDGETS_JOBVIEWDOCKS_H
-#define BORNAGAIN_GUI_COREGUI_VIEWS_JOBWIDGETS_JOBVIEWDOCKS_H
-
-#include "GUI/coregui/Views/CommonWidgets/DocksController.h"
-
-class JobView;
-class JobSelectorWidget;
-class JobOutputDataWidget;
-class JobRealTimeWidget;
-class FitActivityPanel;
-class JobMessagePanel;
-class JobModel;
-class JobItem;
-
-//! The JobViewDocks class assists JobView in holding all main job widgets and corresponding
-//! dock containers.
-
-//! It's main method setActivity handles visibility logic for all of (JobSelectorWidget,
-//! JobOutputDataWidget, JobRealTimeWidget and FitPanelWidget).
-
-class JobViewDocks : public DocksController {
-    Q_OBJECT
-
-public:
-    JobViewDocks(JobView* parent = nullptr);
-
-    void initViews(JobModel* jobModel);
-
-    JobRealTimeWidget* jobRealTimeWidget();
-    FitActivityPanel* fitActivityPanel();
-    JobSelectorWidget* jobSelector();
-    JobOutputDataWidget* jobOutputDataWidget();
-    JobMessagePanel* jobMessagePanel();
-
-    void setActivity(int activity);
-    void setItem(JobItem* jobItem);
-
-public slots:
-    void onResetLayout() override;
-    void onToggleJobSelector();
-
-private:
-    JobSelectorWidget* m_jobSelector;
-    JobOutputDataWidget* m_jobOutputDataWidget;
-    JobRealTimeWidget* m_jobRealTimeWidget;
-    FitActivityPanel* m_fitActivityPanel;
-    JobMessagePanel* m_jobMessagePanel;
-    JobView* m_jobView;
-};
-
-#endif // BORNAGAIN_GUI_COREGUI_VIEWS_JOBWIDGETS_JOBVIEWDOCKS_H
diff --git a/GUI/coregui/mainwindow/actionmanager.cpp b/GUI/coregui/mainwindow/actionmanager.cpp
index abdee604f99..48eb8338f16 100644
--- a/GUI/coregui/mainwindow/actionmanager.cpp
+++ b/GUI/coregui/mainwindow/actionmanager.cpp
@@ -226,7 +226,7 @@ void ActionManager::onAboutToShowViewMenu() {
     if (auto sampleView = dynamic_cast<SampleView*>(view); sampleView != nullptr)
         sampleView->addDockActionsToMenu(m_viewMenu);
     if (auto jobView = dynamic_cast<JobView*>(view); jobView != nullptr)
-        jobView->docks()->addDockActionsToMenu(m_viewMenu);
+        jobView->addDockActionsToMenu(m_viewMenu);
 }
 
 void ActionManager::toggleCheckForUpdates(bool status) {
-- 
GitLab