Skip to content
Snippets Groups Projects
Commit a0728bfb authored by Wuttke, Joachim's avatar Wuttke, Joachim
Browse files

[j.ui2] replace GUI/View/Project/SimulationView.ui ()

Merging branch 'j.ui2'  into 'main'.

See merge request !2066
parents 9b1b8171 e52ba59b
No related branches found
No related tags found
1 merge request!2066replace GUI/View/Project/SimulationView.ui
Pipeline #117731 passed
......@@ -27,67 +27,140 @@
#include "GUI/View/Project/ProjectManager.h"
#include "GUI/View/Project/PythonScriptWidget.h"
#include "GUI/View/Widget/GroupBoxes.h"
#include "ui_SimulationView.h"
#include <QButtonGroup>
#include <QCheckBox>
#include <QFormLayout>
#include <QMessageBox>
#include <QVBoxLayout>
#include <thread>
SimulationView::SimulationView(QWidget* parent, ProjectDocument* document)
: QWidget(parent)
, m_ui(new Ui::SimulationView)
, m_document(document)
{
m_ui->setupUi(this);
GroupBoxCollapser::installIntoGroupBox(m_ui->groupBox_3);
GroupBoxCollapser::installIntoGroupBox(m_ui->groupBox_2);
GroupBoxCollapser::installIntoGroupBox(m_ui->groupBox);
auto* buttonGroup = new QButtonGroup(this);
buttonGroup->addButton(m_ui->runPolicyImmediatelyRadio);
buttonGroup->addButton(m_ui->runPolicyBackgroundRadio);
auto* computationButtonGroup = new QButtonGroup(this);
computationButtonGroup->addButton(m_ui->analyticalRadio);
computationButtonGroup->addButton(m_ui->monteCarloRadio);
buttonGroup = new QButtonGroup(this);
buttonGroup->addButton(m_ui->ambientLayerRadio);
buttonGroup->addButton(m_ui->averageLayerRadio);
auto* layout = new QVBoxLayout;
setLayout(layout);
//... Data selection
auto* g1 = new StaticGroupBox("Data selection", this);
layout->addWidget(g1);
auto* f1 = new QFormLayout;
g1->body()->setLayout(f1);
m_instrumentLabel = new QLabel("Instrument");
m_instrumentCombo = new QComboBox;
f1->addRow(m_instrumentLabel, m_instrumentCombo);
m_sampleCombo = new QComboBox;
f1->addRow("Sample", m_sampleCombo);
m_realDataCombo = new QComboBox;
f1->addRow("Data", m_realDataCombo);
//... Model evaluation settings
auto* g2 = new StaticGroupBox("Model evaluation settings", this);
layout->addWidget(g2);
auto* l2 = new QVBoxLayout;
g2->body()->setLayout(l2);
// analytical vs MC
auto* b_mc = new QButtonGroup;
m_analyticalRadio = new QRadioButton("Deterministic computation at pixel center");
b_mc->addButton(m_analyticalRadio);
l2->addWidget(m_analyticalRadio);
m_monteCarloRadio = new QRadioButton("Monte-Carlo computation; number of points per pixel: ");
b_mc->addButton(m_monteCarloRadio);
auto* l_mc2 = new QHBoxLayout;
l2->addLayout(l_mc2);
l_mc2->addWidget(m_monteCarloRadio);
m_numberOfMonteCarloPoints = new QSpinBox;
l_mc2->addWidget(m_numberOfMonteCarloPoints);
l_mc2->addStretch(1);
l2->addSpacerItem(new QSpacerItem(10, 10));
// layer material
auto* b_lm = new QButtonGroup;
m_ambientLayerRadio = new QRadioButton("R&T computed for layer material as given");
b_lm->addButton(m_ambientLayerRadio);
l2->addWidget(m_ambientLayerRadio);
m_averageLayerRadio = new QRadioButton("R&T computed for averaged layer material");
b_lm->addButton(m_averageLayerRadio);
l2->addWidget(m_averageLayerRadio);
l2->addSpacerItem(new QSpacerItem(10, 10));
// also specular peak?
m_includeSpecularCheck = new QCheckBox("Also compute specular peak");
l2->addWidget(m_includeSpecularCheck);
//... Execution settings
auto* g3 = new StaticGroupBox("Execution settings", this);
layout->addWidget(g3);
auto* l3 = new QVBoxLayout;
g3->body()->setLayout(l3);
// immediately/background?
auto* b_exec = new QButtonGroup;
m_runPolicyImmediatelyRadio = new QRadioButton("Run immediately");
b_exec->addButton(m_runPolicyImmediatelyRadio);
l3->addWidget(m_runPolicyImmediatelyRadio);
m_runPolicyBackgroundRadio = new QRadioButton("Run in background");
b_exec->addButton(m_runPolicyBackgroundRadio);
l2->addWidget(m_runPolicyBackgroundRadio);
l3->addSpacerItem(new QSpacerItem(10, 10));
// number of threads
auto* f3 = new QFormLayout;
m_numberOfThreadsCombo = new QComboBox;
m_numberOfThreadsCombo->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
f3->addRow("Number of threads", m_numberOfThreadsCombo);
l3->addLayout(f3);
l3->addSpacerItem(new QSpacerItem(10, 10));
auto* l_launchers = new QHBoxLayout;
l3->addLayout(l_launchers);
m_simulateButton = new QPushButton("Run simulation");
l_launchers->addWidget(m_simulateButton);
m_exportToPyScriptButton = new QPushButton("Export to Python Script");
l_launchers->addWidget(m_exportToPyScriptButton);
l_launchers->addStretch(1);
layout->addStretch(1);
//... Set data
// -- fill combo for "number of threads"
const int nthreads = static_cast<int>(std::thread::hardware_concurrency());
m_ui->numberOfThreadsCombo->addItem(QString("Max (%1 threads)").arg(nthreads), nthreads);
m_numberOfThreadsCombo->addItem(QString("Max (%1 threads)").arg(nthreads), nthreads);
for (int i = nthreads - 1; i > 1; i--)
m_ui->numberOfThreadsCombo->addItem(QString("%1 threads").arg(i), i);
m_ui->numberOfThreadsCombo->addItem("1 thread", 1);
m_numberOfThreadsCombo->addItem(QString("%1 threads").arg(i), i);
m_numberOfThreadsCombo->addItem("1 thread", 1);
updateFunctionalityNarrowing();
connect(m_ui->instrumentCombo, &QComboBox::currentTextChanged, [this] { updateStateFromUI(); });
connect(m_ui->sampleCombo, &QComboBox::currentTextChanged, [this] { updateStateFromUI(); });
connect(m_ui->realDataCombo, &QComboBox::currentTextChanged, [this] { updateStateFromUI(); });
//... Connect
connect(m_instrumentCombo, &QComboBox::currentTextChanged, [this] { updateStateFromUI(); });
connect(m_sampleCombo, &QComboBox::currentTextChanged, [this] { updateStateFromUI(); });
connect(m_realDataCombo, &QComboBox::currentTextChanged, [this] { updateStateFromUI(); });
connect(m_ui->simulateButton, &QPushButton::clicked, this, &SimulationView::simulate);
connect(m_ui->exportToPyScriptButton, &QPushButton::clicked, this,
connect(m_simulateButton, &QPushButton::clicked, this, &SimulationView::simulate);
connect(m_exportToPyScriptButton, &QPushButton::clicked, this,
&SimulationView::exportPythonScript);
connect(computationButtonGroup, &QButtonGroup::buttonClicked, this,
&SimulationView::updateEnabling);
connect(b_exec, &QButtonGroup::buttonClicked, this, &SimulationView::updateEnabling);
connect(m_ui->runPolicyImmediatelyRadio, &QRadioButton::toggled,
[this]() { updateStateFromUI(); });
connect(m_runPolicyImmediatelyRadio, &QRadioButton::toggled, [this]() { updateStateFromUI(); });
connect(m_ui->analyticalRadio, &QRadioButton::toggled, [this]() { updateStateFromUI(); });
connect(m_analyticalRadio, &QRadioButton::toggled, [this]() { updateStateFromUI(); });
connect(m_ui->averageLayerRadio, &QRadioButton::toggled, [this]() { updateStateFromUI(); });
connect(m_averageLayerRadio, &QRadioButton::toggled, [this]() { updateStateFromUI(); });
connect(m_ui->numberOfThreadsCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),
connect(m_numberOfThreadsCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),
[this]() { updateStateFromUI(); });
connect(m_ui->numberOfMonteCarloPoints, QOverload<int>::of(&QSpinBox::valueChanged),
connect(m_numberOfMonteCarloPoints, QOverload<int>::of(&QSpinBox::valueChanged),
[this]() { updateStateFromUI(); });
connect(m_ui->includeSpecularCheck, &QCheckBox::toggled, [this]() { updateStateFromUI(); });
connect(m_includeSpecularCheck, &QCheckBox::toggled, [this]() { updateStateFromUI(); });
connect(m_document, &ProjectDocument::modifiedStateChanged, this,
&SimulationView::updateFunctionalityNarrowing);
......@@ -100,35 +173,35 @@ void SimulationView::showEvent(QShowEvent*)
void SimulationView::writeOptionsToUI()
{
QSignalBlocker b1(m_ui->runPolicyImmediatelyRadio);
QSignalBlocker b2(m_ui->analyticalRadio);
QSignalBlocker b3(m_ui->averageLayerRadio);
QSignalBlocker b4(m_ui->numberOfThreadsCombo);
QSignalBlocker b5(m_ui->numberOfMonteCarloPoints);
QSignalBlocker b6(m_ui->includeSpecularCheck);
QSignalBlocker b1(m_runPolicyImmediatelyRadio);
QSignalBlocker b2(m_analyticalRadio);
QSignalBlocker b3(m_averageLayerRadio);
QSignalBlocker b4(m_numberOfThreadsCombo);
QSignalBlocker b5(m_numberOfMonteCarloPoints);
QSignalBlocker b6(m_includeSpecularCheck);
// -- selection group
updateSelection(m_ui->instrumentCombo, m_document->instrumentModel()->instrumentNames(),
updateSelection(m_instrumentCombo, m_document->instrumentModel()->instrumentNames(),
optionsItem()->selectedInstrumentIndex());
updateSelection(m_ui->sampleCombo, m_document->sampleModel()->sampleNames(),
updateSelection(m_sampleCombo, m_document->sampleModel()->sampleNames(),
optionsItem()->selectedSampleIndex());
updateSelection(m_ui->realDataCombo, m_document->realModel()->realItemNames(),
updateSelection(m_realDataCombo, m_document->realModel()->realItemNames(),
optionsItem()->selectedDataIndex(), true);
// -- options group
optionsItem()->runImmediately() ? m_ui->runPolicyImmediatelyRadio->setChecked(true)
: m_ui->runPolicyBackgroundRadio->setChecked(true);
optionsItem()->runImmediately() ? m_runPolicyImmediatelyRadio->setChecked(true)
: m_runPolicyBackgroundRadio->setChecked(true);
optionsItem()->useAnalytical() ? m_ui->analyticalRadio->setChecked(true)
: m_ui->monteCarloRadio->setChecked(true);
optionsItem()->useAnalytical() ? m_analyticalRadio->setChecked(true)
: m_monteCarloRadio->setChecked(true);
optionsItem()->useAverageMaterials() ? m_ui->averageLayerRadio->setChecked(true)
: m_ui->ambientLayerRadio->setChecked(true);
optionsItem()->useAverageMaterials() ? m_averageLayerRadio->setChecked(true)
: m_ambientLayerRadio->setChecked(true);
m_ui->numberOfThreadsCombo->setCurrentIndex(
m_ui->numberOfThreadsCombo->findData(optionsItem()->numberOfThreads()));
m_ui->numberOfMonteCarloPoints->setValue(optionsItem()->numberOfMonteCarloPoints());
m_ui->includeSpecularCheck->setChecked(optionsItem()->includeSpecularPeak());
m_numberOfThreadsCombo->setCurrentIndex(
m_numberOfThreadsCombo->findData(optionsItem()->numberOfThreads()));
m_numberOfMonteCarloPoints->setValue(optionsItem()->numberOfMonteCarloPoints());
m_includeSpecularCheck->setChecked(optionsItem()->includeSpecularPeak());
updateEnabling();
}
......@@ -178,23 +251,23 @@ void SimulationView::exportPythonScript()
void SimulationView::readOptionsFromUI()
{
optionsItem()->setSelectedInstrumentIndex(m_ui->instrumentCombo->currentIndex());
optionsItem()->setSelectedSampleIndex(m_ui->sampleCombo->currentIndex());
optionsItem()->setSelectedDataIndex(m_ui->realDataCombo->currentIndex());
optionsItem()->setSelectedInstrumentIndex(m_instrumentCombo->currentIndex());
optionsItem()->setSelectedSampleIndex(m_sampleCombo->currentIndex());
optionsItem()->setSelectedDataIndex(m_realDataCombo->currentIndex());
optionsItem()->setRunImmediately(m_ui->runPolicyImmediatelyRadio->isChecked());
optionsItem()->setNumberOfThreads(m_ui->numberOfThreadsCombo->currentData().toInt());
if (m_ui->analyticalRadio->isChecked())
optionsItem()->setRunImmediately(m_runPolicyImmediatelyRadio->isChecked());
optionsItem()->setNumberOfThreads(m_numberOfThreadsCombo->currentData().toInt());
if (m_analyticalRadio->isChecked())
optionsItem()->setUseAnalytical();
else
optionsItem()->setUseMonteCarloIntegration(m_ui->numberOfMonteCarloPoints->value());
optionsItem()->setUseAverageMaterials(m_ui->averageLayerRadio->isChecked());
optionsItem()->setIncludeSpecularPeak(m_ui->includeSpecularCheck->isChecked());
optionsItem()->setUseMonteCarloIntegration(m_numberOfMonteCarloPoints->value());
optionsItem()->setUseAverageMaterials(m_averageLayerRadio->isChecked());
optionsItem()->setIncludeSpecularPeak(m_includeSpecularCheck->isChecked());
}
void SimulationView::updateEnabling()
{
m_ui->numberOfMonteCarloPoints->setEnabled(m_ui->monteCarloRadio->isChecked());
m_numberOfMonteCarloPoints->setEnabled(m_monteCarloRadio->isChecked());
}
void SimulationView::updateSelection(QComboBox* comboBox, QStringList itemList, int currentIndex,
......@@ -250,8 +323,8 @@ QString SimulationView::validateSimulationSetup(bool validateRealData) const
void SimulationView::updateFunctionalityNarrowing()
{
m_ui->instrumentCombo->setVisible(!m_document->singleInstrumentMode());
m_ui->instrumentLabel->setVisible(!m_document->singleInstrumentMode());
m_instrumentCombo->setVisible(!m_document->singleInstrumentMode());
m_instrumentLabel->setVisible(!m_document->singleInstrumentMode());
}
SimulationOptionsItem* SimulationView::optionsItem() const
......@@ -261,18 +334,17 @@ SimulationOptionsItem* SimulationView::optionsItem() const
const SampleItem* SimulationView::selectedSampleItem() const
{
return m_document->sampleModel()->sampleItems().value(m_ui->sampleCombo->currentIndex(),
nullptr);
return m_document->sampleModel()->sampleItems().value(m_sampleCombo->currentIndex(), nullptr);
}
const InstrumentItem* SimulationView::selectedInstrumentItem() const
{
return m_document->instrumentModel()->instrumentItems().value(
m_ui->instrumentCombo->currentIndex(), nullptr);
return m_document->instrumentModel()->instrumentItems().value(m_instrumentCombo->currentIndex(),
nullptr);
}
const RealItem* SimulationView::selectedRealItem() const
{
return m_document->realModel()->realItems().value(m_ui->realDataCombo->currentIndex() - 1,
return m_document->realModel()->realItems().value(m_realDataCombo->currentIndex() - 1,
nullptr); // -1: "None"
}
......@@ -15,19 +15,20 @@
#ifndef BORNAGAIN_GUI_VIEW_PROJECT_SIMULATIONVIEW_H
#define BORNAGAIN_GUI_VIEW_PROJECT_SIMULATIONVIEW_H
#include <QCheckBox>
#include <QComboBox>
#include <QGroupBox>
#include <QLabel>
#include <QPushButton>
#include <QRadioButton>
#include <QSpinBox>
class MainWindow;
class SampleItem;
class InstrumentItem;
class MainWindow;
class ProjectDocument;
class RealItem;
class SampleItem;
class SimulationOptionsItem;
class ProjectDocument;
namespace Ui {
class SimulationView;
}
//! Widget to define a simulation.
//! Contains:
......@@ -82,10 +83,29 @@ private:
//! Show/hide UI elements according to settings in current project
void updateFunctionalityNarrowing();
private:
Ui::SimulationView* m_ui;
ProjectDocument* m_document;
QLabel* m_instrumentLabel;
QComboBox* m_instrumentCombo;
QComboBox* m_sampleCombo;
QComboBox* m_realDataCombo;
QRadioButton* m_analyticalRadio;
QRadioButton* m_monteCarloRadio;
QSpinBox* m_numberOfMonteCarloPoints;
QRadioButton* m_ambientLayerRadio;
QRadioButton* m_averageLayerRadio;
QCheckBox* m_includeSpecularCheck;
QRadioButton* m_runPolicyImmediatelyRadio;
QRadioButton* m_runPolicyBackgroundRadio;
QComboBox* m_numberOfThreadsCombo;
QPushButton* m_simulateButton;
QPushButton* m_exportToPyScriptButton;
// Convenience method for easier access
SimulationOptionsItem* optionsItem() const;
};
......
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SimulationView</class>
<widget class="QWidget" name="SimulationView">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>866</width>
<height>835</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="mainLayout">
<property name="spacing">
<number>15</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetNoConstraint</enum>
</property>
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Data selection</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum>
</property>
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="labelAlignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="formAlignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="instrumentLabel">
<property name="text">
<string>Instrument:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="instrumentCombo">
<property name="toolTip">
<string>Select Instrument to simulate from those defined in Instrument View</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="sampleLabel">
<property name="text">
<string>Sample:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="sampleCombo">
<property name="toolTip">
<string>Select Sample to simulate from those defined in Sample View</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Real data:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="realDataCombo">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select real data to use during the fitting.&lt;/p&gt;&lt;p&gt;If None is selected, the standard simulation will be run.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Calculation parameters</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<property name="spacing">
<number>22</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>6</number>
</property>
<item>
<widget class="QRadioButton" name="analyticalRadio">
<property name="toolTip">
<string>Defines run policy for the simulation</string>
</property>
<property name="text">
<string>Analytical computation</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QRadioButton" name="monteCarloRadio">
<property name="toolTip">
<string>Defines run policy for the simulation</string>
</property>
<property name="text">
<string>Monte-Carlo Integration; number of points:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="numberOfMonteCarloPoints">
<property name="maximum">
<number>10000</number>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>6</number>
</property>
<item>
<widget class="QRadioButton" name="ambientLayerRadio">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Define if the material used for Fresnel calculations should be the ambient layer material or the average material of the layer and the particles it contains.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Ambient Layer Material for Fresnel calculations</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="averageLayerRadio">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Define if the material used for Fresnel calculations should be the ambient layer material or the average material of the layer and the particles it contains.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Average Layer Material for Fresnel calculations</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="includeSpecularCheck">
<property name="toolTip">
<string>Defines if the specular peak should be included in the simulation result</string>
</property>
<property name="text">
<string>Include specular peak</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Execution parameters</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>22</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>6</number>
</property>
<item>
<widget class="QRadioButton" name="runPolicyImmediatelyRadio">
<property name="toolTip">
<string>Defines run policy for the simulation</string>
</property>
<property name="text">
<string>Run immediately</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="autoExclusive">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="runPolicyBackgroundRadio">
<property name="toolTip">
<string>Defines run policy for the simulation</string>
</property>
<property name="text">
<string>Run in background</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Number of Threads:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="numberOfThreadsCombo">
<property name="toolTip">
<string>Defines number of threads to use for the simulation.</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="simulateButton">
<property name="minimumSize">
<size>
<width>100</width>
<height>50</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Run the simulation using settings above.&lt;/p&gt;&lt;p&gt;Global shortcut ctrl-r can be used to run from sample view.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Run simulation</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="exportToPyScriptButton">
<property name="minimumSize">
<size>
<width>100</width>
<height>50</height>
</size>
</property>
<property name="toolTip">
<string>Export the simulation using settings above to a python script.</string>
</property>
<property name="text">
<string>Export to Python Script</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>488</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment