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