BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
IntensityDataCanvas.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/IntensityDataWidgets/IntensityDataCanvas.cpp
6 //! @brief Implements class IntensityDataCanvas
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 
24 #include <QAction>
25 #include <QMouseEvent>
26 #include <QSettings>
27 #include <QVBoxLayout>
28 
29 namespace {
30 
31 QString group_name()
32 {
33  return "IntensityDataCanvas/";
34 }
35 QString gradient_setting_name()
36 {
37  return group_name() + IntensityDataItem::P_GRADIENT;
38 }
39 QString interpolation_setting_name()
40 {
41  return group_name() + IntensityDataItem::P_IS_INTERPOLATED;
42 }
43 } // namespace
44 
46  : SessionItemWidget(parent)
47  , m_colorMap(new ColorMapCanvas)
48  , m_resetViewAction(nullptr)
49  , m_savePlotAction(nullptr)
50 {
51  setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
52 
53  auto layout = new QVBoxLayout;
54  layout->setMargin(0);
55  layout->setSpacing(0);
56  layout->addWidget(m_colorMap);
57  setLayout(layout);
58 
60 
61  initActions();
62 
63  connect(m_colorMap->customPlot(), &QCustomPlot::mousePress, this,
64  &IntensityDataCanvas::onMousePress, Qt::UniqueConnection);
65 }
66 
68 {
69  SessionItemWidget::setItem(intensityItem);
71 
73 }
74 
76 {
77  return QSize(500, 400);
78 }
79 
81 {
82  return QSize(128, 128);
83 }
84 
86 {
87  return QList<QAction*>() << m_resetViewAction << m_savePlotAction;
88 }
89 
91 {
93 }
94 
96 {
97  QString dirname = AppSvc::projectManager()->userExportDir();
98  SavePlotAssistant saveAssistant;
99  saveAssistant.savePlot(dirname, m_colorMap->customPlot(), intensityDataItem()->getOutputData());
100 }
101 
102 void IntensityDataCanvas::onMousePress(QMouseEvent* event)
103 {
104  if (event->button() == Qt::RightButton)
105  emit customContextMenuRequested(event->globalPos());
106 }
107 
109 {
111  [this](const QString& name) { onPropertyChanged(name); }, this);
112 }
113 
115 {
116  IntensityDataItem* result = dynamic_cast<IntensityDataItem*>(currentItem());
117  ASSERT(result);
118  return result;
119 }
120 
122 {
123  m_resetViewAction = new QAction(this);
124  m_resetViewAction->setText("Center view");
125  m_resetViewAction->setIcon(QIcon(":/images/camera-metering-center.svg"));
126  m_resetViewAction->setToolTip("Reset view\n"
127  "x,y,z axes range will be set to default");
128  connect(m_resetViewAction, &QAction::triggered, this, &IntensityDataCanvas::onResetViewAction);
129 
130  m_savePlotAction = new QAction(this);
131  m_savePlotAction->setText("Save");
132  m_savePlotAction->setIcon(QIcon(":/images/content-save-outline.svg"));
133  m_savePlotAction->setToolTip("Save plot");
134  connect(m_savePlotAction, &QAction::triggered, this, &IntensityDataCanvas::onSavePlotAction);
135 }
136 
137 //! Reads gradient/ interpolation settings from IntensityDataItem and writes to persistant
138 //! project settings.
139 
141 {
143  QSettings settings;
144  settings.setValue(gradient_setting_name(), intensityDataItem()->getGradient());
146  QSettings settings;
147  settings.setValue(interpolation_setting_name(), intensityDataItem()->isInterpolated());
148  }
149 }
150 
151 //! Apply persistent settings (gradient, interpolation) to IntensityDataItem.
152 
154 {
155  QSettings settings;
156 
157  if (settings.contains(gradient_setting_name())) {
158  ComboProperty combo =
160  QString persistentGradient = settings.value(gradient_setting_name()).toString();
161  if (combo.getValue() != persistentGradient) {
162  combo.setValue(settings.value(gradient_setting_name()).toString());
164  }
165  }
166 
167  if (settings.contains(interpolation_setting_name())) {
168  bool value = settings.value(interpolation_setting_name()).toBool();
170  }
171 }
Defines class AppSvc.
#define ASSERT(condition)
Definition: Assert.h:31
Defines class ColorMapCanvas.
Defines class ColorMap.
Defines class ComboProperty.
Defines class ProjectManager.
Defines class IntensityDataCanvas.
Defines class IntensityDataFFTPresenter.
Defines class IntensityDataItem.
Defines class SavePlotAssistant.
static ProjectManager * projectManager()
Definition: AppSvc.cpp:18
The ColorMapCanvas class contains ColorMap for intensity data presentation, and provide control of fo...
void setStatusLabelEnabled(bool flag)
void setItem(SessionItem *intensityDataItem)
QCustomPlot * customPlot()
Custom property to define list of string values with multiple selections.
Definition: ComboProperty.h:25
QVariant variant() const
Constructs variant enclosing given ComboProperty.
void setValue(const QString &name)
QString getValue() const
IntensityDataCanvas(QWidget *parent=0)
void setItem(SessionItem *intensityItem)
QList< QAction * > actionList()
void onMousePress(QMouseEvent *event)
void onPropertyChanged(const QString &name)
Reads gradient/ interpolation settings from IntensityDataItem and writes to persistant project settin...
void applyPersistentSettings()
Apply persistent settings (gradient, interpolation) to IntensityDataItem.
IntensityDataItem * intensityDataItem()
ColorMapCanvas * m_colorMap
static const QString P_GRADIENT
void resetView()
Set axes viewport to original data.
static const QString P_IS_INTERPOLATED
void setOnPropertyChange(std::function< void(QString)> f, const void *caller=0)
Definition: ModelMapper.cpp:35
QString userExportDir() const
Returns directory name suitable for saving plots.
Assistant class which contains all logic for saving IntensityData to various formats from IntensityDa...
void savePlot(const QString &dirname, QCustomPlot *plot, OutputData< double > *output_data)
The SessionItemWidget class is a base for all widgets representing the content of SessionItem.
SessionItem * currentItem()
virtual void setItem(SessionItem *item)
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.
void setItemValue(const QString &tag, const QVariant &variant)
Directly set value of item under given tag.
QCPColorGradient getGradient(const QString &gradientName)
std::string toString(PyObject *obj)
Converts PyObject into string, if possible, or throws exception.
Definition: PyUtils.cpp:24
QString const & name(EShape k)
Definition: particles.cpp:21