Skip to content
Snippets Groups Projects
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