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