1 /***************************************************************************
2     File                 : Plot3DDialog.cpp
3     Project              : SciDAVis
4     --------------------------------------------------------------------
5     Copyright            : (C) 2006 by Ion Vasilief, Tilman Benkert
6     Email (use @ for *)  : ion_vasilief*yahoo.fr, thzs*gmx.net
7     Description          : Surface plot options dialog
8 
9  ***************************************************************************/
10 
11 /***************************************************************************
12  *                                                                         *
13  *  This program is free software; you can redistribute it and/or modify   *
14  *  it under the terms of the GNU General Public License as published by   *
15  *  the Free Software Foundation; either version 2 of the License, or      *
16  *  (at your option) any later version.                                    *
17  *                                                                         *
18  *  This program is distributed in the hope that it will be useful,        *
19  *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
20  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
21  *  GNU General Public License for more details.                           *
22  *                                                                         *
23  *   You should have received a copy of the GNU General Public License     *
24  *   along with this program; if not, write to the Free Software           *
25  *   Foundation, Inc., 51 Franklin Street, Fifth Floor,                    *
26  *   Boston, MA  02110-1301  USA                                           *
27  *                                                                         *
28  ***************************************************************************/
29 #ifdef _MSC_VER
30 #define NOMINMAX
31 #endif
32 #include "Plot3DDialog.h"
33 #include "TextDialog.h"
34 #include "MyParser.h"
35 #include "SymbolDialog.h"
36 
37 #include <QListWidget>
38 #include <QLineEdit>
39 #include <QLayout>
40 #include <QSpinBox>
41 #include <QDoubleSpinBox>
42 #include <QPushButton>
43 #include <QLabel>
44 #include <QStackedWidget>
45 #include <QWidget>
46 #include <QMessageBox>
47 #include <QComboBox>
48 #include <QWidgetList>
49 #include <QFileDialog>
50 #include <QGroupBox>
51 #include <QFontDialog>
52 #include <QColorDialog>
53 
54 #include <qwt3d_color.h>
55 
Plot3DDialog(QWidget * parent,Qt::WindowFlags fl)56 Plot3DDialog::Plot3DDialog(QWidget *parent, Qt::WindowFlags fl) : QDialog(parent, fl)
57 {
58     setWindowTitle(tr("Surface Plot Options"));
59 
60     bars = 0;
61     points = 0;
62 
63     QHBoxLayout *hbox = new QHBoxLayout();
64     hbox->addStretch();
65     btnTable = new QPushButton();
66     btnTable->hide();
67     hbox->addWidget(btnTable);
68     buttonApply = new QPushButton(tr("&Apply"));
69     hbox->addWidget(buttonApply);
70     buttonOk = new QPushButton(tr("&OK"));
71     buttonOk->setDefault(true);
72     hbox->addWidget(buttonOk);
73     buttonCancel = new QPushButton(tr("&Cancel"));
74     hbox->addWidget(buttonCancel);
75 
76     generalDialog = new QTabWidget();
77 
78     initScalesPage();
79     initAxesPage();
80     initTitlePage();
81     initColorsPage();
82     initGeneralPage();
83 
84     QVBoxLayout *vl = new QVBoxLayout(this);
85     vl->addWidget(generalDialog);
86     vl->addLayout(hbox);
87 
88     connect(buttonOk, SIGNAL(clicked()), this, SLOT(accept()));
89     connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
90     connect(buttonApply, SIGNAL(clicked()), this, SLOT(updatePlot()));
91     connect(btnTable, SIGNAL(clicked()), this, SLOT(worksheet()));
92 }
93 
initScalesPage()94 void Plot3DDialog::initScalesPage()
95 {
96     axesList = new QListWidget();
97     axesList->addItem(tr("X"));
98     axesList->addItem(tr("Y"));
99     axesList->addItem(tr("Z"));
100     axesList->setFixedWidth(50);
101     axesList->setCurrentRow(0);
102 
103     QGridLayout *gl1 = new QGridLayout();
104     gl1->addWidget(new QLabel(tr("From")), 0, 0);
105     boxFrom = new QLineEdit();
106     boxFrom->setMaximumWidth(150);
107     gl1->addWidget(boxFrom, 0, 1);
108     gl1->addWidget(new QLabel(tr("To")), 1, 0);
109     boxTo = new QLineEdit();
110     boxTo->setMaximumWidth(150);
111     gl1->addWidget(boxTo, 1, 1);
112     gl1->addWidget(new QLabel(tr("Type")), 2, 0);
113     boxType = new QComboBox();
114     boxType->addItem(tr("linear"));
115     boxType->addItem(tr("logarithmic"));
116     boxType->setMaximumWidth(150);
117     gl1->addWidget(boxType, 2, 1);
118     gl1->setRowStretch(3, 1);
119 
120     QGroupBox *gb1 = new QGroupBox();
121     gb1->setLayout(gl1);
122 
123     QGridLayout *gl2 = new QGridLayout();
124     gl2->addWidget(new QLabel(tr("Major Ticks")), 0, 0);
125     boxMajors = new QSpinBox();
126     gl2->addWidget(boxMajors, 0, 1);
127     gl2->addWidget(new QLabel(tr("Minor Ticks")), 1, 0);
128     boxMinors = new QSpinBox();
129     gl2->addWidget(boxMinors, 1, 1);
130     gl2->setRowStretch(2, 1);
131 
132     TicksGroupBox = new QGroupBox();
133     TicksGroupBox->setLayout(gl2);
134 
135     QHBoxLayout *hb = new QHBoxLayout();
136     hb->addWidget(axesList);
137     hb->addWidget(gb1);
138     hb->addWidget(TicksGroupBox);
139 
140     scale = new QWidget();
141     scale->setLayout(hb);
142     generalDialog->addTab(scale, tr("&Scale"));
143 }
144 
initAxesPage()145 void Plot3DDialog::initAxesPage()
146 {
147     axesList2 = new QListWidget();
148     axesList2->addItem(tr("X"));
149     axesList2->addItem(tr("Y"));
150     axesList2->addItem(tr("Z"));
151     axesList2->setFixedWidth(50);
152     axesList2->setCurrentRow(0);
153 
154     QGridLayout *gl1 = new QGridLayout();
155     gl1->addWidget(new QLabel(tr("Title")), 0, 0);
156     boxLabel = new QLineEdit();
157     gl1->addWidget(boxLabel, 0, 1);
158     gl1->addWidget(new QLabel(tr("Axis Font")), 1, 0);
159 
160     QHBoxLayout *hb1 = new QHBoxLayout();
161     btnLabelFont = new QPushButton(tr("&Choose font"));
162     hb1->addWidget(btnLabelFont);
163     buttonAxisLowerGreek = new QPushButton(QChar(0x3B1));
164     hb1->addWidget(buttonAxisLowerGreek);
165     buttonAxisUpperGreek = new QPushButton(QChar(0x393));
166     hb1->addWidget(buttonAxisUpperGreek);
167     hb1->addStretch();
168     gl1->addLayout(hb1, 1, 1);
169 
170     gl1->addWidget(new QLabel(tr("Major Ticks Length")), 2, 0);
171     boxMajorLength = new QLineEdit();
172     gl1->addWidget(boxMajorLength, 2, 1);
173     gl1->addWidget(new QLabel(tr("Minor Ticks Length")), 3, 0);
174     boxMinorLength = new QLineEdit();
175     gl1->addWidget(boxMinorLength, 3, 1);
176     gl1->setRowStretch(4, 1);
177 
178     QGroupBox *gb1 = new QGroupBox();
179     gb1->setLayout(gl1);
180 
181     QHBoxLayout *hb2 = new QHBoxLayout();
182     hb2->addWidget(axesList2);
183     hb2->addWidget(gb1);
184 
185     axes = new QWidget();
186     axes->setLayout(hb2);
187     generalDialog->addTab(axes, tr("&Axis"));
188 
189     connect(buttonAxisLowerGreek, SIGNAL(clicked()), this, SLOT(showLowerGreek()));
190     connect(buttonAxisUpperGreek, SIGNAL(clicked()), this, SLOT(showUpperGreek()));
191     connect(axesList2, SIGNAL(currentRowChanged(int)), this, SLOT(viewAxisOptions(int)));
192     connect(axesList, SIGNAL(currentRowChanged(int)), this, SLOT(viewScaleLimits(int)));
193     connect(btnLabelFont, SIGNAL(clicked()), this, SLOT(pickAxisLabelFont()));
194 }
195 
initTitlePage()196 void Plot3DDialog::initTitlePage()
197 {
198     QHBoxLayout *hb1 = new QHBoxLayout();
199     hb1->addStretch();
200     buttonLowerGreek = new QPushButton(QChar(0x3B1));
201     hb1->addWidget(buttonLowerGreek);
202     buttonUpperGreek = new QPushButton(QChar(0x393));
203     hb1->addWidget(buttonUpperGreek);
204     btnTitleColor = new QPushButton(tr("&Color"));
205     hb1->addWidget(btnTitleColor);
206     btnTitleFont = new QPushButton(tr("&Font"));
207     hb1->addWidget(btnTitleFont);
208     hb1->addStretch();
209 
210     QVBoxLayout *vl = new QVBoxLayout();
211     boxTitle = new QLineEdit();
212     vl->addWidget(boxTitle);
213     vl->addLayout(hb1);
214     vl->addStretch();
215 
216     title = new QWidget();
217     title->setLayout(vl);
218     generalDialog->addTab(title, tr("&Title"));
219 
220     connect(btnTitleColor, SIGNAL(clicked()), this, SLOT(pickTitleColor()));
221     connect(btnTitleFont, SIGNAL(clicked()), this, SLOT(pickTitleFont()));
222     connect(buttonLowerGreek, SIGNAL(clicked()), this, SLOT(showLowerGreek()));
223     connect(buttonUpperGreek, SIGNAL(clicked()), this, SLOT(showUpperGreek()));
224 }
225 
initColorsPage()226 void Plot3DDialog::initColorsPage()
227 {
228     QVBoxLayout *vl1 = new QVBoxLayout();
229     btnFromColor = new QPushButton(tr("Ma&x"));
230     vl1->addWidget(btnFromColor);
231     btnToColor = new QPushButton(tr("&Min"));
232     vl1->addWidget(btnToColor);
233     btnColorMap = new QPushButton(tr("Color Ma&p"));
234     vl1->addWidget(btnColorMap);
235     vl1->addStretch();
236 
237     QGroupBox *gb1 = new QGroupBox(tr("Data"));
238     gb1->setLayout(vl1);
239 
240     QVBoxLayout *vl2 = new QVBoxLayout();
241     btnMesh = new QPushButton(tr("&Line"));
242     vl2->addWidget(btnMesh);
243     btnBackground = new QPushButton(tr("&Background"));
244     vl2->addWidget(btnBackground);
245     vl2->addStretch();
246 
247     QGroupBox *gb2 = new QGroupBox(tr("General"));
248     gb2->setLayout(vl2);
249 
250     QGridLayout *gl1 = new QGridLayout();
251     btnAxes = new QPushButton(tr("&Axes"));
252     gl1->addWidget(btnAxes, 0, 0);
253     btnLabels = new QPushButton(tr("Lab&els"));
254     gl1->addWidget(btnLabels, 0, 1);
255     btnNumbers = new QPushButton(tr("&Numbers"));
256     gl1->addWidget(btnNumbers, 1, 0);
257     btnGrid = new QPushButton(tr("&Grid"));
258     gl1->addWidget(btnGrid, 1, 1);
259     gl1->setRowStretch(2, 1);
260 
261     AxesColorGroupBox = new QGroupBox(tr("Coordinate System"));
262     AxesColorGroupBox->setLayout(gl1);
263 
264     QHBoxLayout *hb1 = new QHBoxLayout();
265     hb1->addWidget(gb1);
266     hb1->addWidget(gb2);
267     hb1->addWidget(AxesColorGroupBox);
268 
269     QHBoxLayout *hb2 = new QHBoxLayout();
270     hb2->addStretch();
271     hb2->addWidget(new QLabel(tr("Opacity")));
272     boxTransparency = new QSpinBox();
273     boxTransparency->setRange(0, 100);
274     boxTransparency->setSingleStep(5);
275     hb2->addWidget(boxTransparency);
276 
277     QVBoxLayout *vl = new QVBoxLayout();
278     vl->addLayout(hb2);
279     vl->addLayout(hb1);
280 
281     colors = new QWidget();
282     colors->setLayout(vl);
283     generalDialog->addTab(colors, tr("&Colors"));
284 
285     connect(btnAxes, SIGNAL(clicked()), this, SLOT(pickAxesColor()));
286     connect(btnLabels, SIGNAL(clicked()), this, SLOT(pickLabelColor()));
287     connect(btnNumbers, SIGNAL(clicked()), this, SLOT(pickNumberColor()));
288     connect(btnBackground, SIGNAL(clicked()), this, SLOT(pickBgColor()));
289     connect(btnFromColor, SIGNAL(clicked()), this, SLOT(pickFromColor()));
290     connect(btnToColor, SIGNAL(clicked()), this, SLOT(pickToColor()));
291     connect(btnColorMap, SIGNAL(clicked()), this, SLOT(pickDataColorMap()));
292     connect(btnGrid, SIGNAL(clicked()), this, SLOT(pickGridColor()));
293     connect(btnMesh, SIGNAL(clicked()), this, SLOT(pickMeshColor()));
294     connect(boxTransparency, SIGNAL(valueChanged(int)), this, SLOT(changeTransparency(int)));
295 }
296 
initGeneralPage()297 void Plot3DDialog::initGeneralPage()
298 {
299     QGridLayout *gl1 = new QGridLayout();
300     boxLegend = new QCheckBox(tr("Show Legend"));
301     gl1->addWidget(boxLegend, 0, 0);
302     boxOrthogonal = new QCheckBox(tr("Orthogonal"));
303     gl1->addWidget(boxOrthogonal, 0, 1);
304 
305     gl1->addWidget(new QLabel(tr("Line Width")), 1, 0);
306     boxMeshLineWidth = new QSpinBox();
307     boxMeshLineWidth->setRange(1, 100);
308     gl1->addWidget(boxMeshLineWidth, 1, 1);
309 
310     gl1->addWidget(new QLabel(tr("Resolution")), 2, 0);
311     boxResolution = new QSpinBox();
312     boxResolution->setRange(1, 100);
313     boxResolution->setSpecialValueText("1 (all data)");
314     gl1->addWidget(boxResolution, 2, 1);
315 
316     gl1->addWidget(new QLabel(tr("Numbers Font")), 3, 0);
317     btnNumbersFont = new QPushButton(tr("&Choose Font"));
318     gl1->addWidget(btnNumbersFont, 3, 1);
319 
320     gl1->addWidget(new QLabel(tr("Distance labels - axis")), 4, 0);
321     boxDistance = new QSpinBox();
322     boxDistance->setRange(0, 1000);
323     boxDistance->setSingleStep(5);
324     gl1->addWidget(boxDistance, 4, 1);
325     gl1->setRowStretch(5, 1);
326 
327     QGroupBox *gb1 = new QGroupBox();
328     gb1->setLayout(gl1);
329 
330     QGridLayout *gl2 = new QGridLayout();
331     gl2->addWidget(new QLabel(tr("Zoom (%)")), 0, 0);
332     boxZoom = new QDoubleSpinBox();
333     boxZoom->setMinimum(0);
334     boxZoom->setMaximum(1e15);
335     boxZoom->setSingleStep(10);
336 
337     gl2->addWidget(boxZoom, 0, 1);
338     gl2->addWidget(new QLabel(tr("X Zoom (%)")), 1, 0);
339     boxXScale = new QDoubleSpinBox();
340     boxXScale->setMinimum(0);
341     boxXScale->setMaximum(1e15);
342     boxXScale->setSingleStep(10);
343     gl2->addWidget(boxXScale, 1, 1);
344 
345     gl2->addWidget(new QLabel(tr("Y Zoom (%)")), 2, 0);
346     boxYScale = new QDoubleSpinBox();
347     boxYScale->setMinimum(0);
348     boxYScale->setMaximum(1e15);
349     boxYScale->setSingleStep(10);
350     gl2->addWidget(boxYScale, 2, 1);
351 
352     gl2->addWidget(new QLabel(tr("Z Zoom (%)")), 3, 0);
353     boxZScale = new QDoubleSpinBox();
354     boxZScale->setMinimum(0);
355     boxZScale->setMaximum(1e15);
356     boxZScale->setSingleStep(10);
357     gl2->addWidget(boxZScale, 3, 1);
358     gl2->setRowStretch(4, 1);
359 
360     QGroupBox *gb2 = new QGroupBox();
361     gb2->setLayout(gl2);
362 
363     QHBoxLayout *hl = new QHBoxLayout();
364     hl->addWidget(gb1);
365     hl->addWidget(gb2);
366 
367     general = new QWidget();
368     general->setLayout(hl);
369     generalDialog->addTab(general, tr("&General"));
370 
371     connect(boxResolution, SIGNAL(valueChanged(int)), this, SIGNAL(updateResolution(int)));
372     connect(boxDistance, SIGNAL(valueChanged(int)), this, SIGNAL(adjustLabels(int)));
373     connect(boxMeshLineWidth, SIGNAL(valueChanged(int)), this, SIGNAL(updateMeshLineWidth(int)));
374     connect(boxOrthogonal, SIGNAL(toggled(bool)), this, SIGNAL(setOrtho(bool)));
375     connect(boxLegend, SIGNAL(toggled(bool)), this, SIGNAL(showColorLegend(bool)));
376     connect(boxZoom, SIGNAL(valueChanged(double)), this, SLOT(changeZoom(double)));
377     connect(boxXScale, SIGNAL(valueChanged(double)), this, SLOT(changeZoom(double)));
378     connect(boxYScale, SIGNAL(valueChanged(double)), this, SLOT(changeZoom(double)));
379     connect(boxZScale, SIGNAL(valueChanged(double)), this, SLOT(changeZoom(double)));
380     connect(btnNumbersFont, SIGNAL(clicked()), this, SLOT(pickNumbersFont()));
381 }
382 
initPointsOptionsStack()383 void Plot3DDialog::initPointsOptionsStack()
384 {
385     QHBoxLayout *hl1 = new QHBoxLayout();
386     hl1->addStretch();
387     hl1->addWidget(new QLabel(tr("Style")));
388     boxPointStyle = new QComboBox();
389     boxPointStyle->addItem(tr("Dot"));
390     boxPointStyle->addItem(tr("Cross Hair"));
391     boxPointStyle->addItem(tr("Cone"));
392     hl1->addWidget(boxPointStyle);
393 
394     optionStack = new QStackedWidget();
395     optionStack->setFrameShape(QFrame::StyledPanel);
396     optionStack->setFrameShadow(QStackedWidget::Plain);
397 
398     QGridLayout *gl1 = new QGridLayout();
399     gl1->addWidget(new QLabel(tr("Width")), 0, 0);
400     boxSize = new QLineEdit("5");
401     gl1->addWidget(boxSize, 0, 1);
402 
403     gl1->addWidget(new QLabel(tr("Smooth angles")), 1, 0);
404     boxSmooth = new QCheckBox();
405     boxSmooth->setChecked(false);
406     gl1->addWidget(boxSmooth, 1, 1);
407 
408     dotsPage = new QWidget();
409     dotsPage->setLayout(gl1);
410     optionStack->addWidget(dotsPage);
411 
412     QGridLayout *gl2 = new QGridLayout();
413     gl2->addWidget(new QLabel(tr("Radius")), 0, 0);
414     boxCrossRad = new QLineEdit("0.01");
415     gl2->addWidget(boxCrossRad, 0, 1);
416     gl2->addWidget(new QLabel(tr("Line Width")), 1, 0);
417     boxCrossLinewidth = new QLineEdit("1");
418     gl2->addWidget(boxCrossLinewidth, 1, 1);
419     gl2->addWidget(new QLabel(tr("Smooth line")), 2, 0);
420     boxCrossSmooth = new QCheckBox();
421     boxCrossSmooth->setChecked(true);
422     gl2->addWidget(boxCrossSmooth, 2, 1);
423     gl2->addWidget(new QLabel(tr("Boxed")), 3, 0);
424     boxBoxed = new QCheckBox();
425     boxBoxed->setChecked(false);
426     gl2->addWidget(boxBoxed, 3, 1);
427 
428     crossPage = new QWidget();
429     crossPage->setLayout(gl2);
430     optionStack->addWidget(crossPage);
431 
432     QGridLayout *gl3 = new QGridLayout();
433     gl3->addWidget(new QLabel(tr("Width")), 0, 0);
434     boxConesRad = new QLineEdit("0.5");
435     gl3->addWidget(boxConesRad, 0, 1);
436     gl3->addWidget(new QLabel(tr("Quality")), 1, 0);
437     boxQuality = new QSpinBox();
438     boxQuality->setRange(0, 40);
439     boxQuality->setValue(32);
440     gl3->addWidget(boxQuality, 1, 1);
441 
442     conesPage = new QWidget();
443     conesPage->setLayout(gl3);
444     optionStack->addWidget(conesPage);
445 
446     QVBoxLayout *vl = new QVBoxLayout();
447     vl->addLayout(hl1);
448     vl->addWidget(optionStack);
449 
450     points = new QWidget();
451     points->setLayout(vl);
452 
453     generalDialog->insertTab(4, points, tr("Points"));
454     connect(boxPointStyle, SIGNAL(activated(int)), optionStack, SLOT(setCurrentIndex(int)));
455 }
456 
showLowerGreek()457 void Plot3DDialog::showLowerGreek()
458 {
459     SymbolDialog *greekLetters = new SymbolDialog(SymbolDialog::lowerGreek, this, Qt::Tool);
460     greekLetters->setAttribute(Qt::WA_DeleteOnClose);
461     connect(greekLetters, SIGNAL(addLetter(const QString &)), this,
462             SLOT(addSymbol(const QString &)));
463     greekLetters->show();
464     greekLetters->activateWindow();
465 }
466 
showUpperGreek()467 void Plot3DDialog::showUpperGreek()
468 {
469     SymbolDialog *greekLetters = new SymbolDialog(SymbolDialog::upperGreek, this, Qt::Tool);
470     greekLetters->setAttribute(Qt::WA_DeleteOnClose);
471     connect(greekLetters, SIGNAL(addLetter(const QString &)), this,
472             SLOT(addSymbol(const QString &)));
473     greekLetters->show();
474     greekLetters->activateWindow();
475 }
476 
addSymbol(const QString & letter)477 void Plot3DDialog::addSymbol(const QString &letter)
478 {
479     if (generalDialog->currentWidget() == (QWidget *)title)
480         boxTitle->insert(letter);
481     else if (generalDialog->currentWidget() == (QWidget *)axes)
482         boxLabel->insert(letter);
483 }
484 
worksheet()485 void Plot3DDialog::worksheet()
486 {
487     emit showWorksheet();
488     close();
489 }
490 
customWorksheetBtn(const QString & text)491 void Plot3DDialog::customWorksheetBtn(const QString &text)
492 {
493     if (!text.isEmpty()) {
494         btnTable->show();
495         btnTable->setText(text);
496     }
497 }
498 
disableGridOptions()499 void Plot3DDialog::disableGridOptions()
500 {
501     btnGrid->setDisabled(true);
502 }
503 
disableAxesOptions()504 void Plot3DDialog::disableAxesOptions()
505 {
506     TicksGroupBox->setDisabled(true);
507     generalDialog->setTabEnabled(generalDialog->indexOf(axes), false);
508     AxesColorGroupBox->setDisabled(true);
509     boxDistance->setDisabled(true);
510     btnNumbersFont->setDisabled(true);
511 }
512 
showBarsTab(double rad)513 void Plot3DDialog::showBarsTab(double rad)
514 {
515     bars = new QWidget(generalDialog);
516     QHBoxLayout *bars_layout = new QHBoxLayout();
517     bars->setLayout(bars_layout);
518 
519     bars_layout->addWidget(new QLabel(tr("Width")));
520     boxBarsRad = new QLineEdit();
521     boxBarsRad->setText(QString::number(rad));
522     bars_layout->addWidget(boxBarsRad);
523 
524     generalDialog->insertTab(4, bars, tr("Bars"));
525 }
526 
showPointsTab(double rad,bool smooth)527 void Plot3DDialog::showPointsTab(double rad, bool smooth)
528 {
529     boxPointStyle->setCurrentIndex(0);
530     boxSize->setText(QString::number(rad));
531     boxSmooth->setChecked(smooth);
532     optionStack->setCurrentIndex(0);
533 }
534 
showConesTab(double rad,int quality)535 void Plot3DDialog::showConesTab(double rad, int quality)
536 {
537     boxPointStyle->setCurrentIndex(2);
538     boxConesRad->setText(QString::number(rad));
539     boxQuality->setValue(quality);
540     optionStack->setCurrentIndex(2);
541 }
542 
showCrossHairTab(double rad,double linewidth,bool smooth,bool boxed)543 void Plot3DDialog::showCrossHairTab(double rad, double linewidth, bool smooth, bool boxed)
544 {
545     boxPointStyle->setCurrentIndex(1);
546     boxCrossRad->setText(QString::number(rad));
547     boxCrossLinewidth->setText(QString::number(linewidth));
548     boxCrossSmooth->setChecked(smooth);
549     boxBoxed->setChecked(boxed);
550     optionStack->setCurrentIndex(1);
551 }
552 
disableMeshOptions()553 void Plot3DDialog::disableMeshOptions()
554 {
555     btnMesh->setDisabled(true);
556     boxMeshLineWidth->setDisabled(true);
557 }
558 
disableLegend()559 void Plot3DDialog::disableLegend()
560 {
561     boxLegend->setDisabled(true);
562 }
563 
setLabelsDistance(int dist)564 void Plot3DDialog::setLabelsDistance(int dist)
565 {
566     boxDistance->setValue(dist);
567 }
568 
pickDataColorMap()569 void Plot3DDialog::pickDataColorMap()
570 {
571     QString fn = QFileDialog::getOpenFileName(this, QString(), d_plot->colorMap(),
572                                               tr("Colormap files") + " (*.map *.MAP)");
573     if (!fn.isEmpty())
574         emit setDataColorMap(fn);
575 }
576 
pickFromColor()577 QColor Plot3DDialog::pickFromColor()
578 {
579     QColor c = QColorDialog::getColor(fromColor, this);
580     if (!c.isValid())
581         return fromColor;
582 
583     fromColor = c;
584     return fromColor;
585 }
586 
pickToColor()587 QColor Plot3DDialog::pickToColor()
588 {
589     QColor c = QColorDialog::getColor(toColor, this);
590     if (!c.isValid())
591         return toColor;
592 
593     toColor = c;
594     return toColor;
595 }
596 
pickGridColor()597 QColor Plot3DDialog::pickGridColor()
598 {
599     QColor c = QColorDialog::getColor(gridColor, this);
600     if (!c.isValid())
601         return gridColor;
602 
603     gridColor = c;
604     return gridColor;
605 }
606 
pickAxesColor()607 QColor Plot3DDialog::pickAxesColor()
608 {
609     QColor c = QColorDialog::getColor(axesColor, this);
610     if (!c.isValid())
611         return axesColor;
612 
613     axesColor = c;
614     return axesColor;
615 }
616 
pickBgColor()617 QColor Plot3DDialog::pickBgColor()
618 {
619     QColor c = QColorDialog::getColor(bgColor, this);
620     if (!c.isValid())
621         return bgColor;
622 
623     bgColor = c;
624     return bgColor;
625 }
626 
pickNumberColor()627 QColor Plot3DDialog::pickNumberColor()
628 {
629     QColor c = QColorDialog::getColor(numColor, this);
630     if (!c.isValid())
631         return numColor;
632 
633     numColor = c;
634     return numColor;
635 }
636 
pickLabelColor()637 QColor Plot3DDialog::pickLabelColor()
638 {
639     QColor c = QColorDialog::getColor(labelColor, this);
640     if (!c.isValid())
641         return labelColor;
642 
643     labelColor = c;
644     return labelColor;
645 }
646 
pickTitleColor()647 QColor Plot3DDialog::pickTitleColor()
648 {
649     QColor c = QColorDialog::getColor(titleColor, this);
650     if (!c.isValid())
651         return titleColor;
652 
653     titleColor = c;
654     return titleColor;
655 }
656 
pickTitleFont()657 void Plot3DDialog::pickTitleFont()
658 {
659     bool ok;
660     QFont font = QFontDialog::getFont(&ok, titleFont, this);
661     if (ok) {
662         titleFont = font;
663     } else {
664         return;
665     }
666 }
667 
pickNumbersFont()668 void Plot3DDialog::pickNumbersFont()
669 {
670     bool ok;
671     QFont font = QFontDialog::getFont(&ok, numbersFont, this);
672     if (ok) {
673         numbersFont = font;
674     } else {
675         return;
676     }
677 }
678 
viewAxisOptions(int axis)679 void Plot3DDialog::viewAxisOptions(int axis)
680 {
681     boxLabel->setText(labels[axis]);
682 
683     boxMajorLength->setText(tickLengths[2 * axis + 0]);
684     boxMinorLength->setText(tickLengths[2 * axis + 1]);
685 }
686 
setAxesLabels(const QStringList & list)687 void Plot3DDialog::setAxesLabels(const QStringList &list)
688 {
689     labels = list;
690     boxLabel->setText(labels[0]);
691 }
692 
setScales(const QStringList & list)693 void Plot3DDialog::setScales(const QStringList &list)
694 {
695     scales = list;
696     boxFrom->setText(scales[0]);
697     boxTo->setText(scales[1]);
698     boxMajors->setValue(scales[2].toInt());
699     boxMinors->setValue(scales[3].toInt());
700     boxType->setCurrentIndex(scales[4].toInt());
701 }
702 
setAxesTickLengths(const QStringList & list)703 void Plot3DDialog::setAxesTickLengths(const QStringList &list)
704 {
705     tickLengths = list;
706     boxMajorLength->setText(list[0]);
707     boxMinorLength->setText(list[1]);
708 }
709 
viewScaleLimits(int axis)710 void Plot3DDialog::viewScaleLimits(int axis)
711 {
712     boxFrom->setText(scales[5 * axis + 0]);
713     boxTo->setText(scales[5 * axis + 1]);
714     boxMajors->setValue(scales[5 * axis + 2].toInt());
715     boxMinors->setValue(scales[5 * axis + 3].toInt());
716     boxType->setCurrentIndex(scales[5 * axis + 4].toInt());
717 }
718 
setTitle(const QString & title)719 void Plot3DDialog::setTitle(const QString &title)
720 {
721     boxTitle->setText(title);
722 }
723 
setTitleFont(const QFont & font)724 void Plot3DDialog::setTitleFont(const QFont &font)
725 {
726     titleFont = font;
727 }
728 
pickMeshColor()729 QColor Plot3DDialog::pickMeshColor()
730 {
731 
732     QColor c = QColorDialog::getColor(meshColor, this);
733     if (!c.isValid())
734         return meshColor;
735 
736     meshColor = c;
737     return meshColor;
738 }
739 
accept()740 void Plot3DDialog::accept()
741 {
742     if (updatePlot())
743         close();
744 }
745 
setDataColors(const QColor & minColor,const QColor & maxColor)746 void Plot3DDialog::setDataColors(const QColor &minColor, const QColor &maxColor)
747 {
748     fromColor = minColor;
749     toColor = maxColor;
750 }
751 
setColors(const QColor & title,const QColor & mesh,const QColor & axes,const QColor & num,const QColor & label,const QColor & bg,const QColor & grid)752 void Plot3DDialog::setColors(const QColor &title, const QColor &mesh, const QColor &axes,
753                              const QColor &num, const QColor &label, const QColor &bg,
754                              const QColor &grid)
755 {
756     titleColor = title;
757     meshColor = mesh;
758     axesColor = axes;
759     numColor = num;
760     labelColor = label;
761     bgColor = bg;
762     gridColor = grid;
763 }
764 
showLegend(bool show)765 void Plot3DDialog::showLegend(bool show)
766 {
767     boxLegend->setChecked(show);
768 }
769 
changeZoom(double)770 void Plot3DDialog::changeZoom(double)
771 {
772     if (generalDialog->currentWidget() != (QWidget *)general)
773         return;
774 
775     emit updateZoom(boxZoom->value() * 0.01);
776     emit updateScaling(boxXScale->value(), boxYScale->value() * 0.01, boxZScale->value() * 0.01);
777 }
778 
changeTransparency(int val)779 void Plot3DDialog::changeTransparency(int val)
780 {
781     if (generalDialog->currentWidget() != (QWidget *)colors)
782         return;
783 
784     emit updateTransparency(val * 0.01);
785 }
786 
updatePlot()787 bool Plot3DDialog::updatePlot()
788 {
789     int axis = -1;
790 
791     if (generalDialog->currentWidget() == (QWidget *)bars) {
792         emit updateBars(boxBarsRad->text().toDouble());
793     }
794 
795     if (generalDialog->currentWidget() == (QWidget *)points) {
796         if (boxPointStyle->currentIndex() == 0)
797             emit updatePoints(boxSize->text().toDouble(), boxSmooth->isChecked());
798         else if (boxPointStyle->currentIndex() == 1)
799             emit updateCross(boxCrossRad->text().toDouble(), boxCrossLinewidth->text().toDouble(),
800                              boxCrossSmooth->isChecked(), boxBoxed->isChecked());
801         else if (boxPointStyle->currentIndex() == 2)
802             emit updateCones(boxConesRad->text().toDouble(), boxQuality->value());
803     }
804 
805     if (generalDialog->currentWidget() == (QWidget *)title) {
806         emit updateTitle(boxTitle->text(), titleColor, titleFont);
807     }
808 
809     if (generalDialog->currentWidget() == (QWidget *)colors) {
810         emit updateTransparency(boxTransparency->value() * 0.01);
811         emit updateDataColors(fromColor, toColor);
812         emit updateColors(meshColor, axesColor, numColor, labelColor, bgColor, gridColor);
813     }
814 
815     if (generalDialog->currentWidget() == (QWidget *)general) {
816         emit showColorLegend(boxLegend->isChecked());
817         emit updateMeshLineWidth(boxMeshLineWidth->value());
818         emit adjustLabels(boxDistance->value());
819         emit updateResolution(boxResolution->value());
820         emit showColorLegend(boxLegend->isChecked());
821         emit setNumbersFont(numbersFont);
822         emit updateZoom(boxZoom->value() * 0.01);
823         emit updateScaling(boxXScale->value() * 0.01, boxYScale->value() * 0.01,
824                            boxZScale->value() * 0.01);
825     }
826 
827     if (generalDialog->currentWidget() == (QWidget *)scale) {
828         axis = axesList->currentRow();
829         QString from = boxFrom->text().toLower();
830         QString to = boxTo->text().toLower();
831         double start, end;
832         bool error = false;
833         try {
834             MyParser parser;
835             parser.SetExpr(from);
836             start = parser.Eval();
837         } catch (mu::ParserError &e) {
838             QMessageBox::critical(0, tr("Start limit error"), QStringFromString(e.GetMsg()));
839             boxFrom->setFocus();
840             error = true;
841             return false;
842         }
843         try {
844             MyParser parser;
845             parser.SetExpr(to);
846             end = parser.Eval();
847         } catch (mu::ParserError &e) {
848             QMessageBox::critical(0, tr("End limit error"), QStringFromString(e.GetMsg()));
849             boxTo->setFocus();
850             error = true;
851             return false;
852         }
853 
854         if (start >= end) {
855             QMessageBox::critical(0, tr("Input error"),
856                                   tr("Please enter scale limits that satisfy: from < to!"));
857             boxTo->setFocus();
858             return false;
859         }
860 
861         if (!error)
862             emit updateScale(axis,
863                              scaleOptions(axis, start, end, boxMajors->text(), boxMinors->text()));
864     }
865 
866     if (generalDialog->currentWidget() == (QWidget *)axes) {
867         axis = axesList2->currentRow();
868         labels[axis] = boxLabel->text();
869         emit updateLabel(axis, boxLabel->text(), axisFont(axis));
870         emit updateTickLength(axis, boxMajorLength->text().toDouble(),
871                               boxMinorLength->text().toDouble());
872     }
873 
874     return true;
875 }
876 
scaleOptions(int axis,double start,double end,const QString & majors,const QString & minors)877 QStringList Plot3DDialog::scaleOptions(int axis, double start, double end, const QString &majors,
878                                        const QString &minors)
879 {
880     Q_ASSERT(0 <= axis);
881     Q_ASSERT(5 * axis + 4 < scales.size());
882     QStringList l;
883     l << QString::number(start);
884     l << QString::number(end);
885     l << majors;
886     l << minors;
887     l << QString::number(boxType->currentIndex());
888 
889     for (int i = 0; i < 5; i++)
890         scales[5 * axis + i] = l[i];
891     return l;
892 }
893 
setMeshLineWidth(double lw)894 void Plot3DDialog::setMeshLineWidth(double lw)
895 {
896     boxMeshLineWidth->setValue(int(lw));
897 }
898 
setAxesFonts(const QFont & xf,const QFont & yf,const QFont & zf)899 void Plot3DDialog::setAxesFonts(const QFont &xf, const QFont &yf, const QFont &zf)
900 {
901     xAxisFont = xf;
902     yAxisFont = yf;
903     zAxisFont = zf;
904 }
905 
pickAxisLabelFont()906 void Plot3DDialog::pickAxisLabelFont()
907 {
908     bool ok;
909     QFont font;
910     switch (axesList2->currentRow()) {
911     case 0:
912         font = QFontDialog::getFont(&ok, xAxisFont, this);
913         if (ok)
914             xAxisFont = font;
915         else
916             return;
917         break;
918 
919     case 1:
920         font = QFontDialog::getFont(&ok, yAxisFont, this);
921         if (ok)
922             yAxisFont = font;
923         else
924             return;
925         break;
926 
927     case 2:
928         font = QFontDialog::getFont(&ok, zAxisFont, this);
929         if (ok)
930             zAxisFont = font;
931         else
932             return;
933         break;
934     }
935 }
936 
axisFont(int axis)937 QFont Plot3DDialog::axisFont(int axis)
938 {
939     QFont f;
940     switch (axis) {
941     case 0:
942         f = xAxisFont;
943         break;
944 
945     case 1:
946         f = yAxisFont;
947         break;
948 
949     case 2:
950         f = zAxisFont;
951         break;
952     }
953     return f;
954 }
955 
setTransparency(double t)956 void Plot3DDialog::setTransparency(double t)
957 {
958     boxTransparency->setValue(int(100 * t));
959 }
960 
setResolution(int r)961 void Plot3DDialog::setResolution(int r)
962 {
963     boxResolution->setValue(r);
964 }
965 
setZoom(double zoom)966 void Plot3DDialog::setZoom(double zoom)
967 {
968     boxZoom->setValue(zoom * 100);
969 }
970 
setScaling(double xVal,double yVal,double zVal)971 void Plot3DDialog::setScaling(double xVal, double yVal, double zVal)
972 {
973     boxXScale->setValue(xVal * 100);
974     boxYScale->setValue(yVal * 100);
975     boxZScale->setValue(zVal * 100);
976 }
977 
showGeneralTab()978 void Plot3DDialog::showGeneralTab()
979 {
980     generalDialog->setCurrentIndex(generalDialog->indexOf(general));
981 }
982 
showTitleTab()983 void Plot3DDialog::showTitleTab()
984 {
985     generalDialog->setCurrentIndex(2);
986 }
987 
showAxisTab()988 void Plot3DDialog::showAxisTab()
989 {
990     generalDialog->setCurrentIndex(1);
991 }
992 
~Plot3DDialog()993 Plot3DDialog::~Plot3DDialog() { }
994