BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
TestComponentView.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/PropertyEditor/TestComponentView.cpp
6 //! @brief Defines class TestComponentView
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
33 #include <QBoxLayout>
34 #include <QDebug>
35 #include <QItemSelectionModel>
36 #include <QPushButton>
37 #include <QSplitter>
38 #include <QTreeView>
39 #include <limits>
40 
42  : m_mainWindow(mainWindow)
43  , m_sampleModel(new SampleModel(this))
44  , m_materialModel(new MaterialModel(this))
45  , m_sourceTree(new QTreeView)
46  , m_componentTree(new ComponentEditor(ComponentEditor::FullTree))
47  , m_componentFlat(new ComponentEditor(ComponentEditor::PlainWidget))
48  , m_updateButton(new QPushButton("Update models"))
49  , m_addItemButton(new QPushButton("Add item"))
50  , m_expandButton(new QPushButton("Expand tree"))
51  , m_splitter(new QSplitter)
52  , m_delegate(new SessionModelDelegate(this))
53  , m_isExpaned(false)
54 {
55  auto buttonLayout = new QHBoxLayout;
56  buttonLayout->addWidget(m_updateButton);
57  buttonLayout->addWidget(m_addItemButton);
58  buttonLayout->addWidget(m_expandButton);
59 
60  m_sourceTree->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
61  m_sourceTree->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
62 
63  m_splitter->addWidget(m_sourceTree);
64  m_splitter->addWidget(componentTreePanel());
65  m_splitter->addWidget(componentBoxPanel());
66 
67  auto layout = new QVBoxLayout();
68  layout->setMargin(0);
69  layout->setSpacing(0);
70  layout->addLayout(buttonLayout);
71  layout->addWidget(m_splitter);
72 
73  setLayout(layout);
74 
75  init_source();
76 
77  connect(m_updateButton, &QPushButton::clicked, this, &TestComponentView::onUpdateRequest);
78  connect(m_addItemButton, &QPushButton::clicked, this, &TestComponentView::onAddItemRequest);
79  connect(m_expandButton, &QPushButton::clicked, this, &TestComponentView::onExpandRequest);
80 
81  m_sourceTree->setModel(m_sampleModel);
82  m_sourceTree->setItemDelegate(m_delegate);
84  connect(m_sourceTree->selectionModel(), &QItemSelectionModel::selectionChanged, this,
86 }
87 
89 {
90  // m_componentTree->setModel(m_sourceModel);
91 }
92 
94 {
96 }
97 
99 {
100  if (!m_isExpaned) {
101  m_sourceTree->expandAll();
102  m_sourceTree->resizeColumnToContents(0);
103  m_sourceTree->resizeColumnToContents(1);
104  // m_componentTree->treeView()->expandAll();
105  // m_componentTree->treeView()->resizeColumnToContents(0);
106  // m_componentTree->treeView()->resizeColumnToContents(1);
107  } else {
108  m_sourceTree->collapseAll();
109  // m_componentTree->treeView()->collapseAll();
110  }
111 
112  // const auto imax = std::numeric_limits<int>::max();
113  const int imax = 1;
114  QList<int> sizes = {imax, imax, imax};
115  m_splitter->setSizes(sizes);
116 
118 }
119 
120 //! Inserts test items into source model.
121 
123 {
124  SampleBuilderFactory factory;
125  const std::unique_ptr<MultiLayer> sample(
126  factory.createSampleByName("CylindersWithSizeDistributionBuilder"));
131 }
132 
133 void TestComponentView::onSelectionChanged(const QItemSelection& selected, const QItemSelection&)
134 {
135  QModelIndexList indices = selected.indexes();
136 
137  if (!indices.empty()) {
138  // QModelIndex selectedIndex = indices.front();
139  // m_componentTree->setRootIndex(selectedIndex);
140  // m_componentTree->treeView()->expandAll();
141 
142  auto item = m_sampleModel->itemForIndex(indices.front());
143  m_componentTree->setItem(item);
144  m_componentFlat->setItem(item);
145  }
146 }
147 
149 {
150  auto* result = new QSplitter(Qt::Vertical);
151  result->addWidget(m_componentTree);
152 
153  m_componentTree->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
154  return result;
155 }
156 
158 {
159  auto* result = new QSplitter(Qt::Vertical);
160  result->addWidget(m_componentFlat);
161 
162  m_componentFlat->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
163 
164  return result;
165 }
Defines BeamItem hierarchy.
Defines ComponentEditor class.
Defines class ComponentFlatView.
Defines class ComponentTreeView.
Defines GUIObjectBuilder namespace.
Defines class MainWindow.
Defines class IntensityDataItem.
Defines MaterialDataItems classes.
Defines class MaterialItemUtils.
Defines class MaterialModel.
Defines class MultiLayer.
Defines class ParticleItem.
Defines class SampleBuilderFactory.
Defines class SampleModel.
Defines class SessionModelDelegate.
DefinesStyleUtils namespace.
Defines class TestComponentView.
Defines class VectorItem.
Component editor for SessionItem.
void setItem(SessionItem *item)
Factory to create standard pre-defined samples.
MultiLayer * createSampleByName(const std::string &name)
Retrieves a SampleBuilder from the registry, does the build, and returns the result.
Main model to hold sample items.
Definition: SampleModel.h:24
The SessionModelDelegate class presents the content of SessionModel items in standard QTreeView.
SessionItem * itemForIndex(const QModelIndex &index) const
T * insertItem(SessionItem *parent=nullptr, int row=-1, QString tag="")
Definition: SessionModel.h:125
void init_source()
Inserts test items into source model.
ComponentEditor * m_componentTree
QWidget * componentBoxPanel()
QPushButton * m_updateButton
void onSelectionChanged(const QItemSelection &selected, const QItemSelection &)
QTreeView * m_sourceTree
QWidget * componentTreePanel()
SessionModelDelegate * m_delegate
TestComponentView(MainWindow *mainWindow=nullptr)
QSplitter * m_splitter
QPushButton * m_expandButton
MaterialModel * m_materialModel
ComponentEditor * m_componentFlat
SampleModel * m_sampleModel
QPushButton * m_addItemButton
SessionItem * populateSampleModel(SampleModel *sampleModel, MaterialModel *materialModel, const MultiLayer &sample, const QString &sample_name="")
void setPropertyStyle(QTreeView *tree)
Sets style for the tree to use in property editors.
Definition: StyleUtils.cpp:36