Skip to content
Snippets Groups Projects
Commit 0ca14bdb authored by Matthias's avatar Matthias
Browse files

reduce code complexity of job view

* reduce indirections
* reduce redundancy
* implementations in analogy to sample view
* rm job view docks class (integrated into jobview)
parent 5ff67259
No related branches found
No related tags found
No related merge requests found
......@@ -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));
}
......@@ -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
// ************************************************************************************************
//
// 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());
}
// ************************************************************************************************
//
// 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
......@@ -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) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment