diff --git a/GUI/Model/Data/DataProperties.cpp b/GUI/Model/Data/DataProperties.cpp index c8025c563c10db467b11171f904f7db181daa2e9..593c3608fe921dadbf47e163945e0771e85d56ec 100644 --- a/GUI/Model/Data/DataProperties.cpp +++ b/GUI/Model/Data/DataProperties.cpp @@ -31,6 +31,26 @@ const std::vector<std::pair<QString, Qt::GlobalColor>> color_queue = { {"Red", Qt::GlobalColor::darkRed}, {"Cyan", Qt::GlobalColor::darkCyan}, {"Gray", Qt::GlobalColor::darkGray}, {"Magenta", Qt::GlobalColor::darkMagenta}}; +// scatters for representation of 1D graphs +const QMap<QString, QCPScatterStyle::ScatterShape> scatter_map = { + {"None", QCPScatterStyle::ScatterShape::ssNone}, + {"Disc", QCPScatterStyle::ScatterShape::ssDisc}, + {"Circle", QCPScatterStyle::ScatterShape::ssCircle}, + {"Cross", QCPScatterStyle::ScatterShape::ssCross}, + {"Diamond", QCPScatterStyle::ScatterShape::ssDiamond}, + {"Star", QCPScatterStyle::ScatterShape::ssStar} +}; + +// connection lines for representation of 1D graphs +const QMap<QString, QCPGraph::LineStyle> line_map = { + {"None", QCPGraph::LineStyle::lsNone}, + {"Line", QCPGraph::LineStyle::lsLine}, + {"StepLeft", QCPGraph::LineStyle::lsStepLeft}, + {"StepRight", QCPGraph::LineStyle::lsStepRight}, + {"StepCenter", QCPGraph::LineStyle::lsStepCenter}, + {"Impulse", QCPGraph::LineStyle::lsImpulse} +}; + struct ColorNameComparator { ColorNameComparator(QString value_to_comp) : m_value_to_comp(std::move(value_to_comp)) @@ -53,6 +73,24 @@ ComboProperty defaultColorCombo() return result; } +ComboProperty defaultScatterCombo() +{ + ComboProperty result; + for (const auto& scatter : scatter_map.keys()) + result << scatter; + result.setValue(scatter_map.keys().first()); + return result; +} + +ComboProperty defaultLineCombo() +{ + ComboProperty result; + for (const auto& line : line_map.keys()) + result << line; + result.setValue(line_map.keys().first()); + return result; +} + // TODO cover with unit tests and simplify QModelIndex getIndexFromPath(const SessionModel* model, const QString& path) @@ -102,6 +140,8 @@ Data1DProperties::Data1DProperties() : DataProperties(M_TYPE) { addProperty(P_COLOR, defaultColorCombo().variant()); + addProperty(P_SCATTER, defaultScatterCombo().variant()); + addProperty(P_LINE, defaultLineCombo().variant()); } QColor Data1DProperties::color() @@ -136,3 +176,33 @@ void Data1DProperties::setColorProperty(const QString& color_name) color_combo.setValue(color_name); setItemValue(P_COLOR, color_combo.variant()); } + +QCPScatterStyle::ScatterShape Data1DProperties::scatter() +{ + const QString& scatter_name = getItemValue(P_SCATTER).value<ComboProperty>().getValue(); + bool contains = scatter_map.contains(scatter_name); + ASSERT(contains); + return QCPScatterStyle::ScatterShape(scatter_map.value(scatter_name)); +} + +QCPGraph::LineStyle Data1DProperties::line() +{ + const QString& line_name = getItemValue(P_LINE).value<ComboProperty>().getValue(); + bool contains = line_map.contains(line_name); + ASSERT(contains); + return QCPGraph::LineStyle(line_map.value(line_name)); +} + +void Data1DProperties::setScatterProperty(const QString& scatter_name) +{ + auto scatter_combo = defaultScatterCombo(); + scatter_combo.setValue(scatter_name); + setItemValue(P_SCATTER, scatter_combo.variant()); +} + +void Data1DProperties::setLineProperty(const QString& line_name) +{ + auto line_combo = defaultLineCombo(); + line_combo.setValue(line_name); + setItemValue(P_LINE, line_combo.variant()); +} diff --git a/GUI/Model/Data/DataProperties.h b/GUI/Model/Data/DataProperties.h index d71aab4b542b49c3a44f2946db95a0a71ff9068a..9818b55d05c9db2efcffbde866a393b4063bf806 100644 --- a/GUI/Model/Data/DataProperties.h +++ b/GUI/Model/Data/DataProperties.h @@ -16,6 +16,7 @@ #define BORNAGAIN_GUI_MODEL_DATA_DATAPROPERTIES_H #include "GUI/Model/BaseItem/SessionItem.h" +#include "3rdparty/GUI/qcustomplot/qcustomplot.h" class DataItem; @@ -38,13 +39,15 @@ protected: class Data1DProperties : public DataProperties { private: static constexpr auto P_COLOR{"Color"}; + static constexpr auto P_SCATTER{"Scatter"}; + static constexpr auto P_LINE{"Line"}; public: static constexpr auto M_TYPE{"DataItem1DProperties"}; Data1DProperties(); - //! Creates and returns a color object from color name in Data1DPresentationProperties + //! Creates and returns a color object from color name QColor color(); //! Returns the name of the color @@ -53,6 +56,18 @@ public: //! Returns set up color ComboProperty. void setColorProperty(const QString& color_name); + //! Returns a QCP scatter object from its name + QCPScatterStyle::ScatterShape scatter(); + + //! Returns a QCP line object from its name + QCPGraph::LineStyle line(); + + //! Set up scatter for qcustomplot. + void setScatterProperty(const QString& scatter_name); + + //! Set up line for qcustomplot. + void setLineProperty(const QString& line_name); + //! Returns the name of the color, which follows the color of passes property //! container. If the container is nullptr or has the last-in-queue color, //! Returns default color. diff --git a/GUI/Model/Data/DataPropertyContainer.cpp b/GUI/Model/Data/DataPropertyContainer.cpp index 0384fdbe6581fee2a66810fe5ac9188bd1ad3615..ccf9b5784a82a91e8b0f6961187f1b0c3e0229f0 100644 --- a/GUI/Model/Data/DataPropertyContainer.cpp +++ b/GUI/Model/Data/DataPropertyContainer.cpp @@ -14,6 +14,7 @@ #include "GUI/Model/Data/DataPropertyContainer.h" #include "GUI/Model/Data/DataItem.h" +#include "GUI/Model/Data/RealDataItem.h" #include "GUI/Model/Data/DataProperties.h" #include "GUI/Util/Error.h" @@ -56,7 +57,6 @@ void DataPropertyContainer::addItem(DataItem* data_item) if (this->model() != data_item->model()) throw Error("Error in DataPropertyContainer::addItem: hosting models are different"); - auto property_items = propertyItems(); Data1DProperties* previous_item = nullptr; if (!propertyItems().empty()) previous_item = dynamic_cast<Data1DProperties*>(propertyItems().back()); @@ -65,6 +65,14 @@ void DataPropertyContainer::addItem(DataItem* data_item) insertChild(-1, property_item); property_item->setDataItem(data_item); property_item->setColorProperty(Data1DProperties::nextColorName(previous_item)); + + if(dynamic_cast<RealDataItem*>(data_item->parent())) { + property_item->setScatterProperty("Disc"); + property_item->setLineProperty("None"); + } else { + property_item->setScatterProperty("None"); + property_item->setLineProperty("Line"); + } } std::vector<DataItem*> DataPropertyContainer::dataItems() diff --git a/GUI/View/PlotComparison/Plot1D.cpp b/GUI/View/PlotComparison/Plot1D.cpp index 0366e7edb1fa9869d6589f8191587be2e30ba1c0..bf8fe5f7855bd93c74436834ed8ccb9dc8d89678 100644 --- a/GUI/View/PlotComparison/Plot1D.cpp +++ b/GUI/View/PlotComparison/Plot1D.cpp @@ -148,10 +148,12 @@ void Plot1D::unsubscribeFromItem() void Plot1D::initPlots() { auto property_items = viewItem()->propertyContainerItem()->propertyItems(); + std::for_each(property_items.begin(), property_items.end(), [this](Data1DProperties* item) { auto* graph = m_custom_plot->addGraph(); - graph->setLineStyle(QCPGraph::lsLine); + graph->setLineStyle(item->line()); graph->setPen(QPen(item->color())); + graph->setScatterStyle(item->scatter()); m_graph_map[item] = graph; }); } diff --git a/GUI/View/PlotSpecular/SpecularDataCanvas.cpp b/GUI/View/PlotSpecular/SpecularDataCanvas.cpp index 74ecf1b75e0b04d56153e15b46c04e3ca8e6f94b..891bf9c42a6b6f7fe695d654d65b529195acad44 100644 --- a/GUI/View/PlotSpecular/SpecularDataCanvas.cpp +++ b/GUI/View/PlotSpecular/SpecularDataCanvas.cpp @@ -77,6 +77,11 @@ void SpecularDataCanvas::enableDeprecatedOnMousePress(bool b) &SpecularDataCanvas::onMousePress); } +void SpecularDataCanvas::initScatter() +{ + m_plot_canvas->initScatter(); +} + void SpecularDataCanvas::onResetViewAction() { specularDataItem()->resetView(); diff --git a/GUI/View/PlotSpecular/SpecularDataCanvas.h b/GUI/View/PlotSpecular/SpecularDataCanvas.h index fab47accd51ed7bc4ffad42c61013e4a705d4757..7004a1f4282c368a18f9e2eef19331ff968c566d 100644 --- a/GUI/View/PlotSpecular/SpecularDataCanvas.h +++ b/GUI/View/PlotSpecular/SpecularDataCanvas.h @@ -43,6 +43,7 @@ public: //! context menu for axis configuration) void enableDeprecatedOnMousePress(bool b); + void initScatter(); public slots: void onResetViewAction(); void onSavePlotAction(); diff --git a/GUI/View/PlotSpecular/SpecularDataWidget.cpp b/GUI/View/PlotSpecular/SpecularDataWidget.cpp index 793bfedec0b2c97cd0bf9ccf8864b749921ae736..1e13794c2a055ed9ef5597c1e21e9a6655c1c1eb 100644 --- a/GUI/View/PlotSpecular/SpecularDataWidget.cpp +++ b/GUI/View/PlotSpecular/SpecularDataWidget.cpp @@ -49,6 +49,8 @@ void SpecularDataWidget::setItem(SessionItem* jobItem) SessionItemWidget::setItem(jobItem); m_intensity_canvas->setItem(specularDataItem()); m_propertyWidget->setItem(specularDataItem()); + + m_intensity_canvas->initScatter(); } QList<QAction*> SpecularDataWidget::actionList() diff --git a/GUI/View/PlotSpecular/SpecularPlot.cpp b/GUI/View/PlotSpecular/SpecularPlot.cpp index 0e2a1c26334a07a90d8f3c366dd34a8e16a8b5f0..a62059fc0516202e0057c93603539d16fb51e448 100644 --- a/GUI/View/PlotSpecular/SpecularPlot.cpp +++ b/GUI/View/PlotSpecular/SpecularPlot.cpp @@ -12,9 +12,10 @@ // // ************************************************************************************************ -#include "GUI/View/PlotSpecular/SpecularPlot.h" #include "GUI/Model/Data/SpecularDataItem.h" #include "GUI/Model/Device/AxesItems.h" +#include "GUI/Model/Data/RealDataItem.h" +#include "GUI/View/PlotSpecular/SpecularPlot.h" #include "GUI/View/PlotUtil/PlotConstants.h" #include "GUI/View/PlotUtil/PlotEventInfo.h" #include "GUI/View/PlotUtil/RangeUtils.h" @@ -141,7 +142,17 @@ void SpecularPlot::initPlot() m_custom_plot->xAxis->setTickLabelFont( QFont(QFont().family(), GUI::Constants::plot_tick_label_size())); m_custom_plot->yAxis->setTickLabelFont( - QFont(QFont().family(), GUI::Constants::plot_tick_label_size())); + QFont(QFont().family(), GUI::Constants::plot_tick_label_size())); +} + +void SpecularPlot::initScatter() +{ + if(dynamic_cast<RealDataItem*>(specularItem()->parent())) { + m_custom_plot->graph()->setScatterStyle(QCPScatterStyle::ssDisc); + } else { + m_custom_plot->graph()->setScatterStyle(QCPScatterStyle::ssNone); + } + m_custom_plot->replot(); } void SpecularPlot::setConnected(bool isConnected) diff --git a/GUI/View/PlotSpecular/SpecularPlot.h b/GUI/View/PlotSpecular/SpecularPlot.h index 1599bc652f97d1e3e3cdfe133f0d91cee45cc67d..2b46e0113598640305aeb3959f0d107a1fb905bb 100644 --- a/GUI/View/PlotSpecular/SpecularPlot.h +++ b/GUI/View/PlotSpecular/SpecularPlot.h @@ -50,6 +50,9 @@ public: //! reset all axes min,max to initial value void resetView(); + //! Adds scatter ro real data plot + void initScatter(); + private slots: //! updates plot depending on IntensityDataItem properties void onPropertyChanged(const QString& property_name); diff --git a/GUI/View/PlotSpecular/SpecularPlotCanvas.cpp b/GUI/View/PlotSpecular/SpecularPlotCanvas.cpp index 3f2a23843e9899adbe86522ae0df8607b17b5a33..2f13e7c1ea151469d06879056b0e64bddd38c35f 100644 --- a/GUI/View/PlotSpecular/SpecularPlotCanvas.cpp +++ b/GUI/View/PlotSpecular/SpecularPlotCanvas.cpp @@ -54,6 +54,11 @@ QCustomPlot* SpecularPlotCanvas::customPlot() return m_plot->customPlot(); } +void SpecularPlotCanvas::initScatter() +{ + m_plot->initScatter(); +} + void SpecularPlotCanvas::setStatusLabelEnabled(bool flag) { m_statusLabel->setLabelEnabled(flag); diff --git a/GUI/View/PlotSpecular/SpecularPlotCanvas.h b/GUI/View/PlotSpecular/SpecularPlotCanvas.h index fed4fe4d7b827ab09bfe8a28d7334606afd6b90b..cf3c4d7ce862dcbda5020b4d50b4e44541942f8c 100644 --- a/GUI/View/PlotSpecular/SpecularPlotCanvas.h +++ b/GUI/View/PlotSpecular/SpecularPlotCanvas.h @@ -35,6 +35,7 @@ public: SpecularPlot* specularPlot(); QCustomPlot* customPlot(); + void initScatter(); void setStatusLabelEnabled(bool flag);