diff --git a/GUI/coregui/Models/FitParameterItems.cpp b/GUI/coregui/Models/FitParameterItems.cpp new file mode 100644 index 0000000000000000000000000000000000000000..126f57f19eb139474dd13e6c1f72716b41e8503f --- /dev/null +++ b/GUI/coregui/Models/FitParameterItems.cpp @@ -0,0 +1,53 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file coregui/Models/FitParameterItems.cpp +//! @brief Implements class FitParameterItems +//! +//! @homepage http://www.bornagainproject.org +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2016 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov +//! @authors Walter Van Herck, Joachim Wuttke +// +// ************************************************************************** // + +#include "FitParameterItems.h" +#include "ComboProperty.h" + +FitParameterContainerItem::FitParameterContainerItem() + : SessionItem(Constants::FitParameterContainerType) +{ + const QString T_DATA = "Data tag"; + registerTag(T_DATA, 0, -1, QStringList() << Constants::FitParameterType); + setDefaultTag(T_DATA); +} + + +const QString FitParameterItem::P_USE = "Use"; +const QString FitParameterItem::P_INIT = "Starting Value"; +const QString FitParameterItem::P_MIN = "Min"; +const QString FitParameterItem::P_MAX = "Max"; + +FitParameterItem::FitParameterItem() + : SessionItem(Constants::FitParameterType) +{ + addProperty(P_USE, true); + addProperty(P_INIT, 0.0); + addProperty(P_MIN, 0.0); + addProperty(P_MAX, 0.0); + const QString T_LINK = "Link tag"; + registerTag(T_LINK, 0, -1, QStringList() << Constants::FitParameterLinkType); + setDefaultTag(T_LINK); +} + +const QString FitParameterLinkItem::P_LINK = "Link"; + +FitParameterLinkItem::FitParameterLinkItem() + : SessionItem(Constants::FitParameterLinkType) +{ + addProperty(P_LINK, ""); +} + diff --git a/GUI/coregui/Models/FitParameterItems.h b/GUI/coregui/Models/FitParameterItems.h new file mode 100644 index 0000000000000000000000000000000000000000..b96050b8fc3e60035f34137449db2ef149a994f4 --- /dev/null +++ b/GUI/coregui/Models/FitParameterItems.h @@ -0,0 +1,48 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file coregui/Models/FitParameterItems.h +//! @brief Declares class FitParameterItems +//! +//! @homepage http://www.bornagainproject.org +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2016 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov +//! @authors Walter Van Herck, Joachim Wuttke +// +// ************************************************************************** // +#ifndef FITPARAMETERITEMS_H +#define FITPARAMETERITEMS_H + +#include "SessionItem.h" + +class BA_CORE_API_ FitParameterContainerItem : public SessionItem +{ + +public: + explicit FitParameterContainerItem(); +}; + +class BA_CORE_API_ FitParameterItem : public SessionItem +{ + +public: + static const QString P_USE; + static const QString P_INIT; + static const QString P_MIN; + static const QString P_MAX; + explicit FitParameterItem(); +}; + + +class BA_CORE_API_ FitParameterLinkItem : public SessionItem +{ + +public: + static const QString P_LINK; + explicit FitParameterLinkItem(); +}; + +#endif diff --git a/GUI/coregui/Models/FitSuiteItem.cpp b/GUI/coregui/Models/FitSuiteItem.cpp new file mode 100644 index 0000000000000000000000000000000000000000..72442543e67517194bd33dbfd9b9ef233eeaa606 --- /dev/null +++ b/GUI/coregui/Models/FitSuiteItem.cpp @@ -0,0 +1,25 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file coregui/Models/FitSuiteItem.cpp +//! @brief Implements class FitSuiteItem +//! +//! @homepage http://www.bornagainproject.org +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2016 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov +//! @authors Walter Van Herck, Joachim Wuttke +// +// ************************************************************************** // + +#include "FitSuiteItem.h" + +const QString FitSuiteItem::T_FIT_PARAMETERS = "Fit parameters container"; + +FitSuiteItem::FitSuiteItem() + : SessionItem(Constants::FitSuiteType) +{ + registerTag(T_FIT_PARAMETERS, 1, 1, QStringList() << Constants::FitParameterContainerType); +} diff --git a/GUI/coregui/Models/FitSuiteItem.h b/GUI/coregui/Models/FitSuiteItem.h new file mode 100644 index 0000000000000000000000000000000000000000..74e9ddfb91bb0ac482fcfbac0d10a8b0b4cee543 --- /dev/null +++ b/GUI/coregui/Models/FitSuiteItem.h @@ -0,0 +1,30 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file coregui/Models/FitSuiteItem.h +//! @brief Declares class FitSuiteItem +//! +//! @homepage http://www.bornagainproject.org +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2016 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov +//! @authors Walter Van Herck, Joachim Wuttke +// +// ************************************************************************** // + +#ifndef FITSUITEITEM_H +#define FITSUITEITEM_H + +#include "SessionItem.h" + +class BA_CORE_API_ FitSuiteItem : public SessionItem +{ + +public: + static const QString T_FIT_PARAMETERS; + explicit FitSuiteItem(); +}; + +#endif diff --git a/GUI/coregui/Models/ItemFactory.cpp b/GUI/coregui/Models/ItemFactory.cpp index 76b6ab1a0e5ef191e5aac476edffbe84c282eadf..fb54e0d621b97d3013f532f277c0e88ad1dde93d 100644 --- a/GUI/coregui/Models/ItemFactory.cpp +++ b/GUI/coregui/Models/ItemFactory.cpp @@ -52,6 +52,8 @@ #include "ObsoleteFitParameterItems.h" #include "ParameterTreeItems.h" #include "SimulationOptionsItem.h" +#include "FitParameterItems.h" +#include "FitSuiteItem.h" #include <QDebug> namespace { @@ -182,8 +184,13 @@ ItemFactory::ItemMap_t initializeItemMap() { result[Constants::ObsoleteMinimizerSettingsType] = &createInstance<ObsoleteMinimizerSettingsItem>; result[Constants::ObsoleteInputDataType] = &createInstance<ObsoleteInputDataItem>; result[Constants::GroupItemType] = &createInstance<GroupItem>; + result[Constants::ParameterLabelType] = &createInstance<ParameterLabelItem>; result[Constants::ParameterType] = &createInstance<ParameterItem>; + result[Constants::FitParameterContainerType] = &createInstance<FitParameterContainerItem>; + result[Constants::FitParameterType] = &createInstance<FitParameterItem>; + result[Constants::FitParameterLinkType] = &createInstance<FitParameterLinkItem>; + result[Constants::FitSuiteType] = &createInstance<FitSuiteItem>; result[Constants::SimulationOptionsType] = &createInstance<SimulationOptionsItem>; diff --git a/GUI/coregui/Models/JobItem.cpp b/GUI/coregui/Models/JobItem.cpp index 27f68b08fe998ccd7a65c8e3e1c7a7b667c1e294..21ad2d78f71731b0ef47e51cafcc6155527947e5 100644 --- a/GUI/coregui/Models/JobItem.cpp +++ b/GUI/coregui/Models/JobItem.cpp @@ -43,6 +43,7 @@ const QString JobItem::T_OUTPUT = "Output Tag"; const QString JobItem::T_REALDATA = "Real Data Tag"; const QString JobItem::T_PARAMETER_TREE = "Parameter Tree"; const QString JobItem::T_SIMULATION_OPTIONS = "Simulation Options"; +const QString JobItem::T_FIT_SUITE = "Fit Suite"; JobItem::JobItem() : SessionItem(Constants::JobItemType) @@ -76,6 +77,7 @@ JobItem::JobItem() << Constants::ParameterType); registerTag(T_SIMULATION_OPTIONS, 1, 1, QStringList() << Constants::SimulationOptionsType); + registerTag(T_FIT_SUITE, 1, 1, QStringList() << Constants::FitSuiteType); mapper()->setOnChildPropertyChange( [this](SessionItem* item, const QString &name) diff --git a/GUI/coregui/Models/JobItem.h b/GUI/coregui/Models/JobItem.h index 8757ba9ad7b3200d0db08bb85357c2ee685299f7..3ba483b3ad20bd06023769336650e91d970382f9 100644 --- a/GUI/coregui/Models/JobItem.h +++ b/GUI/coregui/Models/JobItem.h @@ -46,6 +46,7 @@ public: static const QString T_REALDATA; static const QString T_PARAMETER_TREE; static const QString T_SIMULATION_OPTIONS; + static const QString T_FIT_SUITE; explicit JobItem(); virtual ~JobItem(); diff --git a/GUI/coregui/Models/ParameterModelBuilder.cpp b/GUI/coregui/Models/ParameterModelBuilder.cpp index b12b66405481d94df7a0d43a859dd752fa813545..1363026e737ed6302f93226496bb034c2fbd7f39 100644 --- a/GUI/coregui/Models/ParameterModelBuilder.cpp +++ b/GUI/coregui/Models/ParameterModelBuilder.cpp @@ -37,7 +37,7 @@ #include <QDebug> -void ParameterModelBuilder::createParameterTree(JobItem *item, const QString tag) +void ParameterModelBuilder::createParameterTree(JobItem *item, const QString &tag) { SessionItem *container = item->model()->insertNewItem(Constants::ParameterLabelType, item->index(), -1, tag); container->setDisplayName("Parameter Tree Container"); diff --git a/GUI/coregui/Models/ParameterModelBuilder.h b/GUI/coregui/Models/ParameterModelBuilder.h index 045be263e22201b5d23dffcd657ad83c41560871..85370ecb352966b9357efda994588d6460b8a21a 100644 --- a/GUI/coregui/Models/ParameterModelBuilder.h +++ b/GUI/coregui/Models/ParameterModelBuilder.h @@ -25,7 +25,7 @@ class SessionItem; class ParameterModelBuilder { public: - static void createParameterTree(JobItem *item, const QString tag = QString()); + static void createParameterTree(JobItem *item, const QString &tag = QString()); private: static void handleItem(SessionItem *tree, SessionItem *source); }; diff --git a/GUI/coregui/Models/item_constants.h b/GUI/coregui/Models/item_constants.h index a14ed167bb3f9891c2d8d397706c81594c584b50..217260c60f89e02df03bffba7a70e606c0fca719 100644 --- a/GUI/coregui/Models/item_constants.h +++ b/GUI/coregui/Models/item_constants.h @@ -126,8 +126,13 @@ const ModelType ObsoleteFitParameterLinkType = "ObsoleteFitParameterLink"; const ModelType ObsoleteFitSelectionType = "ObsoleteFitSelection"; const ModelType ObsoleteMinimizerSettingsType = "ObsoleteMinimizer Settings"; const ModelType ObsoleteInputDataType = "Obsolete Input Data"; + const ModelType ParameterType = "Parameter"; const ModelType ParameterLabelType = "Parameter Label"; +const ModelType FitParameterContainerType = "FitParameterContainer"; +const ModelType FitParameterType = "FitParameter"; +const ModelType FitParameterLinkType = "FitParameterLink"; +const ModelType FitSuiteType = "FitSuite"; const ModelType JobItemType = "JobItem"; const ModelType IntensityDataType = "IntensityData"; diff --git a/GUI/coregui/Views/FitWidgets/FitParametersWidget.cpp b/GUI/coregui/Views/FitWidgets/FitParametersWidget.cpp index 81b16760ca84030638629961e632a62eb03a965b..350f26956a5efefa5c4daefe5a72c3c8ec292ec4 100644 --- a/GUI/coregui/Views/FitWidgets/FitParametersWidget.cpp +++ b/GUI/coregui/Views/FitWidgets/FitParametersWidget.cpp @@ -15,14 +15,66 @@ // ************************************************************************** // #include "FitParametersWidget.h" +#include "JobItem.h" +#include "JobModel.h" +#include "FitSuiteItem.h" +#include "FitParameterItems.h" #include <QTreeView> #include <QVBoxLayout> FitParametersWidget::FitParametersWidget(QWidget *parent) : QWidget(parent) , m_treeView(new QTreeView) + , m_jobItem(0) { QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(m_treeView); setLayout(layout); } + +void FitParametersWidget::setItem(JobItem *jobItem) +{ + if(jobItem == m_jobItem) { + return; + } + + else { + if(m_jobItem) + stop_tracking_job_item(); + + m_jobItem = jobItem; + if (!m_jobItem) return; + + init_job_item(); + + } +} + +//! stop tracking job item +void FitParametersWidget::stop_tracking_job_item() +{ + Q_ASSERT(m_jobItem); + +} + +//! init job item: create fit containers if necessary, subscribes for item changing +void FitParametersWidget::init_job_item() +{ + SessionItem *fitSuiteItem = m_jobItem->getItem(JobItem::T_FIT_SUITE); + if (!fitSuiteItem) { + fitSuiteItem = m_jobItem->model()->insertNewItem( + Constants::FitSuiteType, m_jobItem->index(), -1, JobItem::T_FIT_SUITE); + } + Q_ASSERT(fitSuiteItem); + + SessionItem *parsContainerItem = fitSuiteItem->getItem(FitSuiteItem::T_FIT_PARAMETERS); + if (!parsContainerItem) { + parsContainerItem = fitSuiteItem->model()->insertNewItem( + Constants::FitParameterContainerType, fitSuiteItem->index(), -1, + FitSuiteItem::T_FIT_PARAMETERS); + } + + SessionItem *fitPar = parsContainerItem->model()->insertNewItem(Constants::FitParameterType, parsContainerItem->index()); + m_treeView->setModel(parsContainerItem->model()); + m_treeView->setRootIndex(parsContainerItem->index()); +} diff --git a/GUI/coregui/Views/FitWidgets/FitParametersWidget.h b/GUI/coregui/Views/FitWidgets/FitParametersWidget.h index 2ad538b7662cd1dc5e708ef02ad4326978f361d8..217f65a0be4bb8ad04481b9ec44cd6c356d8c3eb 100644 --- a/GUI/coregui/Views/FitWidgets/FitParametersWidget.h +++ b/GUI/coregui/Views/FitWidgets/FitParametersWidget.h @@ -20,6 +20,7 @@ #include "WinDllMacros.h" #include <QWidget> +class JobItem; class QTreeView; //! The FitParametersWidget class contains a tree view to set fit parameters (fix/release, @@ -30,9 +31,14 @@ class BA_CORE_API_ FitParametersWidget : public QWidget Q_OBJECT public: FitParametersWidget(QWidget *parent = 0); + void setItem(JobItem *jobItem); private: + void stop_tracking_job_item(); + void init_job_item(); + QTreeView *m_treeView; + JobItem *m_jobItem; }; #endif diff --git a/GUI/coregui/Views/FitWidgets/TestFitWidgets.cpp b/GUI/coregui/Views/FitWidgets/TestFitWidgets.cpp index f5c58d68775af8b1e46858d55f18dd5ac2958f90..139ea141f31187b3b458b7df2f30e53c75062e06 100644 --- a/GUI/coregui/Views/FitWidgets/TestFitWidgets.cpp +++ b/GUI/coregui/Views/FitWidgets/TestFitWidgets.cpp @@ -18,6 +18,9 @@ #include "mainwindow.h" #include "ModelTuningWidget.h" #include "FitParametersWidget.h" +#include "item_constants.h" +#include "JobModel.h" +#include "JobItem.h" #include <QVBoxLayout> TestFitWidgets::TestFitWidgets(MainWindow *mainWindow) @@ -25,9 +28,21 @@ TestFitWidgets::TestFitWidgets(MainWindow *mainWindow) , m_mainWindow(mainWindow) , m_tuningWidget(new ModelTuningWidget(mainWindow->jobModel())) , m_fitParametersWidget(new FitParametersWidget(this)) + , m_jobItem(0) { QHBoxLayout *hlayout = new QHBoxLayout; hlayout->addWidget(m_tuningWidget); hlayout->addWidget(m_fitParametersWidget); setLayout(hlayout); } + +void TestFitWidgets::showEvent(QShowEvent *) +{ + JobItem *jobItem = dynamic_cast<JobItem *>(m_mainWindow->jobModel()->getTopItem(Constants::JobItemType)); + if(jobItem) { + m_jobItem = jobItem; + m_tuningWidget->setItem(jobItem); + m_fitParametersWidget->setItem(jobItem); + } + +} diff --git a/GUI/coregui/Views/FitWidgets/TestFitWidgets.h b/GUI/coregui/Views/FitWidgets/TestFitWidgets.h index c5fefb6ace66526e8b7b9cab13d7f6a8fe0b30df..b53f860697faba66ff124d6e88a552e69d789904 100644 --- a/GUI/coregui/Views/FitWidgets/TestFitWidgets.h +++ b/GUI/coregui/Views/FitWidgets/TestFitWidgets.h @@ -23,6 +23,7 @@ class MainWindow; class ModelTuningWidget; class FitParametersWidget; +class JobItem; //! TestFitWidgets is a temporary widget (created by mainwindow) //! for testing fitting related widgets. @@ -33,10 +34,13 @@ class BA_CORE_API_ TestFitWidgets : public QWidget public: TestFitWidgets(MainWindow *mainWindow); + void showEvent(QShowEvent *); + private: MainWindow *m_mainWindow; ModelTuningWidget *m_tuningWidget; FitParametersWidget *m_fitParametersWidget; + JobItem *m_jobItem; }; #endif diff --git a/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp b/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp index c78d8e1e6a277562a9a64d61af09303259d78108..374c3fc8642f5898f289d1a7092e9fda0d744250 100644 --- a/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp +++ b/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp @@ -107,7 +107,7 @@ void JobRealTimeWidget::setItem(JobItem * item) //qDebug() << "JobOutputDataWidget::itemClicked() -> creating"; // widget = new ModelTuningWidget(m_jobModel->getJobQueueData()); widget = new ModelTuningWidget(m_jobModel); - widget->setCurrentItem(item); + widget->setItem(item); m_stack->addWidget(widget); m_jobItemToTuningWidget[item] = widget; diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp index c522f6fb49aa7a2da437a37c2a7bd2dedd0def22..e177983ef9c0d266c15e25ed102d566ffd76f3b3 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp +++ b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp @@ -93,7 +93,7 @@ ModelTuningWidget::~ModelTuningWidget() { } -void ModelTuningWidget::setCurrentItem(JobItem *item) +void ModelTuningWidget::setItem(JobItem *item) { if (m_currentJobItem == item) { return; diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h index dfa5fda876c236ce4b12d2520e0a8ca3c0744604..9912e5b724355139a9e2a80d81a0c136395a95f5 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h +++ b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h @@ -39,7 +39,7 @@ public: ModelTuningWidget(JobModel *jobModel, QWidget *parent = 0); virtual ~ModelTuningWidget(); - void setCurrentItem(JobItem *item); + void setItem(JobItem *item); public slots: void onCurrentLinkChanged(SessionItem* item); diff --git a/GUI/coregui/mainwindow/mainwindow.cpp b/GUI/coregui/mainwindow/mainwindow.cpp index 8135fe2eb3c50c884121b20ca889f0ba82345a0f..5ed6ca418ea0c07c67f88ec8dc088539c84ebbf4 100644 --- a/GUI/coregui/mainwindow/mainwindow.cpp +++ b/GUI/coregui/mainwindow/mainwindow.cpp @@ -103,7 +103,7 @@ MainWindow::MainWindow(QWidget *parent) m_tabWidget->insertTab(FIT, testView, QIcon(":/images/main_jobqueue.png"), "Test"); m_tabWidget->insertTab(TESTVIEW, testFitWidgets, QIcon(":/images/main_jobqueue.png"), "TestView"); - m_tabWidget->setCurrentIndex(WELCOME); + m_tabWidget->setCurrentIndex(TESTVIEW); m_progressBar = new Manhattan::ProgressBar(this); m_tabWidget->addBottomCornerWidget(m_progressBar);