BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
IShape2DView.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/MaskWidgets/IShape2DView.cpp
6 //! @brief Implements interface IShape2DView.
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 
18 #include <QAction>
19 #include <QGraphicsSceneContextMenuEvent>
20 #include <QMenu>
21 #include <QPainter>
22 
24  : m_item(nullptr), m_adaptor(nullptr), m_block_on_property_change(false)
25 {
26  connect(this, &IShape2DView::xChanged, this, &IShape2DView::onChangedX);
27  connect(this, &IShape2DView::yChanged, this, &IShape2DView::onChangedY);
28 }
29 
31 {
32  if (m_item)
33  m_item->mapper()->unsubscribe(this);
34 }
35 
37 {
38  return m_bounding_rect;
39 }
40 
42 {
43  if (m_item == item) {
44  return;
45 
46  } else {
47  if (m_item)
48  m_item->mapper()->unsubscribe(this);
49 
50  m_item = item;
51  if (!m_item)
52  return;
53 
55  [this](const QString& name) { onItemPropertyChange(name); }, this);
56 
57  m_item->mapper()->setOnItemDestroy([this](SessionItem*) { m_item = 0; }, this);
58  }
59 }
60 
62 {
63  return m_item;
64 }
65 
67 {
68  ASSERT(adaptor);
69 
70  if (m_adaptor != adaptor) {
71  if (m_adaptor)
73 
74  m_adaptor = adaptor;
76  Qt::UniqueConnection);
77  update_view();
78  }
79 }
80 
81 double IShape2DView::par(const QString& property_name) const
82 {
83  return m_item->getItemValue(property_name).toReal();
84 }
85 
86 qreal IShape2DView::toSceneX(const QString& property_name) const
87 {
88  return toSceneX(m_item->getItemValue(property_name).toReal());
89 }
90 
91 qreal IShape2DView::toSceneX(qreal value) const
92 {
93  return m_adaptor ? m_adaptor->toSceneX(value) : value;
94 }
95 
96 qreal IShape2DView::toSceneY(const QString& property_name) const
97 {
98  return toSceneY(m_item->getItemValue(property_name).toReal());
99 }
100 
101 qreal IShape2DView::toSceneY(qreal value) const
102 {
103  return m_adaptor ? m_adaptor->toSceneY(value) : value;
104 }
105 
106 qreal IShape2DView::fromSceneX(qreal value) const
107 {
108  return m_adaptor ? m_adaptor->fromSceneX(value) : value;
109 }
110 
111 qreal IShape2DView::fromSceneY(qreal value) const
112 {
113  return m_adaptor ? m_adaptor->fromSceneY(value) : value;
114 }
115 
116 void IShape2DView::addView(IShape2DView* childView, int /* row */)
117 {
118  if (!childItems().contains(childView))
119  childView->setParentItem(this);
120 }
121 
123 {
125 }
126 
128 {
130 }
131 
132 void IShape2DView::onItemPropertyChange(const QString& propertyName)
133 {
135  return;
136 
138 
139  bool schedule_update = false;
140  if (propertyName == MaskItem::P_MASK_VALUE) {
141  schedule_update = true;
142  } else if (propertyName == MaskItem::P_IS_VISIBLE) {
143  this->setVisible(parameterizedItem()->getItemValue(MaskItem::P_IS_VISIBLE).toBool());
144  schedule_update = true;
145  }
146 
147  onPropertyChange(propertyName);
148 
149  if (schedule_update)
150  update();
151 
153 }
#define ASSERT(condition)
Definition: Assert.h:31
Defines interface class ISceneAdaptor.
Defines interface IShape2DView.
Defines MaskItems classes.
Interface to adapt MaskItems coordinates (expressed in units of IntensityDataItem) to/from scene coor...
Definition: ISceneAdaptor.h:24
virtual qreal fromSceneX(qreal) const =0
convert scene x-coordinate to native mask coordinate
virtual qreal toSceneY(qreal) const =0
convert native mask y-coordinate to scene coordinate
virtual qreal fromSceneY(qreal) const =0
convert scene y-coordinate to native mask coordinate
void update_request()
virtual qreal toSceneX(qreal) const =0
convert native mask x-coordinate to scene coordinate
Main interface class for views representing MaskItems, Projections on graphics scene.
Definition: IShape2DView.h:27
qreal toSceneX(const QString &property_name) const
virtual void addView(IShape2DView *childView, int row=0)
qreal toSceneY(const QString &property_name) const
SessionItem * m_item
Definition: IShape2DView.h:65
virtual void onChangedX()
Definition: IShape2DView.h:48
virtual void update_view()=0
update visual appearance of view (triggered by ISceneAdaptor)
const ISceneAdaptor * m_adaptor
Definition: IShape2DView.h:66
QRectF boundingRect() const
virtual void onPropertyChange(const QString &)
Definition: IShape2DView.h:50
qreal fromSceneY(qreal value) const
void setBlockOnProperty(bool value)
bool blockOnProperty() const
void onItemPropertyChange(const QString &propertyName)
qreal fromSceneX(qreal value) const
convert scene coordinates to ColorMap plot coordinates
double par(const QString &property_name) const
void setSceneAdaptor(const ISceneAdaptor *adaptor)
virtual void onChangedY()
Definition: IShape2DView.h:49
bool m_block_on_property_change
Definition: IShape2DView.h:68
QRectF m_bounding_rect
Definition: IShape2DView.h:67
virtual void setParameterizedItem(SessionItem *item)
virtual SessionItem * parameterizedItem()
virtual ~IShape2DView()
static const QString P_IS_VISIBLE
Definition: MaskItems.h:34
static const QString P_MASK_VALUE
Definition: MaskItems.h:33
void unsubscribe(const void *caller)
Cancells all subscribtion of given caller.
Definition: ModelMapper.cpp:98
void setOnItemDestroy(std::function< void(SessionItem *)> f, const void *caller=0)
Definition: ModelMapper.cpp:87
void setOnPropertyChange(std::function< void(QString)> f, const void *caller=0)
Definition: ModelMapper.cpp:35
QVariant getItemValue(const QString &tag) const
Directly access value of item under given tag.
ModelMapper * mapper()
Returns the current model mapper of this item. Creates new one if necessary.
QString const & name(EShape k)
Definition: particles.cpp:21