• 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
detaildialog.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  detaildialog.cpp - description
3  -------------------
4  begin : Sun May 5 2002
5  copyright : (C) 2002 by Jason Harris and Jasem Mutlaq
6  email : kstars@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 "detaildialog.h"
19 
20 #include <QLineEdit>
21 #include <QPixmap>
22 #include <QRegExp>
23 #include <QTextStream>
24 #include <QHBoxLayout>
25 #include <QLabel>
26 #include <QTreeWidgetItem>
27 
28 #include <kstandarddirs.h>
29 #include <kmessagebox.h>
30 #include <kpushbutton.h>
31 #include <klineedit.h>
32 #include <ktoolinvocation.h>
33 #include <ktemporaryfile.h>
34 #include <kio/netaccess.h>
35 
36 #include "kstars.h"
37 #include "kdebug.h"
38 #include "kstarsdata.h"
39 #include "kstarsdatetime.h"
40 #include "ksnumbers.h"
41 #include "geolocation.h"
42 #include "ksutils.h"
43 #include "skymap.h"
44 #include "skyobjects/skyobject.h"
45 #include "skyobjects/starobject.h"
46 #include "skyobjects/deepskyobject.h"
47 #include "skyobjects/ksplanetbase.h"
48 #include "skyobjects/ksmoon.h"
49 #include "skyobjects/kscomet.h"
50 #include "skyobjects/ksasteroid.h"
51 #include "skyobjects/supernova.h"
52 #include "skycomponents/catalogcomponent.h"
53 #include "thumbnailpicker.h"
54 #include "Options.h"
55 #include "widgets/kshelplabel.h"
56 
57 #include <config-kstars.h>
58 
59 #ifdef HAVE_INDI_H
60 #include <basedevice.h>
61 #include "indi/indilistener.h"
62 #include "indi/indistd.h"
63 #include "indi/driverinfo.h"
64 #endif
65 
66 #include "skycomponents/constellationboundarylines.h"
67 #include "skycomponents/skymapcomposite.h"
68 
69 DetailDialog::DetailDialog(SkyObject *o, const KStarsDateTime &ut, GeoLocation *geo, QWidget *parent ) :
70  KPageDialog( parent ),
71  selectedObject(o),
72  Data(0), DataComet(0), Pos(0), Links(0), Adv(0), Log(0)
73 {
74  setFaceType( Tabbed );
75  setBackgroundRole( QPalette::Base );
76 
77  titlePalette = palette();
78  titlePalette.setColor( backgroundRole(), palette().color( QPalette::Active, QPalette::Highlight ) );
79  titlePalette.setColor( foregroundRole(), palette().color( QPalette::Active, QPalette::HighlightedText ) );
80 
81  //Create thumbnail image
82  Thumbnail = new QPixmap( 200, 200 );
83 
84  setCaption( i18n( "Object Details" ) );
85  setButtons( KDialog::Close );
86 
87  createGeneralTab();
88  createPositionTab( ut, geo );
89  createLinksTab();
90  createAdvancedTab();
91  createLogTab();
92 }
93 
94 DetailDialog::~DetailDialog() {
95  delete Thumbnail;
96 }
97 
98 void DetailDialog::createGeneralTab()
99 {
100  Data = new DataWidget(this);
101  addPage( Data, i18n("General") );
102 
103  Data->Names->setPalette( titlePalette );
104 
105  //Connections
106  connect( Data->ObsListButton, SIGNAL( clicked() ), this, SLOT( addToObservingList() ) );
107  connect( Data->CenterButton, SIGNAL( clicked() ), this, SLOT( centerMap() ) );
108  #ifdef HAVE_INDI_H
109  connect( Data->ScopeButton, SIGNAL( clicked() ), this, SLOT( centerTelescope() ) );
110  #else
111  Data->ScopeButton->setEnabled(false);
112  #endif
113  connect( Data->Image, SIGNAL( clicked() ), this, SLOT( updateThumbnail() ) );
114 
115  // Stuff that should be visible only for specific types of objects
116  Data->IllumLabel->setVisible( false ); // Only shown for the moon
117  Data->Illumination->setVisible( false );
118 
119  Data->BVIndex->setVisible( false ); // Only shown for stars
120  Data->BVLabel->setVisible( false );
121 
122  //Show object thumbnail image
123  showThumbnail();
124 
125  //Fill in the data fields
126  //Contents depend on type of object
127  StarObject *s = 0L;
128  DeepSkyObject *dso = 0L;
129  KSPlanetBase *ps = 0L;
130  Supernova *sup = 0L;
131  QString pname, oname, objecttyp, constellationname, str;
132 
133  switch ( selectedObject->type() ) {
134  case SkyObject::STAR:
135  s = (StarObject *)selectedObject;
136 
137  Data->Names->setText( s->longname() );
138 
139  if( s->getHDIndex() != 0 ) {
140  if( !s->longname().isEmpty() )
141  Data->Names->setText( s->longname() + QString( ", HD%1" ).arg( QString::number( s->getHDIndex() ) ) );
142  else
143  Data->Names->setText( QString( ", HD%1" ).arg( QString::number( s->getHDIndex() ) ) );
144  }
145  objecttyp = s->sptype() + ' ' + i18n("star");
146  Data->Magnitude->setText( i18nc( "number in magnitudes", "%1 mag" ,
147  KGlobal::locale()->formatNumber( s->mag(), 1 ) ) ); //show to tenths place
148 
149  Data->BVLabel->setVisible( true );
150  Data->BVIndex->setVisible( true );
151  if( s->getBVIndex() < 30.0 )
152  Data->BVIndex->setText( QString::number( s->getBVIndex() , 'g', 2 ) );
153 
154  //The thumbnail image is empty, and isn't clickable for stars
155  //Also, don't show the border around the Image QFrame.
156  Data->Image->setFrameStyle( QFrame::NoFrame );
157  disconnect( Data->Image, SIGNAL( clicked() ), this, SLOT( updateThumbnail() ) );
158 
159  //distance
160  if ( s->distance() > 2000. || s->distance() < 0. ) // parallax < 0.5 mas
161  Data->Distance->setText( QString(i18nc("larger than 2000 parsecs", "> 2000 pc") ) );
162  else if ( s->distance() > 50.0 ) //show to nearest integer
163  Data->Distance->setText( i18nc( "number in parsecs", "%1 pc" ,
164  KGlobal::locale()->formatNumber( s->distance(), 0 ) ) );
165  else if ( s->distance() > 10.0 ) //show to tenths place
166  Data->Distance->setText( i18nc( "number in parsecs", "%1 pc" ,
167  KGlobal::locale()->formatNumber( s->distance(), 1 ) ) );
168  else //show to hundredths place
169  Data->Distance->setText( i18nc( "number in parsecs", "%1 pc" ,
170  KGlobal::locale()->formatNumber( s->distance(), 2 ) ) );
171 
172  //Note multiplicity/variablility in angular size label
173  Data->AngSizeLabel->setText( QString() );
174  Data->AngSize->setText( QString() );
175  Data->AngSizeLabel->setFont( Data->AngSize->font() );
176  if ( s->isMultiple() && s->isVariable() ) {
177  Data->AngSizeLabel->setText( i18nc( "the star is a multiple star", "multiple" ) + ',' );
178  Data->AngSize->setText( i18nc( "the star is a variable star", "variable" ) );
179  } else if ( s->isMultiple() )
180  Data->AngSizeLabel->setText( i18nc( "the star is a multiple star", "multiple" ) );
181  else if ( s->isVariable() )
182  Data->AngSizeLabel->setText( i18nc( "the star is a variable star", "variable" ) );
183 
184  break; //end of stars case
185  case SkyObject::ASTEROID: //[fall through to planets]
186  case SkyObject::COMET: //[fall through to planets]
187  case SkyObject::MOON: //[fall through to planets]
188  case SkyObject::PLANET:
189  ps = (KSPlanetBase *)selectedObject;
190 
191  Data->Names->setText( ps->longname() );
192  //Type is "G5 star" for Sun
193  if ( ps->name() == "Sun" )
194  objecttyp = i18n("G5 star");
195  else if ( ps->name() == "Moon" )
196  objecttyp = ps->translatedName();
197  else if ( ps->name() == i18n("Pluto") || ps->name() == "Ceres" || ps->name() == "Eris" ) // TODO: Check if Ceres / Eris have translations and i18n() them
198  objecttyp = i18n("Dwarf planet");
199  else
200  objecttyp = ps->typeName();
201 
202  //Magnitude: The moon displays illumination fraction instead
203  if ( selectedObject->name() == "Moon" ) {
204  Data->IllumLabel->setVisible( true );
205  Data->Illumination->setVisible( true );
206  Data->Illumination->setText( QString("%1 %").arg( KGlobal::locale()->formatNumber( ((KSMoon *)selectedObject)->illum()*100., 0 ) ) );
207  }
208 
209  if(selectedObject->type() == SkyObject::COMET){
210  Data->Magnitude->setText( i18nc( "number in magnitudes", "%1 mag" ,
211  KGlobal::locale()->formatNumber( ((KSComet *)selectedObject)->getTotalMagnitudeParameter(), 1 ) ) ); //show to tenths place
212  }
213  else{
214  Data->Magnitude->setText( i18nc( "number in magnitudes", "%1 mag" ,
215  KGlobal::locale()->formatNumber( ps->mag(), 1 ) ) ); //show to tenths place
216  }
217 
218  //Distance from Earth. The moon requires a unit conversion
219  if ( ps->name() == "Moon" ) {
220  Data->Distance->setText( i18nc("distance in kilometers", "%1 km",
221  KGlobal::locale()->formatNumber( ps->rearth()*AU_KM ) ) );
222  } else {
223  Data->Distance->setText( i18nc("distance in Astronomical Units", "%1 AU",
224  KGlobal::locale()->formatNumber( ps->rearth() ) ) );
225  }
226 
227  //Angular size; moon and sun in arcmin, others in arcsec
228  if ( ps->angSize() ) {
229  if ( ps->name() == "Sun" || ps->name() == "Moon" )
230  Data->AngSize->setText( i18nc("angular size in arcminutes", "%1 arcmin",
231  KGlobal::locale()->formatNumber( ps->angSize() ) ) ); // Needn't be a plural form because sun / moon will never contract to 1 arcminute
232  else
233  Data->AngSize->setText( i18nc("angular size in arcseconds","%1 arcsec",
234  KGlobal::locale()->formatNumber( ps->angSize()*60.0 ) ) );
235  } else {
236  Data->AngSize->setText( "--" );
237  }
238 
239  break; //end of planets/comets/asteroids case
240 
241  case SkyObject::SUPERNOVA:
242  sup=(Supernova *)selectedObject;
243 
244  Data->Names->setText(sup->name());
245 
246  Data->Magnitude->setText( i18nc( "number in magnitudes", "%1 mag" ,
247  KGlobal::locale()->formatNumber( sup->mag(), 1 ) ) );
248  Data->Distance->setText( "---" );
249 
250  break;
251 
252  default: //deep-sky objects
253  dso = (DeepSkyObject *)selectedObject;
254 
255  //Show all names recorded for the object
256  if ( ! dso->longname().isEmpty() && dso->longname() != dso->name() ) {
257  pname = dso->translatedLongName();
258  oname = dso->translatedName();
259  } else {
260  pname = dso->translatedName();
261  }
262 
263  if ( ! dso->translatedName2().isEmpty() ) {
264  if ( oname.isEmpty() ) oname = dso->translatedName2();
265  else oname += ", " + dso->translatedName2();
266  }
267 
268  if ( dso->ugc() != 0 ) {
269  if ( ! oname.isEmpty() ) oname += ", ";
270  oname += "UGC " + QString::number( dso->ugc() );
271  }
272  if ( dso->pgc() != 0 ) {
273  if ( ! oname.isEmpty() ) oname += ", ";
274  oname += "PGC " + QString::number( dso->pgc() );
275  }
276 
277  if ( ! oname.isEmpty() ) pname += ", " + oname;
278  Data->Names->setText( pname );
279 
280  objecttyp = dso->typeName();
281 
282  if (dso->type() == SkyObject::RADIO_SOURCE)
283  {
284  Data->MagLabel->setText(i18nc("integrated flux at a frequency", "Flux(%1):", dso->customCatalog()->fluxFrequency()));
285  Data->Magnitude->setText( i18nc( "integrated flux value", "%1 %2" ,
286  KGlobal::locale()->formatNumber( dso->flux(), 1 ), dso->customCatalog()->fluxUnit()) ); //show to tenths place
287  }
288  else if ( dso->mag() > 90.0 )
289  Data->Magnitude->setText( "--" );
290  else
291  Data->Magnitude->setText( i18nc( "number in magnitudes", "%1 mag" ,
292  KGlobal::locale()->formatNumber( dso->mag(), 1 ) ) ); //show to tenths place
293 
294  //No distances at this point...
295  Data->Distance->setText( "--" );
296 
297  //Only show decimal place for small angular sizes
298  if ( dso->a() > 10.0 )
299  Data->AngSize->setText( i18nc("angular size in arcminutes", "%1 arcmin",
300  KGlobal::locale()->formatNumber(dso->a(), 0 ) ) );
301  else if ( dso->a() )
302  Data->AngSize->setText( i18nc("angular size in arcminutes", "%1 arcmin",
303  KGlobal::locale()->formatNumber( dso->a(), 1 ) ) );
304  else
305  Data->AngSize->setText( "--" );
306 
307  break;
308  }
309 
310  // Add specifics data
311  switch ( selectedObject->type() ) {
312  case SkyObject::ASTEROID: {
313  KSAsteroid* ast = (KSAsteroid *)selectedObject;
314  DataComet = new DataCometWidget( this ); // Show same specifics data as comets
315  Data->IncludeData->layout()->addWidget( DataComet );
316 
317  // Perihelion
318  str.setNum( ast->getPerihelion() );
319  DataComet->Perihelion->setText( str + " AU" );
320  // Earth MOID
321  if ( ast->getEarthMOID() == 0 )
322  str = "";
323  else
324  str.setNum( ast->getEarthMOID() ).append( " AU" );
325  DataComet->EarthMOID->setText( str );
326  // Orbit ID
327  DataComet->OrbitID->setText( ast->getOrbitID() );
328  // Orbit Class
329  DataComet->OrbitClass->setText( ast->getOrbitClass() );
330  // NEO
331  if ( ast->isNEO() )
332  DataComet->NEO->setText( "Yes" );
333  else
334  DataComet->NEO->setText( "No" );
335  // Albedo
336  if ( ast->getAlbedo() == 0.0 )
337  str = "";
338  else
339  str.setNum( ast->getAlbedo() );
340  DataComet->Albedo->setText( str );
341  // Diameter
342  if( ast->getDiameter() == 0.0 )
343  str = "";
344  else
345  str.setNum( ast->getDiameter() ).append( " km" );
346  DataComet->Diameter->setText( str );
347  // Dimensions
348  if ( ast->getDimensions().isEmpty() )
349  DataComet->Dimensions->setText( "" );
350  else
351  DataComet->Dimensions->setText( ast->getDimensions() + " km" );
352  // Rotation period
353  if ( ast->getRotationPeriod() == 0.0 )
354  str = "";
355  else
356  str.setNum( ast->getRotationPeriod() ).append( " h" );
357  DataComet->Rotation->setText( str );
358  // Period
359  if ( ast->getPeriod() == 0.0 )
360  str = "";
361  else
362  str.setNum( ast->getPeriod() ).append( " y" );
363  DataComet->Period->setText( str );
364 
365  break;
366  }
367  case SkyObject::COMET: {
368  KSComet* com = (KSComet *)selectedObject;
369  DataComet = new DataCometWidget( this );
370  Data->IncludeData->layout()->addWidget( DataComet );
371 
372  // Perihelion
373  str.setNum( com->getPerihelion() );
374  DataComet->Perihelion->setText( str + " AU" );
375  // Earth MOID
376  if ( com->getEarthMOID() == 0 )
377  str = "";
378  else
379  str.setNum( com->getEarthMOID() ).append( " AU" );
380  DataComet->EarthMOID->setText( str );
381  // Orbit ID
382  DataComet->OrbitID->setText( com->getOrbitID() );
383  // Orbit Class
384  DataComet->OrbitClass->setText( com->getOrbitClass() );
385  // NEO
386  if ( com->isNEO() )
387  DataComet->NEO->setText( "Yes" );
388  else
389  DataComet->NEO->setText( "No" );
390  // Albedo
391  if ( com->getAlbedo() == 0.0 )
392  str = "";
393  else
394  str.setNum( com->getAlbedo() );
395  DataComet->Albedo->setText( str );
396  // Diameter
397  if( com->getDiameter() == 0.0 )
398  str = "";
399  else
400  str.setNum( com->getDiameter() ).append( " km" );
401  DataComet->Diameter->setText( str );
402  // Dimensions
403  if ( com->getDimensions().isEmpty() )
404  DataComet->Dimensions->setText( "" );
405  else
406  DataComet->Dimensions->setText( com->getDimensions() + " km" );
407  // Rotation period
408  if ( com->getRotationPeriod() == 0.0 )
409  str = "";
410  else
411  str.setNum( com->getRotationPeriod() ).append( " h" );
412  DataComet->Rotation->setText( str );
413  // Period
414  if ( com->getPeriod() == 0.0 )
415  str = "";
416  else
417  str.setNum( com->getPeriod() ).append( " y" );
418  DataComet->Period->setText( str );
419 
420  break;
421  }
422  case SkyObject::SUPERNOVA: {
423  break;
424  }
425  }
426 
427  //Common to all types:
428  if ( selectedObject->type() == SkyObject::CONSTELLATION )
429  Data->ObjectTypeInConstellation->setText(
430  KStarsData::Instance()->skyComposite()->getConstellationBoundary()->constellationName( selectedObject ) );
431  else
432  Data->ObjectTypeInConstellation->setText(
433  i18nc("%1 type of sky object (planet, asteroid etc), %2 name of a constellation", "%1 in %2", objecttyp,
434  KStarsData::Instance()->skyComposite()->getConstellationBoundary()->constellationName( selectedObject ) ) );
435 }
436 
437 void DetailDialog::createPositionTab( const KStarsDateTime &ut, GeoLocation *geo ) {
438  Pos = new PositionWidget(this);
439  addPage( Pos, i18n("Position") );
440 
441  Pos->CoordTitle->setPalette( titlePalette );
442  Pos->RSTTitle->setPalette( titlePalette );
443  KStarsData *data = KStarsData::Instance();
444 
445  //Coordinates Section:
446  //Don't use KLocale::formatNumber() for the epoch string,
447  //because we don't want a thousands-place separator!
448  QString sEpoch = QString::number( ut.epoch(), 'f', 1 );
449  //Replace the decimal point with localized decimal symbol
450  sEpoch.replace( '.', KGlobal::locale()->decimalSymbol() );
451 
452  kDebug() << (selectedObject->deprecess(data->updateNum(),2451545.0l)).ra0().toHMSString() << (selectedObject->deprecess(data->updateNum(),2451545.0l)).dec0().toDMSString() << endl;
453  //kDebug() << selectedObject->ra().toHMSString() << selectedObject->dec().toDMSString() << endl;
454  Pos->RALabel->setText( i18n( "RA (%1):", sEpoch ) );
455  Pos->DecLabel->setText( i18n( "Dec (%1):", sEpoch ) );
456  Pos->RA->setText( selectedObject->ra().toHMSString() );
457  Pos->Dec->setText( selectedObject->dec().toDMSString() );
458  Pos->Az->setText( selectedObject->az().toDMSString() );
459  dms a;
460  if( Options::useAltAz() )
461  a = selectedObject->alt();
462  else
463  a = selectedObject->altRefracted();
464  Pos->Alt->setText( a.toDMSString() );
465 
466  // Display the RA0 and Dec0 for objects that are outside the solar system
467  if( !selectedObject->isSolarSystem() ) {
468  Pos->RA0->setText( selectedObject->ra0().toHMSString() );
469  Pos->Dec0->setText( selectedObject->dec0().toDMSString() );
470  }
471  else {
472  Pos->RA0->setText( "--" );
473  Pos->Dec0->setText( "--" );
474  }
475 
476  //Hour Angle can be negative, but dms HMS expressions cannot.
477  //Here's a kludgy workaround:
478  dms lst = geo->GSTtoLST( ut.gst() );
479  dms ha( lst.Degrees() - selectedObject->ra().Degrees() );
480  QChar sgn('+');
481  if ( ha.Hours() > 12.0 ) {
482  ha.setH( 24.0 - ha.Hours() );
483  sgn = '-';
484  }
485  Pos->HA->setText( QString("%1%2").arg(sgn).arg( ha.toHMSString() ) );
486 
487  //Airmass is approximated as the secant of the zenith distance,
488  //equivalent to 1./sin(Alt). Beware of Inf at Alt=0!
489  if ( selectedObject->alt().Degrees() > 0.0 )
490  Pos->Airmass->setText( KGlobal::locale()->formatNumber(
491  1./sin( selectedObject->alt().radians() ), 2 ) );
492  else
493  Pos->Airmass->setText( "--" );
494 
495  //Rise/Set/Transit Section:
496 
497  //Prepare time/position variables
498  QTime rt = selectedObject->riseSetTime( ut, geo, true ); //true = use rise time
499  dms raz = selectedObject->riseSetTimeAz( ut, geo, true ); //true = use rise time
500 
501  //If transit time is before rise time, use transit time for tomorrow
502  QTime tt = selectedObject->transitTime( ut, geo );
503  dms talt = selectedObject->transitAltitude( ut, geo );
504  if ( tt < rt ) {
505  tt = selectedObject->transitTime( ut.addDays( 1 ), geo );
506  talt = selectedObject->transitAltitude( ut.addDays( 1 ), geo );
507  }
508 
509  //If set time is before rise time, use set time for tomorrow
510  QTime st = selectedObject->riseSetTime( ut, geo, false ); //false = use set time
511  dms saz = selectedObject->riseSetTimeAz( ut, geo, false ); //false = use set time
512  if ( st < rt ) {
513  st = selectedObject->riseSetTime( ut.addDays( 1 ), geo, false ); //false = use set time
514  saz = selectedObject->riseSetTimeAz( ut.addDays( 1 ), geo, false ); //false = use set time
515  }
516 
517  if ( rt.isValid() ) {
518  Pos->TimeRise->setText( QString().sprintf( "%02d:%02d", rt.hour(), rt.minute() ) );
519  Pos->TimeSet->setText( QString().sprintf( "%02d:%02d", st.hour(), st.minute() ) );
520  Pos->AzRise->setText( raz.toDMSString() );
521  Pos->AzSet->setText( saz.toDMSString() );
522  } else {
523  if ( selectedObject->alt().Degrees() > 0.0 ) {
524  Pos->TimeRise->setText( i18n( "Circumpolar" ) );
525  Pos->TimeSet->setText( i18n( "Circumpolar" ) );
526  } else {
527  Pos->TimeRise->setText( i18n( "Never rises" ) );
528  Pos->TimeSet->setText( i18n( "Never rises" ) );
529  }
530 
531  Pos->AzRise->setText( i18nc( "Not Applicable", "N/A" ) );
532  Pos->AzSet->setText( i18nc( "Not Applicable", "N/A" ) );
533  }
534 
535  Pos->TimeTransit->setText( QString().sprintf( "%02d:%02d", tt.hour(), tt.minute() ) );
536  Pos->AltTransit->setText( talt.toDMSString() );
537 
538  // Restore the position and other time-dependent parameters
539  selectedObject->recomputeCoords( ut, geo );
540 
541 }
542 
543 void DetailDialog::createLinksTab()
544 {
545  // don't create a link tab for an unnamed star
546  if (selectedObject->name() == QString("star"))
547  return;
548 
549  Links = new LinksWidget( this );
550  addPage( Links, i18n( "Links" ) );
551 
552  Links->InfoTitle->setPalette( titlePalette );
553  Links->ImagesTitle->setPalette( titlePalette );
554 
555  foreach ( const QString &s, selectedObject->InfoTitle() )
556  Links->InfoTitleList->addItem( i18nc( "Image/info menu item (should be translated)", s.toLocal8Bit() ) );
557 
558  //Links->InfoTitleList->setCurrentRow(0);
559 
560  foreach ( const QString &s, selectedObject->ImageTitle() )
561  Links->ImageTitleList->addItem( i18nc( "Image/info menu item (should be translated)", s.toLocal8Bit() ) );
562 
563  updateButtons();
564 
565  // Signals/Slots
566  connect( Links->ViewButton, SIGNAL(clicked()), this, SLOT( viewLink() ) );
567  connect( Links->AddLinkButton, SIGNAL(clicked()), KStars::Instance()->map(), SLOT( addLink() ) );
568  connect( Links->EditLinkButton, SIGNAL(clicked()), this, SLOT( editLinkDialog() ) );
569  connect( Links->RemoveLinkButton, SIGNAL(clicked()), this, SLOT( removeLinkDialog() ) );
570 
571  // When an item is selected in info list, selected items are cleared image list.
572  connect( Links->InfoTitleList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT( setCurrentLink(QListWidgetItem*) ) );
573  connect( Links->InfoTitleList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), Links->ImageTitleList, SLOT( clearSelection() ) );
574 
575  // vice versa
576  connect( Links->ImageTitleList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT( setCurrentLink(QListWidgetItem*) ) );
577  connect( Links->ImageTitleList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), Links->InfoTitleList, SLOT( clearSelection() ));
578 
579  connect( Links->InfoTitleList, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT( viewLink() ) );
580  connect( Links->ImageTitleList, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT( viewLink() ) );
581 
582  connect( Links->InfoTitleList, SIGNAL(itemSelectionChanged ()), this, SLOT( updateButtons() ) );
583  connect( Links->ImageTitleList, SIGNAL(itemSelectionChanged ()), this, SLOT( updateButtons() ));
584 
585  connect( KStars::Instance()->map(), SIGNAL(linkAdded()), this, SLOT( updateLists() ) );
586 }
587 
588 void DetailDialog::createAdvancedTab()
589 {
590  // Don't create an adv tab for an unnamed star or if advinterface file failed loading
591  // We also don't need adv dialog for solar system objects.
592  if (selectedObject->name() == QString("star") ||
593  KStarsData::Instance()->ADVtreeList.isEmpty() ||
594  selectedObject->type() == SkyObject::PLANET ||
595  selectedObject->type() == SkyObject::COMET ||
596  selectedObject->type() == SkyObject::ASTEROID )
597  return;
598 
599  Adv = new DatabaseWidget( this );
600  addPage( Adv, i18n( "Advanced" ) );
601 
602  connect( Adv->ADVTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(viewADVData()));
603 
604  populateADVTree();
605 }
606 
607 void DetailDialog::createLogTab()
608 {
609  //Don't create a a log tab for an unnamed star
610  if ( selectedObject->name() == QString("star") )
611  return;
612 
613  // Log Tab
614  Log = new LogWidget( this );
615  addPage( Log, i18n( "Log" ) );
616 
617  Log->LogTitle->setPalette( titlePalette );
618 
619  if ( selectedObject->userLog().isEmpty() )
620  Log->UserLog->setText(i18n("Record here observation logs and/or data on %1.", selectedObject->translatedName()));
621  else
622  Log->UserLog->setText(selectedObject->userLog());
623 
624  //Automatically save the log contents when the widget loses focus
625  connect( Log->UserLog, SIGNAL( focusOut() ), this, SLOT( saveLogData() ) );
626 }
627 
628 
629 void DetailDialog::setCurrentLink(QListWidgetItem *it)
630 {
631  m_CurrentLink = it;
632 }
633 
634 void DetailDialog::viewLink()
635 {
636  QString URL;
637 
638  if (m_CurrentLink == NULL) return;
639 
640  if ( m_CurrentLink->listWidget() == Links->InfoTitleList ) {
641  URL = QString( selectedObject->InfoList().at( Links->InfoTitleList->row(m_CurrentLink) ) );
642  }
643  else if ( m_CurrentLink->listWidget() == Links->ImageTitleList ) {
644  URL = QString( selectedObject->ImageList().at( Links->ImageTitleList->row(m_CurrentLink) ) );
645  }
646 
647  if ( !URL.isEmpty() )
648  KToolInvocation::invokeBrowser(URL);
649 }
650 
651 void DetailDialog::updateLists()
652 {
653  Links->InfoTitleList->clear();
654  Links->ImageTitleList->clear();
655 
656  foreach ( const QString &s, selectedObject->InfoTitle() )
657  Links->InfoTitleList->addItem( s );
658 
659  foreach ( const QString &s, selectedObject->ImageTitle() )
660  Links->ImageTitleList->addItem( s );
661 
662  updateButtons();
663 }
664 
665 void DetailDialog::updateButtons()
666 {
667 
668  bool anyLink=false;
669  if (!Links->InfoTitleList->selectedItems().isEmpty() || !Links->ImageTitleList->selectedItems().isEmpty())
670  anyLink = true;
671 
672  // Buttons could be disabled if lists are initially empty, we enable and disable them here
673  // depending on the current status of the list.
674  Links->ViewButton->setEnabled(anyLink);
675  Links->EditLinkButton->setEnabled(anyLink);
676  Links->RemoveLinkButton->setEnabled(anyLink);
677 }
678 
679 void DetailDialog::editLinkDialog()
680 {
681  int type=0, row=0;
682  QString search_line, replace_line, currentItemTitle, currentItemURL;
683 
684  if (m_CurrentLink == NULL) return;
685 
686  KDialog editDialog( this );
687  editDialog.setCaption( i18n("Edit Link") );
688  editDialog.setButtons( KDialog::Ok | KDialog::Cancel );
689  QFrame editFrame( &editDialog );
690 
691  if ( m_CurrentLink->listWidget() == Links->InfoTitleList )
692  {
693  row = Links->InfoTitleList->row( m_CurrentLink );
694 
695  currentItemTitle = m_CurrentLink->text();
696  currentItemURL = selectedObject->InfoTitle().at( row );
697  search_line = selectedObject->name();
698  search_line += ':';
699  search_line += currentItemTitle;
700  search_line += ':';
701  search_line += currentItemURL;
702  type = 0;
703  }
704  else if ( m_CurrentLink->listWidget() == Links->ImageTitleList )
705  {
706  row = Links->ImageTitleList->row( m_CurrentLink );
707 
708  currentItemTitle = m_CurrentLink->text();
709  currentItemURL = selectedObject->ImageTitle().at( row );
710  search_line = selectedObject->name();
711  search_line += ':';
712  search_line += currentItemTitle;
713  search_line += ':';
714  search_line += currentItemURL;
715  type = 1;
716  }
717  else return;
718 
719  QLineEdit editNameField(&editFrame);
720  editNameField.setObjectName("nameedit");
721  editNameField.home(false);
722  editNameField.setText(currentItemTitle);
723  QLabel editLinkURL(i18n("URL:"), &editFrame);
724  QLineEdit editLinkField(&editFrame);
725  editLinkField.setObjectName("urledit");
726  editLinkField.home(false);
727  editLinkField.setText(currentItemURL);
728  QVBoxLayout vlay(&editFrame);
729  vlay.setObjectName("vlay");
730  QHBoxLayout editLinkLayout(&editFrame);
731  editLinkLayout.setObjectName("editlinklayout");
732  editLinkLayout.addWidget(&editLinkURL);
733  editLinkLayout.addWidget(&editLinkField);
734  vlay.addWidget( &editNameField );
735  vlay.addLayout( &editLinkLayout );
736  editDialog.setMainWidget( &editFrame );
737 
738  bool go( true );
739  // If user presses cancel then skip the action
740  if ( editDialog.exec() != QDialog::Accepted )
741  go = false;
742 
743  // If nothing changed, skip th action
744  if (editLinkField.text() == currentItemURL && editNameField.text() == currentItemTitle)
745  go = false;
746 
747  if ( go ) {
748  replace_line = selectedObject->name() + ':' + editNameField.text() + ':' + editLinkField.text();
749 
750  // Info Link
751  if (type==0) {
752  selectedObject->InfoTitle().replace(row, editNameField.text());
753  selectedObject->InfoList().replace(row, editLinkField.text());
754 
755  // Image Links
756  } else {
757  selectedObject->ImageTitle().replace(row, editNameField.text());
758  selectedObject->ImageList().replace(row, editLinkField.text());
759  }
760 
761  // Update local files
762  updateLocalDatabase(type, search_line, replace_line);
763 
764  // Set focus to the same item again
765  if (type == 0)
766  Links->InfoTitleList->setCurrentRow(row);
767  else
768  Links->ImageTitleList->setCurrentRow(row);
769  }
770 }
771 
772 void DetailDialog::removeLinkDialog()
773 {
774  int type=0, row=0;
775  QString currentItemURL, currentItemTitle, LineEntry, TempFileName, FileLine;
776  QFile URLFile;
777  KTemporaryFile TempFile;
778  TempFile.setAutoRemove(false);
779  TempFile.open();
780  TempFileName = TempFile.fileName();
781 
782  if (m_CurrentLink == NULL) return;
783 
784  if ( m_CurrentLink->listWidget() == Links->InfoTitleList )
785  {
786  row = Links->InfoTitleList->row( m_CurrentLink );
787  currentItemTitle = m_CurrentLink->text();
788  currentItemURL = selectedObject->InfoList()[row];
789  LineEntry = selectedObject->name();
790  LineEntry += ':';
791  LineEntry += currentItemTitle;
792  LineEntry += ':';
793  LineEntry += currentItemURL;
794  type = 0;
795  }
796  else if ( m_CurrentLink->listWidget() == Links->ImageTitleList )
797  {
798  row = Links->ImageTitleList->row( m_CurrentLink );
799  currentItemTitle = m_CurrentLink->text();
800  currentItemURL = selectedObject->ImageList()[row];
801  LineEntry = selectedObject->name();
802  LineEntry += ':';
803  LineEntry += currentItemTitle;
804  LineEntry += ':';
805  LineEntry += currentItemURL;
806  type = 1;
807  }
808  else return;
809 
810  if (KMessageBox::warningContinueCancel( 0, i18n("Are you sure you want to remove the %1 link?", currentItemTitle), i18n("Delete Confirmation"),KStandardGuiItem::del())!=KMessageBox::Continue)
811  return;
812 
813  if (type ==0)
814  {
815  selectedObject->InfoTitle().removeAt(row);
816  selectedObject->InfoList().removeAt(row);
817  }
818  else
819  {
820  selectedObject->ImageTitle().removeAt(row);
821  selectedObject->ImageList().removeAt(row);
822  }
823 
824  // Remove link from file
825  updateLocalDatabase(type, LineEntry);
826 
827  // Set focus to the 1st item in the list
828  if (type == 0)
829  Links->InfoTitleList->clearSelection();
830  else
831  Links->ImageTitleList->clearSelection();
832 
833 }
834 
835 void DetailDialog::updateLocalDatabase(int type, const QString &search_line, const QString &replace_line)
836 {
837  QString TempFileName, file_line;
838  QFile URLFile;
839  KTemporaryFile TempFile;
840  TempFile.setAutoRemove(false);
841  TempFile.open();
842  QTextStream *temp_stream=NULL, *out_stream=NULL;
843  bool replace = !replace_line.isEmpty();
844 
845  if (search_line.isEmpty())
846  return;
847 
848  TempFileName = TempFile.fileName();
849 
850  switch (type)
851  {
852  // Info Links
853  case 0:
854  // Get name for our local info_url file
855  URLFile.setFileName( KStandardDirs::locateLocal( "appdata", "info_url.dat" ) );
856  break;
857 
858  // Image Links
859  case 1:
860  // Get name for our local info_url file
861  URLFile.setFileName( KStandardDirs::locateLocal( "appdata", "image_url.dat" ) );
862  break;
863  }
864 
865  // Copy URL file to temp file
866  KIO::file_copy(KUrl::fromPath(URLFile.fileName()), KUrl::fromPath(TempFileName), -1, KIO::Overwrite | KIO::HideProgressInfo );
867 
868 
869  if ( !URLFile.open( QIODevice::WriteOnly) )
870  {
871  kDebug() << "DetailDialog: Failed to open " << URLFile.fileName();
872  kDebug() << "KStars cannot save to user database";
873  return;
874  }
875 
876  // Get streams;
877  temp_stream = new QTextStream(&TempFile);
878  out_stream = new QTextStream(&URLFile);
879 
880  while (!temp_stream->atEnd())
881  {
882  file_line = temp_stream->readLine();
883  // If we find a match, either replace, or remove (by skipping).
884  if (file_line == search_line)
885  {
886  if (replace)
887  (*out_stream) << replace_line << endl;
888  else
889  continue;
890  }
891  else
892  (*out_stream) << file_line << endl;
893  }
894 
895  URLFile.close();
896  delete(temp_stream);
897  delete(out_stream);
898 
899  updateLists();
900 
901 }
902 
903 void DetailDialog::populateADVTree()
904 {
905  QTreeWidgetItem *parent = NULL, *temp = NULL;
906 
907  // We populate the tree iterativley, keeping track of parents as we go
908  // This solution is more efficient than the previous recursion algorithm.
909  foreach (ADVTreeData *item, KStarsData::Instance()->ADVtreeList)
910  {
911 
912  switch (item->Type)
913  {
914  // Top Level
915  case 0:
916  temp = new QTreeWidgetItem(parent, QStringList(item->Name));
917  if (parent == NULL)
918  Adv->ADVTree->addTopLevelItem(temp);
919  parent = temp;
920 
921  break;
922 
923  // End of top level
924  case 1:
925  if (parent != NULL) parent = parent->parent();
926  break;
927 
928  // Leaf
929  case 2:
930  new QTreeWidgetItem(parent, QStringList(item->Name));
931  break;
932  }
933  }
934 
935 }
936 
937 void DetailDialog::viewADVData()
938 {
939  QString link;
940  QTreeWidgetItem * current = Adv->ADVTree->currentItem();
941 
942  //If the item has children or is invalid, do nothing
943  if ( !current || current->childCount()>0 ) return;
944 
945  foreach (ADVTreeData *item, KStarsData::Instance()->ADVtreeList)
946  {
947  if (item->Name == current->text(0))
948  {
949  link = item->Link;
950  link = parseADVData(link);
951  KToolInvocation::invokeBrowser(link);
952  return;
953  }
954  }
955 }
956 
957 QString DetailDialog::parseADVData( const QString &inlink )
958 {
959  QString link = inlink;
960  QString subLink;
961  int index;
962 
963  if ( (index = link.indexOf("KSOBJ")) != -1)
964  {
965  link.remove(index, 5);
966  link = link.insert(index, selectedObject->name());
967  }
968 
969  if ( (index = link.indexOf("KSRA")) != -1)
970  {
971  link.remove(index, 4);
972  subLink.sprintf("%02d%02d%02d", selectedObject->ra0().hour(), selectedObject->ra0().minute(), selectedObject->ra0().second());
973  subLink = subLink.insert(2, "%20");
974  subLink = subLink.insert(7, "%20");
975 
976  link = link.insert(index, subLink);
977  }
978  if ( (index = link.indexOf("KSDEC")) != -1)
979  {
980  link.remove(index, 5);
981  if (selectedObject->dec().degree() < 0)
982  {
983  subLink.sprintf("%03d%02d%02d", selectedObject->dec0().degree(), selectedObject->dec0().arcmin(), selectedObject->dec0().arcsec());
984  subLink = subLink.insert(3, "%20");
985  subLink = subLink.insert(8, "%20");
986  }
987  else
988  {
989  subLink.sprintf("%02d%02d%02d", selectedObject->dec0().degree(), selectedObject->dec0().arcmin(), selectedObject->dec0().arcsec());
990  subLink = subLink.insert(0, "%2B");
991  subLink = subLink.insert(5, "%20");
992  subLink = subLink.insert(10, "%20");
993  }
994  link = link.insert(index, subLink);
995  }
996 
997  return link;
998 }
999 
1000 void DetailDialog::saveLogData() {
1001  selectedObject->saveUserLog( Log->UserLog->toPlainText() );
1002 }
1003 
1004 void DetailDialog::addToObservingList() {
1005  KStars::Instance()->observingList()->slotAddObject( selectedObject );
1006 }
1007 
1008 void DetailDialog::centerMap() {
1009  SkyMap* map = KStars::Instance()->map();
1010  map->setClickedObject( selectedObject );
1011  map->slotCenter();
1012 }
1013 
1014 void DetailDialog::centerTelescope()
1015 {
1016 
1017 #ifdef HAVE_INDI_H
1018 
1019  if (INDIListener::Instance()->size() == 0)
1020  {
1021  KMessageBox::sorry(0, i18n("KStars did not find any active telescopes."));
1022  return;
1023  }
1024 
1025  foreach(ISD::GDInterface *gd, INDIListener::Instance()->getDevices())
1026  {
1027  INDI::BaseDevice *bd = gd->getBaseDevice();
1028 
1029  if (gd->getType() != KSTARS_TELESCOPE)
1030  continue;
1031 
1032  if (bd == NULL)
1033  continue;
1034 
1035  if (bd->isConnected() == false)
1036  {
1037  KMessageBox::error(0, i18n("Telescope %1 is offline. Please connect and retry again.", gd->getDeviceName()));
1038  return;
1039  }
1040 
1041 
1042  ISD::GDSetCommand SlewCMD(INDI_SWITCH, "ON_COORD_SET", "SLEW", ISS_ON, this);
1043 
1044  gd->setProperty(&SlewCMD);
1045  gd->runCommand(INDI_SEND_COORDS, selectedObject);
1046 
1047  return;
1048 
1049  }
1050 
1051  KMessageBox::sorry(0, i18n("KStars did not find any active telescopes."));
1052 
1053 #endif
1054 }
1055 
1056 void DetailDialog::showThumbnail() {
1057  //No image if object is a star
1058  if ( selectedObject->type() == SkyObject::STAR ||
1059  selectedObject->type() == SkyObject::CATALOG_STAR ) {
1060  Thumbnail->scaled( Data->Image->width(), Data->Image->height() );
1061  Thumbnail->fill( Data->DataFrame->palette().color( QPalette::Window ) );
1062  Data->Image->setPixmap( *Thumbnail );
1063  return;
1064  }
1065 
1066  //Try to load the object's image from disk
1067  //If no image found, load "no image" image
1068  //If that isn't found, make it blank.
1069  QFile file;
1070  QString fname = "thumb-" + selectedObject->name().toLower().remove( ' ' ) + ".png";
1071  if ( KSUtils::openDataFile( file, fname ) ) {
1072  file.close();
1073  Thumbnail->load( file.fileName(), "PNG" );
1074  } else if ( KSUtils::openDataFile( file, "noimage.png" ) ) {
1075  file.close();
1076  Thumbnail->load( file.fileName(), "PNG" );
1077  } else {
1078  Thumbnail->scaled( Data->Image->width(), Data->Image->height() );
1079  Thumbnail->fill( Data->DataFrame->palette().color( QPalette::Window ) );
1080  }
1081 
1082  Data->Image->setPixmap( *Thumbnail );
1083 }
1084 
1085 void DetailDialog::updateThumbnail() {
1086  QPointer<ThumbnailPicker> tp = new ThumbnailPicker( selectedObject, *Thumbnail, this );
1087 
1088  if ( tp->exec() == QDialog::Accepted ) {
1089  QString fname = KStandardDirs::locateLocal( "appdata", "thumb-" + selectedObject->name().toLower().remove( ' ' ) + ".png" );
1090 
1091  Data->Image->setPixmap( *(tp->image()) );
1092 
1093  //If a real image was set, save it.
1094  //If the image was unset, delete the old image on disk.
1095  if ( tp->imageFound() ) {
1096  Data->Image->pixmap()->save( fname, "PNG" );
1097  *Thumbnail = *(Data->Image->pixmap());
1098  } else {
1099  QFile f;
1100  f.setFileName( fname );
1101  f.remove();
1102  }
1103  }
1104  delete tp;
1105 }
1106 
1107 DataWidget::DataWidget( QWidget *p ) : QFrame( p )
1108 {
1109  setupUi( this );
1110  DataFrame->setBackgroundRole( QPalette::Base );
1111 }
1112 
1113 DataCometWidget::DataCometWidget( QWidget *p ) : QFrame( p )
1114 {
1115  setupUi( this );
1116 }
1117 
1118 PositionWidget::PositionWidget( QWidget *p ) : QFrame( p )
1119 {
1120  setupUi( this );
1121  CoordFrame->setBackgroundRole( QPalette::Base );
1122  RSTFrame->setBackgroundRole( QPalette::Base );
1123 }
1124 
1125 LinksWidget::LinksWidget( QWidget *p ) : QFrame( p )
1126 {
1127  setupUi( this );
1128 }
1129 
1130 DatabaseWidget::DatabaseWidget( QWidget *p ) : QFrame( p )
1131 {
1132  setupUi( this );
1133 }
1134 
1135 LogWidget::LogWidget( QWidget *p ) : QFrame( p )
1136 {
1137  setupUi( this );
1138 }
1139 
1140 #include "detaildialog.moc"
dms::hour
int hour() const
Definition: dms.h:104
KSComet::getOrbitID
QString getOrbitID()
Definition: kscomet.h:158
KSComet::getEarthMOID
double getEarthMOID()
Definition: kscomet.h:148
SkyObject::riseSetTimeAz
dms riseSetTimeAz(const KStarsDateTime &dt, const GeoLocation *geo, bool rst)
Definition: skyobject.cpp:192
SkyObject::transitAltitude
dms transitAltitude(const KStarsDateTime &dt, const GeoLocation *geo)
Definition: skyobject.cpp:245
SkyPoint::deprecess
SkyPoint deprecess(const KSNumbers *num, long double epoch=J2000)
Obtain a Skypoint with RA0 and Dec0 set from the RA, Dec of this skypoint.
Definition: skypoint.cpp:190
KSComet::getAlbedo
float getAlbedo()
Definition: kscomet.h:188
KSComet::getOrbitClass
QString getOrbitClass()
Definition: kscomet.h:168
ksplanetbase.h
KPageDialog
CatalogComponent::fluxUnit
QString fluxUnit() const
Definition: catalogcomponent.h:69
SkyPoint::ra
const dms & ra() const
Definition: skypoint.h:171
KSAsteroid::isNEO
bool isNEO()
Definition: ksasteroid.h:134
SkyPoint::dec0
const dms & dec0() const
Definition: skypoint.h:168
indilistener.h
KStarsData
KStarsData is the backbone of KStars.
Definition: kstarsdata.h:66
supernova.h
SkyPoint::az
const dms & az() const
Definition: skypoint.h:177
DeepSkyObject::customCatalog
CatalogComponent * customCatalog()
Definition: deepskyobject.h:117
KStars::map
SkyMap * map() const
Definition: kstars.h:134
DetailDialog::updateButtons
void updateButtons()
Update View/Edit/Remove buttons.
Definition: detaildialog.cpp:665
KSAsteroid::getEarthMOID
double getEarthMOID()
Definition: ksasteroid.h:104
SkyObject::translatedName
QString translatedName() const
Definition: skyobject.h:129
StarObject::getBVIndex
float getBVIndex() const
Definition: starobject.h:263
dms::minute
int minute() const
Definition: dms.cpp:174
DataCometWidget::DataCometWidget
DataCometWidget(QWidget *parent=0)
Definition: detaildialog.cpp:1113
SkyMap::slotCenter
void slotCenter()
Center the display at the point ClickedPoint.
Definition: skymap.cpp:373
ISD::GDInterface::runCommand
virtual bool runCommand(int command, void *ptr=NULL)=0
CatalogComponent::fluxFrequency
QString fluxFrequency() const
Definition: catalogcomponent.h:66
DetailDialog::removeLinkDialog
void removeLinkDialog()
remove a URL entry from either the Images or Info lists, and update the user's *url.dat file.
Definition: detaildialog.cpp:772
StarObject::sptype
QString sptype(void) const
Returns entire spectral type string.
Definition: starobject.cpp:340
DetailDialog::updateLists
void updateLists()
Rebuild the Image and Info URL lists for this object.
Definition: detaildialog.cpp:651
INDIListener::Instance
static INDIListener * Instance()
Definition: indilistener.cpp:46
detaildialog.h
skyobject.h
deepskyobject.h
DeepSkyObject::flux
float flux() const
Definition: deepskyobject.h:127
KStarsDateTime::addDays
KStarsDateTime addDays(int nd) const
Modify the Date/Time by adding a number of days.
Definition: kstarsdatetime.h:117
SkyObject::PLANET
Definition: skyobject.h:108
ISD::GDInterface::getBaseDevice
virtual INDI::BaseDevice * getBaseDevice()=0
LogWidget::LogWidget
LogWidget(QWidget *parent=0)
Definition: detaildialog.cpp:1135
KSComet::getPerihelion
double getPerihelion()
Returns Perihelion distance.
Definition: kscomet.h:93
SkyObject::longname
virtual QString longname(void) const
Definition: skyobject.h:140
SkyMap::setClickedObject
void setClickedObject(SkyObject *o)
Set the ClickedObject pointer to the argument.
Definition: skymap.cpp:361
QWidget
KStarsData::Instance
static KStarsData * Instance()
Definition: kstarsdata.h:92
dms::Degrees
const double & Degrees() const
Definition: dms.h:98
KStarsDateTime::epoch
double epoch() const
Definition: kstarsdatetime.h:166
SkyObject::riseSetTime
QTime riseSetTime(const KStarsDateTime &dt, const GeoLocation *geo, bool rst, bool exact=true)
Determine the time at which the point will rise or set.
Definition: skyobject.cpp:105
ISD::GDInterface::getDeviceName
virtual const char * getDeviceName()=0
dms::degree
int degree() const
Definition: dms.h:79
KSAsteroid::getOrbitClass
QString getOrbitClass()
Definition: ksasteroid.h:124
KSAsteroid::getOrbitID
QString getOrbitID()
Definition: ksasteroid.h:114
SkyObject::saveUserLog
void saveUserLog(const QString &newLog)
Save new user log text.
Definition: skyobject.cpp:412
KSComet::getDimensions
QString getDimensions()
Definition: kscomet.h:208
KStars::Instance
static KStars * Instance()
Definition: kstars.h:125
ISD::GDSetCommand
Definition: indistd.h:34
KDialog
LogWidget
Definition: detaildialog.h:257
dms::second
int second() const
Definition: dms.cpp:182
SkyObject::transitTime
QTime transitTime(const KStarsDateTime &dt, const GeoLocation *geo)
The same iteration technique described in riseSetTime() is used here.
Definition: skyobject.cpp:241
ADVTreeData::Type
int Type
Definition: detaildialog.h:62
SkyPoint::ra0
const dms & ra0() const
Definition: skypoint.h:165
SkyObject::COMET
Definition: skyobject.h:110
KSAsteroid::getDiameter
float getDiameter()
Definition: ksasteroid.h:154
SkyObject::InfoList
QStringList & InfoList()
Definition: skyobject.h:309
geolocation.h
DeepSkyObject::pgc
int pgc() const
Definition: deepskyobject.h:158
KSAsteroid::getPerihelion
double getPerihelion()
Definition: ksasteroid.h:94
KSUtils::openDataFile
bool openDataFile(QFile &file, const QString &filename)
Attempt to open the data file named filename, using the QFile object "file".
KSComet::isNEO
bool isNEO()
Definition: kscomet.h:178
KSAsteroid::getRotationPeriod
float getRotationPeriod()
Definition: ksasteroid.h:174
PositionWidget::PositionWidget
PositionWidget(QWidget *parent=0)
Definition: detaildialog.cpp:1118
SkyObject::RADIO_SOURCE
Definition: skyobject.h:111
NaN::f
const float f
Definition: nan.h:36
driverinfo.h
KStarsData::updateNum
KSNumbers * updateNum()
Definition: kstarsdata.h:226
KSAsteroid::getDimensions
QString getDimensions()
Definition: ksasteroid.h:164
DetailDialog::centerMap
void centerMap()
Slot to center this object in the display.
Definition: detaildialog.cpp:1008
KSComet::getPeriod
float getPeriod()
Definition: kscomet.h:228
DeepSkyObject::a
float a() const
Definition: deepskyobject.h:132
AU_KM
#define AU_KM
Definition: kstarsdata.h:42
StarObject::distance
double distance() const
Definition: starobject.h:216
skymapcomposite.h
KStars::observingList
ObservingList * observingList() const
Definition: kstars.h:136
DetailDialog::updateThumbnail
void updateThumbnail()
Slot to update thumbnail image for the object, using the Thumbnail Picker tool.
Definition: detaildialog.cpp:1085
GeoLocation
Contains all relevant information for specifying a location on Earth: City Name, State/Province name...
Definition: geolocation.h:39
SkyObject::ImageList
QStringList & ImageList()
Definition: skyobject.h:299
GeoLocation::GSTtoLST
dms GSTtoLST(const dms &gst) const
Definition: geolocation.h:230
KSPlanetBase::angSize
double angSize() const
Definition: ksplanetbase.h:171
KSComet
A subclass of KSPlanetBase that implements comets.
Definition: kscomet.h:50
Supernova
Represents the supernova object.
Definition: supernova.h:44
StarObject::getHDIndex
int getHDIndex() const
Definition: starobject.h:226
LinksWidget
Definition: detaildialog.h:245
DatabaseWidget::DatabaseWidget
DatabaseWidget(QWidget *parent=0)
Definition: detaildialog.cpp:1130
skymap.h
StarObject::isMultiple
bool isMultiple() const
Definition: starobject.h:223
i18nc
i18nc("string from libindi, used in the config dialog","100x")
DetailDialog::showThumbnail
void showThumbnail()
Slot to display the thumbnail image for the object.
Definition: detaildialog.cpp:1056
KStarsDateTime
Extension of KDateTime for KStars KStarsDateTime can represent the date/time as a Julian Day...
Definition: kstarsdatetime.h:45
KSComet::getDiameter
float getDiameter()
Definition: kscomet.h:198
KSAsteroid
A subclass of KSPlanetBase that implements asteroids.
Definition: ksasteroid.h:48
SkyObject::MOON
Definition: skyobject.h:110
SkyObject::isSolarSystem
bool isSolarSystem() const
Definition: skyobject.h:197
ksnumbers.h
SkyObject::translatedLongName
QString translatedLongName() const
Definition: skyobject.h:145
kshelplabel.h
KStarsData::skyComposite
SkyMapComposite * skyComposite()
Definition: kstarsdata.h:146
dms
An angle, stored as degrees, but expressible in many ways.
Definition: dms.h:42
SkyPoint::dec
const dms & dec() const
Definition: skypoint.h:174
KSAsteroid::getPeriod
float getPeriod()
Definition: ksasteroid.h:184
DetailDialog::addToObservingList
void addToObservingList()
Slot to add this object to the observing list.
Definition: detaildialog.cpp:1004
DataCometWidget
Definition: detaildialog.h:233
DetailDialog::DetailDialog
DetailDialog(SkyObject *o, const KStarsDateTime &ut, GeoLocation *geo, QWidget *parent=0)
Constructor.
Definition: detaildialog.cpp:69
constellationboundarylines.h
DetailDialog::viewADVData
void viewADVData()
Open the web browser to the selected online astronomy database, with a query to the object of this De...
Definition: detaildialog.cpp:937
Options.h
SkyPoint::altRefracted
dms altRefracted() const
Definition: skypoint.cpp:754
SkyObject::mag
float mag(void) const
Definition: skyobject.h:182
DeepSkyObject
Provides all necessary information about a deep-sky object: data inherited from SkyObject (coordinate...
Definition: deepskyobject.h:43
ISD::GDInterface::getType
virtual DeviceFamily getType()=0
QTextStream
SkyObject::InfoTitle
QStringList & InfoTitle()
Definition: skyobject.h:314
DetailDialog::saveLogData
void saveLogData()
Save the User's text in the Log Tab to the userlog.dat file.
Definition: detaildialog.cpp:1000
DetailDialog::viewLink
void viewLink()
Slot for viewing the selected image or info URL in the web browser.
Definition: detaildialog.cpp:634
KSMoon
A subclass of SkyObject that provides information needed for the Moon.
Definition: ksmoon.h:36
DatabaseWidget
Definition: detaildialog.h:251
SkyObject::recomputeCoords
SkyPoint recomputeCoords(const KStarsDateTime &dt, const GeoLocation *geo=0)
The coordinates for the object on date dt are computed and returned, but the object's internal coordi...
Definition: skyobject.cpp:296
ADVTreeData
Definition: detaildialog.h:58
SkyObject::type
int type(void) const
Definition: skyobject.h:164
kscomet.h
KSPlanetBase::rearth
double rearth() const
Definition: ksplanetbase.h:134
thumbnailpicker.h
SkyObject::CONSTELLATION
Definition: skyobject.h:110
QLabel
ISD::GDInterface::setProperty
virtual bool setProperty(QObject *)=0
StarObject::isVariable
bool isVariable() const
Definition: starobject.h:235
ksmoon.h
DataWidget
Definition: detaildialog.h:227
starobject.h
SkyMap
This is the canvas on which the sky is painted.
Definition: skymap.h:72
Options::useAltAz
static bool useAltAz()
Get Use horizontal coordinate system?
Definition: Options.h:2386
ADVTreeData::Link
QString Link
Definition: detaildialog.h:61
SkyMapComposite::getConstellationBoundary
ConstellationBoundaryLines * getConstellationBoundary()
Definition: skymapcomposite.h:194
indistd.h
KSAsteroid::getAlbedo
float getAlbedo()
Definition: ksasteroid.h:144
StarObject::longname
virtual QString longname(void) const
If star is unnamed return "star" otherwise return the longname.
Definition: starobject.h:134
SkyObject::translatedName2
QString translatedName2() const
Definition: skyobject.h:135
KSPlanetBase
A subclass of TrailObject that provides additional information needed for most solar system objects...
Definition: ksplanetbase.h:63
SkyObject::ASTEROID
Definition: skyobject.h:110
SkyObject::SUPERNOVA
Definition: skyobject.h:112
DataWidget::DataWidget
DataWidget(QWidget *parent=0)
Definition: detaildialog.cpp:1107
kstarsdatetime.h
dms::arcsec
int arcsec() const
Definition: dms.cpp:156
LinksWidget::LinksWidget
LinksWidget(QWidget *parent=0)
Definition: detaildialog.cpp:1125
DetailDialog::~DetailDialog
~DetailDialog()
Destructor.
Definition: detaildialog.cpp:94
ksasteroid.h
ADVTreeData::Name
QString Name
Definition: detaildialog.h:60
kstarsdata.h
DetailDialog::centerTelescope
void centerTelescope()
Slot to center this object in the telescope.
Definition: detaildialog.cpp:1014
OAL::Log
Definition: log.h:41
DeepSkyObject::ugc
int ugc() const
Definition: deepskyobject.h:153
SkyPoint::alt
const dms & alt() const
Definition: skypoint.h:180
ConstellationBoundaryLines::constellationName
QString constellationName(SkyPoint *p)
Definition: constellationboundarylines.cpp:261
SkyObject::name
virtual QString name(void) const
Definition: skyobject.h:124
KSTARS_TELESCOPE
Definition: indicommon.h:66
INDI_SEND_COORDS
Definition: indicommon.h:72
DetailDialog::editLinkDialog
void editLinkDialog()
Open a dialog to edit a URL in either the Images or Info lists, and update the user's *url...
Definition: detaildialog.cpp:679
ksutils.h
StarObject
This is a subclass of SkyObject.
Definition: starobject.h:41
KStarsDateTime::gst
dms gst() const
Definition: kstarsdatetime.cpp:138
SkyObject::typeName
static QString typeName(const int t)
Definition: skyobject.cpp:319
SkyObject::STAR
Definition: skyobject.h:108
SkyObject
Provides all necessary information about an object in the sky: its coordinates, name(s), type, magnitude, and QStringLists of URLs for images and webpages regarding the object.
Definition: skyobject.h:46
QFrame
SkyObject::CATALOG_STAR
Definition: skyobject.h:108
KSComet::getRotationPeriod
float getRotationPeriod()
Definition: kscomet.h:218
SkyObject::ImageTitle
QStringList & ImageTitle()
Definition: skyobject.h:304
Supernova::name
virtual QString name(void) const
Definition: supernova.h:58
PositionWidget
Definition: detaildialog.h:239
kstars.h
catalogcomponent.h
ISD::GDInterface
Definition: indistd.h:48
SkyObject::userLog
QString & userLog()
Definition: skyobject.h:319
dms::arcmin
int arcmin() const
Definition: dms.cpp:148
DetailDialog::setCurrentLink
void setCurrentLink(QListWidgetItem *it)
Set the currently-selected URL resource.
Definition: detaildialog.cpp:629
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:19 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