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