Skip to content
Snippets Groups Projects
InstrumentView.cpp 5.17 KiB
Newer Older
  • Learn to ignore specific revisions
  • //  ************************************************************************************************
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    //
    
    //  BornAgain: simulate and fit reflection and scattering
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    //
    
    //! @file      GUI/View/Instrument/InstrumentView.cpp
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    //! @brief     Implements class InstrumentView
    //!
    
    //! @homepage  http://www.bornagainproject.org
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    //! @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)
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    //
    
    //  ************************************************************************************************
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    
    
    #include "GUI/View/Instrument/InstrumentView.h"
    
    #include "GUI/Model/Item/InstrumentItems.h"
    #include "GUI/Model/Model/InstrumentModel.h"
    
    #include "GUI/Model/Project/ProjectDocument.h"
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
    #include "GUI/View/Common/StyledToolBar.h"
    
    #include "GUI/View/Instrument/DepthProbeInstrumentEditor.h"
    #include "GUI/View/Instrument/GISASInstrumentEditor.h"
    
    #include "GUI/View/Instrument/InstrumentListView.h"
    
    #include "GUI/View/Instrument/OffSpecularInstrumentEditor.h"
    #include "GUI/View/Instrument/SpecularInstrumentEditor.h"
    
    #include <QBoxLayout>
    
    #include <QFormLayout>
    #include <QLabel>
    #include <QLineEdit>
    #include <QScrollArea>
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    
    
    InstrumentView::InstrumentView(QWidget* parent, ProjectDocument* document)
    
        : QWidget(parent)
        , m_document(document)
    
        auto* horizontalLayout = new QHBoxLayout;
    
        m_instrumentListView = new InstrumentListView(document, this);
        horizontalLayout->addWidget(m_instrumentListView);
    
    
        auto* rightVLayout = new QVBoxLayout;
        rightVLayout->setContentsMargins(0, 20, 0, 20);
    
        auto* formLayout = new QFormLayout;
        formLayout->setMargin(17);
        formLayout->setSpacing(8);
        rightVLayout->addLayout(formLayout);
    
        m_nameLineEdit = new QLineEdit(this);
        formLayout->addRow("Instrument name:", m_nameLineEdit);
    
        m_typeLabel = new QLabel(this);
        formLayout->addRow("Instrument type:", m_typeLabel);
    
        m_scrollArea = new QScrollArea(this);
        m_scrollArea->setWidgetResizable(true);
        m_scrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
        rightVLayout->addWidget(m_scrollArea);
        horizontalLayout->addLayout(rightVLayout, 1);
    
        auto* toolbar = new StyledToolBar(this);
    
        toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    
        toolbar->addActions(m_instrumentListView->toolbarActions());
    
        auto* mainLayout = new QVBoxLayout;
    
        mainLayout->setMargin(0);
        mainLayout->setSpacing(0);
    
        mainLayout->addWidget(toolbar);
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        mainLayout->addLayout(horizontalLayout);
    
        setLayout(mainLayout);
    
        createWidgetsForCurrentInstrument();
    
        connect(m_nameLineEdit, &QLineEdit::editingFinished, this,
                &InstrumentView::onInstrumentNameEditingFinished);
    
    
        connect(m_instrumentListView, &InstrumentListView::instrumentSelected, this,
    
                &InstrumentView::createWidgetsForCurrentInstrument);
    }
    
    void InstrumentView::createWidgetsForCurrentInstrument()
    {
        auto* currentInstrument = m_instrumentListView->currentInstrument();
    
        if (currentInstrument) {
            m_nameLineEdit->setEnabled(true);
            m_nameLineEdit->setText(currentInstrument->instrumentName());
            m_typeLabel->setText(currentInstrument->instrumentType());
            if (auto* sp = dynamic_cast<SpecularInstrumentItem*>(currentInstrument)) {
                auto* editor = new SpecularInstrumentEditor(m_scrollArea, sp);
                connect(editor, &SpecularInstrumentEditor::dataChanged,
                        [=] { emit instrumentChanged(currentInstrument); });
                m_scrollArea->setWidget(editor);
            } else if (auto* os = dynamic_cast<OffSpecularInstrumentItem*>(currentInstrument)) {
                auto* editor = new OffSpecularInstrumentEditor(m_scrollArea, os);
                connect(editor, &OffSpecularInstrumentEditor::dataChanged,
                        [=] { emit instrumentChanged(currentInstrument); });
                m_scrollArea->setWidget(editor);
            } else if (auto* gisas = dynamic_cast<GISASInstrumentItem*>(currentInstrument)) {
                auto* editor = new GISASInstrumentEditor(m_scrollArea, gisas);
                connect(editor, &GISASInstrumentEditor::dataChanged,
                        [=] { emit instrumentChanged(currentInstrument); });
                m_scrollArea->setWidget(editor);
            } else if (auto* dp = dynamic_cast<DepthProbeInstrumentItem*>(currentInstrument)) {
                auto* editor = new DepthProbeInstrumentEditor(m_scrollArea, dp);
                connect(editor, &DepthProbeInstrumentEditor::dataChanged,
                        [=] { emit instrumentChanged(currentInstrument); });
                m_scrollArea->setWidget(editor);
            } else
                ASSERT(false);
        } else {
            m_scrollArea->setWidget(new QWidget(m_scrollArea)); // blank widget
            m_nameLineEdit->clear();
            m_nameLineEdit->setEnabled(false);
            m_typeLabel->clear();
        }
    
    void InstrumentView::onInstrumentNameEditingFinished()
    
        auto* currentInstrument = m_instrumentListView->currentInstrument();
        auto newName = m_nameLineEdit->text();
        if (currentInstrument && currentInstrument->instrumentName() != newName) {
            currentInstrument->setInstrumentName(newName);
            emit instrumentChanged(currentInstrument);
        }