1 /*
2     SPDX-FileCopyrightText: 2001 Jason Harris <jharris@30doradus.org>
3     SPDX-FileCopyrightText: 2021 Valentin Boettcher <hiro at protagon.space; @hiro98:tchncs.de>
4 
5     SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #include "catalogobject.h"
9 #include "ksutils.h"
10 #include "Options.h"
11 #include "skymap.h"
12 #include "texturemanager.h"
13 #include "kstarsdata.h"
14 #include "kspopupmenu.h"
15 #include "catalogsdb.h"
16 #include <QCryptographicHash>
17 #include <typeinfo>
18 
clone() const19 CatalogObject *CatalogObject::clone() const
20 {
21     Q_ASSERT(typeid(this) == typeid(static_cast<const CatalogObject *>(
22                                         this))); // Ensure we are not slicing a derived class
23     return new CatalogObject(*this);      // NOLINT, (b.c. returning raw memory is bad!)
24 }
25 
e() const26 float CatalogObject::e() const
27 {
28     if (m_major_axis == 0.0 || m_minor_axis == 0.0)
29         return 1.0; //assume circular
30     return m_minor_axis / m_major_axis;
31 }
32 
labelOffset() const33 double CatalogObject::labelOffset() const
34 {
35     //Calculate object size in pixels
36     double major_axis = m_major_axis;
37     double minor_axis = m_minor_axis;
38 
39     if (major_axis == 0.0 && type() == 1) //catalog stars
40     {
41         major_axis = 1.0;
42         minor_axis = 1.0;
43     }
44 
45     double size =
46         ((major_axis + minor_axis) / 2.0) * dms::PI * Options::zoomFactor() / 10800.0;
47 
48     return 0.5 * size + 4.;
49 }
50 
labelString() const51 QString CatalogObject::labelString() const
52 {
53     QString oName;
54     if (Options::showDeepSkyNames())
55     {
56         if (Options::deepSkyLongLabels() && translatedLongName() != translatedName())
57             oName = translatedLongName() + " (" + translatedName() + ')';
58         else
59             oName = translatedName();
60     }
61 
62     if (Options::showDeepSkyMagnitudes() && !std::isnan(mag()))
63     {
64         if (Options::showDeepSkyNames())
65             oName += ' ';
66         oName += '[' + QLocale().toString(mag(), 'f', 1) + "m]";
67     }
68 
69     return oName;
70 }
71 
getUID() const72 SkyObject::UID CatalogObject::getUID() const
73 {
74     return m_object_id.toLongLong(); // = qint64
75 }
76 
JITupdate()77 void CatalogObject::JITupdate()
78 {
79     KStarsData *data{ KStarsData::Instance() };
80 
81     if (m_updateID != data->updateID())
82     {
83         m_updateID = data->updateID();
84 
85         if (m_updateNumID != data->updateNumID())
86         {
87             updateCoords(data->updateNum());
88             m_updateNumID = data->updateNumID();
89         }
90 
91         EquatorialToHorizontal(data->lst(), data->geo()->lat());
92     }
93 }
94 
initPopupMenu(KSPopupMenu * pmenu)95 void CatalogObject::initPopupMenu(KSPopupMenu *pmenu)
96 {
97 #ifndef KSTARS_LITE
98     pmenu->createCatalogObjectMenu(this);
99 #else
100     Q_UNUSED(pmenu);
101 #endif
102 }
103 
getCatalog() const104 const CatalogsDB::Catalog CatalogObject::getCatalog() const
105 {
106     if (m_database_path.get().length() == 0)
107         return {};
108 
109     CatalogsDB::DBManager db{ m_database_path };
110 
111     const auto &success = db.get_catalog(m_catalog_id);
112     return (success.first ? success.second : CatalogsDB::Catalog{});
113 }
114 
getId() const115 const CatalogObject::oid CatalogObject::getId() const
116 
117 {
118     return CatalogObject::getId(SkyObject::TYPE(type()), ra0().Degrees(),
119                                 dec0().Degrees(), name(), catalogIdentifier());
120 }
121 
getId(const SkyObject::TYPE type,const double ra,const double dec,const QString & name,const QString & catalog_identifier)122 const CatalogObject::oid CatalogObject::getId(const SkyObject::TYPE type, const double ra,
123         const double dec, const QString &name,
124         const QString &catalog_identifier)
125 {
126     QString data;
127     data += QString::number(type);
128     data += QString::number(static_cast<int>(std::floor(ra)));
129     data += QString::number(static_cast<int>(std::floor(dec)));
130     data += name;
131     data += catalog_identifier;
132 
133     QCryptographicHash hash{ QCryptographicHash::Sha256 };
134     hash.addData(data.toUtf8());
135 
136     return hash.result();
137 }
138 
load_image()139 void CatalogObject::load_image()
140 {
141     if (!m_image_loaded)
142     {
143         QString tname  = name().toLower().remove(' ');
144         m_image        = TextureManager::getImage(tname);
145         m_image_loaded = true;
146     }
147 }
148