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

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
  • dialogs
locationdialog.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  locationdialog.cpp - K Desktop Planetarium
3  -------------------
4  begin : Sun Feb 11 2001
5  copyright : (C) 2001 by Jason Harris
6  email : jharris@30doradus.org
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "locationdialog.h"
19 #include "ui_locationdialog.h"
20 
21 #include <cstdlib>
22 #include <cstdio>
23 
24 #include <QFile>
25 #include <QTextStream>
26 #include <QListWidget>
27 
28 #include <kmessagebox.h>
29 #include <kstandarddirs.h>
30 
31 #include "kstarsdata.h"
32 
33 LocationDialog::LocationDialog( QWidget* parent ) :
34  KDialog( parent ), timer( 0 )
35 {
36  KStarsData* data = KStarsData::Instance();
37  ui = new Ui::LocationDialog();
38  ui->setupUi( mainWidget() );
39  // FIXME: temporary plug! (See MapCanvas for details)
40  ui->MapView->setLocationDialog( this );
41 
42  setCaption( i18n( "Set Geographic Location" ) );
43  setButtons( KDialog::Ok|KDialog::Cancel );
44 
45  for ( int i=0; i<25; ++i )
46  ui->TZBox->addItem( KGlobal::locale()->formatNumber( (double)(i-12) ) );
47 
48  //Populate DSTRuleBox
49  foreach( const QString& key, data->getRulebook().keys() ) {
50  if( !key.isEmpty() )
51  ui->DSTRuleBox->addItem( key );
52  }
53 
54  connect( this, SIGNAL( cancelClicked() ), this, SLOT( reject() ) );
55  connect( ui->CityFilter, SIGNAL( textChanged( const QString & ) ), this, SLOT( enqueueFilterCity() ) );
56  connect( ui->ProvinceFilter, SIGNAL( textChanged( const QString & ) ), this, SLOT( enqueueFilterCity() ) );
57  connect( ui->CountryFilter, SIGNAL( textChanged( const QString & ) ), this, SLOT( enqueueFilterCity() ) );
58  connect( ui->NewCityName, SIGNAL( textChanged( const QString & ) ), this, SLOT( nameChanged() ) );
59  connect( ui->NewProvinceName, SIGNAL( textChanged( const QString & ) ), this, SLOT( nameChanged() ) );
60  connect( ui->NewCountryName, SIGNAL( textChanged( const QString & ) ), this, SLOT( nameChanged() ) );
61  connect( ui->NewLong, SIGNAL( textChanged( const QString & ) ), this, SLOT( dataChanged() ) );
62  connect( ui->NewLat, SIGNAL( textChanged( const QString & ) ), this, SLOT( dataChanged() ) );
63  connect( ui->TZBox, SIGNAL( activated(int) ), this, SLOT( dataChanged() ) );
64  connect( ui->DSTRuleBox, SIGNAL( activated(int) ), this, SLOT( dataChanged() ) );
65  connect( ui->GeoBox, SIGNAL( itemSelectionChanged () ), this, SLOT( changeCity() ) );
66  connect( ui->AddCityButton, SIGNAL( clicked() ), this, SLOT( addCity() ) );
67  connect( ui->ClearFieldsButton, SIGNAL( clicked() ), this, SLOT( clearFields() ) );
68 
69  ui->DSTLabel->setText( "<a href=\"showrules\">" + i18n("DST Rule:") + "</a>" );
70  connect( ui->DSTLabel, SIGNAL( linkActivated(const QString &) ), this, SLOT( showTZRules() ) );
71 
72  dataModified = false;
73  nameModified = false;
74  ui->AddCityButton->setEnabled( false );
75 
76  ui->NewCityName->setTrapReturnKey(true);
77  ui->NewProvinceName->setTrapReturnKey(true);
78  ui->NewCountryName->setTrapReturnKey(true);
79  ui->CityFilter->setTrapReturnKey(true);
80  ui->ProvinceFilter->setTrapReturnKey(true);
81  ui->CountryFilter->setTrapReturnKey(true);
82 
83  initCityList();
84  resize (640, 480);
85  connect(this,SIGNAL(okClicked()),this,SLOT(slotOk()));
86 }
87 
88 //Do NOT delete members of filteredCityList! They are not created by LocationDialog
89 LocationDialog::~LocationDialog(){
90  delete ui;
91 }
92 
93 void LocationDialog::initCityList() {
94  KStarsData* data = KStarsData::Instance();
95  foreach ( GeoLocation *loc, data->getGeoList() )
96  {
97  ui->GeoBox->addItem( loc->fullName() );
98  filteredCityList.append( loc );
99 
100  //If TZ is not an even integer value, add it to listbox
101  if ( loc->TZ0() - int( loc->TZ0() ) && ui->TZBox->findText( KGlobal::locale()->formatNumber( loc->TZ0() ) ) != -1 ) {
102  for ( int i=0; i < ui->TZBox->count(); ++i ) {
103  if ( ui->TZBox->itemText( i ).toDouble() > loc->TZ0() ) {
104  ui->TZBox->addItem( KGlobal::locale()->formatNumber( loc->TZ0() ), i-1 );
105  break;
106  }
107  }
108  }
109  }
110 
111  //Sort the list of Cities alphabetically...note that filteredCityList may now have a different ordering!
112  ui->GeoBox->sortItems();
113 
114  ui->CountLabel->setText( i18np("One city matches search criteria","%1 cities match search criteria", ui->GeoBox->count()) );
115 
116  // attempt to highlight the current kstars location in the GeoBox
117  ui->GeoBox->setCurrentItem( 0 );
118  for( int i=0; i < ui->GeoBox->count(); i++ ) {
119  if ( ui->GeoBox->item(i)->text() == data->geo()->fullName() ) {
120  ui->GeoBox->setCurrentRow( i );
121  break;
122  }
123  }
124 }
125 
126 void LocationDialog::enqueueFilterCity() {
127  if( timer )
128  timer->stop();
129  else {
130  timer = new QTimer( this );
131  timer->setSingleShot( true );
132  connect( timer, SIGNAL( timeout() ), this, SLOT( filterCity() ) );
133  }
134  timer->start( 500 );
135 }
136 
137 void LocationDialog::filterCity() {
138  KStarsData* data = KStarsData::Instance();
139  ui->GeoBox->clear();
140  //Do NOT delete members of filteredCityList!
141  while( !filteredCityList.isEmpty() )
142  filteredCityList.takeFirst();
143 
144  nameModified = false;
145  dataModified = false;
146  ui->AddCityButton->setEnabled( false );
147 
148  foreach ( GeoLocation *loc, data->getGeoList() ) {
149  QString sc( loc->translatedName() );
150  QString ss( loc->translatedCountry() );
151  QString sp = "";
152  if ( !loc->province().isEmpty() )
153  sp = loc->translatedProvince();
154 
155  if ( sc.toLower().startsWith( ui->CityFilter->text().toLower() ) &&
156  sp.toLower().startsWith( ui->ProvinceFilter->text().toLower() ) &&
157  ss.toLower().startsWith( ui->CountryFilter->text().toLower() ) ) {
158 
159  ui->GeoBox->addItem( loc->fullName() );
160  filteredCityList.append( loc );
161  }
162  }
163 
164  ui->GeoBox->sortItems();
165 
166  ui->CountLabel->setText( i18np("One city matches search criteria","%1 cities match search criteria", ui->GeoBox->count()) );
167 
168  if ( ui->GeoBox->count() > 0 ) // set first item in list as selected
169  ui->GeoBox->setCurrentItem( ui->GeoBox->item(0) );
170 
171  ui->MapView->repaint();
172 }
173 
174 void LocationDialog::changeCity() {
175  KStarsData* data = KStarsData::Instance();
176  //when the selected city changes, set newCity, and redraw map
177  SelectedCity = 0L;
178  if ( ui->GeoBox->currentItem() ) {
179  for ( int i=0; i < filteredCityList.size(); ++i ) {
180  GeoLocation *loc = filteredCityList.at(i);
181  if ( loc->fullName() == ui->GeoBox->currentItem()->text()) {
182  SelectedCity = loc;
183  break;
184  }
185  }
186  }
187 
188  ui->MapView->repaint();
189 
190  //Fill the fields at the bottom of the window with the selected city's data.
191  if ( SelectedCity ) {
192  ui->NewCityName->setText( SelectedCity->translatedName() );
193  if ( SelectedCity->province().isEmpty() )
194  ui->NewProvinceName->setText( QString() );
195  else
196  ui->NewProvinceName->setText( SelectedCity->translatedProvince() );
197 
198  ui->NewCountryName->setText( SelectedCity->translatedCountry() );
199  ui->NewLong->showInDegrees( SelectedCity->lng() );
200  ui->NewLat->showInDegrees( SelectedCity->lat() );
201  ui->TZBox->setEditText( KGlobal::locale()->formatNumber( SelectedCity->TZ0() ) );
202 
203  //Pick the City's rule from the rulebook
204  for ( int i=0; i < ui->DSTRuleBox->count(); ++i ) {
205  TimeZoneRule tzr = data->getRulebook().value( ui->DSTRuleBox->itemText(i) );
206  if ( tzr.equals( SelectedCity->tzrule() ) ) {
207  ui->DSTRuleBox->setCurrentIndex( i );
208  break;
209  }
210  }
211  }
212 
213  nameModified = false;
214  dataModified = false;
215  ui->AddCityButton->setEnabled( false );
216 }
217 
218 bool LocationDialog::addCity( ) {
219  KStarsData* data = KStarsData::Instance();
220  if ( !nameModified && !dataModified ) {
221  QString message = i18n( "This City already exists in the database." );
222  KMessageBox::sorry( 0, message, i18n( "Error: Duplicate Entry" ) );
223  return false;
224  }
225 
226  bool latOk(false), lngOk(false), tzOk(false);
227  dms lat = ui->NewLat->createDms( true, &latOk );
228  dms lng = ui->NewLong->createDms( true, &lngOk );
229  QString TimeZoneString = ui->TZBox->lineEdit()->text();
230  TimeZoneString.replace( KGlobal::locale()->decimalSymbol(), "." );
231  double TZ = TimeZoneString.toDouble( &tzOk );
232 
233  if ( ui->NewCityName->text().isEmpty() || ui->NewCountryName->text().isEmpty() ) {
234  QString message = i18n( "All fields (except province) must be filled to add this location." );
235  KMessageBox::sorry( 0, message, i18n( "Fields are Empty" ) );
236  return false;
237  } else if ( ! latOk || ! lngOk ) {
238  QString message = i18n( "Could not parse the Latitude/Longitude." );
239  KMessageBox::sorry( 0, message, i18n( "Bad Coordinates" ) );
240  return false;
241  } else if( ! tzOk) {
242  QString message = i18n( "Could not parse coordinates." );
243  KMessageBox::sorry( 0, message, i18n( "Bad Coordinates" ) );
244  return false;
245  } else {
246  if ( !nameModified ) {
247  QString message = i18n( "Really override original data for this city?" );
248  if ( KMessageBox::questionYesNo( 0, message, i18n( "Override Existing Data?" ), KGuiItem(i18n("Override Data")), KGuiItem(i18n("Do Not Override"))) == KMessageBox::No )
249  return false; //user answered No.
250  }
251 
252  QString entry;
253  QFile file;
254 
255  //Strip off white space
256  QString name = ui->NewCityName->text().trimmed();
257  QString province = ui->NewProvinceName->text().trimmed();
258  QString country = ui->NewCountryName->text().trimmed();
259 
260  //check for user's city database. If it doesn't exist, create it.
261  file.setFileName( KStandardDirs::locateLocal( "appdata", "mycities.dat" ) ); //determine filename in local user KDE directory tree.
262 
263  if ( !file.open( QIODevice::ReadWrite | QIODevice::Append ) ) {
264  QString message = i18n( "Local cities database could not be opened.\nLocation will not be recorded." );
265  KMessageBox::sorry( 0, message, i18n( "Could Not Open File" ) );
266  return false;
267  } else {
268  char ltsgn = 'N'; if ( lat.degree()<0 ) ltsgn = 'S';
269  char lgsgn = 'E'; if ( lng.degree()<0 ) lgsgn = 'W';
270  QString TZrule = ui->DSTRuleBox->currentText();
271 
272  entry = entry.sprintf( "%-32s : %-21s : %-21s : %2d : %2d : %2d : %c : %3d : %2d : %2d : %c : %5.1f : %2s\n",
273  name.toLocal8Bit().data(), province.toLocal8Bit().data(), country.toLocal8Bit().data(),
274  abs(lat.degree()), lat.arcmin(), lat.arcsec(), ltsgn,
275  abs(lng.degree()), lng.arcmin(), lat.arcsec(), lgsgn,
276  TZ, TZrule.toLocal8Bit().data() );
277 
278  QTextStream stream( &file );
279  stream << entry;
280  file.close();
281 
282  //Add city to geoList...don't need to insert it alphabetically, since we always sort GeoList
283  GeoLocation *g = new GeoLocation( lng, lat,
284  ui->NewCityName->text(), ui->NewProvinceName->text(), ui->NewCountryName->text(),
285  TZ, &data->Rulebook[ TZrule ] );
286  // FIXME: Uses friendship
287  data->geoList.append( g );
288 
289  //(possibly) insert new city into GeoBox by running filterCity()
290  filterCity();
291 
292  //Attempt to highlight new city in list
293  ui->GeoBox->setCurrentItem( 0 );
294  if ( ui->GeoBox->count() ) {
295  for ( int i=0; i<ui->GeoBox->count(); i++ ) {
296  if ( ui->GeoBox->item(i)->text() == g->fullName() ) {
297  ui->GeoBox->setCurrentRow( i );
298  break;
299  }
300  }
301  }
302 
303  }
304  }
305  return true;
306 }
307 
308 void LocationDialog::findCitiesNear( int lng, int lat ) {
309  KStarsData* data = KStarsData::Instance();
310  //find all cities within 3 degrees of (lng, lat); list them in GeoBox
311  ui->GeoBox->clear();
312  //Remember, do NOT delete members of filteredCityList
313  while ( ! filteredCityList.isEmpty() ) filteredCityList.takeFirst();
314 
315  foreach ( GeoLocation *loc, data->getGeoList() ) {
316  if ( ( abs( lng - int( loc->lng()->Degrees() ) ) < 3 ) &&
317  ( abs( lat - int( loc->lat()->Degrees() ) ) < 3 ) ) {
318 
319  ui->GeoBox->addItem( loc->fullName() );
320  filteredCityList.append( loc );
321  }
322  }
323 
324  ui->GeoBox->sortItems();
325  ui->CountLabel->setText( i18np("One city matches search criteria","%1 cities match search criteria", ui->GeoBox->count()) );
326 
327  if ( ui->GeoBox->count() > 0 ) // set first item in list as selected
328  ui->GeoBox->setCurrentItem( ui->GeoBox->item(0) );
329 
330  repaint();
331 }
332 
333 bool LocationDialog::checkLongLat() {
334  if ( ui->NewLong->text().isEmpty() || ui->NewLat->text().isEmpty() )
335  return false;
336 
337  bool ok;
338  double lng = ui->NewLong->createDms(true, &ok).Degrees();
339  if( !ok )
340  return false;
341  double lat = ui->NewLat->createDms(true, &ok).Degrees();
342  if( !ok )
343  return false;
344 
345  if( fabs(lng) > 180 || fabs(lat) > 90 )
346  return false;
347 
348  return true;
349 }
350 
351 void LocationDialog::clearFields() {
352  ui->CityFilter->clear();
353  ui->ProvinceFilter->clear();
354  ui->CountryFilter->clear();
355  ui->NewCityName->clear();
356  ui->NewProvinceName->clear();
357  ui->NewCountryName->clear();
358  ui->NewLong->clearFields();
359  ui->NewLat->clearFields();
360  ui->TZBox->lineEdit()->setText( KGlobal::locale()->formatNumber( 0.0 ) );
361  ui->DSTRuleBox->setCurrentIndex( 0 );
362  nameModified = true;
363  dataModified = false;
364  ui->AddCityButton->setEnabled( false );
365  ui->NewCityName->setFocus();
366 }
367 
368 void LocationDialog::showTZRules() {
369  QStringList lines;
370  lines.append( i18n( " Start Date (Start Time) / Revert Date (Revert Time)" ) );
371  lines.append( " " );
372  lines.append( i18n( "--: No DST correction" ) );
373  lines.append( i18n( "AU: last Sun in Oct. (02:00) / last Sun in Mar. (02:00)" ) );
374  lines.append( i18n( "BZ: 2nd Sun in Oct. (00:00) / 3rd Sun in Feb. (00:00)" ) );
375  lines.append( i18n( "CH: 2nd Sun in Apr. (00:00) / 2nd Sun in Sep. (00:00)" ) );
376  lines.append( i18n( "CL: 2nd Sun in Oct. (04:00) / 2nd Sun in Mar. (04:00)" ) );
377  lines.append( i18n( "CZ: 1st Sun in Oct. (02:45) / 3rd Sun in Mar. (02:45)" ) );
378  lines.append( i18n( "EE: Last Sun in Mar. (00:00) / Last Sun in Oct. (02:00)" ) );
379  lines.append( i18n( "EG: Last Fri in Apr. (00:00) / Last Thu in Sep. (00:00)" ) );
380  lines.append( i18n( "EU: Last Sun in Mar. (01:00) / Last Sun in Oct. (01:00)" ) );
381  lines.append( i18n( "FK: 1st Sun in Sep. (02:00) / 3rd Sun in Apr. (02:00)" ) );
382  lines.append( i18n( "HK: 2nd Sun in May (03:30) / 3rd Sun in Oct. (03:30)" ) );
383  lines.append( i18n( "IQ: Apr 1 (03:00) / Oct. 1 (00:00)" ) );
384  lines.append( i18n( "IR: Mar 21 (00:00) / Sep. 22 (00:00)" ) );
385  lines.append( i18n( "JD: Last Thu in Mar. (00:00) / Last Thu in Sep. (00:00)" ) );
386  lines.append( i18n( "LB: Last Sun in Mar. (00:00) / Last Sun in Oct. (00:00)" ) );
387  lines.append( i18n( "MX: 1st Sun in May (02:00) / Last Sun in Sep. (02:00)" ) );
388  lines.append( i18n( "NB: 1st Sun in Sep. (02:00) / 1st Sun in Apr. (02:00)" ) );
389  lines.append( i18n( "NZ: 1st Sun in Oct. (02:00) / 3rd Sun in Mar. (02:00)" ) );
390  lines.append( i18n( "PY: 1st Sun in Oct. (00:00) / 1st Sun in Mar. (00:00)" ) );
391  lines.append( i18n( "RU: Last Sun in Mar. (02:00) / Last Sun in Oct. (02:00)" ) );
392  lines.append( i18n( "SK: 2nd Sun in May (00:00) / 2nd Sun in Oct. (00:00)" ) );
393  lines.append( i18n( "SY: Apr. 1 (00:00) / Oct. 1 (00:00)" ) );
394  lines.append( i18n( "TG: 1st Sun in Nov. (02:00) / Last Sun in Jan. (02:00)" ) );
395  lines.append( i18n( "TS: 1st Sun in Oct. (02:00) / Last Sun in Mar. (02:00)" ) );
396  lines.append( i18n( "US: 1st Sun in Apr. (02:00) / Last Sun in Oct. (02:00)" ) );
397  lines.append( i18n( "ZN: Apr. 1 (01:00) / Oct. 1 (00:00)" ) );
398 
399  QString message = i18n( "Daylight Saving Time Rules" );
400  // KMessageBox::informationList( 0, message, lines, message );
401 
402  QPointer<KDialog> tzd = new KDialog( this );
403  tzd->setCaption( message );
404  tzd->setButtons( KDialog::Close );
405  QListWidget *lw = new QListWidget( tzd );
406  lw->addItems( lines );
407  //This is pretty lame...I have to measure the width of the first item in the
408  //list widget, in order to set its width properly. Why doesn't it just resize
409  //the widget to fit the contents automatically? I tried setting the sizePolicy,
410  //no joy...
411  int w = int( 1.1*lw->visualItemRect( lw->item(0) ).width() );
412  lw->setMinimumWidth( w );
413  tzd->setMainWidget( lw );
414  tzd->exec();
415 
416  delete tzd;
417 }
418 
419 void LocationDialog::nameChanged() {
420  nameModified = true;
421  dataChanged();
422 }
423 
424 //do not enable Add button until all data are present and valid.
425 void LocationDialog::dataChanged() {
426  dataModified = true;
427  ui->AddCityButton->setEnabled( !ui->NewCityName->text().isEmpty() &&
428  !ui->NewCountryName->text().isEmpty() &&
429  checkLongLat() );
430 }
431 
432 void LocationDialog::slotOk() {
433  if( addCityEnabled() && addCity() )
434  accept();
435 }
436 
437 bool LocationDialog::addCityEnabled() { return ui->AddCityButton->isEnabled(); }
438 
439 #include "locationdialog.moc"
LocationDialog::initCityList
void initCityList(void)
Initialize list of cities.
Definition: locationdialog.cpp:93
KStarsData
KStarsData is the backbone of KStars.
Definition: kstarsdata.h:66
GeoLocation::translatedName
QString translatedName() const
Definition: geolocation.cpp:78
LocationDialog::enqueueFilterCity
void enqueueFilterCity()
Filter by city / province / country only after a few milliseconds.
Definition: locationdialog.cpp:126
LocationDialog::findCitiesNear
void findCitiesNear(int longitude, int latitude)
Show only cities within 3 degrees of point specified by arguments.
Definition: locationdialog.cpp:308
QWidget
KStarsData::Instance
static KStarsData * Instance()
Definition: kstarsdata.h:92
dms::Degrees
const double & Degrees() const
Definition: dms.h:98
GeoLocation::lng
const dms * lng() const
Definition: geolocation.h:76
LocationDialog::changeCity
void changeCity()
When the selected city in the QListBox changes, repaint the MapCanvas so that the crosshairs icon app...
Definition: locationdialog.cpp:174
dms::degree
int degree() const
Definition: dms.h:79
KDialog
KStarsData::geo
GeoLocation * geo()
Definition: kstarsdata.h:164
GeoLocation::tzrule
TimeZoneRule * tzrule()
Definition: geolocation.h:124
TimeZoneRule
This class provides the information needed to determine whether Daylight Savings Time (DST; a...
Definition: timezonerule.h:56
LocationDialog::filterCity
void filterCity()
When text is entered in the City/Province/Country Filter KLineEdits, the List of cities is trimmed to...
Definition: locationdialog.cpp:137
GeoLocation::translatedProvince
QString translatedProvince() const
Definition: geolocation.cpp:88
LocationDialog::showTZRules
void showTZRules()
Definition: locationdialog.cpp:368
LocationDialog::addCityEnabled
bool addCityEnabled()
Definition: locationdialog.cpp:437
LocationDialog::slotOk
void slotOk()
Definition: locationdialog.cpp:432
KStarsData::getRulebook
const QMap< QString, TimeZoneRule > & getRulebook()
Return map for daylight saving rules.
Definition: kstarsdata.h:180
locationdialog.h
GeoLocation
Contains all relevant information for specifying a location on Earth: City Name, State/Province name...
Definition: geolocation.h:39
LocationDialog::addCity
bool addCity()
When the "Add new city" QPushButton is clicked, add the manually-entered city information to the user...
Definition: locationdialog.cpp:218
LocationDialog::~LocationDialog
~LocationDialog()
Destructor (empty)
Definition: locationdialog.cpp:89
KStarsData::getGeoList
QList< GeoLocation * > getGeoList()
Definition: kstarsdata.h:167
LocationDialog::nameChanged
void nameChanged()
Definition: locationdialog.cpp:419
dms
An angle, stored as degrees, but expressible in many ways.
Definition: dms.h:42
GeoLocation::province
QString province() const
Definition: geolocation.h:103
QTextStream
LocationDialog::LocationDialog
LocationDialog(QWidget *parent)
Constructor.
Definition: locationdialog.cpp:33
GeoLocation::lat
const dms * lat() const
Definition: geolocation.h:79
GeoLocation::TZ0
double TZ0() const
Definition: geolocation.h:118
LocationDialog::dataChanged
void dataChanged()
Definition: locationdialog.cpp:425
GeoLocation::fullName
QString fullName() const
Definition: geolocation.cpp:56
dms::arcsec
int arcsec() const
Definition: dms.cpp:156
kstarsdata.h
LocationDialog::clearFields
void clearFields()
Definition: locationdialog.cpp:351
GeoLocation::translatedCountry
QString translatedCountry() const
Definition: geolocation.cpp:92
TimeZoneRule::equals
bool equals(TimeZoneRule *r)
Definition: timezonerule.cpp:406
dms::arcmin
int arcmin() const
Definition: dms.cpp:148
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:20 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

Skip menu "kstars"
  • 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