Skip to content
Snippets Groups Projects
InterferenceForm.cpp 3.49 KiB
Newer Older
  • Learn to ignore specific revisions
  • //  ************************************************************************************************
    //
    //  BornAgain: simulate and fit reflection and scattering
    //
    //! @file      GUI/Views/SampleDesigner/InterferenceForm.cpp
    //! @brief     Implements class InterferenceForm
    //!
    //! @homepage  http://www.bornagainproject.org
    //! @license   GNU General Public License v3 or higher (see COPYING)
    //! @copyright Forschungszentrum Jülich GmbH 2021
    //! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
    //
    //  ************************************************************************************************
    
    #include "GUI/Views/SampleDesigner/InterferenceForm.h"
    #include "GUI/Models/InterferenceItems.h"
    #include "GUI/Models/ParticleLayoutItem.h"
    #include "GUI/Views/CommonWidgets/GroupBoxCollapser.h"
    #include "GUI/Views/SampleDesigner/FormLayouter.h"
    #include "GUI/Views/SampleDesigner/SampleEditorController.h"
    #include "GUI/Views/SampleDesigner/SelectionContainerForm.h"
    
    InterferenceForm::InterferenceForm(QWidget* parent, ParticleLayoutItem* layoutItem,
                                       SampleEditorController* ec)
        : QGroupBox(parent), m_layoutItem(layoutItem), m_ec(ec)
    {
        setTitle("Interference Function");
    
        FormLayouter layouter(this, ec);
        layouter.setContentsMargins(6, 6, 0, 6);
        m_collapser = GroupBoxCollapser::installIntoGroupBox(this);
    
        m_interferenceTypeCombo = new QComboBox(this);
        auto d = layoutItem->interference();
        m_interferenceTypeCombo->addItems(d.options);
        m_interferenceTypeCombo->setCurrentIndex(d.currentIndex());
        m_interferenceTypeCombo->setMaxVisibleItems(m_interferenceTypeCombo->count());
        m_interferenceTypeCombo->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
        layouter.addRow("Type:", m_interferenceTypeCombo);
    
        createInterferenceWidgets();
    
        connect(m_interferenceTypeCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
                &InterferenceForm::onInterferenceComboChanged);
    
        updateTitle();
    }
    
    void InterferenceForm::onInterferenceComboChanged()
    {
        FormLayouter layouter(this, m_ec);
        while (layouter.layout()->rowCount() > 1)
            layouter.layout()->removeRow(1);
    
        m_ec->selectInterference(m_layoutItem, m_interferenceTypeCombo->currentIndex());
    
        createInterferenceWidgets();
        updateTitle();
    }
    
    void InterferenceForm::createInterferenceWidgets()
    {
        FormLayouter layouter(this, m_ec);
        auto* interference = m_layoutItem->interference().currentItem();
        if (auto itf = dynamic_cast<Interference1DLatticeItem*>(interference)) {
            layouter.addValue(itf->positionVariance());
            layouter.addValue(itf->length());
            layouter.addValue(itf->rotationAngle());
            layouter.addSelection(itf->decayFunction());
        } else if (auto itf = dynamic_cast<InterferenceRadialParaCrystalItem*>(interference)) {
            layouter.addValue(itf->positionVariance());
            layouter.addValue(itf->peakDistance());
            layouter.addValue(itf->dampingLength());
            layouter.addValue(itf->domainSize());
            layouter.addValue(itf->kappa());
            layouter.addSelection(itf->probabilityDistribution());
        } else if (auto itf = dynamic_cast<InterferenceHardDiskItem*>(interference)) {
            layouter.addValue(itf->positionVariance());
            layouter.addValue(itf->radius());
        }
        // #baLayerEditor implement missing interference function types
    }
    
    void InterferenceForm::updateTitle()
    {
        m_collapser->setTitle("Interference Function (" + m_interferenceTypeCombo->currentText() + ")");
    }