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 }