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 "solarsystemcomposite.h"
8 
9 #include "asteroidscomponent.h"
10 #include "cometscomponent.h"
11 #include "kstarsdata.h"
12 #include "Options.h"
13 #ifndef KSTARS_LITE
14 #include "skymap.h"
15 #endif
16 #include "solarsystemsinglecomponent.h"
17 #include "earthshadowcomponent.h"
18 #include "skyobjects/ksmoon.h"
19 #include "skyobjects/ksplanet.h"
20 #include "skyobjects/kssun.h"
21 #include "skyobjects/ksearthshadow.h"
22 
SolarSystemComposite(SkyComposite * parent)23 SolarSystemComposite::SolarSystemComposite(SkyComposite *parent) : SkyComposite(parent)
24 {
25     emitProgressText(i18n("Loading solar system"));
26     m_Earth = new KSPlanet(i18n("Earth"), QString(), QColor("white"), 12756.28 /*diameter in km*/);
27     m_Sun                           = new KSSun();
28     SolarSystemSingleComponent *sun = new SolarSystemSingleComponent(this, m_Sun, Options::showSun);
29     addComponent(sun, 2);
30     m_Moon                           = new KSMoon();
31     SolarSystemSingleComponent *moon = new SolarSystemSingleComponent(this, m_Moon, Options::showMoon, true);
32     addComponent(moon, 3);
33     m_EarthShadow = new KSEarthShadow(m_Moon, m_Sun, m_Earth);
34     EarthShadowComponent * shadow = new EarthShadowComponent(this, m_EarthShadow);
35     addComponent(shadow);
36     SolarSystemSingleComponent *mercury =
37         new SolarSystemSingleComponent(this, new KSPlanet(KSPlanetBase::MERCURY), Options::showMercury);
38     addComponent(mercury, 4);
39     SolarSystemSingleComponent *venus =
40         new SolarSystemSingleComponent(this, new KSPlanet(KSPlanetBase::VENUS), Options::showVenus);
41     addComponent(venus, 4);
42     SolarSystemSingleComponent *mars =
43         new SolarSystemSingleComponent(this, new KSPlanet(KSPlanetBase::MARS), Options::showMars);
44     addComponent(mars, 4);
45     SolarSystemSingleComponent *jup =
46         new SolarSystemSingleComponent(this, new KSPlanet(KSPlanetBase::JUPITER), Options::showJupiter);
47     addComponent(jup, 4);
48     /*
49     m_JupiterMoons = new PlanetMoonsComponent( this, jup, KSPlanetBase::JUPITER);
50     addComponent( m_JupiterMoons, 5 );
51     */
52     SolarSystemSingleComponent *sat =
53         new SolarSystemSingleComponent(this, new KSPlanet(KSPlanetBase::SATURN), Options::showSaturn);
54     addComponent(sat, 4);
55     SolarSystemSingleComponent *uranus =
56         new SolarSystemSingleComponent(this, new KSPlanet(KSPlanetBase::URANUS), Options::showUranus);
57     addComponent(uranus, 4);
58     SolarSystemSingleComponent *nep =
59         new SolarSystemSingleComponent(this, new KSPlanet(KSPlanetBase::NEPTUNE), Options::showNeptune);
60     addComponent(nep, 4);
61     //addComponent( new SolarSystemSingleComponent( this, new KSPluto(), Options::showPluto ) );
62 
63     m_planets.append(sun);
64     m_planets.append(moon);
65     m_planets.append(mercury);
66     m_planets.append(venus);
67     m_planets.append(mars);
68     m_planets.append(sat);
69     m_planets.append(jup);
70     m_planets.append(uranus);
71     m_planets.append(nep);
72 
73     /*m_planetObjects.append(sun->planet());
74     m_planetObjects.append(moon->planet());
75     m_planetObjects.append(mercury->planet());
76     m_planetObjects.append(venus->planet());
77     m_planetObjects.append(mars->planet());
78     m_planetObjects.append(sat->planet());
79     m_planetObjects.append(jup->planet());
80     m_planetObjects.append(uranus->planet());
81     m_planetObjects.append(nep->planet());
82 
83     foreach(PlanetMoonsComponent *pMoons, planetMoonsComponent()) {
84         PlanetMoons *moons = pMoons->getMoons();
85         for(int i = 0; i < moons->nMoons(); ++i) {
86             SkyObject *moon = moons->moon(i);
87             objectLists(SkyObject::MOON).append(QPair<QString, const SkyObject*>(moon->name(), moon));
88         }
89     }*/
90 
91     addComponent(m_AsteroidsComponent = new AsteroidsComponent(this), 7);
92     addComponent(m_CometsComponent = new CometsComponent(this), 7);
93 }
94 
~SolarSystemComposite()95 SolarSystemComposite::~SolarSystemComposite()
96 {
97     delete (m_EarthShadow);
98 }
99 
selected()100 bool SolarSystemComposite::selected()
101 {
102 #ifndef KSTARS_LITE
103     return Options::showSolarSystem() && !(Options::hideOnSlew() && Options::hidePlanets() && SkyMap::IsSlewing());
104 #else
105     return Options::showSolarSystem() && !(Options::hideOnSlew() && Options::hidePlanets());
106 #endif
107 }
108 
update(KSNumbers * num)109 void SolarSystemComposite::update(KSNumbers *num)
110 {
111     //    if ( ! selected() ) return;
112 
113     KStarsData *data = KStarsData::Instance();
114     m_Sun->EquatorialToHorizontal(data->lst(), data->geo()->lat());
115     m_Moon->EquatorialToHorizontal(data->lst(), data->geo()->lat());
116     //    m_JupiterMoons->update( num );
117 
118     foreach (SkyComponent *comp, components())
119     {
120         comp->update(num);
121     }
122 }
123 
updateSolarSystemBodies(KSNumbers * num)124 void SolarSystemComposite::updateSolarSystemBodies(KSNumbers *num)
125 {
126     m_Earth->findPosition(num);
127     foreach (SkyComponent *comp, components())
128     {
129         comp->updateSolarSystemBodies(num);
130     }
131 }
132 
updateMoons(KSNumbers * num)133 void SolarSystemComposite::updateMoons(KSNumbers *num)
134 {
135     //    if ( ! selected() ) return;
136     m_Earth->findPosition(num);
137     foreach (SkyComponent *comp, components())
138     {
139         comp->updateMoons(num);
140     }
141     //    m_JupiterMoons->updateMoons( num );
142 }
143 
drawTrails(SkyPainter * skyp)144 void SolarSystemComposite::drawTrails(SkyPainter *skyp)
145 {
146     if (selected())
147         foreach (SkyComponent *comp, components())
148             comp->drawTrails(skyp);
149 }
150 
asteroids() const151 const QList<SkyObject *> &SolarSystemComposite::asteroids() const
152 {
153     return m_AsteroidsComponent->objectList();
154 }
155 
comets() const156 const QList<SkyObject *> &SolarSystemComposite::comets() const
157 {
158     return m_CometsComponent->objectList();
159 }
160 
planetObjects() const161 const QList<SkyObject *> &SolarSystemComposite::planetObjects() const
162 {
163     return m_planetObjects;
164 }
165 
moons() const166 const QList<SkyObject *> &SolarSystemComposite::moons() const
167 {
168     return m_moons;
169 }
170 
cometsComponent()171 CometsComponent *SolarSystemComposite::cometsComponent()
172 {
173     return m_CometsComponent;
174 }
175 
asteroidsComponent()176 AsteroidsComponent *SolarSystemComposite::asteroidsComponent()
177 {
178     return m_AsteroidsComponent;
179 }
180 
planets() const181 const QList<SolarSystemSingleComponent *> &SolarSystemComposite::planets() const
182 {
183     return m_planets;
184 }
185 
186 /*
187 QList<PlanetMoonsComponent *> SolarSystemComposite::planetMoonsComponent() const
188 {
189     return QList <PlanetMoonsComponent *>({m_JupiterMoons});
190 }
191 */
192