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 }