diff --git a/GUI/coregui/Models/ApplicationModels.cpp b/GUI/coregui/Models/ApplicationModels.cpp index debd8341432301e993a76caaf2500a9843102d13..0ff4a817c36f406ae2fb31b0999ba84ebd3da9b2 100644 --- a/GUI/coregui/Models/ApplicationModels.cpp +++ b/GUI/coregui/Models/ApplicationModels.cpp @@ -44,6 +44,11 @@ ApplicationModels::~ApplicationModels() delete m_materialSvc; } +DocumentModel *ApplicationModels::documentModel() +{ + return m_documentModel; +} + MaterialModel *ApplicationModels::materialModel() { return m_materialModel; @@ -123,12 +128,14 @@ void ApplicationModels::createDocumentModel() { delete m_documentModel; m_documentModel = new DocumentModel(this); + connectModel(m_documentModel); } void ApplicationModels::createMaterialModel() { delete m_materialModel; m_materialModel = new MaterialModel(this); + connectModel(m_materialModel); m_materialSvc = new MaterialSvc(m_materialModel); } @@ -137,6 +144,7 @@ void ApplicationModels::createSampleModel() Q_ASSERT(m_materialModel); delete m_sampleModel; m_sampleModel = new SampleModel(this); + connectModel(m_sampleModel); connect(m_materialModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), m_sampleModel, SLOT(onMaterialModelChanged(QModelIndex,QModelIndex))); } @@ -145,12 +153,14 @@ void ApplicationModels::createJobModel() { delete m_jobModel; m_jobModel = new JobModel(this); + connectModel(m_jobModel); } void ApplicationModels::createInstrumentModel() { delete m_instrumentModel; m_instrumentModel = new InstrumentModel(this); + connectModel(m_instrumentModel); m_instrumentModel->setIconProvider(new IconProvider()); } @@ -158,6 +168,7 @@ void ApplicationModels::createFitModel() { delete m_fitModel; m_fitModel = new FitModel(m_sampleModel, m_instrumentModel, this); + connectModel(m_fitModel); } void ApplicationModels::testGUIObjectBuilder() @@ -172,3 +183,28 @@ void ApplicationModels::testGUIObjectBuilder() // const std::unique_ptr<GISASSimulation> simulation(simRegistry.createSimulation("RectDetectorPerpToReflectedBeamDpos")); // guiBuilder.populateInstrumentModel(m_instrumentModel, *simulation); } + +void ApplicationModels::disconnectModel(SessionModel *model) +{ + if(model) { + disconnect(model, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, + SIGNAL(modelChanged())); + disconnect(model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, + SIGNAL(modelChanged())); + disconnect(model, SIGNAL(rowsInserted(QModelIndex, int,int)), this, + SIGNAL(modelChanged())); + } +} + +void ApplicationModels::connectModel(SessionModel *model) +{ + if(model) { + connect(model, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, + SIGNAL(modelChanged()), Qt::UniqueConnection); + connect(model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, + SIGNAL(modelChanged()), Qt::UniqueConnection); + connect(model, SIGNAL(rowsInserted(QModelIndex, int,int)), this, + SIGNAL(modelChanged()), Qt::UniqueConnection); + } +} + diff --git a/GUI/coregui/Models/ApplicationModels.h b/GUI/coregui/Models/ApplicationModels.h index 1b59ffe30816ee69fe5a80c8b287631fa5c0ff5c..c10c2b8590af0793e12bcff954f4c0700dd5a6f7 100644 --- a/GUI/coregui/Models/ApplicationModels.h +++ b/GUI/coregui/Models/ApplicationModels.h @@ -20,6 +20,7 @@ #include "WinDllMacros.h" #include <QObject> +class SessionModel; class DocumentModel; class MaterialModel; class MaterialSvc; @@ -35,6 +36,7 @@ public: ApplicationModels(QObject *parent); ~ApplicationModels(); + DocumentModel *documentModel(); MaterialModel *materialModel(); InstrumentModel *instrumentModel(); SampleModel *sampleModel(); @@ -43,6 +45,9 @@ public: void resetModels(); +signals: + void modelChanged(); + private: void createModels(); void createDocumentModel(); @@ -53,6 +58,9 @@ private: void createFitModel(); void testGUIObjectBuilder(); + void disconnectModel(SessionModel *model); + void connectModel(SessionModel *model); + DocumentModel *m_documentModel; MaterialModel *m_materialModel; MaterialSvc *m_materialSvc; diff --git a/GUI/coregui/Models/SimulationOptionsItem.cpp b/GUI/coregui/Models/SimulationOptionsItem.cpp index 8ec488701da21f243aa8bbc7f970ccbe812f322c..2d44b1eb30995b1883046696b1906fdccfe2dab0 100644 --- a/GUI/coregui/Models/SimulationOptionsItem.cpp +++ b/GUI/coregui/Models/SimulationOptionsItem.cpp @@ -45,8 +45,6 @@ SimulationOptionsItem::SimulationOptionsItem() addProperty(P_MC_POINTS, 100); } - - //! returns list with number of threads to select QStringList SimulationOptionsItem::getCPUUsageOptions() { diff --git a/GUI/coregui/mainwindow/projectdocument.cpp b/GUI/coregui/mainwindow/projectdocument.cpp index 88406c26dffddb58d836a59cb6cee28a8a257bce..32fd79cff155b375c73e8e285c54ed1634769482 100644 --- a/GUI/coregui/mainwindow/projectdocument.cpp +++ b/GUI/coregui/mainwindow/projectdocument.cpp @@ -15,6 +15,7 @@ // ************************************************************************** // #include "projectdocument.h" +#include "ApplicationModels.h" #include "MaterialModel.h" #include "InstrumentModel.h" #include "JobQueueData.h" @@ -45,14 +46,14 @@ const QString XML_FORMAT_ERROR = "XML_FORMAT_ERROR"; } ProjectDocument::ProjectDocument() - : m_materialModel(0), m_instrumentModel(0), m_sampleModel(0), m_jobModel(0), m_fitModel(0) + : m_applicationModels(0) , m_modified(false), m_documentStatus(STATUS_OK), m_messageService(0) { setObjectName("ProjectDocument"); } ProjectDocument::ProjectDocument(const QString &projectFileName) - : m_materialModel(0), m_instrumentModel(0), m_sampleModel(0), m_jobModel(0) + : m_applicationModels(0) , m_modified(false), m_documentStatus(STATUS_OK), m_messageService(0) { setObjectName("ProjectDocument"); @@ -98,48 +99,12 @@ QString ProjectDocument::getProjectFileExtension() return QString(".pro"); } -void ProjectDocument::setMaterialModel(MaterialModel *materialModel) +void ProjectDocument::setApplicationModels(ApplicationModels *applicationModels) { - if (materialModel != m_materialModel) { - disconnectModel(m_materialModel); - m_materialModel = materialModel; - connectModel(m_materialModel); - } -} - -void ProjectDocument::setInstrumentModel(InstrumentModel *instrumentModel) -{ - if (instrumentModel != m_instrumentModel) { - disconnectModel(m_instrumentModel); - m_instrumentModel = instrumentModel; - connectModel(m_instrumentModel); - } -} - -void ProjectDocument::setSampleModel(SampleModel *sampleModel) -{ - if (sampleModel != m_sampleModel) { - disconnectModel(m_sampleModel); - m_sampleModel = sampleModel; - connectModel(m_sampleModel); - } -} - -void ProjectDocument::setJobModel(JobModel *jobModel) -{ - if (jobModel != m_jobModel) { - disconnectModel(m_jobModel); - m_jobModel = jobModel; - connectModel(m_jobModel); - } -} - -void ProjectDocument::setFitModel(FitModel *fitModel) -{ - if (fitModel != m_fitModel) { - disconnectModel(m_fitModel); - m_fitModel = fitModel; - connectModel(m_fitModel); + if (applicationModels != m_applicationModels) { + disconnectModels(); + m_applicationModels = applicationModels; + connectModels(); } } @@ -238,19 +203,7 @@ QString ProjectDocument::getDocumentVersion() const return result; } -void ProjectDocument::onDataChanged(const QModelIndex &, const QModelIndex &) -{ - m_modified = true; - emit modified(); -} - -void ProjectDocument::onJobModelChanged(const QString &) -{ - m_modified = true; - emit modified(); -} - -void ProjectDocument::onRowsChanged(const QModelIndex &, int , int ) +void ProjectDocument::onModelChanged() { m_modified = true; emit modified(); @@ -258,11 +211,7 @@ void ProjectDocument::onRowsChanged(const QModelIndex &, int , int ) void ProjectDocument::readFrom(QIODevice *device) { - disconnectModel(m_materialModel); - disconnectModel(m_instrumentModel); - disconnectModel(m_sampleModel); - disconnectModel(m_jobModel); - //disconnectModel(m_fitModel); + disconnectModels(); QXmlStreamReader reader(device); @@ -276,16 +225,17 @@ void ProjectDocument::readFrom(QIODevice *device) } else if (reader.name() == ProjectDocumentXML::InfoTag) { // } else if (reader.name() == SessionXML::MaterialModelTag) { - readModel(m_materialModel, &reader); + readModel(m_applicationModels->materialModel(), &reader); } else if (reader.name() == SessionXML::InstrumentModelTag) { - readModel(m_instrumentModel, &reader); + readModel(m_applicationModels->instrumentModel(), &reader); } else if (reader.name() == SessionXML::SampleModelTag) { - readModel(m_sampleModel, &reader); + readModel(m_applicationModels->sampleModel(), &reader); } else if (reader.name() == SessionXML::JobModelTag) { - readModel(m_jobModel, &reader); + readModel(m_applicationModels->jobModel(), &reader); + } /*else if (reader.name() == SessionXML::FitModelTag) { readModel(m_fitModel, &reader); }*/ @@ -298,12 +248,9 @@ void ProjectDocument::readFrom(QIODevice *device) return; } - connectModel(m_materialModel); - connectModel(m_instrumentModel); - connectModel(m_sampleModel); - connectModel(m_jobModel); - m_jobModel->modelLoaded(); - //connectModel(m_fitModel); + m_applicationModels->jobModel()->modelLoaded(); + + connectModels(); } void ProjectDocument::writeTo(QIODevice *device) @@ -319,11 +266,10 @@ void ProjectDocument::writeTo(QIODevice *device) writer.writeAttribute(ProjectDocumentXML::InfoNameAttribute, getProjectName()); writer.writeEndElement(); // InfoTag - m_materialModel->writeTo(&writer); - m_instrumentModel->writeTo(&writer); - m_sampleModel->writeTo(&writer); - m_jobModel->writeTo(&writer); - //m_fitModel->writeTo(&writer); + m_applicationModels->materialModel()->writeTo(&writer); + m_applicationModels->instrumentModel()->writeTo(&writer); + m_applicationModels->sampleModel()->writeTo(&writer); + m_applicationModels->jobModel()->writeTo(&writer); writer.writeEndElement(); // BornAgain tag writer.writeEndDocument(); @@ -345,8 +291,11 @@ void ProjectDocument::readModel(SessionModel *model, QXmlStreamReader *reader) //! *.int files in project directory by removing them. void ProjectDocument::reviseOutputData() { - for (int i = 0; i < m_jobModel->rowCount(QModelIndex()); ++i) { - JobItem *jobItem = m_jobModel->getJobItemForIndex(m_jobModel->index(i, 0, QModelIndex())); + JobModel *jobModel = m_applicationModels->jobModel(); + Q_ASSERT(jobModel); + + for (int i = 0; i < jobModel->rowCount(QModelIndex()); ++i) { + JobItem *jobItem = jobModel->getJobItemForIndex(jobModel->index(i, 0, QModelIndex())); IntensityDataItem *dataItem = jobItem->getIntensityDataItem(); if (dataItem) { // handling case when user has renamed jobItem and we have to clean previous @@ -366,9 +315,11 @@ void ProjectDocument::reviseOutputData() //! saves OutputData into project directory void ProjectDocument::saveOutputData() { - Q_ASSERT(m_jobModel); - for (int i = 0; i < m_jobModel->rowCount(QModelIndex()); ++i) { - JobItem *jobItem = m_jobModel->getJobItemForIndex(m_jobModel->index(i, 0, QModelIndex())); + JobModel *jobModel = m_applicationModels->jobModel(); + Q_ASSERT(jobModel); + + for (int i = 0; i < jobModel->rowCount(QModelIndex()); ++i) { + JobItem *jobItem = jobModel->getJobItemForIndex(jobModel->index(i, 0, QModelIndex())); JobResultsPresenter::saveIntensityData(jobItem, getProjectDir()); } } @@ -376,33 +327,27 @@ void ProjectDocument::saveOutputData() //! load OutputData from project directory void ProjectDocument::loadOutputData() { - for (int i = 0; i < m_jobModel->rowCount(QModelIndex()); ++i) { - JobItem *jobItem = m_jobModel->getJobItemForIndex(m_jobModel->index(i, 0, QModelIndex())); + JobModel *jobModel = m_applicationModels->jobModel(); + Q_ASSERT(jobModel); + + for (int i = 0; i < jobModel->rowCount(QModelIndex()); ++i) { + JobItem *jobItem = jobModel->getJobItemForIndex(jobModel->index(i, 0, QModelIndex())); JobResultsPresenter::loadIntensityData(jobItem, getProjectDir()); } } -void ProjectDocument::disconnectModel(SessionModel *model) +void ProjectDocument::disconnectModels() { - if(model) { - disconnect(model, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, - SLOT(onDataChanged(QModelIndex, QModelIndex))); - disconnect(model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, - SLOT(onRowsChanged(QModelIndex, int, int))); - disconnect(model, SIGNAL(rowsInserted(QModelIndex, int,int)), this, - SLOT(onRowsChanged(QModelIndex, int,int))); + if(m_applicationModels) { + disconnect(m_applicationModels, SIGNAL(modelChanged()), this, + SLOT(onModelChanged())); } } -void ProjectDocument::connectModel(SessionModel *model) +void ProjectDocument::connectModels() { - if(model) { - connect(model, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, - SLOT(onDataChanged(QModelIndex, QModelIndex))); - connect(model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, - SLOT(onRowsChanged(QModelIndex, int, int))); - connect(model, SIGNAL(rowsInserted(QModelIndex, int,int)), this, - SLOT(onRowsChanged(QModelIndex, int,int))); + if(m_applicationModels) { + connect(m_applicationModels, SIGNAL(modelChanged()), this, + SLOT(onModelChanged()), Qt::UniqueConnection); } } - diff --git a/GUI/coregui/mainwindow/projectdocument.h b/GUI/coregui/mainwindow/projectdocument.h index 84866a31fd4a6f3b27ab886414d4fd9c68be2492..76ed266a32feaf97dce227bee3c0df558e30a9ef 100644 --- a/GUI/coregui/mainwindow/projectdocument.h +++ b/GUI/coregui/mainwindow/projectdocument.h @@ -23,13 +23,8 @@ class QIODevice; class QModelIndex; -class JobItem; +class ApplicationModels; class SessionModel; -class InstrumentModel; -class MaterialModel; -class SampleModel; -class JobModel; -class FitModel; class QXmlStreamReader; class WarningMessageService; @@ -74,11 +69,7 @@ public: static QString getProjectFileExtension(); - void setMaterialModel(MaterialModel *materialModel); - void setInstrumentModel(InstrumentModel *instrumentModel); - void setSampleModel(SampleModel *sampleModel); - void setJobModel(JobModel *jobModel); - void setFitModel(FitModel *fitModel); + void setApplicationModels(ApplicationModels *applicationModels); bool save(); bool load(const QString &project_file_name); @@ -103,9 +94,7 @@ signals: void modified(); public slots: - void onDataChanged(const QModelIndex &, const QModelIndex &); - void onJobModelChanged(const QString &); - void onRowsChanged(const QModelIndex &parent, int, int); + void onModelChanged(); private: void readFrom(QIODevice *device); @@ -116,16 +105,12 @@ private: void saveOutputData(); void loadOutputData(); - void disconnectModel(SessionModel *model); - void connectModel(SessionModel *model); + void disconnectModels(); + void connectModels(); QString m_project_dir; QString m_project_name; - MaterialModel *m_materialModel; - InstrumentModel *m_instrumentModel; - SampleModel *m_sampleModel; - JobModel *m_jobModel; - FitModel *m_fitModel; + ApplicationModels *m_applicationModels; bool m_modified; EDocumentStatus m_documentStatus; WarningMessageService *m_messageService; diff --git a/GUI/coregui/mainwindow/projectmanager.cpp b/GUI/coregui/mainwindow/projectmanager.cpp index 4f0c43aa9ba56ab07912cc7036b7ea9c2b004013..9397f3ae52656419c4ba577b4398e5580775d232 100644 --- a/GUI/coregui/mainwindow/projectmanager.cpp +++ b/GUI/coregui/mainwindow/projectmanager.cpp @@ -95,11 +95,7 @@ void ProjectManager::createNewProject() m_project_document = new ProjectDocument(); connect(m_project_document, SIGNAL(modified()), this, SLOT(onDocumentModified())); m_project_document->setProjectName("Untitled"); - m_project_document->setMaterialModel(m_mainWindow->getMaterialModel()); - m_project_document->setInstrumentModel(m_mainWindow->instrumentModel()); - m_project_document->setSampleModel(m_mainWindow->sampleModel()); - m_project_document->setJobModel(m_mainWindow->jobModel()); - m_project_document->setFitModel(m_mainWindow->getFitModel()); + m_project_document->setApplicationModels(m_mainWindow->models()); m_project_document->setMessageService(m_messageService); }