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 "markerstab.h"
14 
15 #include "plotdefines.h"
16 
17 #include <QMessageBox>
18 
19 namespace Kst {
20 
MarkersTab(QWidget * parent)21 MarkersTab::MarkersTab(QWidget *parent)
22   : DialogTab(parent) {
23 
24   setupUi(this);
25   setTabTitle(tr("Markers"));
26 
27   _markerLineStyle->addItem(tr("Solid Line", "Pen type"), (int)Qt::SolidLine);
28   _markerLineStyle->addItem(tr("Dash Line", "Pen type"), (int)Qt::DashLine);
29   _markerLineStyle->addItem(tr("Dot Line", "Pen type"), (int)Qt::DotLine);
30   _markerLineStyle->addItem(tr("Dash Dot Line", "Pen type"), (int)Qt::DashDotLine);
31   _markerLineStyle->addItem(tr("Dash Dot Dot Line", "Pen type"), (int)Qt::DashDotDotLine);
32   _markerLineStyle->addItem(tr("Custom Dash Line", "Pen type"), (int)Qt::CustomDashLine);
33 
34   connect(_curveMarkers, SIGNAL(stateChanged(int)), this, SLOT(update()));
35   connect(_vectorMarkers, SIGNAL(stateChanged(int)), this, SLOT(update()));
36   connect(_currentMarkersList, SIGNAL(itemSelectionChanged()), this, SLOT(update()));
37   connect(_newMarker, SIGNAL(textChanged(QString)), this, SLOT(update()));
38 
39   connect(_markerLineStyle, SIGNAL(currentIndexChanged(int)), this, SIGNAL(modified()));
40   connect(_markerLineColor, SIGNAL(changed(QColor)), this, SIGNAL(modified()));
41   connect(_curveMarkers, SIGNAL(stateChanged(int)), this, SIGNAL(modified()));
42   connect(_vectorMarkers, SIGNAL(stateChanged(int)), this, SIGNAL(modified()));
43   connect(_vector, SIGNAL(selectionChanged(QString)), this, SIGNAL(modified()));
44   connect(_curve, SIGNAL(selectionChanged(QString)), this, SIGNAL(modified()));
45   connect(_risingEdge, SIGNAL(toggled(bool)), this, SIGNAL(modified()));
46   connect(_fallingEdge, SIGNAL(toggled(bool)), this, SIGNAL(modified()));
47   connect(_both, SIGNAL(toggled(bool)), this, SIGNAL(modified()));
48   connect(_markerLineWidth, SIGNAL(valueChanged(double)), this, SIGNAL(modified()));
49 
50   connect(_addMarker, SIGNAL(clicked()), this, SLOT(add()));
51   connect(_removeMarker, SIGNAL(clicked()), this, SLOT(remove()));
52   connect(_clearMarkers, SIGNAL(clicked()), this, SLOT(clear()));
53 
54   connect(this, SIGNAL(modified()), this, SLOT(setDirty()));
55 
56   update();
57 
58 }
59 
60 
~MarkersTab()61 MarkersTab::~MarkersTab() {
62 }
63 
64 
setObjectStore(ObjectStore * store)65 void MarkersTab::setObjectStore(ObjectStore *store) {
66   _vector->setObjectStore(store);
67   _curve->setObjectStore(store);
68 }
69 
70 
update()71 void MarkersTab::update() {
72   _curve->setEnabled(_curveMarkers->isChecked());
73   _risingEdge->setEnabled(_curveMarkers->isChecked());
74   _fallingEdge->setEnabled(_curveMarkers->isChecked());
75   _both->setEnabled(_curveMarkers->isChecked());
76   _vector->setEnabled(_vectorMarkers->isChecked());
77 
78   _removeMarker->setEnabled(_currentMarkersList->selectedItems().count() > 0);
79   _clearMarkers->setEnabled(_currentMarkersList->count() > 0);
80   _addMarker->setEnabled(!_newMarker->text().isEmpty());
81 }
82 
83 
lineStyle() const84 Qt::PenStyle MarkersTab::lineStyle() const {
85   return Qt::PenStyle(_markerLineStyle->itemData(_markerLineStyle->currentIndex()).toInt());
86 }
87 
88 
setLineStyle(Qt::PenStyle style)89 void MarkersTab::setLineStyle(Qt::PenStyle style) {
90   _markerLineStyle->setCurrentIndex(_markerLineStyle->findData(QVariant((int)style)));
91 }
92 
93 
lineColor() const94 QColor MarkersTab::lineColor() const {
95   return _markerLineColor->color();
96 }
97 
98 
setLineColor(const QColor & color)99 void MarkersTab::setLineColor(const QColor &color) {
100   _markerLineColor->setColor(color);
101 }
102 
103 
lineWidth() const104 double MarkersTab::lineWidth() const {
105   return _markerLineWidth->value();
106 }
107 
108 
setLineWidth(const double width)109 void MarkersTab::setLineWidth(const double width) {
110   _markerLineWidth->setValue(width);
111 }
112 
113 
isCurveSource() const114 bool MarkersTab::isCurveSource() const {
115   return _curveMarkers->isChecked();
116 }
117 
118 
setCurveSource(const bool enabled)119 void MarkersTab::setCurveSource(const bool enabled) {
120   _curveMarkers->setChecked(enabled);
121 }
122 
123 
isVectorSource() const124 bool MarkersTab::isVectorSource() const {
125   return _vectorMarkers->isChecked();
126 }
127 
128 
setVectorSource(const bool enabled)129 void MarkersTab::setVectorSource(const bool enabled) {
130   _vectorMarkers->setChecked(enabled);
131 }
132 
133 
vector() const134 VectorPtr MarkersTab::vector() const {
135   return _vector->selectedVector();
136 }
137 
138 
setVector(const VectorPtr vector)139 void MarkersTab::setVector(const VectorPtr vector) {
140   _vector->setSelectedVector(vector);
141 }
142 
143 
curveMarkerMode() const144 PlotMarkers::CurveMarkerMode MarkersTab::curveMarkerMode() const {
145   if (_risingEdge->isChecked()) {
146     return PlotMarkers::RisingEdge;
147   } else if (_fallingEdge->isChecked()) {
148     return PlotMarkers::FallingEdge;
149   } else {
150     return PlotMarkers::BothEdges;
151   }
152 }
153 
154 
setCurveMarkerMode(const PlotMarkers::CurveMarkerMode mode)155 void MarkersTab::setCurveMarkerMode(const PlotMarkers::CurveMarkerMode mode) {
156   if (mode == PlotMarkers::RisingEdge) {
157     _risingEdge->setChecked(true);
158   } else if (mode == PlotMarkers::FallingEdge) {
159     _fallingEdge->setChecked(true);
160   } else {
161     _both->setChecked(true);
162   }
163 }
164 
165 
markers() const166 QList<double> MarkersTab::markers() const {
167   QList<double> markerList;
168   foreach(QListWidgetItem *item, _currentMarkersList->findItems("*", Qt::MatchWildcard)) {
169     markerList << item->text().toDouble();
170   }
171   return markerList;
172 }
173 
174 
setMarkers(const QList<double> & markers)175 void MarkersTab::setMarkers(const QList<double> &markers) {
176   QStringList markerList;
177   foreach(double marker, markers) {
178     markerList << QString::number(marker, 'g', MARKER_LABEL_PRECISION);
179   }
180   _currentMarkersList->clear();
181   _currentMarkersList->addItems(markerList);
182 }
183 
184 
curve() const185 CurvePtr MarkersTab::curve() const {
186   return _curve->selectedCurve();
187 }
188 
189 
setCurve(CurvePtr curve)190 void MarkersTab::setCurve(CurvePtr curve) {
191   _curve->setSelectedCurve(curve);
192 }
193 
194 
add()195 void MarkersTab::add() {
196   if (!_newMarker->text().isEmpty()) {
197     bool ok;
198     double newMarkerValue = _newMarker->text().toDouble(&ok);
199 
200     if (ok) {
201       int i = 0;
202       QString newMarkerString;
203 
204       newMarkerString.setNum(newMarkerValue, 'g', MARKER_LABEL_PRECISION);
205       while (i < _currentMarkersList->count() && _currentMarkersList->item(i)->text().toDouble() < newMarkerValue) {
206         i++;
207       }
208       if (i == _currentMarkersList->count()) {
209         _currentMarkersList->addItem(newMarkerString);
210         _newMarker->clear();
211         update();
212         emit modified();
213       } else if (newMarkerValue != _currentMarkersList->item(i)->text().toDouble()) {
214         _currentMarkersList->insertItem(i, newMarkerString);
215         _newMarker->clear();
216         update();
217         emit modified();
218       } else {
219         QMessageBox::warning(this, tr("Kst"), tr("A plot marker with equal (or very close) value already exists."));
220       }
221     } else {
222         QMessageBox::warning(this, tr("Kst"), tr("The text you have entered is not a valid number."));
223     }
224   }
225 }
226 
227 
remove()228 void MarkersTab::remove() {
229   foreach(QListWidgetItem *item, _currentMarkersList->selectedItems()) {
230     _currentMarkersList->takeItem(_currentMarkersList->row(item));
231   }
232   emit modified();
233 }
234 
235 
clear()236 void MarkersTab::clear() {
237   _currentMarkersList->clear();
238   emit modified();
239 }
240 
241 
plotMarkers() const242 PlotMarkers MarkersTab::plotMarkers() const {
243   PlotMarkers plotMarker = _plotMarkers;
244   plotMarker.setManualMarkers(markers());
245   plotMarker.setLineStyle(lineStyle());
246   plotMarker.setLineColor(lineColor());
247   plotMarker.setLineWidth(lineWidth());
248   if (isVectorSource()) {
249     plotMarker.setVector(vector());
250   } else {
251     plotMarker.setVector(0);
252   }
253   if (isCurveSource()) {
254     plotMarker.setCurve(curve());
255   } else {
256     plotMarker.setCurve(0);
257   }
258   plotMarker.setCurveMarkerMode(curveMarkerMode());
259   return plotMarker;
260 }
261 
262 
setPlotMarkers(const PlotMarkers & plotMarkers)263 void MarkersTab::setPlotMarkers(const PlotMarkers &plotMarkers) {
264   _plotMarkers = plotMarkers;
265   setMarkers(plotMarkers.manualMarkers());
266   setLineStyle(plotMarkers.lineStyle());
267   setLineColor(plotMarkers.lineColor());
268   setLineWidth(plotMarkers.lineWidth());
269   setCurveMarkerMode(plotMarkers.curveMarkerMode());
270   if (plotMarkers.isVectorSource()) {
271     setVector(plotMarkers.vector());
272     setVectorSource(true);
273   } else {
274     setVectorSource(false);
275   }
276   if (plotMarkers.isCurveSource()) {
277     setCurve(plotMarkers.curve());
278     setCurveSource(true);
279   } else {
280     setCurveSource(false);
281   }
282   _dirty = false;
283 }
284 
285 
clearTabValues()286 void MarkersTab::clearTabValues() {
287   _currentMarkersList->clear();
288   _hidden->setChecked(true);
289   _markerLineStyle->setCurrentIndex(-1);
290   _markerLineColor->clearSelection();
291   _markerLineWidth->clear();
292 
293   _curve->clearSelection();
294   _vector->clearSelection();
295 
296   _curveMarkers->setCheckState(Qt::PartiallyChecked);
297   _vectorMarkers->setCheckState(Qt::PartiallyChecked);
298 }
299 
300 
enableSingleEditOptions(bool enabled)301 void MarkersTab::enableSingleEditOptions(bool enabled) {
302   if (enabled) {
303     _curveMarkers->setTristate(false);
304     _vectorMarkers->setTristate(false);
305   }
306 }
307 
308 }
309 
310 // vim: ts=2 sw=2 et
311