Kstars

detailstable.cpp
1 /*
2  SPDX-FileCopyrightText: 2011 Rafał Kułaga <[email protected]>
3 
4  SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "detailstable.h"
8 
9 #include <QTextDocument>
10 #include <QTextTable>
11 
12 #include "kstars.h"
13 #include "kstarsdata.h"
14 #include "ksplanetbase.h"
15 #include "starobject.h"
16 #include "skymapcomposite.h"
17 #include "constellationboundarylines.h"
18 #include "catalogobject.h"
19 #include "ksmoon.h"
20 #include "ksasteroid.h"
21 #include "kscomet.h"
22 #include "Options.h"
23 #include "catalogsdb.h"
24 
26 {
27  m_Document = new QTextDocument(KStars::Instance());
28 
29  setDefaultFormatting();
30 }
31 
33 {
34  if (m_Document)
35  {
36  delete m_Document;
37  }
38 }
39 
41 {
42  clearContents();
43 
44  QTextCursor cursor = m_Document->rootFrame()->firstCursorPosition();
45 
46  //Fill in the data fields
47  //Contents depend on type of object
48  StarObject *s = nullptr;
49  CatalogObject *dso = nullptr;
50  KSPlanetBase *ps = nullptr;
51  QString pname, oname;
52 
53  QString objNamesVal, objTypeVal, objDistVal, objSizeVal, objMagVal, objBvVal, objIllumVal;
54  QString objSizeLabel, objMagLabel;
55 
56  switch (obj->type())
57  {
58  case SkyObject::STAR:
59  {
60  s = (StarObject *)obj;
61 
62  objNamesVal = s->longname();
63 
64  if (s->getHDIndex() != 0)
65  {
66  if (!s->longname().isEmpty())
67  {
68  objNamesVal = s->longname() + QString(", HD%1").arg(QString::number(s->getHDIndex()));
69  }
70 
71  else
72  {
73  objNamesVal = QString(", HD%1").arg(QString::number(s->getHDIndex()));
74  }
75  }
76 
77  objTypeVal = s->sptype() + ' ' + i18n("star");
78  objMagVal = i18nc("number in magnitudes", "%1 mag", QLocale().toString(s->mag(), 1)); //show to tenths place
79 
80  if (s->getBVIndex() < 30.0)
81  {
82  objBvVal = QString::number(s->getBVIndex(), 'g', 2);
83  }
84 
85  //distance
86  if (s->distance() > 2000. || s->distance() < 0.) // parallax < 0.5 mas
87  {
88  objDistVal = i18nc("larger than 2000 parsecs", "> 2000 pc");
89  }
90 
91  else if (s->distance() > 50.0) //show to nearest integer
92  {
93  objDistVal = i18nc("number in parsecs", "%1 pc", QLocale().toString(s->distance(), 0));
94  }
95 
96  else if (s->distance() > 10.0) //show to tenths place
97  {
98  objDistVal = i18nc("number in parsecs", "%1 pc", QLocale().toString(s->distance(), 1));
99  }
100 
101  else //show to hundredths place
102  {
103  objDistVal = i18nc("number in parsecs", "%1 pc", QLocale().toString(s->distance(), 2));
104  }
105 
106  //Note multiplicity/variability in angular size label
107  if (s->isMultiple() && s->isVariable())
108  {
109  objSizeLabel = i18nc("the star is a multiple star", "multiple") + ',';
110  objSizeVal = i18nc("the star is a variable star", "variable");
111  }
112 
113  else if (s->isMultiple())
114  {
115  objSizeLabel = i18nc("the star is a multiple star", "multiple");
116  }
117 
118  else if (s->isVariable())
119  {
120  objSizeLabel = i18nc("the star is a variable star", "variable");
121  }
122 
123  objIllumVal = "--";
124 
125  break; //End of stars case
126  }
127 
128  case SkyObject::ASTEROID: //[fall through to planets]
129 
130  case SkyObject::COMET: //[fall through to planets]
131 
132  case SkyObject::MOON: //[fall through to planets]
133 
134  case SkyObject::PLANET:
135  {
136  ps = dynamic_cast<KSPlanetBase *>(obj);
137 
138  objNamesVal = ps->longname();
139  //Type is "G5 star" for Sun
140  if (ps->name() == i18n("Sun"))
141  {
142  objTypeVal = i18n("G5 star");
143  }
144 
145  else if (ps->name() == i18n("Moon"))
146  {
147  objTypeVal = ps->translatedName();
148  }
149 
150  else if (ps->name() == i18nc("Asteroid name (optional)", "Pluto") || ps->name() == i18nc("Asteroid name (optional)", "Ceres") ||
151  ps->name() == i18nc("Asteroid name (optional)", "Eris")) // TODO: Check if Ceres / Eris have translations and i18n() them
152  {
153  objTypeVal = i18n("Dwarf planet");
154  }
155 
156  else
157  {
158  objTypeVal = ps->typeName();
159  }
160 
161  //Magnitude: The moon displays illumination fraction instead
162  if (obj->name() == i18n("Moon"))
163  {
164  KSMoon * const m = dynamic_cast<KSMoon *>(obj);
165  if (m)
166  objIllumVal = QString("%1 %").arg(QLocale().toString(m->illum() * 100., 0));
167  }
168 
169  objMagVal =
170  i18nc("number in magnitudes", "%1 mag", QLocale().toString(ps->mag(), 1)); //show to tenths place
171 
172  //Distance from Earth. The moon requires a unit conversion
173  if (ps->name() == i18n("Moon"))
174  {
175  objDistVal = i18nc("distance in kilometers", "%1 km", QLocale().toString(ps->rearth() * AU_KM));
176  }
177 
178  else
179  {
180  objDistVal = i18nc("distance in Astronomical Units", "%1 AU", QLocale().toString(ps->rearth()));
181  }
182 
183  //Angular size; moon and sun in arcmin, others in arcsec
184  if (ps->angSize())
185  {
186  if (ps->name() == i18n("Sun") || ps->name() == i18n("Moon"))
187  {
188  // Needn't be a plural form because sun / moon will never contract to 1 arcminute
189  objSizeVal = i18nc("angular size in arcminutes", "%1 arcmin", QLocale().toString(ps->angSize()));
190  }
191 
192  else
193  {
194  objSizeVal =
195  i18nc("angular size in arcseconds", "%1 arcsec", QLocale().toString(ps->angSize() * 60.0));
196  }
197  }
198 
199  else
200  {
201  objSizeVal = "--";
202  }
203 
204  break; //End of planets/comets/asteroids case
205  }
206 
207  default: //Deep-sky objects
208  {
209  dso = (CatalogObject *)obj;
210 
211  //Show all names recorded for the object
212  if (!dso->longname().isEmpty() && dso->longname() != dso->name())
213  {
214  pname = dso->translatedLongName();
215  oname = dso->translatedName();
216  }
217 
218  else
219  {
220  pname = dso->translatedName();
221  }
222 
223  if (!dso->translatedName2().isEmpty())
224  {
225  if (oname.isEmpty())
226  {
227  oname = dso->translatedName2();
228  }
229 
230  else
231  {
232  oname += ", " + dso->translatedName2();
233  }
234  }
235 
236 
237  if (!oname.isEmpty())
238  {
239  pname += ", " + oname;
240  }
241 
242  objNamesVal = pname;
243 
244  objTypeVal = dso->typeName();
245 
246  if (dso->type() == SkyObject::RADIO_SOURCE)
247  {
248  objMagLabel =
249  i18nc("integrated flux at a frequency", "Flux(%1):", CatalogsDB::flux_frequency);
250  objMagVal = i18nc("integrated flux value", "%1 %2", QLocale().toString(dso->flux(), 1),
251  CatalogsDB::flux_unit); //show to tenths place
252  }
253 
254  if (dso->mag() > 90.0)
255  {
256  objMagVal = "--";
257  }
258 
259  else
260  {
261  objMagVal =
262  i18nc("number in magnitudes", "%1 mag", QLocale().toString(dso->mag(), 1)); //show to tenths place
263  }
264 
265  //No distances at this point...
266  objDistVal = "--";
267 
268  //Only show decimal place for small angular sizes
269  if (dso->a() > 10.0)
270  {
271  objSizeVal = i18nc("angular size in arcminutes", "%1 arcmin", QLocale().toString(dso->a(), 0));
272  }
273 
274  else if (dso->a())
275  {
276  objSizeVal = i18nc("angular size in arcminutes", "%1 arcmin", QLocale().toString(dso->a(), 1));
277  }
278 
279  else
280  {
281  objSizeVal = "--";
282  }
283 
284  break; //End of deep-space objects case
285  }
286  }
287 
288  //Common to all types:
289  if (obj->type() == SkyObject::CONSTELLATION)
290  {
291  objTypeVal = KStarsData::Instance()->skyComposite()->constellationBoundary()->constellationName(obj);
292  }
293 
294  else
295  {
296  objTypeVal =
297  i18nc("%1 type of sky object (planet, asteroid etc), %2 name of a constellation", "%1 in %2", objTypeVal,
298  KStarsData::Instance()->skyComposite()->constellationBoundary()->constellationName(obj));
299  }
300 
301  QVector<QTextLength> constraints;
304  m_TableFormat.setColumnWidthConstraints(constraints);
305 
306  QTextTable *table = cursor.insertTable(5, 4, m_TableFormat);
307  table->mergeCells(0, 0, 1, 4);
308  QTextBlockFormat centered;
309  centered.setAlignment(Qt::AlignCenter);
310  table->cellAt(0, 0).firstCursorPosition().setBlockFormat(centered);
311  table->cellAt(0, 0).firstCursorPosition().insertText(i18n("General"), m_TableTitleCharFormat);
312 
313  table->mergeCells(1, 1, 1, 3);
314  table->cellAt(1, 0).firstCursorPosition().insertText(i18n("Names:"), m_ItemNameCharFormat);
315  table->cellAt(1, 0).firstCursorPosition().setBlockFormat(centered);
316  table->cellAt(1, 1).firstCursorPosition().insertText(objNamesVal, m_ItemValueCharFormat);
317 
318  table->cellAt(2, 0).firstCursorPosition().insertText(i18n("Type:"), m_ItemNameCharFormat);
319  table->cellAt(2, 0).firstCursorPosition().setBlockFormat(centered);
320  table->cellAt(2, 1).firstCursorPosition().insertText(objTypeVal, m_ItemValueCharFormat);
321 
322  table->cellAt(3, 0).firstCursorPosition().insertText(i18n("Distance:"), m_ItemNameCharFormat);
323  table->cellAt(3, 0).firstCursorPosition().setBlockFormat(centered);
324  table->cellAt(3, 1).firstCursorPosition().insertText(objDistVal, m_ItemValueCharFormat);
325 
326  table->cellAt(4, 0).firstCursorPosition().insertText(i18n("Size:"), m_ItemNameCharFormat);
327  table->cellAt(4, 0).firstCursorPosition().setBlockFormat(centered);
328  table->cellAt(4, 1).firstCursorPosition().insertText(objSizeVal, m_ItemValueCharFormat);
329 
330  table->cellAt(2, 2).firstCursorPosition().insertText(i18n("Magnitude:"), m_ItemNameCharFormat);
331  table->cellAt(2, 2).firstCursorPosition().setBlockFormat(centered);
332  table->cellAt(2, 3).firstCursorPosition().insertText(objMagVal, m_ItemValueCharFormat);
333 
334  table->cellAt(3, 2).firstCursorPosition().insertText(i18n("B-V index:"), m_ItemNameCharFormat);
335  table->cellAt(3, 2).firstCursorPosition().setBlockFormat(centered);
336  table->cellAt(3, 3).firstCursorPosition().insertText(objBvVal, m_ItemValueCharFormat);
337 
338  table->cellAt(4, 2).firstCursorPosition().insertText(i18n("Illumination:"), m_ItemNameCharFormat);
339  table->cellAt(4, 2).firstCursorPosition().setBlockFormat(centered);
340  table->cellAt(4, 3).firstCursorPosition().insertText(objIllumVal, m_ItemValueCharFormat);
341 }
342 
344 {
345  clearContents();
346 
347  QTextCursor cursor = m_Document->rootFrame()->firstCursorPosition();
348 
349  QString perihelionVal, orbitIdVal, neoVal, diamVal, rotPeriodVal, moidVal;
350  QString orbitClassVal, albedoVal, dimVal, periodVal;
351 
352  // Add specifics data
353  switch (obj->type())
354  {
355  case SkyObject::ASTEROID:
356  {
357  KSAsteroid *ast = (KSAsteroid *)obj;
358 
359  // Perihelion
360  perihelionVal = QString::number(ast->getPerihelion()) + " AU";
361 
362  // Earth MOID
363  moidVal = ast->getEarthMOID() == 0 ? QString("--") : QString::number(ast->getEarthMOID()) + QString(" AU");
364 
365  // Orbit ID
366  orbitIdVal = ast->getOrbitID();
367 
368  // Orbit Class
369  orbitClassVal = ast->getOrbitClass();
370 
371  // NEO
372  neoVal = ast->isNEO() ? i18n("Yes") : i18n("No");
373 
374  // Albedo
375  albedoVal = ast->getAlbedo() == 0 ? QString("--") : QString::number(ast->getAlbedo());
376 
377  // Diameter
378  diamVal = ast->getDiameter() == 0 ? QString("--") : QString::number(ast->getDiameter()) + QString(" km");
379 
380  // Dimensions
381  dimVal = ast->getDimensions().isEmpty() ? QString("--") : ast->getDimensions() + QString(" km");
382 
383  // Rotation period
384  rotPeriodVal = ast->getRotationPeriod() == 0 ? QString("--") :
385  QString::number(ast->getRotationPeriod()) + QString(" h");
386 
387  // Period
388  periodVal = ast->getPeriod() == 0 ? QString("--") : QString::number(ast->getPeriod()) + QString(" y");
389 
390  break;
391  }
392 
393  case SkyObject::COMET:
394  {
395  KSComet *com = (KSComet *)obj;
396 
397  // Perihelion
398  perihelionVal = QString::number(com->getPerihelion()) + " AU";
399 
400  // Earth MOID
401  moidVal = com->getEarthMOID() == 0 ? QString("--") : QString::number(com->getEarthMOID()) + QString(" AU");
402 
403  // Orbit ID
404  orbitIdVal = com->getOrbitID();
405 
406  // Orbit Class
407  orbitClassVal = com->getOrbitClass();
408 
409  // NEO
410  neoVal = com->isNEO() ? i18n("Yes") : i18n("No");
411 
412  // Albedo
413  albedoVal = com->getAlbedo() == 0 ? QString("--") : QString::number(com->getAlbedo());
414 
415  // Diameter
416  diamVal = com->getDiameter() == 0 ? QString("--") : QString::number(com->getDiameter()) + QString(" km");
417 
418  // Dimensions
419  dimVal = com->getDimensions().isEmpty() ? QString("--") : com->getDimensions() + QString(" km");
420 
421  // Rotation period
422  rotPeriodVal = com->getRotationPeriod() == 0 ? QString("--") :
423  QString::number(com->getRotationPeriod()) + QString(" h");
424 
425  // Period
426  periodVal = com->getPeriod() == 0 ? QString("--") : QString::number(com->getPeriod()) + QString(" y");
427 
428  break;
429  }
430 
431  default:
432  {
433  return;
434  }
435  }
436 
437  // Set column width constraints
438  QVector<QTextLength> constraints;
441  m_TableFormat.setColumnWidthConstraints(constraints);
442 
443  QTextTable *table = cursor.insertTable(6, 4, m_TableFormat);
444  table->mergeCells(0, 0, 1, 4);
445  QTextBlockFormat centered;
446  centered.setAlignment(Qt::AlignCenter);
447  table->cellAt(0, 0).firstCursorPosition().setBlockFormat(centered);
448  table->cellAt(0, 0).firstCursorPosition().insertText(i18n("Asteroid/Comet details"), m_TableTitleCharFormat);
449 
450  table->cellAt(1, 0).firstCursorPosition().insertText(i18n("Perihelion:"), m_ItemNameCharFormat);
451  table->cellAt(1, 0).firstCursorPosition().setBlockFormat(centered);
452  table->cellAt(1, 1).firstCursorPosition().insertText(perihelionVal, m_ItemValueCharFormat);
453 
454  table->cellAt(2, 0).firstCursorPosition().insertText(i18n("Orbit ID:"), m_ItemNameCharFormat);
455  table->cellAt(2, 0).firstCursorPosition().setBlockFormat(centered);
456  table->cellAt(2, 1).firstCursorPosition().insertText(orbitIdVal, m_ItemValueCharFormat);
457 
458  table->cellAt(3, 0).firstCursorPosition().insertText(i18n("NEO:"), m_ItemNameCharFormat);
459  table->cellAt(3, 0).firstCursorPosition().setBlockFormat(centered);
460  table->cellAt(3, 1).firstCursorPosition().insertText(neoVal, m_ItemValueCharFormat);
461 
462  table->cellAt(4, 0).firstCursorPosition().insertText(i18n("Diameter:"), m_ItemNameCharFormat);
463  table->cellAt(4, 0).firstCursorPosition().setBlockFormat(centered);
464  table->cellAt(4, 1).firstCursorPosition().insertText(diamVal, m_ItemValueCharFormat);
465 
466  table->cellAt(5, 0).firstCursorPosition().insertText(i18n("Rotation period:"), m_ItemNameCharFormat);
467  table->cellAt(5, 0).firstCursorPosition().setBlockFormat(centered);
468  table->cellAt(5, 1).firstCursorPosition().insertText(rotPeriodVal, m_ItemValueCharFormat);
469 
470  table->cellAt(1, 2).firstCursorPosition().insertText(i18n("Earth MOID:"), m_ItemNameCharFormat);
471  table->cellAt(1, 2).firstCursorPosition().setBlockFormat(centered);
472  table->cellAt(1, 3).firstCursorPosition().insertText(moidVal, m_ItemValueCharFormat);
473 
474  table->cellAt(2, 2).firstCursorPosition().insertText(i18n("Orbit class:"), m_ItemNameCharFormat);
475  table->cellAt(2, 2).firstCursorPosition().setBlockFormat(centered);
476  table->cellAt(2, 3).firstCursorPosition().insertText(orbitClassVal, m_ItemValueCharFormat);
477 
478  table->cellAt(3, 2).firstCursorPosition().insertText(i18n("Albedo:"), m_ItemNameCharFormat);
479  table->cellAt(3, 2).firstCursorPosition().setBlockFormat(centered);
480  table->cellAt(3, 3).firstCursorPosition().insertText(albedoVal, m_ItemValueCharFormat);
481 
482  table->cellAt(4, 2).firstCursorPosition().insertText(i18n("Dimensions:"), m_ItemNameCharFormat);
483  table->cellAt(4, 2).firstCursorPosition().setBlockFormat(centered);
484  table->cellAt(4, 3).firstCursorPosition().insertText(dimVal, m_ItemValueCharFormat);
485 
486  table->cellAt(5, 2).firstCursorPosition().insertText(i18n("Period:"), m_ItemNameCharFormat);
487  table->cellAt(5, 2).firstCursorPosition().setBlockFormat(centered);
488  table->cellAt(5, 3).firstCursorPosition().insertText(periodVal, m_ItemValueCharFormat);
489 }
490 
492 {
493  clearContents();
494 
495  QTextCursor cursor = m_Document->rootFrame()->firstCursorPosition();
496 
497  // Set column width constraints
498  QVector<QTextLength> constraints;
501  m_TableFormat.setColumnWidthConstraints(constraints);
502 
503  // Insert table & row containing table name
504  QTextTable *table = cursor.insertTable(4, 4, m_TableFormat);
505  table->mergeCells(0, 0, 1, 4);
506  QTextBlockFormat centered;
507  centered.setAlignment(Qt::AlignCenter);
508  table->cellAt(0, 0).firstCursorPosition().setBlockFormat(centered);
509  table->cellAt(0, 0).firstCursorPosition().insertText(i18n("Coordinates"), m_TableTitleCharFormat);
510 
511  //Coordinates Section:
512  //Don't use KLocale::formatNumber() for the epoch string,
513  //because we don't want a thousands-place separator!
514  QString sEpoch = QString::number(ut.epoch(), 'f', 1);
515  //Replace the decimal point with localized decimal symbol
516  sEpoch.replace('.', QLocale().decimalPoint());
517 
518  table->cellAt(1, 0).firstCursorPosition().insertText(i18n("RA (%1):", sEpoch), m_ItemNameCharFormat);
519  table->cellAt(1, 0).firstCursorPosition().setBlockFormat(centered);
520  table->cellAt(1, 1).firstCursorPosition().insertText(obj->ra().toHMSString(), m_ItemValueCharFormat);
521 
522  table->cellAt(2, 0).firstCursorPosition().insertText(i18n("Dec (%1):", sEpoch), m_ItemNameCharFormat);
523  table->cellAt(2, 0).firstCursorPosition().setBlockFormat(centered);
524  table->cellAt(2, 1).firstCursorPosition().insertText(obj->dec().toDMSString(), m_ItemValueCharFormat);
525 
526  table->cellAt(3, 0).firstCursorPosition().insertText(i18n("Hour angle:"), m_ItemNameCharFormat);
527  table->cellAt(3, 0).firstCursorPosition().setBlockFormat(centered);
528  //Hour Angle can be negative, but dms HMS expressions cannot.
529  //Here's a kludgy workaround:
530  dms lst = geo->GSTtoLST(ut.gst());
531  dms ha(lst.Degrees() - obj->ra().Degrees());
532  QChar sgn('+');
533  if (ha.Hours() > 12.0)
534  {
535  ha.setH(24.0 - ha.Hours());
536  sgn = '-';
537  }
538  table->cellAt(3, 1).firstCursorPosition().insertText(QString("%1%2").arg(sgn).arg(ha.toHMSString()),
539  m_ItemValueCharFormat);
540 
541  table->cellAt(1, 2).firstCursorPosition().insertText(i18n("Azimuth:"), m_ItemNameCharFormat);
542  table->cellAt(1, 2).firstCursorPosition().setBlockFormat(centered);
543  table->cellAt(1, 3).firstCursorPosition().insertText(obj->az().toDMSString(), m_ItemValueCharFormat);
544 
545  table->cellAt(2, 2).firstCursorPosition().insertText(i18n("Altitude:"), m_ItemNameCharFormat);
546  table->cellAt(2, 2).firstCursorPosition().setBlockFormat(centered);
547  dms a;
548  if (Options::useAltAz())
549  {
550  a = obj->alt();
551  }
552 
553  else
554  {
555  a = obj->altRefracted();
556  }
557  table->cellAt(2, 3).firstCursorPosition().insertText(a.toDMSString(), m_ItemValueCharFormat);
558 
559  table->cellAt(3, 2).firstCursorPosition().insertText(i18n("Airmass:"), m_ItemNameCharFormat);
560  table->cellAt(3, 2).firstCursorPosition().setBlockFormat(centered);
561  //Airmass is approximated as the secant of the zenith distance,
562  //equivalent to 1./sin(Alt). Beware of Inf at Alt=0!
563  QString aMassStr;
564  if (obj->alt().Degrees() > 0.0)
565  {
566  aMassStr = QLocale().toString(1. / sin(obj->alt().radians()), 2);
567  }
568 
569  else
570  {
571  aMassStr = "--";
572  }
573  table->cellAt(3, 3).firstCursorPosition().insertText(aMassStr, m_ItemValueCharFormat);
574 
575  // Restore the position and other time-dependent parameters
576  obj->recomputeCoords(ut, geo);
577 }
578 
580 {
581  clearContents();
582 
583  QTextCursor cursor = m_Document->rootFrame()->firstCursorPosition();
584 
585  QString rtValue, stValue; // Rise/Set time values
586  QString azRValue, azSValue; // Rise/Set azimuth values
587 
588  //Prepare time/position variables
589  QTime rt = obj->riseSetTime(ut, geo, true); //true = use rise time
590  dms raz = obj->riseSetTimeAz(ut, geo, true); //true = use rise time
591 
592  //If transit time is before rise time, use transit time for tomorrow
593  QTime tt = obj->transitTime(ut, geo);
594  dms talt = obj->transitAltitude(ut, geo);
595  if (tt < rt)
596  {
597  tt = obj->transitTime(ut.addDays(1), geo);
598  talt = obj->transitAltitude(ut.addDays(1), geo);
599  }
600 
601  //If set time is before rise time, use set time for tomorrow
602  QTime st = obj->riseSetTime(ut, geo, false); //false = use set time
603  dms saz = obj->riseSetTimeAz(ut, geo, false); //false = use set time
604  if (st < rt)
605  {
606  st = obj->riseSetTime(ut.addDays(1), geo, false); //false = use set time
607  saz = obj->riseSetTimeAz(ut.addDays(1), geo, false); //false = use set time
608  }
609 
610  if (rt.isValid())
611  {
612  rtValue = QString::asprintf("%02d:%02d", rt.hour(), rt.minute());
613  stValue = QString::asprintf("%02d:%02d", st.hour(), st.minute());
614  azRValue = raz.toDMSString();
615  azSValue = saz.toDMSString();
616  }
617 
618  else
619  {
620  if (obj->alt().Degrees() > 0.0)
621  {
622  rtValue = i18n("Circumpolar");
623  stValue = i18n("Circumpolar");
624  }
625 
626  else
627  {
628  rtValue = i18n("Never rises");
629  stValue = i18n("Never rises");
630  }
631 
632  azRValue = i18nc("Not Applicable", "N/A");
633  azSValue = i18nc("Not Applicable", "N/A");
634  }
635 
636  // Set column width constraints
637  QVector<QTextLength> constraints;
640  m_TableFormat.setColumnWidthConstraints(constraints);
641 
642  // Insert table & row containing table name
643  QTextTable *table = cursor.insertTable(4, 4, m_TableFormat);
644  table->mergeCells(0, 0, 1, 4);
645  QTextBlockFormat centered;
646  centered.setAlignment(Qt::AlignCenter);
647  table->cellAt(0, 0).firstCursorPosition().setBlockFormat(centered);
648  table->cellAt(0, 0).firstCursorPosition().insertText(i18n("Rise/Set/Transit"), m_TableTitleCharFormat);
649 
650  // Insert cell names & values
651  table->cellAt(1, 0).firstCursorPosition().insertText(i18n("Rise time:"), m_ItemNameCharFormat);
652  table->cellAt(1, 0).firstCursorPosition().setBlockFormat(centered);
653  table->cellAt(1, 1).firstCursorPosition().insertText(rtValue, m_ItemValueCharFormat);
654 
655  table->cellAt(2, 0).firstCursorPosition().insertText(i18n("Transit time:"), m_ItemNameCharFormat);
656  table->cellAt(2, 0).firstCursorPosition().setBlockFormat(centered);
657  table->cellAt(2, 1).firstCursorPosition().insertText(QString::asprintf("%02d:%02d", tt.hour(), tt.minute()),
658  m_ItemValueCharFormat);
659 
660  table->cellAt(3, 0).firstCursorPosition().insertText(i18n("Set time:"), m_ItemNameCharFormat);
661  table->cellAt(3, 0).firstCursorPosition().setBlockFormat(centered);
662  table->cellAt(3, 1).firstCursorPosition().insertText(stValue, m_ItemValueCharFormat);
663 
664  table->cellAt(1, 2).firstCursorPosition().insertText(i18n("Azimuth at rise:"), m_ItemNameCharFormat);
665  table->cellAt(1, 2).firstCursorPosition().setBlockFormat(centered);
666  table->cellAt(1, 3).firstCursorPosition().insertText(azRValue, m_ItemValueCharFormat);
667 
668  table->cellAt(2, 2).firstCursorPosition().insertText(i18n("Altitude at transit:"), m_ItemNameCharFormat);
669  table->cellAt(2, 2).firstCursorPosition().setBlockFormat(centered);
670  table->cellAt(2, 3).firstCursorPosition().insertText(talt.toDMSString(), m_ItemValueCharFormat);
671 
672  table->cellAt(3, 2).firstCursorPosition().insertText(i18n("Azimuth at set:"), m_ItemNameCharFormat);
673  table->cellAt(3, 2).firstCursorPosition().setBlockFormat(centered);
674  table->cellAt(3, 3).firstCursorPosition().insertText(azSValue, m_ItemValueCharFormat);
675 
676  // Restore the position and other time-dependent parameters
677  obj->recomputeCoords(ut, geo);
678 }
679 
681 {
682  m_Document->clear();
683 }
684 
685 void DetailsTable::setDefaultFormatting()
686 {
687  // Set default table format
688  m_TableFormat.setAlignment(Qt::AlignCenter);
689  m_TableFormat.setBorder(4);
690  m_TableFormat.setCellPadding(2);
691  m_TableFormat.setCellSpacing(2);
692 
693  // Set default table title character format
694  m_TableTitleCharFormat.setFont(QFont("Times", 12, QFont::Bold));
695  m_TableTitleCharFormat.setFontCapitalization(QFont::Capitalize);
696 
697  // Set default table item name character format
698  m_ItemNameCharFormat.setFont(QFont("Times", 10, QFont::Bold));
699 
700  // Set default table item value character format
701  m_ItemValueCharFormat.setFont(QFont("Times", 10));
702 }
const dms & alt() const
Definition: skypoint.h:281
QString getOrbitClass() const
Definition: ksasteroid.h:118
float getRotationPeriod() const
Definition: ksasteroid.h:168
Extension of QDateTime for KStars KStarsDateTime can represent the date/time as a Julian Day,...
AlignCenter
QString getOrbitClass()
Definition: kscomet.h:130
KStarsDateTime addDays(int nd) const
Modify the Date/Time by adding a number of days.
void setColumnWidthConstraints(const QVector< QTextLength > &constraints)
QString number(int n, int base)
QString translatedLongName() const
Definition: skyobject.h:169
QTextCursor firstCursorPosition() const const
QTextFrame * rootFrame() const const
A subclass of KSPlanetBase that implements asteroids.
Definition: ksasteroid.h:41
A subclass of KSPlanetBase that implements comets.
Definition: kscomet.h:43
virtual QString name(void) const
Definition: skyobject.h:145
bool isNEO()
Definition: kscomet.h:136
QString translatedName() const
Definition: skyobject.h:148
float mag() const
Definition: skyobject.h:206
float getDiameter()
Definition: kscomet.h:148
bool isVariable() const
Definition: starobject.h:258
bool isValid() const const
double rearth() const
Definition: ksplanetbase.h:139
void setCellSpacing(qreal spacing)
void setAlignment(Qt::Alignment alignment)
double getPerihelion() const
Definition: ksasteroid.h:88
const QString toHMSString(const bool machineReadable=false, const bool highPrecision=false) const
Definition: dms.cpp:370
QString translatedName2() const
Definition: skyobject.h:159
float getRotationPeriod()
Definition: kscomet.h:160
Provides necessary information about the Moon. A subclass of SkyObject that provides information need...
Definition: ksmoon.h:25
void createCoordinatesTable(SkyObject *obj, const KStarsDateTime &ut, GeoLocation *geo)
Create coordinates details table.
dms altRefracted() const
Definition: skypoint.cpp:1050
QString getOrbitID() const
Definition: ksasteroid.h:108
double getEarthMOID() const
Definition: ksasteroid.h:98
int getHDIndex() const
Definition: starobject.h:248
static KStars * Instance()
Definition: kstars.h:125
double getPerihelion()
Returns Perihelion distance.
Definition: kscomet.h:85
void createRSTTAble(SkyObject *obj, const KStarsDateTime &ut, GeoLocation *geo)
Create Rise/Set/Transit details table.
int type(void) const
Definition: skyobject.h:188
void setFontCapitalization(QFont::Capitalization capitalization)
float a() const
virtual void setH(const double &x)
Sets floating-point value of angle, in hours.
Definition: dms.h:210
QTextTableCell cellAt(int row, int column) const const
QString getOrbitID()
Definition: kscomet.h:124
QString i18n(const char *text, const TYPE &arg...)
double epoch() const
This is (approximately) the year expressed as a floating-point value.
QString longname(void) const override
If star is unnamed return "star" otherwise return the longname.
Definition: starobject.h:133
const QString toDMSString(const bool forceSign=false, const bool machineReadable=false, const bool highPrecision=false) const
Definition: dms.cpp:279
const CachingDms & dec() const
Definition: skypoint.h:269
QString getDimensions() const
Definition: ksasteroid.h:158
QTextCursor firstCursorPosition() const const
double illum() const
Definition: ksmoon.h:49
dms riseSetTimeAz(const KStarsDateTime &dt, const GeoLocation *geo, bool rst) const
Definition: skyobject.cpp:190
void setBlockFormat(const QTextBlockFormat &format)
subclass of SkyObject specialized for stars.
Definition: starobject.h:32
QTime riseSetTime(const KStarsDateTime &dt, const GeoLocation *geo, bool rst, bool exact=true) const
Determine the time at which the point will rise or set.
Definition: skyobject.cpp:93
void createGeneralTable(SkyObject *obj)
Create general details table.
bool isEmpty() const const
QString sptype(void) const
Returns entire spectral type string.
Definition: starobject.cpp:549
QString toString(qlonglong i) const const
QString getDimensions()
Definition: kscomet.h:154
float getPeriod() const
Definition: ksasteroid.h:178
bool isNEO() const
Definition: ksasteroid.h:128
SkyPoint recomputeCoords(const KStarsDateTime &dt, const GeoLocation *geo=nullptr) const
The equatorial coordinates for the object on date dt are computed and returned, but the object's inte...
Definition: skyobject.cpp:295
void setFont(const QFont &font, QTextCharFormat::FontPropertiesInheritanceBehavior behavior)
float getPeriod()
Definition: kscomet.h:166
void setBorder(qreal width)
double getEarthMOID()
Definition: kscomet.h:118
int hour() const const
QString & replace(int position, int n, QChar after)
DetailsTable()
Default constructor - creates empty details table.
SkyMapComposite * skyComposite()
Definition: kstarsdata.h:165
QTextTable * insertTable(int rows, int columns, const QTextTableFormat &format)
An angle, stored as degrees, but expressible in many ways.
Definition: dms.h:37
double angSize() const
Definition: ksplanetbase.h:184
dms transitAltitude(const KStarsDateTime &dt, const GeoLocation *geo) const
Definition: skyobject.cpp:244
static QString typeName(const int t)
Definition: skyobject.cpp:338
float getBVIndex() const
Definition: starobject.h:281
void setCellPadding(qreal padding)
float flux() const
const CachingDms & ra() const
Definition: skypoint.h:263
float getAlbedo()
Definition: kscomet.h:142
~DetailsTable()
Destructor.
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
double radians() const
Express the angle in radians.
Definition: dms.h:320
double distance() const
Definition: starobject.h:236
const double & Degrees() const
Definition: dms.h:141
float getDiameter() const
Definition: ksasteroid.h:148
bool isMultiple() const
Definition: starobject.h:245
void insertText(const QString &text)
QString i18nc(const char *context, const char *text, const TYPE &arg...)
virtual QString longname(void) const
Definition: skyobject.h:164
QTime transitTime(const KStarsDateTime &dt, const GeoLocation *geo) const
The same iteration technique described in riseSetTime() is used here.
Definition: skyobject.cpp:239
void createAsteroidCometTable(SkyObject *obj)
Create Asteroid/Comet details table.
QString asprintf(const char *cformat,...)
void setAlignment(Qt::Alignment alignment)
virtual void clear()
float getAlbedo() const
Definition: ksasteroid.h:138
A simple container object to hold the minimum information for a Deeb Sky Object to be drawn on the sk...
Definition: catalogobject.h:40
Information about an object in the sky.
Definition: skyobject.h:41
int minute() const const
void mergeCells(int row, int column, int numRows, int numCols)
double Hours() const
Definition: dms.h:168
void clearContents()
Clear current table.
Provides necessary information about objects in the solar system.
Definition: ksplanetbase.h:49
Relevant data about an observing location on Earth.
Definition: geolocation.h:27
const dms & az() const
Definition: skypoint.h:275
This file is part of the KDE documentation.
Documentation copyright © 1996-2022 The KDE developers.
Generated on Fri Aug 12 2022 04:00:53 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.