Skip to content
Snippets Groups Projects
ParticleLayoutForm.cpp 4.55 KiB
Newer Older
  • Learn to ignore specific revisions
  • //  ************************************************************************************************
    //
    //  BornAgain: simulate and fit reflection and scattering
    //
    
    //! @file      GUI/View/SampleDesigner/ParticleLayoutForm.cpp
    
    //! @brief     Implements class ParticleLayoutForm
    //!
    //! @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)
    //
    //  ************************************************************************************************
    
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
    #include "GUI/View/SampleDesigner/ParticleLayoutForm.h"
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
    #include "Base/Util/Assert.h"
    
    #include "GUI/Model/Sample/InterferenceItems.h"
    #include "GUI/Model/Sample/ItemWithParticles.h"
    #include "GUI/Model/Sample/LayerItem.h"
    #include "GUI/Model/Sample/ParticleLayoutItem.h"
    
    #include "GUI/Util/ActionFactory.h"
    
    #include "GUI/View/Common/DoubleSpinBox.h"
    
    #include "GUI/View/SampleDesigner/InterferenceForm.h"
    #include "GUI/View/SampleDesigner/LayerEditorUtils.h"
    #include "GUI/View/SampleDesigner/LayerForm.h"
    #include "GUI/View/SampleDesigner/SampleEditorController.h"
    
    #include "GUI/View/Tool/GroupBoxCollapser.h"
    
    #include <QAction>
    #include <QPushButton>
    
    ParticleLayoutForm::ParticleLayoutForm(LayerForm* parent, ParticleLayoutItem* layoutItem,
                                           SampleEditorController* ec)
    
        : QGroupBox(parent)
        , m_layoutItem(layoutItem)
        , m_ec(ec)
    
    {
        FormLayouter layouter(this, ec);
        layouter.setContentsMargins(30, 6, 0, 0);
    
        int rowOfTotalDensity = layouter.addValue(m_layoutItem->ownDensity());
    
        m_totalDensitySpinBox =
            layouter.widgetAt<DoubleSpinBox*>(rowOfTotalDensity, QFormLayout::FieldRole);
        ASSERT(m_totalDensitySpinBox);
    
        layouter.addRow(new InterferenceForm(this, layoutItem, ec));
    
    
        for (auto* particle : m_layoutItem->itemsWithParticles())
    
            layouter.addRow(
                LayerEditorUtils::createWidgetForItemWithParticles(this, particle, true, ec));
    
    
        auto* btn = LayerEditorUtils::createAddParticleButton(
    
            this,
            [=](FormFactorItemCatalog::Type type) { ec->addParticleLayoutItem(layoutItem, type); },
            [=](ItemWithParticlesCatalog::Type type) { ec->addParticleLayoutItem(layoutItem, type); });
    
        m_structureEditingWidgets << btn;
        layouter.addStructureEditingRow(btn);
    
        m_removeAction = ActionFactory::createRemoveAction(
    
            this, "particle layout", [=] { ec->removeLayoutItem(parent, layoutItem); });
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        auto* showInRealspaceAction = ActionFactory::createShowInRealspaceAction(
            this, "particle layout", [=] { ec->requestViewInRealspace(layoutItem); });
    
        m_collapser = GroupBoxCollapser::installIntoGroupBox(this);
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        m_collapser->addAction(showInRealspaceAction);
    
        m_layout = layouter.layout();
    
    }
    
    void ParticleLayoutForm::enableStructureEditing(bool b)
    {
        m_removeAction->setVisible(b);
    
        for (auto* w : m_structureEditingWidgets)
    
            w->setVisible(b);
    }
    
    ParticleLayoutItem* ParticleLayoutForm::layoutItem() const
    {
        return m_layoutItem;
    }
    
    
    void ParticleLayoutForm::onParticleAdded(ItemWithParticles* p)
    
        int index = m_layoutItem->itemsWithParticles().indexOf(p);
    
        const int rowInLayout =
    
            m_layout->rowCount() - 1 - (m_layoutItem->itemsWithParticles().size() - 1) + index; // -1: btn
    
        m_layout->insertRow(rowInLayout,
                            LayerEditorUtils::createWidgetForItemWithParticles(this, p, true, m_ec));
    
    }
    
    void ParticleLayoutForm::onAboutToRemoveParticle(ItemWithParticles* item)
    {
    
        int index = m_layoutItem->itemsWithParticles().indexOf(item);
    
            m_layout->rowCount() - m_layoutItem->itemsWithParticles().size() - 1 + index; // -1: btn
    
        m_totalDensitySpinBox->setEnabled(!m_layoutItem->totalDensityIsDefinedByInterference());
    
    
    void ParticleLayoutForm::updateDensityValue()
    {
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
        if (m_layoutItem->totalDensityIsDefinedByInterference())
    
            m_layoutItem->setOwnDensity(m_layoutItem->totalDensityValue());
    
        m_totalDensitySpinBox->updateValue();
    
    
    void ParticleLayoutForm::updateTitle(const LayerItem* layerItem)
    {
    
        const auto layouts = layerItem->layoutItems();
    
        if (layouts.size() > 1)
            m_collapser->setTitle("Particle layout "
                                  + QString::number(layouts.indexOf(m_layoutItem) + 1));
        else
            m_collapser->setTitle("Particle layout");
    }