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