File indexing completed on 2025-10-26 03:35:57

0001 /*
0002     File                 : ImageWidget.cpp
0003     Project              : LabPlot
0004     Description          : widget for datapicker properties
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2015 Ankit Wagadre <wagadre.ankit@gmail.com>
0007     SPDX-FileCopyrightText: 2015-2019 Alexander Semke <alexander.semke@web.de>
0008 
0009     SPDX-License-Identifier: GPL-2.0-or-later
0010 */
0011 
0012 #include "DatapickerCurveWidget.h"
0013 #include "backend/datapicker/DatapickerPoint.h"
0014 #include "backend/worksheet/Worksheet.h"
0015 #include "kdefrontend/GuiTools.h"
0016 #include "kdefrontend/widgets/SymbolWidget.h"
0017 
0018 #include <KLocalizedString>
0019 
0020 #include <QPainter>
0021 
0022 #include <cmath>
0023 
0024 DatapickerCurveWidget::DatapickerCurveWidget(QWidget* parent)
0025     : BaseDock(parent) {
0026     ui.setupUi(this);
0027     setBaseWidgets(ui.leName, ui.teComment);
0028 
0029     ui.cbXErrorType->addItem(i18n("No Error"));
0030     ui.cbXErrorType->addItem(i18n("Symmetric"));
0031     ui.cbXErrorType->addItem(i18n("Asymmetric"));
0032 
0033     ui.cbYErrorType->addItem(i18n("No Error"));
0034     ui.cbYErrorType->addItem(i18n("Symmetric"));
0035     ui.cbYErrorType->addItem(i18n("Asymmetric"));
0036 
0037     QString info = i18n(
0038         "Specify whether the data points have errors and of which type.\n"
0039         "Note, changing this type is not possible once at least one point was read.");
0040     ui.lXErrorType->setToolTip(info);
0041     ui.cbXErrorType->setToolTip(info);
0042     ui.lYErrorType->setToolTip(info);
0043     ui.cbYErrorType->setToolTip(info);
0044 
0045     //"Symbol"-tab
0046     auto* hboxLayout = new QHBoxLayout(ui.tabSymbol);
0047     symbolWidget = new SymbolWidget(ui.tabSymbol);
0048     hboxLayout->addWidget(symbolWidget);
0049     hboxLayout->setContentsMargins(2, 2, 2, 2);
0050     hboxLayout->setSpacing(2);
0051 
0052     GuiTools::updateBrushStyles(ui.cbErrorBarFillingStyle, Qt::black);
0053     DatapickerCurveWidget::updateLocale();
0054 
0055     // General
0056     connect(ui.cbXErrorType, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &DatapickerCurveWidget::xErrorTypeChanged);
0057     connect(ui.cbYErrorType, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &DatapickerCurveWidget::yErrorTypeChanged);
0058     connect(ui.chkVisible, &QCheckBox::clicked, this, &DatapickerCurveWidget::visibilityChanged);
0059 
0060     // error bar
0061     connect(ui.cbErrorBarFillingStyle, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &DatapickerCurveWidget::errorBarFillingStyleChanged);
0062     connect(ui.kcbErrorBarFillingColor, &KColorButton::changed, this, &DatapickerCurveWidget::errorBarFillingColorChanged);
0063     connect(ui.sbErrorBarSize, QOverload<double>::of(&NumberSpinBox::valueChanged), this, &DatapickerCurveWidget::errorBarSizeChanged);
0064 
0065     hideErrorBarWidgets(true);
0066 }
0067 
0068 DatapickerCurveWidget::~DatapickerCurveWidget() = default;
0069 
0070 void DatapickerCurveWidget::setCurves(QList<DatapickerCurve*> list) {
0071     if (list.isEmpty())
0072         return;
0073 
0074     m_curveList = list;
0075     m_curve = list.first();
0076     setAspects(list);
0077 
0078     load();
0079     updateSymbolWidgets();
0080 
0081     QList<Symbol*> symbols;
0082     for (auto* curve : m_curveList)
0083         symbols << curve->symbol();
0084 
0085     symbolWidget->setSymbols(symbols);
0086 
0087     connect(m_curve, &AbstractAspect::aspectDescriptionChanged, this, &DatapickerCurveWidget::aspectDescriptionChanged);
0088     connect(m_curve, &AbstractAspect::childAspectRemoved, this, &DatapickerCurveWidget::updateSymbolWidgets);
0089     connect(m_curve, &AbstractAspect::childAspectAdded, this, &DatapickerCurveWidget::updateSymbolWidgets);
0090     connect(m_curve, &DatapickerCurve::curveErrorTypesChanged, this, &DatapickerCurveWidget::curveErrorsChanged);
0091     connect(m_curve, &DatapickerCurve::pointVisibilityChanged, this, &DatapickerCurveWidget::symbolVisibleChanged);
0092     connect(m_curve, &DatapickerCurve::pointErrorBarBrushChanged, this, &DatapickerCurveWidget::symbolErrorBarBrushChanged);
0093     connect(m_curve, &DatapickerCurve::pointErrorBarSizeChanged, this, &DatapickerCurveWidget::symbolErrorBarSizeChanged);
0094 }
0095 
0096 void DatapickerCurveWidget::hideErrorBarWidgets(bool on) {
0097     ui.cbErrorBarFillingStyle->setEnabled(!on);
0098     ui.kcbErrorBarFillingColor->setEnabled(!on);
0099     ui.lErrorBarFillingColor->setEnabled(!on);
0100     ui.lErrorBarFillingStyle->setEnabled(!on);
0101     ui.sbErrorBarSize->setEnabled(!on);
0102     ui.lErrorBarSize->setEnabled(!on);
0103 }
0104 
0105 void DatapickerCurveWidget::updateLocale() {
0106     ui.sbErrorBarSize->setLocale(QLocale());
0107 }
0108 
0109 //*************************************************************
0110 //**** SLOTs for changes triggered in DatapickerCurveWidget ***
0111 //*************************************************************
0112 //"General"-tab
0113 void DatapickerCurveWidget::xErrorTypeChanged(int index) {
0114     if (DatapickerCurve::ErrorType(index) != DatapickerCurve::ErrorType::NoError || m_curve->curveErrorTypes().y != DatapickerCurve::ErrorType::NoError)
0115         hideErrorBarWidgets(false);
0116     else
0117         hideErrorBarWidgets(true);
0118 
0119     if (m_suppressTypeChange)
0120         return;
0121 
0122     CONDITIONAL_LOCK_RETURN;
0123 
0124     DatapickerCurve::Errors errors = m_curve->curveErrorTypes();
0125     errors.x = DatapickerCurve::ErrorType(index);
0126 
0127     for (auto* curve : m_curveList)
0128         curve->setCurveErrorTypes(errors);
0129 }
0130 
0131 void DatapickerCurveWidget::yErrorTypeChanged(int index) {
0132     if (DatapickerCurve::ErrorType(index) != DatapickerCurve::ErrorType::NoError || m_curve->curveErrorTypes().x != DatapickerCurve::ErrorType::NoError)
0133         hideErrorBarWidgets(false);
0134     else
0135         hideErrorBarWidgets(true);
0136 
0137     if (m_suppressTypeChange)
0138         return;
0139 
0140     CONDITIONAL_LOCK_RETURN;
0141 
0142     DatapickerCurve::Errors errors = m_curve->curveErrorTypes();
0143     errors.y = DatapickerCurve::ErrorType(index);
0144 
0145     for (auto* curve : m_curveList)
0146         curve->setCurveErrorTypes(errors);
0147 }
0148 
0149 void DatapickerCurveWidget::errorBarSizeChanged(double value) {
0150     CONDITIONAL_RETURN_NO_LOCK;
0151 
0152     for (auto* curve : m_curveList)
0153         curve->setPointErrorBarSize(Worksheet::convertToSceneUnits(value, Worksheet::Unit::Point));
0154 }
0155 
0156 void DatapickerCurveWidget::errorBarFillingStyleChanged(int index) {
0157     auto brushStyle = Qt::BrushStyle(index);
0158     ui.kcbErrorBarFillingColor->setEnabled(!(brushStyle == Qt::NoBrush));
0159 
0160     CONDITIONAL_LOCK_RETURN;
0161 
0162     QBrush brush;
0163     for (auto* curve : m_curveList) {
0164         brush = curve->pointErrorBarBrush();
0165         brush.setStyle(brushStyle);
0166         curve->setPointErrorBarBrush(brush);
0167     }
0168 }
0169 
0170 void DatapickerCurveWidget::errorBarFillingColorChanged(const QColor& color) {
0171     CONDITIONAL_LOCK_RETURN;
0172 
0173     QBrush brush;
0174     for (auto* curve : m_curveList) {
0175         brush = curve->pointErrorBarBrush();
0176         brush.setColor(color);
0177         curve->setPointErrorBarBrush(brush);
0178     }
0179     GuiTools::updateBrushStyles(ui.cbErrorBarFillingStyle, color);
0180 }
0181 
0182 void DatapickerCurveWidget::visibilityChanged(bool state) {
0183     CONDITIONAL_LOCK_RETURN;
0184 
0185     for (auto* curve : m_curveList)
0186         curve->setPointVisibility(state);
0187 }
0188 
0189 void DatapickerCurveWidget::updateSymbolWidgets() {
0190     auto list = m_curve->children<DatapickerPoint>(AbstractAspect::ChildIndexFlag::IncludeHidden);
0191     if (list.isEmpty()) {
0192         ui.cbXErrorType->setEnabled(true);
0193         ui.cbYErrorType->setEnabled(true);
0194         m_suppressTypeChange = false;
0195     } else {
0196         ui.cbXErrorType->setEnabled(false);
0197         ui.cbYErrorType->setEnabled(false);
0198         m_suppressTypeChange = true;
0199     }
0200 }
0201 
0202 //*************************************************************
0203 //******** SLOTs for changes triggered in DatapickerCurve *****
0204 //*************************************************************
0205 void DatapickerCurveWidget::curveErrorsChanged(DatapickerCurve::Errors errors) {
0206     CONDITIONAL_LOCK_RETURN;
0207     ui.cbXErrorType->setCurrentIndex((int)errors.x);
0208     ui.cbYErrorType->setCurrentIndex((int)errors.y);
0209 }
0210 
0211 void DatapickerCurveWidget::symbolErrorBarSizeChanged(qreal size) {
0212     CONDITIONAL_LOCK_RETURN;
0213     ui.sbErrorBarSize->setValue(Worksheet::convertFromSceneUnits(size, Worksheet::Unit::Point));
0214 }
0215 
0216 void DatapickerCurveWidget::symbolErrorBarBrushChanged(const QBrush& brush) {
0217     CONDITIONAL_LOCK_RETURN;
0218     ui.cbErrorBarFillingStyle->setCurrentIndex((int)brush.style());
0219     ui.kcbErrorBarFillingColor->setColor(brush.color());
0220     GuiTools::updateBrushStyles(ui.cbErrorBarFillingStyle, brush.color());
0221 }
0222 
0223 void DatapickerCurveWidget::symbolVisibleChanged(bool on) {
0224     CONDITIONAL_LOCK_RETURN;
0225     ui.chkVisible->setChecked(on);
0226 }
0227 
0228 //**********************************************************
0229 //******************** SETTINGS ****************************
0230 //**********************************************************
0231 void DatapickerCurveWidget::load() {
0232     if (!m_curve)
0233         return;
0234 
0235     CONDITIONAL_LOCK_RETURN;
0236     ui.cbXErrorType->setCurrentIndex((int)m_curve->curveErrorTypes().x);
0237     ui.cbYErrorType->setCurrentIndex((int)m_curve->curveErrorTypes().y);
0238     ui.chkVisible->setChecked(m_curve->pointVisibility());
0239     ui.cbErrorBarFillingStyle->setCurrentIndex((int)m_curve->pointErrorBarBrush().style());
0240     ui.kcbErrorBarFillingColor->setColor(m_curve->pointErrorBarBrush().color());
0241     ui.sbErrorBarSize->setValue(Worksheet::convertFromSceneUnits(m_curve->pointErrorBarSize(), Worksheet::Unit::Point));
0242 }