File indexing completed on 2024-05-26 03:52:36

0001 /*
0002     File             : XYHilbertTransformCurveDock.cpp
0003     Project          : LabPlot
0004     Description      : widget for editing properties of Hilbert transform curves
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2021 Stefan Gerlach <stefan.gerlach@uni.kn>
0007 
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 
0011 #include "XYHilbertTransformCurveDock.h"
0012 #include "backend/worksheet/plots/cartesian/XYHilbertTransformCurve.h"
0013 #include "commonfrontend/widgets/TreeViewComboBox.h"
0014 
0015 /*!
0016   \class XYHilbertTransformCurveDock
0017  \brief  Provides a widget for editing the properties of the XYHilbertTransformCurves
0018         (2D-curves defined by a Hilbert transform) currently selected in
0019         the project explorer.
0020 
0021   If more than one curves are set, the properties of the first column are shown.
0022   The changes of the properties are applied to all curves.
0023   The exclusions are the name, the comment and the datasets (columns) of
0024   the curves  - these properties can only be changed if there is only one single curve.
0025 
0026   \ingroup kdefrontend
0027 */
0028 
0029 XYHilbertTransformCurveDock::XYHilbertTransformCurveDock(QWidget* parent)
0030     : XYAnalysisCurveDock(parent) {
0031 }
0032 
0033 /*!
0034  *  // Tab "General"
0035  */
0036 void XYHilbertTransformCurveDock::setupGeneral() {
0037     auto* generalTab = new QWidget(ui.tabGeneral);
0038     uiGeneralTab.setupUi(generalTab);
0039     setPlotRangeCombobox(uiGeneralTab.cbPlotRanges);
0040     setBaseWidgets(uiGeneralTab.leName, uiGeneralTab.teComment, uiGeneralTab.pbRecalculate);
0041     setVisibilityWidgets(uiGeneralTab.chkVisible, uiGeneralTab.chkLegendVisible);
0042 
0043     auto* gridLayout = static_cast<QGridLayout*>(generalTab->layout());
0044     gridLayout->setContentsMargins(2, 2, 2, 2);
0045     gridLayout->setHorizontalSpacing(2);
0046     gridLayout->setVerticalSpacing(2);
0047 
0048     cbXDataColumn = new TreeViewComboBox(generalTab);
0049     gridLayout->addWidget(cbXDataColumn, 5, 2, 1, 2);
0050     cbYDataColumn = new TreeViewComboBox(generalTab);
0051     gridLayout->addWidget(cbYDataColumn, 6, 2, 1, 2);
0052 
0053     for (int i = 0; i < NSL_HILBERT_RESULT_TYPE_COUNT; i++)
0054         uiGeneralTab.cbType->addItem(i18n(nsl_hilbert_result_type_name[i]));
0055 
0056     uiGeneralTab.leMin->setValidator(new QDoubleValidator(uiGeneralTab.leMin));
0057     uiGeneralTab.leMax->setValidator(new QDoubleValidator(uiGeneralTab.leMax));
0058 
0059     auto* layout = new QHBoxLayout(ui.tabGeneral);
0060     layout->setContentsMargins(0, 0, 0, 0);
0061     layout->addWidget(generalTab);
0062 
0063     // Slots
0064     connect(uiGeneralTab.cbAutoRange, &QCheckBox::clicked, this, &XYHilbertTransformCurveDock::autoRangeChanged);
0065     connect(uiGeneralTab.leMin, &QLineEdit::textChanged, this, &XYHilbertTransformCurveDock::xRangeMinChanged);
0066     connect(uiGeneralTab.leMax, &QLineEdit::textChanged, this, &XYHilbertTransformCurveDock::xRangeMaxChanged);
0067     connect(uiGeneralTab.cbType, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &XYHilbertTransformCurveDock::typeChanged);
0068     connect(uiGeneralTab.pbRecalculate, &QPushButton::clicked, this, &XYHilbertTransformCurveDock::recalculateClicked);
0069 
0070     connect(cbXDataColumn, &TreeViewComboBox::currentModelIndexChanged, this, &XYHilbertTransformCurveDock::xDataColumnChanged);
0071     connect(cbYDataColumn, &TreeViewComboBox::currentModelIndexChanged, this, &XYHilbertTransformCurveDock::yDataColumnChanged);
0072 }
0073 
0074 void XYHilbertTransformCurveDock::initGeneralTab() {
0075     // show the properties of the first curve
0076     cbXDataColumn->setColumn(m_transformCurve->xDataColumn(), m_transformCurve->xDataColumnPath());
0077     cbYDataColumn->setColumn(m_transformCurve->yDataColumn(), m_transformCurve->yDataColumnPath());
0078     uiGeneralTab.cbAutoRange->setChecked(m_transformData.autoRange);
0079 
0080     const auto numberLocale = QLocale();
0081     uiGeneralTab.leMin->setText(numberLocale.toString(m_transformData.xRange.first()));
0082     uiGeneralTab.leMax->setText(numberLocale.toString(m_transformData.xRange.last()));
0083     this->autoRangeChanged();
0084 
0085     uiGeneralTab.cbType->setCurrentIndex(m_transformData.type);
0086     this->typeChanged();
0087     this->showTransformResult();
0088 
0089     // enable the "recalculate"-button if the source data was changed since the last transform
0090     uiGeneralTab.pbRecalculate->setEnabled(m_transformCurve->isSourceDataChangedSinceLastRecalc());
0091 
0092     uiGeneralTab.chkLegendVisible->setChecked(m_curve->legendVisible());
0093     uiGeneralTab.chkVisible->setChecked(m_curve->isVisible());
0094 
0095     // Slots
0096     connect(m_transformCurve, &XYHilbertTransformCurve::xDataColumnChanged, this, &XYHilbertTransformCurveDock::curveXDataColumnChanged);
0097     connect(m_transformCurve, &XYHilbertTransformCurve::yDataColumnChanged, this, &XYHilbertTransformCurveDock::curveYDataColumnChanged);
0098     connect(m_transformCurve, &XYHilbertTransformCurve::transformDataChanged, this, &XYHilbertTransformCurveDock::curveTransformDataChanged);
0099     connect(m_transformCurve, &XYHilbertTransformCurve::sourceDataChanged, this, &XYHilbertTransformCurveDock::enableRecalculate);
0100 }
0101 
0102 void XYHilbertTransformCurveDock::setModel() {
0103     auto list = defaultColumnTopLevelClasses();
0104     list.append(AspectType::XYFitCurve);
0105 
0106     XYAnalysisCurveDock::setModel(list);
0107 }
0108 
0109 /*!
0110   sets the curves. The properties of the curves in the list \c list can be edited in this widget.
0111 */
0112 void XYHilbertTransformCurveDock::setCurves(QList<XYCurve*> list) {
0113     CONDITIONAL_LOCK_RETURN;
0114     m_curvesList = list;
0115     m_curve = list.first();
0116     setAspects(list);
0117     setAnalysisCurves(list);
0118     m_transformCurve = static_cast<XYHilbertTransformCurve*>(m_curve);
0119     this->setModel();
0120     m_transformData = m_transformCurve->transformData();
0121 
0122     initGeneralTab();
0123     initTabs();
0124     setSymbols(list);
0125 
0126     updatePlotRangeList();
0127 }
0128 
0129 //*************************************************************
0130 //**** SLOTs for changes triggered in XYFitCurveDock *****
0131 //*************************************************************
0132 void XYHilbertTransformCurveDock::xDataColumnChanged(const QModelIndex& index) {
0133     CONDITIONAL_LOCK_RETURN;
0134 
0135     auto* column = static_cast<AbstractColumn*>(index.internalPointer());
0136 
0137     for (auto* curve : m_curvesList)
0138         static_cast<XYHilbertTransformCurve*>(curve)->setXDataColumn(column);
0139 
0140     if (column && uiGeneralTab.cbAutoRange->isChecked()) {
0141         const auto numberLocale = QLocale();
0142         uiGeneralTab.leMin->setText(numberLocale.toString(column->minimum()));
0143         uiGeneralTab.leMax->setText(numberLocale.toString(column->maximum()));
0144     }
0145 
0146     enableRecalculate();
0147 }
0148 
0149 void XYHilbertTransformCurveDock::autoRangeChanged() {
0150     bool autoRange = uiGeneralTab.cbAutoRange->isChecked();
0151     m_transformData.autoRange = autoRange;
0152 
0153     if (autoRange) {
0154         uiGeneralTab.lMin->setEnabled(false);
0155         uiGeneralTab.leMin->setEnabled(false);
0156         uiGeneralTab.lMax->setEnabled(false);
0157         uiGeneralTab.leMax->setEnabled(false);
0158         m_transformCurve = static_cast<XYHilbertTransformCurve*>(m_curve);
0159         if (m_transformCurve->xDataColumn()) {
0160             const auto numberLocale = QLocale();
0161             uiGeneralTab.leMin->setText(numberLocale.toString(m_transformCurve->xDataColumn()->minimum()));
0162             uiGeneralTab.leMax->setText(numberLocale.toString(m_transformCurve->xDataColumn()->maximum()));
0163         }
0164     } else {
0165         uiGeneralTab.lMin->setEnabled(true);
0166         uiGeneralTab.leMin->setEnabled(true);
0167         uiGeneralTab.lMax->setEnabled(true);
0168         uiGeneralTab.leMax->setEnabled(true);
0169     }
0170 }
0171 void XYHilbertTransformCurveDock::xRangeMinChanged() {
0172     SET_DOUBLE_FROM_LE_REC(m_transformData.xRange.first(), uiGeneralTab.leMin);
0173 }
0174 
0175 void XYHilbertTransformCurveDock::xRangeMaxChanged() {
0176     SET_DOUBLE_FROM_LE_REC(m_transformData.xRange.last(), uiGeneralTab.leMax);
0177 }
0178 
0179 void XYHilbertTransformCurveDock::typeChanged() {
0180     auto type = (nsl_hilbert_result_type)uiGeneralTab.cbType->currentIndex();
0181     m_transformData.type = type;
0182 
0183     enableRecalculate();
0184 }
0185 
0186 void XYHilbertTransformCurveDock::recalculateClicked() {
0187     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
0188     for (auto* curve : m_curvesList)
0189         static_cast<XYHilbertTransformCurve*>(curve)->setTransformData(m_transformData);
0190 
0191     uiGeneralTab.pbRecalculate->setEnabled(false);
0192     Q_EMIT info(i18n("Hilbert transformation status: %1", m_transformCurve->result().status));
0193     QApplication::restoreOverrideCursor();
0194 }
0195 
0196 /*!
0197  * show the result and details of the transform
0198  */
0199 void XYHilbertTransformCurveDock::showTransformResult() {
0200     showResult(m_transformCurve, uiGeneralTab.teResult);
0201 }
0202 
0203 //*************************************************************
0204 //*********** SLOTs for changes triggered in XYCurve **********
0205 //*************************************************************
0206 // General-Tab
0207 void XYHilbertTransformCurveDock::curveTransformDataChanged(const XYHilbertTransformCurve::TransformData& transformData) {
0208     CONDITIONAL_LOCK_RETURN;
0209     m_transformData = transformData;
0210     uiGeneralTab.cbType->setCurrentIndex(m_transformData.type);
0211     this->typeChanged();
0212 
0213     this->showTransformResult();
0214 }