Skip to content
Snippets Groups Projects
ParameterBackupWidget.cpp 4.76 KiB
Newer Older
  • Learn to ignore specific revisions
  • //  ************************************************************************************************
    //
    //  BornAgain: simulate and fit reflection and scattering
    //
    //! @file      GUI/View/Tuning/ParameterBackupWidget.cpp
    //! @brief     Implements class ParameterBackupWidget.
    //!
    //! @homepage  http://www.bornagainproject.org
    //! @license   GNU General Public License v3 or higher (see COPYING)
    //! @copyright Forschungszentrum Jülich GmbH 2023
    //! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
    //
    //  ************************************************************************************************
    
    #include "GUI/View/Tuning/ParameterBackupWidget.h"
    
    #include "Base/Util/Assert.h"
    
    #include "GUI/Model/Par/ParameterTreeItems.h"
    
    #include "GUI/View/Base/ActionFactory.h"
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
    #include <QBoxLayout>
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
    #include <QDateTime>
    #include <QDialog>
    #include <QLineEdit>
    
    namespace {
    void resizeLineEditToContents(QLineEdit* lineedit)
    {
        QSize text_size = lineedit->fontMetrics().size(0, lineedit->text());
        lineedit->setMinimumSize(text_size + QSize(15, 0));
    }
    
    class NewSnapshotDialog : public QDialog {
    public:
        explicit NewSnapshotDialog(QString& newName, QWidget* parent = nullptr)
            : QDialog(parent)
        {
            setWindowTitle("New snapshot");
            setMinimumWidth(240);
    
            auto* mainLayout = new QVBoxLayout(this);
    
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
            QString dateTime = QDateTime::currentDateTime().toString("<dd.MM.yyyy | hh:mm:ss>");
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
            auto* lineEdit = new QLineEdit("State at " + dateTime);
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
            lineEdit->selectAll();
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
            mainLayout->addWidget(lineEdit);
            connect(lineEdit, &QLineEdit::textEdited, [this, lineEdit] {
                ::resizeLineEditToContents(lineEdit);
                adjustSize();
            });
            ::resizeLineEditToContents(lineEdit);
    
            auto* okButton = new QPushButton("OK");
            okButton->setFixedWidth(50);
            mainLayout->addWidget(okButton, 0, Qt::AlignCenter);
            okButton->setDefault(true);
            connect(okButton, &QPushButton::clicked, [this, &newName, lineEdit] {
                newName = lineEdit->text();
                accept();
            });
        }
    };
    } // namespace
    
    
    ParameterBackupWidget::ParameterBackupWidget(QWidget* parent)
    
        : QWidget(parent)
    
        auto* mainLayout = new QVBoxLayout(this);
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
    
    
        auto* h1 = new QHBoxLayout;
        h1->setAlignment(Qt::AlignLeft);
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
        m_combo->setSizeAdjustPolicy(QComboBox::AdjustToContents);
    
        h1->addWidget(m_combo);
    
        m_remove = new QPushButton(QIcon(":/images/delete.svg"), "Remove");
        m_remove->setToolTip("Remove selected snapshot");
        h1->addWidget(m_remove);
    
        auto* h2 = new QHBoxLayout;
        h2->setAlignment(Qt::AlignLeft);
        m_create = new QPushButton(QIcon(":/images/shape-square-plus.svg"), "New snapshot");
        m_create->setToolTip("Add new snapshot of parameter tree");
        h2->addWidget(m_create);
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
    
    
        m_reset = new QPushButton(QIcon(":/images/undo.svg"), "Reset");
        m_reset->setToolTip("Reset parameter tree to selected snapshot");
    
        connect(m_reset, &QPushButton::clicked, [this] { backupSwitched(m_combo->currentIndex()); });
    
        h2->addWidget(m_reset);
    
        mainLayout->addLayout(h1);
        mainLayout->addLayout(h2);
    
    
    void ParameterBackupWidget::setParameterContainer(ParameterContainerItem* container)
    {
        ASSERT(container);
    
        m_container = container;
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
        // new snapshot
    
        disconnect(m_create, nullptr, nullptr, nullptr);
    
        connect(m_create, &QPushButton::clicked, [this] {
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
            QString newName;
            NewSnapshotDialog dialog(newName);
            if (dialog.exec() == QDialog::Accepted)
    
                m_container->addBackupValues(newName);
            fillCombo();
    
            QSignalBlocker b(m_combo);
            m_combo->setCurrentIndex(m_combo->count() - 1);
            m_remove->setEnabled(true);
        });
    
        // delete snapshot
        disconnect(m_remove, nullptr, nullptr, nullptr);
    
        connect(m_remove, &QPushButton::clicked, [this] {
    
            if (m_combo->currentIndex() >= 0) {
    
                m_container->deleteBackupValues(m_combo->currentIndex());
                fillCombo();
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
        });
    
    Mikhail Svechnikov's avatar
    Mikhail Svechnikov committed
    
        // update combo
    
        fillCombo();
    
    void ParameterBackupWidget::onComboChange(int index)
    {
        m_remove->setDisabled(m_combo->currentIndex() <= 0);
    
        m_container->setCurrentIndex(index);
    
        emit backupSwitched(index);
    }
    
    
    void ParameterBackupWidget::fillCombo()
    
    {
        disconnect(m_combo, nullptr, nullptr, nullptr);
    
    
        int index = m_container->currentIndex();
    
        m_combo->clear();
    
        m_combo->addItems(m_container->backupTitles());
        if (index >= 0) {
            if (index < m_combo->count())
                m_combo->setCurrentIndex(index);
    
            else
                m_combo->setCurrentIndex(m_combo->count() - 1);
        }
        m_remove->setDisabled(m_combo->currentIndex() <= 0);
    
        connect(m_combo, &QComboBox::currentIndexChanged, this, &ParameterBackupWidget::onComboChange);