File indexing completed on 2024-04-21 03:44:45
0001 /* 0002 SPDX-FileCopyrightText: 2007 Jason Harris <kstars@30doradus.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "trailobject.h" 0008 0009 #include "kstarsdata.h" 0010 #include "skymap.h" 0011 #ifndef KSTARS_LITE 0012 #include "kspopupmenu.h" 0013 #endif 0014 #include "skycomponents/skylabeler.h" 0015 #include "skypainter.h" 0016 #include "projections/projector.h" 0017 #include "Options.h" 0018 0019 #include <QPainter> 0020 0021 #include <typeinfo> 0022 0023 QSet<TrailObject *> TrailObject::trailObjects; 0024 0025 TrailObject::TrailObject(int t, dms r, dms d, float m, const QString &n) : SkyObject(t, r, d, m, n) 0026 { 0027 } 0028 0029 TrailObject::TrailObject(int t, double r, double d, float m, const QString &n) : SkyObject(t, r, d, m, n) 0030 { 0031 } 0032 0033 TrailObject::~TrailObject() 0034 { 0035 trailObjects.remove(this); 0036 } 0037 0038 TrailObject *TrailObject::clone() const 0039 { 0040 Q_ASSERT(typeid(this) == 0041 typeid(static_cast<const TrailObject *>(this))); // Ensure we are not slicing a derived class 0042 return new TrailObject(*this); 0043 } 0044 0045 void TrailObject::updateTrail(dms *LST, const dms *lat) 0046 { 0047 for (auto & item : Trail) 0048 item.EquatorialToHorizontal(LST, lat); 0049 } 0050 0051 void TrailObject::initPopupMenu(KSPopupMenu *pmenu) 0052 { 0053 #ifndef KSTARS_LITE 0054 pmenu->createPlanetMenu(this); 0055 #else 0056 Q_UNUSED(pmenu); 0057 #endif 0058 } 0059 0060 void TrailObject::addToTrail(const QString &label) 0061 { 0062 Trail.append(SkyPoint(*this)); 0063 m_TrailLabels.append(label); 0064 trailObjects.insert(this); 0065 } 0066 0067 void TrailObject::clipTrail() 0068 { 0069 if (Trail.size()) 0070 { 0071 Trail.removeFirst(); 0072 Q_ASSERT(m_TrailLabels.size()); 0073 m_TrailLabels.removeFirst(); 0074 } 0075 if (Trail.size()) // Eh? Shouldn't this be if( !Trail.size() ) -- asimha 0076 trailObjects.remove(this); 0077 } 0078 0079 void TrailObject::clearTrail() 0080 { 0081 Trail.clear(); 0082 m_TrailLabels.clear(); 0083 trailObjects.remove(this); 0084 } 0085 0086 void TrailObject::clearTrailsExcept(SkyObject *o) 0087 { 0088 TrailObject *keep = nullptr; 0089 foreach (TrailObject *tr, trailObjects) 0090 { 0091 if (tr != o) 0092 tr->clearTrail(); 0093 else 0094 keep = tr; 0095 } 0096 0097 trailObjects = QSet<TrailObject *>(); 0098 if (keep) 0099 trailObjects.insert(keep); 0100 } 0101 0102 void TrailObject::drawTrail(SkyPainter *skyp) const 0103 { 0104 Q_UNUSED(skyp) 0105 #ifndef KSTARS_LITE 0106 if (!Trail.size()) 0107 return; 0108 0109 KStarsData *data = KStarsData::Instance(); 0110 0111 QColor tcolor = QColor(data->colorScheme()->colorNamed("PlanetTrailColor")); 0112 skyp->setPen(QPen(tcolor, 1)); 0113 SkyLabeler *labeler = SkyLabeler::Instance(); 0114 labeler->setPen(tcolor); 0115 int n = Trail.size(); 0116 for (int i = 1; i < n; ++i) 0117 { 0118 if (Options::fadePlanetTrails()) 0119 { 0120 tcolor.setAlphaF(static_cast<qreal>(i) / static_cast<qreal>(n)); 0121 skyp->setPen(QPen(tcolor, 1)); 0122 } 0123 SkyPoint a = Trail[i - 1]; 0124 SkyPoint b = Trail[i]; 0125 skyp->drawSkyLine(&a, &b); 0126 if (i % 5 == 1) // TODO: Make drawing of labels configurable, incl. frequency etc. 0127 { 0128 QPointF pt = SkyMap::Instance()->projector()->toScreen(&a); 0129 labeler->drawGuideLabel(pt, m_TrailLabels[i - 1], 0.0); 0130 } 0131 } 0132 #endif 0133 }