• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.12
  • kdeedu
  • marble
  • src
  • lib
  • marble
LatLonEdit.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2008 Henry de Valence <hdevalence@gmail.com>
9 // Copyright 2011 Friedrich W. H. Kossebau <kossebau@kde.org>
10 
11 
12 #include "LatLonEdit.h"
13 #include "ui_LatLonEdit.h"
14 
15 #include <QWidget>
16 #include "MarbleDebug.h"
17 
18 #include "MarbleGlobal.h"
19 
20 
21 namespace Marble
22 {
23 
24 // This widget can have 3 different designs, one per notation (Decimal, DMS, DM)
25 // To reduce the footprint this was not implemented using a stack of widgets
26 // where each widget offer the needed design for another notation.
27 // Instead, as Decimal and DM are both using subsets of the UI elements used
28 // for DMS, just the UI elements for DMS are created and modified as needed,
29 // if another notation is selected. This involves showing and hiding them and
30 // setting the proper suffix and min/max values.
31 // The logic per notation is moved into specialized subclasses of a class
32 // AbstractInputHandler.
33 // TODO: simply remove the LatLonEdit.ui file and embed code directly here?
34 
35 enum { PositiveSphereIndex = 0, NegativeSphereIndex = 1 };
36 
37 
38 class LatLonEditPrivate;
39 
40 class AbstractInputHandler // TODO: better name
41 {
42 protected:
43  AbstractInputHandler(LatLonEditPrivate *ui) : m_ui(ui) {}
44 public:
45  virtual ~AbstractInputHandler() {}
46 
47 public: // API to be implemented
48  virtual void setupUi() = 0;
49  virtual void setupMinMax(Dimension dimension) = 0;
50  virtual void setValue(qreal value) = 0;
51  virtual void handleIntEditChange() = 0;
52  virtual void handleUIntEditChange() = 0;
53  virtual void handleFloatEditChange() = 0;
54  virtual qreal calculateValue() const = 0;
55 
56 protected:
57  LatLonEditPrivate * const m_ui;
58 };
59 
60 class DecimalInputHandler : public AbstractInputHandler
61 {
62 public:
63  DecimalInputHandler(LatLonEditPrivate *ui) : AbstractInputHandler(ui) {}
64 public: // AbstractInputHandler API
65  virtual void setupUi();
66  virtual void setupMinMax(Dimension dimension);
67  virtual void setValue(qreal value);
68  virtual void handleIntEditChange();
69  virtual void handleUIntEditChange();
70  virtual void handleFloatEditChange();
71  virtual qreal calculateValue() const;
72 };
73 
74 class DMSInputHandler : public AbstractInputHandler
75 {
76 public:
77  DMSInputHandler(LatLonEditPrivate *ui) : AbstractInputHandler(ui) {}
78 public: // AbstractInputHandler API
79  virtual void setupUi();
80  virtual void setupMinMax(Dimension dimension);
81  virtual void setValue(qreal value);
82  virtual void handleIntEditChange();
83  virtual void handleUIntEditChange();
84  virtual void handleFloatEditChange();
85  virtual qreal calculateValue() const;
86 };
87 
88 class DMInputHandler : public AbstractInputHandler
89 {
90 public:
91  DMInputHandler(LatLonEditPrivate *ui) : AbstractInputHandler(ui) {}
92 public: // AbstractInputHandler API
93  virtual void setupUi();
94  virtual void setupMinMax(Dimension dimension);
95  virtual void setValue(qreal value);
96  virtual void handleIntEditChange();
97  virtual void handleUIntEditChange();
98  virtual void handleFloatEditChange();
99 
100  virtual qreal calculateValue() const;
101 };
102 
103 class LatLonEditPrivate : public Ui::LatLonEditPrivate
104 {
105  friend class DecimalInputHandler;
106  friend class DMSInputHandler;
107  friend class DMInputHandler;
108 
109 public:
110  Dimension m_dimension;
111  qreal m_value;
112  GeoDataCoordinates::Notation m_notation;
113  AbstractInputHandler *m_inputHandler;
114  // flag which indicates that the widgets are updated due to a change
115  // in one of the other widgets. Q*SpinBox does not have a signal which is
116  // only emitted by a change due to user input, not code setting a new value.
117  // This flag should be less expensive then disconnecting from and reconnecting
118  // to the valueChanged signal of all widgets.
119  bool m_updating : 1;
120 
121  LatLonEditPrivate();
122  ~LatLonEditPrivate();
123  void init(QWidget* parent);
124 };
125 
126 
127 static void
128 switchSign( QComboBox *sign )
129 {
130  const bool isNegativeSphere = (sign->currentIndex() == NegativeSphereIndex);
131  sign->setCurrentIndex( isNegativeSphere ? PositiveSphereIndex : NegativeSphereIndex );
132 }
133 
134 void DecimalInputHandler::setupUi()
135 {
136  m_ui->m_floatValueEditor->setSuffix(LatLonEdit::trUtf8("\xC2\xB0")); // the degree symbol °
137  m_ui->m_floatValueEditor->setDecimals(5);
138 
139  m_ui->m_intValueEditor->hide();
140  m_ui->m_uintValueEditor->hide();
141 }
142 
143 void DecimalInputHandler::setupMinMax(Dimension dimension)
144 {
145  const qreal maxValue = (dimension == Longitude) ? 180.0 : 90.0;
146 
147  m_ui->m_floatValueEditor->setMinimum(-maxValue);
148  m_ui->m_floatValueEditor->setMaximum( maxValue);
149 }
150 
151 void DecimalInputHandler::setValue(qreal value)
152 {
153  value = qAbs(value);
154 
155  m_ui->m_floatValueEditor->setValue(value);
156 }
157 
158 void DecimalInputHandler::handleIntEditChange()
159 {
160  // nothing to do, perhaps rather disconnect the signal with this notation
161 }
162 
163 void DecimalInputHandler::handleUIntEditChange()
164 {
165  // nothing to do, perhaps rather disconnect the signal with this notation
166 }
167 
168 void DecimalInputHandler::handleFloatEditChange()
169 {
170  // nothing to do, perhaps rather disconnect the signal with this notation
171 }
172 
173 qreal DecimalInputHandler::calculateValue() const
174 {
175  qreal value = m_ui->m_floatValueEditor->value();
176 
177  if (m_ui->m_sign->currentIndex() == NegativeSphereIndex) {
178  value *= -1;
179  }
180 
181  return value;
182 }
183 
184 void DMSInputHandler::setupUi()
185 {
186  m_ui->m_uintValueEditor->setSuffix(LatLonEdit::tr("'"));
187  m_ui->m_floatValueEditor->setSuffix(LatLonEdit::tr("\""));
188  m_ui->m_floatValueEditor->setDecimals(2);
189 
190  m_ui->m_intValueEditor->show();
191  m_ui->m_uintValueEditor->show();
192 }
193 
194 void DMSInputHandler::setupMinMax(Dimension dimension)
195 {
196  const int maxValue = (dimension == Longitude) ? 180 : 90;
197 
198  m_ui->m_intValueEditor->setMinimum(-maxValue);
199  m_ui->m_intValueEditor->setMaximum( maxValue);
200 }
201 
202 void DMSInputHandler::setValue(qreal value)
203 {
204  value = qAbs( value );
205 
206  int degValue = (int) value;
207 
208  qreal minFValue = 60 * (value - degValue);
209  int minValue = (int) minFValue;
210  qreal secFValue = 60 * (minFValue - minValue);
211  // Adjustment for fuzziness (like 49.999999999999999999999)
212  int secValue = qRound(secFValue);
213  if (secValue > 59) {
214  secFValue = 0.0;
215  ++minValue;
216  }
217  if (minValue > 59) {
218  minValue = 0;
219  ++degValue;
220  }
221 
222  m_ui->m_intValueEditor->setValue( degValue );
223  m_ui->m_uintValueEditor->setValue( minValue );
224  m_ui->m_floatValueEditor->setValue( secFValue );
225 }
226 
227 void DMSInputHandler::handleIntEditChange()
228 {
229  const int degValue = m_ui->m_intValueEditor->value();
230  const int minDegValue = m_ui->m_intValueEditor->minimum();
231  const int maxDegValue = m_ui->m_intValueEditor->maximum();
232  // at max/min?
233  if (degValue <= minDegValue || maxDegValue <= degValue) {
234  m_ui->m_uintValueEditor->setValue( 0 );
235  m_ui->m_floatValueEditor->setValue( 0.0 );
236  }
237 }
238 
239 void DMSInputHandler::handleUIntEditChange()
240 {
241  const int degValue = m_ui->m_intValueEditor->value();
242  const int minValue = m_ui->m_uintValueEditor->value();
243 
244  if (minValue < 0) {
245  if (degValue != 0) {
246  m_ui->m_uintValueEditor->setValue( 59 );
247  const int degDec = (degValue > 0) ? 1 : -1;
248  m_ui->m_intValueEditor->setValue( degValue - degDec );
249  } else {
250  switchSign( m_ui->m_sign );
251  m_ui->m_uintValueEditor->setValue( 1 );
252  }
253  } else {
254  const int minDegValue = m_ui->m_intValueEditor->minimum();
255  const int maxDegValue = m_ui->m_intValueEditor->maximum();
256  // at max/min already?
257  if (degValue <= minDegValue || maxDegValue <= degValue) {
258  // ignore
259  m_ui->m_uintValueEditor->setValue( 0 );
260  // overflow?
261  } else if (minValue >= 60) {
262  m_ui->m_uintValueEditor->setValue( 0 );
263  // will reach max/min?
264  if (minDegValue+1 == degValue || degValue == maxDegValue-1) {
265  // reset also sec
266  m_ui->m_floatValueEditor->setValue( 0.0 );
267  }
268  const int degInc = (degValue > 0) ? 1 : -1;
269  m_ui->m_intValueEditor->setValue( degValue + degInc );
270  }
271  }
272 }
273 
274 void DMSInputHandler::handleFloatEditChange()
275 {
276  const int degValue = m_ui->m_intValueEditor->value();
277  const int minValue = m_ui->m_uintValueEditor->value();
278  const qreal secValue = m_ui->m_floatValueEditor->value();
279 
280  if (secValue < 0.0) {
281  const qreal secDiff = -secValue;
282  if (degValue == 0 && minValue == 0) {
283  switchSign( m_ui->m_sign );
284  m_ui->m_floatValueEditor->setValue( secDiff );
285  } else {
286  m_ui->m_floatValueEditor->setValue( 60.0 - secDiff );
287  if (minValue > 0) {
288  m_ui->m_uintValueEditor->setValue( minValue - 1 );
289  } else {
290  m_ui->m_uintValueEditor->setValue( 59 );
291  const int degDec = (degValue > 0) ? 1 : -1;
292  m_ui->m_intValueEditor->setValue( degValue - degDec );
293  }
294  }
295  } else {
296  const int minDegValue = m_ui->m_intValueEditor->minimum();
297  const int maxDegValue = m_ui->m_intValueEditor->maximum();
298  // at max/min already?
299  if (degValue <= minDegValue || maxDegValue <= degValue) {
300  // ignore
301  m_ui->m_floatValueEditor->setValue( 0.0 );
302  // need to inc minutes?
303  } else if (secValue >= 60.0) {
304  qreal newSec = secValue - 60.0;
305  // will reach max/min?
306  if (minValue == 59) {
307  m_ui->m_uintValueEditor->setValue( 0 );
308  // will reach max/min?
309  if (minDegValue+1 == degValue || degValue == maxDegValue-1) {
310  // reset also sec
311  newSec = 0.0;
312  }
313  const int degInc = (degValue > 0) ? 1 : -1;
314  m_ui->m_intValueEditor->setValue( degValue + degInc );
315  } else {
316  m_ui->m_uintValueEditor->setValue( minValue + 1 );
317  }
318  m_ui->m_floatValueEditor->setValue( newSec );
319  }
320  }
321 }
322 
323 qreal DMSInputHandler::calculateValue() const
324 {
325  const bool isNegativeDeg = ( m_ui->m_intValueEditor->value() < 0 );
326 
327  const qreal deg = (qreal)(qAbs(m_ui->m_intValueEditor->value()));
328  const qreal min = (qreal)(m_ui->m_uintValueEditor->value()) / 60.0;
329  const qreal sec = m_ui->m_floatValueEditor->value() / 3600.0;
330 
331  qreal value = deg + min + sec;
332 
333  if (isNegativeDeg) {
334  value *= -1;
335  }
336  if (m_ui->m_sign->currentIndex() == NegativeSphereIndex) {
337  value *= -1;
338  }
339 
340  return value;
341 }
342 
343 void DMInputHandler::setupUi()
344 {
345  m_ui->m_floatValueEditor->setSuffix(LatLonEdit::tr("'"));
346  m_ui->m_floatValueEditor->setDecimals(2);
347 
348  m_ui->m_intValueEditor->show();
349  m_ui->m_uintValueEditor->hide();
350 }
351 
352 void DMInputHandler::setupMinMax(Dimension dimension)
353 {
354  const int maxValue = (dimension == Longitude) ? 180 : 90;
355 
356  m_ui->m_intValueEditor->setMinimum(-maxValue);
357  m_ui->m_intValueEditor->setMaximum( maxValue);
358 }
359 
360 void DMInputHandler::setValue(qreal value)
361 {
362  value = qAbs(value);
363 
364  int degValue = (int)value;
365 
366  qreal minFValue = 60 * (value - degValue);
367  // Adjustment for fuzziness (like 49.999999999999999999999)
368  int minValue = qRound( minFValue );
369  if (minValue > 59) {
370  minFValue = 0.0;
371  ++degValue;
372  }
373 
374  m_ui->m_intValueEditor->setValue( degValue );
375  m_ui->m_floatValueEditor->setValue( minFValue );
376 }
377 
378 void DMInputHandler::handleIntEditChange()
379 {
380  const int degValue = m_ui->m_intValueEditor->value();
381  const int minDegValue = m_ui->m_intValueEditor->minimum();
382  const int maxDegValue = m_ui->m_intValueEditor->maximum();
383  // at max/min?
384  if (degValue <= minDegValue || maxDegValue <= degValue) {
385  m_ui->m_floatValueEditor->setValue( 0.0 );
386  }
387 }
388 
389 void DMInputHandler::handleUIntEditChange()
390 {
391  // nothing to be done here, should be never called
392 }
393 
394 void DMInputHandler::handleFloatEditChange()
395 {
396  const int degValue = m_ui->m_intValueEditor->value();
397  const qreal minValue = m_ui->m_floatValueEditor->value();
398 
399  if (minValue < 0.0) {
400  const qreal minDiff = -minValue;
401  if (degValue == 0) {
402  switchSign( m_ui->m_sign );
403  m_ui->m_floatValueEditor->setValue( minDiff );
404  } else {
405  m_ui->m_floatValueEditor->setValue( 60.0 - minDiff );
406  m_ui->m_intValueEditor->setValue( degValue - 1 );
407  }
408  } else {
409  const int minDegValue = m_ui->m_intValueEditor->minimum();
410  const int maxDegValue = m_ui->m_intValueEditor->maximum();
411  // at max/min already?
412  if (degValue <= minDegValue || maxDegValue <= degValue) {
413  // ignore
414  m_ui->m_floatValueEditor->setValue( 0.0 );
415  // need to inc degrees?
416  } else if (minValue >= 60.0) {
417  qreal newMin = minValue - 60.0;
418  // will reach max/min?
419  if (minDegValue+1 == degValue || degValue == maxDegValue-1) {
420  // reset also sec
421  newMin = 0.0;
422  } else {
423  m_ui->m_intValueEditor->setValue( degValue + 1 );
424  }
425  m_ui->m_floatValueEditor->setValue( newMin );
426  }
427  }
428 }
429 
430 qreal DMInputHandler::calculateValue() const
431 {
432  const bool isNegativeDeg = ( m_ui->m_intValueEditor->value() < 0 );
433 
434  const qreal deg = (qreal)(qAbs(m_ui->m_intValueEditor->value()));
435  const qreal min = m_ui->m_floatValueEditor->value() / 60.0;
436 
437  qreal value = deg + min;
438 
439  if (isNegativeDeg) {
440  value *= -1;
441  }
442  if (m_ui->m_sign->currentIndex() == NegativeSphereIndex) {
443  value *= -1;
444  }
445 
446  return value;
447 }
448 
449 
450 LatLonEditPrivate::LatLonEditPrivate()
451  : m_dimension(Latitude)
452  , m_value(0.0)
453  , m_notation(GeoDataCoordinates::DMS)
454  , m_inputHandler(new DMSInputHandler(this))
455  , m_updating(false)
456 {}
457 
458 LatLonEditPrivate::~LatLonEditPrivate()
459 {
460  delete m_inputHandler;
461 }
462 
463 void LatLonEditPrivate::init(QWidget* parent) { setupUi(parent); }
464 
465 }
466 
467 
468 using namespace Marble;
469 
470 LatLonEdit::LatLonEdit(QWidget *parent, Dimension dimension, GeoDataCoordinates::Notation notation)
471  : QWidget( parent ), d(new LatLonEditPrivate())
472 {
473  d->init(this);
474  setDimension(dimension);
475  setNotation(notation);
476 
477  connect(d->m_intValueEditor, SIGNAL(valueChanged(int)), this, SLOT(checkIntValueOverflow()));
478  connect(d->m_uintValueEditor, SIGNAL(valueChanged(int)), this, SLOT(checkUIntValueOverflow()));
479  connect(d->m_floatValueEditor, SIGNAL(valueChanged(double)), this, SLOT(checkFloatValueOverflow()));
480 
481  connect(d->m_sign, SIGNAL(currentIndexChanged(int)),
482  this, SLOT(onSignChanged()));
483 }
484 
485 LatLonEdit::~LatLonEdit()
486 {
487  delete d;
488 }
489 
490 qreal LatLonEdit::value() const
491 {
492  return d->m_value;
493 }
494 
495 GeoDataCoordinates::Notation LatLonEdit::notation() const
496 {
497  return d->m_notation;
498 }
499 
500 void LatLonEdit::onSignChanged()
501 {
502  if( d->m_updating )
503  return;
504 
505  // Only flip the value if it does not match the sign
506  if (d->m_sign->currentIndex() == PositiveSphereIndex) {
507  if (d->m_value < 0.0) {
508  d->m_value *= -1;
509  }
510  } else {
511  if (d->m_value > 0.0) {
512  d->m_value *= -1;
513  }
514  }
515 
516  emit valueChanged( d->m_value );
517 }
518 
519 void LatLonEdit::setDimension( Dimension dimension )
520 {
521  d->m_dimension = dimension;
522 
523  d->m_updating = true;
524 
525  d->m_inputHandler->setupMinMax(dimension);
526 
527  // update sign widget content
528  {
529  d->m_sign->clear();
530 
531  switch (dimension) {
532  case Longitude:
533  d->m_sign->addItem( tr("E", "East, the direction" ) );
534  d->m_sign->addItem( tr("W", "West, the direction" ) );
535  break;
536  case Latitude:
537  d->m_sign->addItem( tr("N", "North, the direction" ) );
538  d->m_sign->addItem( tr("S", "South, the direction" ) );
539  break;
540  }
541  }
542 
543  d->m_updating = false;
544 
545  // reset value, old one is useless
546  setValue( 0.0 );
547 }
548 
549 void LatLonEdit::setNotation(GeoDataCoordinates::Notation notation)
550 {
551  delete d->m_inputHandler;
552 
553  switch (notation) {
554  case GeoDataCoordinates::Decimal:
555  d->m_inputHandler = new DecimalInputHandler(d);
556  break;
557  case GeoDataCoordinates::DMS:
558  d->m_inputHandler = new DMSInputHandler(d);
559  break;
560  case GeoDataCoordinates::DM:
561  d->m_inputHandler = new DMInputHandler(d);
562  break;
563  case GeoDataCoordinates::UTM:
565  break;
566  case GeoDataCoordinates::Astro:
568  break;
569  }
570 
571  d->m_notation = notation;
572  d->m_inputHandler->setupUi();
573  d->m_inputHandler->setupMinMax(d->m_dimension);
574  d->m_inputHandler->setValue(d->m_value);
575 }
576 
577 void LatLonEdit::checkFloatValueOverflow()
578 {
579  if( d->m_updating )
580  return;
581 
582  d->m_updating = true;
583 
584  d->m_inputHandler->handleFloatEditChange();
585 
586  d->m_updating = false;
587 
588  recalculate();
589 }
590 
591 
592 void LatLonEdit::checkUIntValueOverflow()
593 {
594  if( d->m_updating )
595  return;
596 
597  d->m_updating = true;
598 
599  d->m_inputHandler->handleUIntEditChange();
600 
601  d->m_updating = false;
602 
603  recalculate();
604 }
605 
606 void LatLonEdit::checkIntValueOverflow()
607 {
608  if( d->m_updating )
609  return;
610 
611  d->m_updating = true;
612 
613  d->m_inputHandler->handleIntEditChange();
614 
615  d->m_updating = false;
616 
617  recalculate();
618 }
619 
620 void LatLonEdit::setValue( qreal value )
621 {
622  // limit to allowed values
623  const qreal maxValue = (d->m_dimension == Longitude) ? 180.0 : 90.0;
624 
625  if (value > maxValue) {
626  value = maxValue;
627  } else {
628  const qreal minValue = -maxValue;
629  if (value < minValue) {
630  value = minValue;
631  }
632  }
633 
634  // no change?
635  if( value == d->m_value ) {
636  return;
637  }
638 
639  d->m_value = value;
640 
641  // calculate sub values
642  // calculation is done similar to GeoDataCoordinates::lonToString,
643  // perhaps should be moved with similar methods into some utility class/namespace
644 
645  d->m_updating = true;
646 
647  d->m_inputHandler->setValue(value);
648 
649  const bool isNegative = (value < 0.0);
650  d->m_sign->setCurrentIndex( isNegative ? NegativeSphereIndex : PositiveSphereIndex );
651 
652  d->m_updating = false;
653 }
654 
655 void LatLonEdit::recalculate()
656 {
657  d->m_value = d->m_inputHandler->calculateValue();
658 
659  emit valueChanged( d->m_value );
660 }
661 
662 
663 #include "LatLonEdit.moc"
Marble::LatLonEdit::setValue
void setValue(qreal newvalue)
Definition: LatLonEdit.cpp:620
Marble::GeoDataCoordinates
A 3d point representation.
Definition: GeoDataCoordinates.h:52
Marble::GeoDataCoordinates::UTM
Definition: GeoDataCoordinates.h:83
QWidget
Marble::LatLonEdit::notation
GeoDataCoordinates::Notation notation() const
Definition: LatLonEdit.cpp:495
Marble::GeoDataCoordinates::Decimal
"Decimal" notation (base-10)
Definition: GeoDataCoordinates.h:80
Marble::LatLonEdit::dimension
Dimension dimension() const
MarbleDebug.h
Marble::Latitude
Latitude.
Definition: MarbleGlobal.h:54
Marble::switchSign
static void switchSign(QComboBox *sign)
Definition: LatLonEdit.cpp:128
Marble::NegativeSphereIndex
Definition: LatLonEdit.cpp:35
Marble::LatLonEdit::value
qreal value() const
Definition: LatLonEdit.cpp:490
MarbleGlobal.h
LatLonEdit.h
Marble::Longitude
Longitude.
Definition: MarbleGlobal.h:55
Marble::GeoDataCoordinates::Notation
Notation
enum used to specify the notation / numerical system
Definition: GeoDataCoordinates.h:79
Marble::Dimension
Dimension
This enum is used to choose the dimension.
Definition: MarbleGlobal.h:53
Marble::LatLonEdit::LatLonEdit
LatLonEdit(QWidget *parent=0, Dimension dimension=Longitude, GeoDataCoordinates::Notation notation=GeoDataCoordinates::DMS)
Definition: LatLonEdit.cpp:470
Marble::LatLonEdit::valueChanged
void valueChanged(qreal value)
Marble::GeoDataCoordinates::DMS
"Sexagesimal DMS" notation (base-60)
Definition: GeoDataCoordinates.h:81
Marble::GeoDataCoordinates::DM
"Sexagesimal DM" notation (base-60)
Definition: GeoDataCoordinates.h:82
Marble::LatLonEdit::setDimension
void setDimension(Dimension dimension)
Definition: LatLonEdit.cpp:519
Marble::LatLonEdit::~LatLonEdit
~LatLonEdit()
Definition: LatLonEdit.cpp:485
Marble::LatLonEdit::setNotation
void setNotation(GeoDataCoordinates::Notation notation)
Definition: LatLonEdit.cpp:549
Marble::GeoDataCoordinates::Astro
< "RA and DEC" notation (used for astronomical sky coordinates)
Definition: GeoDataCoordinates.h:84
Marble::PositiveSphereIndex
Definition: LatLonEdit.cpp:35
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:51 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal