-
Matthias Puchner authoredMatthias Puchner authored
ProjectDocument.h 5.29 KiB
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file GUI/Model/Project/ProjectDocument.h
//! @brief Defines class ProjectDocument
//!
//! @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_MODEL_PROJECT_PROJECTDOCUMENT_H
#define BORNAGAIN_GUI_MODEL_PROJECT_PROJECTDOCUMENT_H
#include "GUI/Model/Model/ApplicationModels.h"
#include "GUI/Model/Model/InstrumentModel.h"
#include "GUI/Model/Model/MaterialModel.h"
#include "GUI/Model/Model/SampleModel.h"
#include "GUI/Model/Project/InstrumentsEditController.h"
#include "GUI/Support/Data/SimulationOptionsItem.h"
#include <QObject>
#include <QVariant>
#include <memory>
class QIODevice;
class MessageService;
class OutputDataIOService;
class InstrumentModel;
class SampleModel;
class MaterialModel;
class RealDataModel;
class JobModel;
class LinkInstrumentManager;
//! Project document class handles all data related to the opened project
//! (sample, jobModel, project specific windows settings)
//!
//! e.g. if project file is /home/users/development/Untitled/Untitled.pro
//! projectName() - 'Untitled'
//! projectDir() - '/home/users/development/Untitled
//! projectFileName() - '/home/users/development/Untitled/Untitled.pro'
class ProjectDocument : public QObject {
Q_OBJECT
public:
enum class ReadResult { ok, warning, error };
enum Functionality {
None = 0x0,
Gisas = 0x1,
OffSpecular = 0x2,
Specular = 0x4,
DepthProbe = 0x8,
All = Gisas | OffSpecular | Specular | DepthProbe
};
Q_DECLARE_FLAGS(Functionalities, Functionality)
Q_FLAG(Functionalities)
ProjectDocument(const QString& projectFileName = "");
~ProjectDocument() override;
QString projectName() const;
void setProjectName(const QString& text);
QString projectDir() const;
QString validProjectDir() const;
void setProjectDir(const QString& text);
QString userExportDir() const;
QString projectFileName() const;
void setProjectFileName(const QString& projectFileName);
InstrumentModel* instrumentModel();
SampleModel* sampleModel();
MaterialModel* materialModel();
RealDataModel* realDataModel() const;
JobModel* jobModel() const;
SimulationOptionsItem* simulationOptionsItem();
LinkInstrumentManager* linkInstrumentManager();
//! The edit controller for the instruments in this project document.
//!
//! Use this to modify instrument list or instrument data.
//! Listen to its signals to get notification about any changes.
//! \sa InstrumentsEditController for more information
InstrumentsEditController* instrumentsEditController();
void save(const QString& project_file_name, bool autoSave = false);
void saveProjectFile(const QString& project_file_name, bool autoSave = false);
void saveProjectData(const QString& project_file_name);
ReadResult loadProjectFile(const QString& project_file_name, MessageService& messageService);
bool hasValidNameAndPath();
bool isModified() const;
void setModified();
void clearModified();
bool hasData() const;
QString documentVersion() const;
bool singleInstrumentMode() const;
void setSingleInstrumentMode(bool b);
bool singleSampleMode() const;
void setSingleSampleMode(bool b);
Functionalities functionalities() const;
void setFunctionalities(const Functionalities& f);
signals:
//! Emitted for _any_ modifications in the document
void modified();
//! Emitted when functionality has changed
void functionalitiesChanged();
//! Emitted when single instrument mode has changed
void singleInstrumentModeChanged();
//! Emitted when single sample mode has changed
void singleSampleModeChanged();
private:
ReadResult readProject(QIODevice* device, MessageService& messageService);
void writeTo(QIODevice* device);
void disconnectModels();
void connectModels();
void onModelChanged();
QString m_project_dir;
QString m_project_name;
ApplicationModels m_applicationModels;
bool m_modified;
QString m_currentVersion;
OutputDataIOService* m_dataService;
std::unique_ptr<LinkInstrumentManager> m_linkManager;
bool m_singleInstrumentMode;
bool m_singleSampleMode;
Functionalities m_functionalities;
SimulationOptionsItem m_simulationOptionsItem;
MaterialModel m_materials;
SampleModel m_samples;
InstrumentsEditController m_instrumentEditController;
InstrumentModel m_instruments;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(ProjectDocument::Functionalities)
inline QVariant toVariant(const ProjectDocument::Functionalities& f)
{
return QVariant(static_cast<ProjectDocument::Functionalities::Int>(f));
}
inline ProjectDocument::Functionalities toFunctionalities(const QVariant& v)
{
return static_cast<ProjectDocument::Functionalities>(
v.value<ProjectDocument::Functionalities::Int>());
}
#endif // BORNAGAIN_GUI_MODEL_PROJECT_PROJECTDOCUMENT_H