1 /*
2 SPDX-FileCopyrightText: 2005 Thomas Kabelmann <thomas.kabelmann@gmx.de>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "solarsystemsinglecomponent.h"
8 #include "solarsystemcomposite.h"
9 #include "skycomponent.h"
10 #include <KLocalizedString>
11
12 #include "dms.h"
13 #include "kstarsdata.h"
14 #include "skyobjects/starobject.h"
15 #include "skyobjects/ksplanetbase.h"
16 #include "skyobjects/ksplanet.h"
17 #ifdef KSTARS_LITE
18 #include "skymaplite.h"
19 #else
20 #include "skymap.h"
21 #endif
22
23 #include "Options.h"
24 #include "skylabeler.h"
25
26 #include "skypainter.h"
27 #include "projections/projector.h"
28
SolarSystemSingleComponent(SolarSystemComposite * parent,KSPlanetBase * kspb,bool (* visibleMethod)(),bool isMoon)29 SolarSystemSingleComponent::SolarSystemSingleComponent(SolarSystemComposite *parent, KSPlanetBase *kspb,
30 bool (*visibleMethod)(), bool isMoon)
31 : SkyComponent(parent), visible(visibleMethod), m_isMoon(isMoon), m_Earth(parent->earth()), m_Planet(kspb)
32 {
33 m_Planet->loadData();
34 if (!m_Planet->name().isEmpty())
35 {
36 objectNames(m_Planet->type()).append(m_Planet->name());
37 objectLists(m_Planet->type()).append(QPair<QString, const SkyObject *>(m_Planet->name(), m_Planet));
38 }
39 if (!m_Planet->longname().isEmpty() && m_Planet->longname() != m_Planet->name())
40 {
41 objectNames(m_Planet->type()).append(m_Planet->longname());
42 objectLists(m_Planet->type()).append(QPair<QString, const SkyObject *>(m_Planet->longname(), m_Planet));
43 }
44 }
45
~SolarSystemSingleComponent()46 SolarSystemSingleComponent::~SolarSystemSingleComponent()
47 {
48 removeFromNames(m_Planet);
49 removeFromLists(m_Planet);
50 delete m_Planet;
51 }
52
selected()53 bool SolarSystemSingleComponent::selected()
54 {
55 return visible();
56 }
57
findByName(const QString & name)58 SkyObject *SolarSystemSingleComponent::findByName(const QString &name)
59 {
60 if (QString::compare(m_Planet->name(), name, Qt::CaseInsensitive) == 0 ||
61 QString::compare(m_Planet->longname(), name, Qt::CaseInsensitive) == 0 ||
62 QString::compare(m_Planet->name2(), name, Qt::CaseInsensitive) == 0)
63 return m_Planet;
64 return nullptr;
65 }
66
objectNearest(SkyPoint * p,double & maxrad)67 SkyObject *SolarSystemSingleComponent::objectNearest(SkyPoint *p, double &maxrad)
68 {
69 double r = m_Planet->angularDistanceTo(p).Degrees();
70 if (r < maxrad)
71 {
72 maxrad = r;
73 return m_Planet;
74 }
75 return nullptr;
76 }
77
update(KSNumbers *)78 void SolarSystemSingleComponent::update(KSNumbers *)
79 {
80 KStarsData *data = KStarsData::Instance();
81 if (selected())
82 m_Planet->EquatorialToHorizontal(data->lst(), data->geo()->lat());
83 }
84
updateSolarSystemBodies(KSNumbers * num)85 void SolarSystemSingleComponent::updateSolarSystemBodies(KSNumbers *num)
86 {
87 if (!m_isMoon && selected())
88 {
89 KStarsData *data = KStarsData::Instance();
90 m_Planet->findPosition(num, data->geo()->lat(), data->lst(), m_Earth);
91 m_Planet->EquatorialToHorizontal(data->lst(), data->geo()->lat());
92 if (m_Planet->hasTrail())
93 m_Planet->updateTrail(data->lst(), data->geo()->lat());
94 }
95 }
96
97 // NOTE: This seems like code duplication, and yes IT IS. But there may be some
98 // NOTE: changes to be made to it later on, and calling `updateSolarSystemBodies`
99 // NOTE: is ugly.
updateMoons(KSNumbers * num)100 void SolarSystemSingleComponent::updateMoons(KSNumbers *num)
101 {
102 KStarsData *data = KStarsData::Instance();
103 m_Planet->findPosition(num, data->geo()->lat(), data->lst(), m_Earth);
104 m_Planet->EquatorialToHorizontal(data->lst(), data->geo()->lat());
105 if (m_Planet->hasTrail())
106 m_Planet->updateTrail(data->lst(), data->geo()->lat());
107 }
108
draw(SkyPainter * skyp)109 void SolarSystemSingleComponent::draw(SkyPainter *skyp)
110 {
111 if (!selected())
112 return;
113
114 skyp->setPen(m_Planet->color());
115 skyp->setBrush(m_Planet->color());
116
117 bool drawn = skyp->drawPlanet(m_Planet);
118 if (drawn && Options::showPlanetNames())
119 SkyLabeler::AddLabel(m_Planet, SkyLabeler::PLANET_LABEL);
120 }
121
drawTrails(SkyPainter * skyp)122 void SolarSystemSingleComponent::drawTrails(SkyPainter *skyp)
123 {
124 if (selected())
125 m_Planet->drawTrail(skyp);
126 }
127