1 /***************************************************************************
2 * *
3 * copyright : (C) 2007 The University of Toronto *
4 * netterfield@astro.utoronto.ca *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 ***************************************************************************/
12
13 #include "powerspectrumdialog.h"
14
15 #include "application.h"
16 #include "curve.h"
17 #include "datacollection.h"
18 #include "dialogdefaults.h"
19 #include "dialogpage.h"
20 #include "document.h"
21 #include "mainwindow.h"
22 #include "objectstore.h"
23 #include "plotitem.h"
24 #include "plotrenderitem.h"
25 #include "psd.h"
26 #include "tabwidget.h"
27 #include "view.h"
28 #include "editmultiplewidget.h"
29 #include "updatemanager.h"
30
31 #include <QPushButton>
32
33 namespace Kst {
34
PowerSpectrumTab(QWidget * parent)35 PowerSpectrumTab::PowerSpectrumTab(QWidget *parent)
36 : DataTab(parent) {
37
38 setupUi(this);
39 setTabTitle(tr("Power Spectrum"));
40
41 _curvePlacement->setExistingPlots(Data::self()->plotList());
42
43 connect(_vector, SIGNAL(selectionChanged(QString)), this, SLOT(selectionChanged()));
44 connect(_FFTOptions, SIGNAL(modified()), this, SIGNAL(modified()));
45 connect(_vector, SIGNAL(selectionChanged(QString)), this, SIGNAL(modified()));
46 connect(_curvePlacement->_noPlot, SIGNAL(toggled(bool)), _curveAppearance, SLOT(setDisabled(bool)));
47
48 _vectorLabel->setBuddy(_vector->_vector);
49
50 }
51
52
~PowerSpectrumTab()53 PowerSpectrumTab::~PowerSpectrumTab() {
54 }
55
56
vector() const57 VectorPtr PowerSpectrumTab::vector() const {
58 return _vector->selectedVector();
59 }
60
61
vectorDirty() const62 bool PowerSpectrumTab::vectorDirty() const {
63 return _vector->selectedVectorDirty();
64 }
65
66
setVector(const VectorPtr vector)67 void PowerSpectrumTab::setVector(const VectorPtr vector) {
68 _vector->setSelectedVector(vector);
69 }
70
71
selectionChanged()72 void PowerSpectrumTab::selectionChanged() {
73 emit vectorChanged();
74 }
75
76
curveAppearance() const77 CurveAppearance* PowerSpectrumTab::curveAppearance() const {
78 return _curveAppearance;
79 }
80
81
curvePlacement() const82 CurvePlacement* PowerSpectrumTab::curvePlacement() const {
83 return _curvePlacement;
84 }
85
86
FFTOptionsWidget() const87 FFTOptions* PowerSpectrumTab::FFTOptionsWidget() const {
88 return _FFTOptions;
89 }
90
91
setObjectStore(ObjectStore * store)92 void PowerSpectrumTab::setObjectStore(ObjectStore *store) {
93 _vector->setObjectStore(store);
94 }
95
96
hideCurveOptions()97 void PowerSpectrumTab::hideCurveOptions() {
98 _curvePlacement->setVisible(false);
99 _curveAppearance->setVisible(false);
100 }
101
102
clearTabValues()103 void PowerSpectrumTab::clearTabValues() {
104 _vector->clearSelection();
105 _FFTOptions->clearValues();
106 }
107
108
PowerSpectrumDialog(ObjectPtr dataObject,QWidget * parent)109 PowerSpectrumDialog::PowerSpectrumDialog(ObjectPtr dataObject, QWidget *parent)
110 : DataDialog(dataObject, parent) {
111
112 if (editMode() == Edit)
113 setWindowTitle(tr("Edit Power Spectrum"));
114 else
115 setWindowTitle(tr("New Power Spectrum"));
116
117 _powerSpectrumTab = new PowerSpectrumTab(this);
118 addDataTab(_powerSpectrumTab);
119
120 if (editMode() == Edit) {
121 configureTab(dataObject);
122 } else {
123 configureTab(0);
124 }
125
126 connect(_powerSpectrumTab, SIGNAL(vectorChanged()), this, SLOT(updateButtons()));
127 connect(this, SIGNAL(editMultipleMode()), this, SLOT(editMultipleMode()));
128 connect(this, SIGNAL(editSingleMode()), this, SLOT(editSingleMode()));
129
130 connect(_powerSpectrumTab, SIGNAL(modified()), this, SLOT(modified()));
131 updateButtons();
132 }
133
134
~PowerSpectrumDialog()135 PowerSpectrumDialog::~PowerSpectrumDialog() {
136 }
137
138
139 // QString PowerSpectrumDialog::tagString() const {
140 // return DataDialog::tagString();
141 // }
142
143
editMultipleMode()144 void PowerSpectrumDialog::editMultipleMode() {
145 _powerSpectrumTab->clearTabValues();
146 }
147
148
editSingleMode()149 void PowerSpectrumDialog::editSingleMode() {
150 configureTab(dataObject());
151 }
152
153
setVector(VectorPtr vector)154 void PowerSpectrumDialog::setVector(VectorPtr vector) {
155 _powerSpectrumTab->setVector(vector);
156 _powerSpectrumTab->selectionChanged();
157 }
158
159
160
configureTab(ObjectPtr object)161 void PowerSpectrumDialog::configureTab(ObjectPtr object) {
162 if (!object) {
163 _powerSpectrumTab->FFTOptionsWidget()->loadWidgetDefaults();
164 _powerSpectrumTab->curveAppearance()->loadWidgetDefaults();
165
166 } else if (PSDPtr psd = kst_cast<PSD>(object)) {
167 _powerSpectrumTab->setVector(psd->vector());
168
169 _powerSpectrumTab->FFTOptionsWidget()->setSampleRate(psd->frequency());
170 _powerSpectrumTab->FFTOptionsWidget()->setInterleavedAverage(psd->average());
171 _powerSpectrumTab->FFTOptionsWidget()->setFFTLength(psd->length());
172 _powerSpectrumTab->FFTOptionsWidget()->setApodize(psd->apodize());
173 _powerSpectrumTab->FFTOptionsWidget()->setRemoveMean(psd->removeMean());
174 _powerSpectrumTab->FFTOptionsWidget()->setVectorUnits(psd->vectorUnits());
175 _powerSpectrumTab->FFTOptionsWidget()->setRateUnits(psd->rateUnits());
176 _powerSpectrumTab->FFTOptionsWidget()->setApodizeFunction(psd->apodizeFxn());
177 _powerSpectrumTab->FFTOptionsWidget()->setSigma(psd->gaussianSigma());
178 _powerSpectrumTab->FFTOptionsWidget()->setOutput(psd->output());
179 _powerSpectrumTab->hideCurveOptions();
180 if (_editMultipleWidget) {
181 PSDList objects = _document->objectStore()->getObjects<PSD>();
182 _editMultipleWidget->clearObjects();
183 foreach(const PSDPtr &object, objects) {
184 _editMultipleWidget->addObject(object->Name(), object->descriptionTip());
185 }
186 }
187 }
188 }
189
190
updateButtons()191 void PowerSpectrumDialog::updateButtons() {
192 _buttonBox->button(QDialogButtonBox::Ok)->setEnabled(dialogValid());
193 }
194
195
dialogValid() const196 bool PowerSpectrumDialog::dialogValid() const {
197 bool valid = _powerSpectrumTab->vector() || (editMode() == EditMultiple);
198 return valid;
199 }
200
createNewDataObject()201 ObjectPtr PowerSpectrumDialog::createNewDataObject() {
202 Q_ASSERT(_document && _document->objectStore());
203 PSDPtr powerspectrum = _document->objectStore()->createObject<PSD>();
204 Q_ASSERT(powerspectrum);
205
206 powerspectrum->writeLock();
207 powerspectrum->change(_powerSpectrumTab->vector(),
208 _powerSpectrumTab->FFTOptionsWidget()->sampleRate(),
209 _powerSpectrumTab->FFTOptionsWidget()->interleavedAverage(),
210 _powerSpectrumTab->FFTOptionsWidget()->FFTLength(),
211 _powerSpectrumTab->FFTOptionsWidget()->apodize(),
212 _powerSpectrumTab->FFTOptionsWidget()->removeMean(),
213 _powerSpectrumTab->FFTOptionsWidget()->vectorUnits(),
214 _powerSpectrumTab->FFTOptionsWidget()->rateUnits(),
215 _powerSpectrumTab->FFTOptionsWidget()->apodizeFunction(),
216 _powerSpectrumTab->FFTOptionsWidget()->sigma(),
217 _powerSpectrumTab->FFTOptionsWidget()->output());
218
219 if (DataDialog::tagStringAuto()) {
220 powerspectrum->setDescriptiveName(QString());
221 } else {
222 powerspectrum->setDescriptiveName(DataDialog::tagString());
223 }
224
225 powerspectrum->registerChange();
226 powerspectrum->unlock();
227
228 _powerSpectrumTab->FFTOptionsWidget()->setWidgetDefaults();
229
230 CurvePtr curve = _document->objectStore()->createObject<Curve>();
231 Q_ASSERT(curve);
232
233 curve->setXVector(powerspectrum->vX());
234 curve->setYVector(powerspectrum->vY());
235 curve->setColor(_powerSpectrumTab->curveAppearance()->color());
236 curve->setHeadColor(_powerSpectrumTab->curveAppearance()->headColor());
237 curve->setBarFillColor(_powerSpectrumTab->curveAppearance()->barFillColor());
238 curve->setHasPoints(_powerSpectrumTab->curveAppearance()->showPoints());
239 curve->setHasLines(_powerSpectrumTab->curveAppearance()->showLines());
240 curve->setHasBars(_powerSpectrumTab->curveAppearance()->showBars());
241 curve->setHasHead(_powerSpectrumTab->curveAppearance()->showHead());
242 curve->setLineWidth(_powerSpectrumTab->curveAppearance()->lineWidth());
243 curve->setPointSize(_powerSpectrumTab->curveAppearance()->pointSize());
244 curve->setLineStyle(_powerSpectrumTab->curveAppearance()->lineStyle());
245 curve->setPointType(_powerSpectrumTab->curveAppearance()->pointType());
246 curve->setHeadType(_powerSpectrumTab->curveAppearance()->headType());
247 curve->setPointDensity(_powerSpectrumTab->curveAppearance()->pointDensity());
248
249 curve->writeLock();
250 curve->registerChange();
251 curve->unlock();
252
253 _powerSpectrumTab->curveAppearance()->setWidgetDefaults();
254
255 if(editMode()==New) {
256 PlotItem *plotItem = 0;
257 switch (_powerSpectrumTab->curvePlacement()->place()) {
258 case CurvePlacement::NoPlot:
259 break;
260 case CurvePlacement::ExistingPlot:
261 {
262 plotItem = static_cast<PlotItem*>(_powerSpectrumTab->curvePlacement()->existingPlot());
263 break;
264 }
265 case CurvePlacement::NewPlotNewTab:
266 _document->createView();
267 // fall through to case NewPlot.
268 case CurvePlacement::NewPlot:
269 {
270 CreatePlotForCurve *cmd = new CreatePlotForCurve();
271 cmd->createItem();
272
273 plotItem = static_cast<PlotItem*>(cmd->item());
274 if (_powerSpectrumTab->curvePlacement()->scaleFonts()) {
275 plotItem->view()->resetPlotFontSizes(plotItem);
276 plotItem->view()->configurePlotFontDefaults(plotItem); // copy plots already in window
277 }
278 break;
279 }
280 default:
281 break;
282 }
283
284 if (_powerSpectrumTab->curvePlacement()->place() != CurvePlacement::NoPlot) {
285 PlotRenderItem *renderItem = plotItem->renderItem(PlotRenderItem::Cartesian);
286 renderItem->addRelation(kst_cast<Relation>(curve));
287 plotItem->update();
288
289 if (_powerSpectrumTab->curvePlacement()->place() != CurvePlacement::ExistingPlot) {
290 plotItem->view()->appendToLayout(_powerSpectrumTab->curvePlacement()->layout(), plotItem, _powerSpectrumTab->curvePlacement()->gridColumns());
291 if (_powerSpectrumTab->curvePlacement()->layout() == CurvePlacement::Custom) {
292 plotItem->createCustomLayout(_powerSpectrumTab->curvePlacement()->gridColumns());
293 }
294 }
295 }
296 }
297
298 return ObjectPtr(powerspectrum.data());
299 }
300
301
editExistingDataObject() const302 ObjectPtr PowerSpectrumDialog::editExistingDataObject() const {
303 if (PSDPtr powerspectrum = kst_cast<PSD>(dataObject())) {
304 if (editMode() == EditMultiple) {
305 const FFTOptions *options = _powerSpectrumTab->FFTOptionsWidget();
306 QStringList objects = _editMultipleWidget->selectedObjects();
307 foreach (const QString &objectName, objects) {
308 PSDPtr powerspectrum = kst_cast<PSD>(_document->objectStore()->retrieveObject(objectName));
309 if (powerspectrum) {
310 VectorPtr vector = _powerSpectrumTab->vectorDirty() ? _powerSpectrumTab->vector() : powerspectrum->vector();
311 const double frequency = options->sampleRateDirty() ? options->sampleRate() : powerspectrum->frequency();
312 const double sigma = options->sigmaDirty() ? options->sigma() : powerspectrum->gaussianSigma();
313
314 const bool apodize = options->apodizeDirty() ? options->apodize() : powerspectrum->apodize();
315 const bool removeMean = options->removeMeanDirty() ? options->removeMean() : powerspectrum->removeMean();
316 const bool interleavedAverage = options->interleavedAverageDirty() ? options->interleavedAverage() : powerspectrum->average();
317 const int FFTLength = options->FFTLengthDirty() ? options->FFTLength() : powerspectrum->length();
318 const ApodizeFunction apodizeFunction = options->apodizeFunctionDirty() ? options->apodizeFunction() : powerspectrum->apodizeFxn();
319 const PSDType output = options->outputDirty() ? options->output() : powerspectrum->output();
320 const QString vectorUnits = options->vectorUnitsDirty() ? options->vectorUnits() : powerspectrum->vectorUnits();
321 const QString rateUnits = options->rateUnitsDirty() ? options->rateUnits() : powerspectrum->rateUnits();
322
323 powerspectrum->writeLock();
324 powerspectrum->setVector(vector);
325 powerspectrum->setFrequency(frequency);
326 powerspectrum->setAverage(interleavedAverage);
327 powerspectrum->setLength(FFTLength);
328 powerspectrum->setApodize(apodize);
329 powerspectrum->setRemoveMean(removeMean);
330 powerspectrum->setVectorUnits(vectorUnits);
331 powerspectrum->setRateUnits(rateUnits);
332 powerspectrum->setApodizeFxn(apodizeFunction);
333 powerspectrum->setGaussianSigma(sigma);
334 powerspectrum->setOutput(output);
335
336 powerspectrum->registerChange();
337 powerspectrum->unlock();
338 }
339 }
340 } else {
341 powerspectrum->writeLock();
342 powerspectrum->setVector(_powerSpectrumTab->vector());
343 powerspectrum->setFrequency(_powerSpectrumTab->FFTOptionsWidget()->sampleRate());
344 powerspectrum->setAverage(_powerSpectrumTab->FFTOptionsWidget()->interleavedAverage());
345 powerspectrum->setLength(_powerSpectrumTab->FFTOptionsWidget()->FFTLength());
346 powerspectrum->setApodize(_powerSpectrumTab->FFTOptionsWidget()->apodize());
347 powerspectrum->setRemoveMean(_powerSpectrumTab->FFTOptionsWidget()->removeMean());
348 powerspectrum->setVectorUnits(_powerSpectrumTab->FFTOptionsWidget()->vectorUnits());
349 powerspectrum->setRateUnits(_powerSpectrumTab->FFTOptionsWidget()->rateUnits());
350 powerspectrum->setApodizeFxn(_powerSpectrumTab->FFTOptionsWidget()->apodizeFunction());
351 powerspectrum->setGaussianSigma(_powerSpectrumTab->FFTOptionsWidget()->sigma());
352 powerspectrum->setOutput(_powerSpectrumTab->FFTOptionsWidget()->output());
353 if (DataDialog::tagStringAuto()) {
354 powerspectrum->setDescriptiveName(QString());
355 } else {
356 powerspectrum->setDescriptiveName(DataDialog::tagString());
357 }
358
359 powerspectrum->registerChange();
360 powerspectrum->unlock();
361
362 _powerSpectrumTab->FFTOptionsWidget()->setWidgetDefaults();
363 }
364 }
365 return dataObject();
366 }
367
368 }
369
370 // vim: ts=2 sw=2 et
371