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