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 }