File indexing completed on 2024-03-24 03:47:03

0001 /*
0002     SPDX-FileCopyrightText: 2016 Artem Fedoskin <afedoskin3@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "Options.h"
0007 #include <QSGNode>
0008 #include "labelsitem.h"
0009 #include "skylabeler.h"
0010 #include "skynodes/labelnode.h"
0011 #include "skynodes/guidelabelnode.h"
0012 
0013 #include "cometsitem.h"
0014 #include "staritem.h"
0015 #include "rootnode.h"
0016 #include "skymesh.h"
0017 #include "skynodes/trixelnode.h"
0018 
0019 LabelsItem::LabelsItem() : m_rootNode(0)
0020 {
0021     LabelTypeNode *stars = new LabelTypeNode;
0022     appendChildNode(stars);
0023 
0024     //Add trixels to hold star labels
0025     int trixelNum = SkyMesh::Instance()->size();
0026 
0027     for (int i = 0; i < trixelNum; ++i)
0028     {
0029         TrixelNode *trixel = new TrixelNode(i);
0030         stars->appendChildNode(trixel);
0031     }
0032 
0033     m_labelsLists.insert(label_t::STAR_LABEL, stars);
0034 
0035     LabelTypeNode *catalog_stars = new LabelTypeNode;
0036     appendChildNode(catalog_stars);
0037     m_labelsLists.insert(label_t::CATALOG_STAR_LABEL, catalog_stars);
0038 
0039     LabelTypeNode *asteroids = new LabelTypeNode;
0040     appendChildNode(asteroids);
0041     m_labelsLists.insert(label_t::ASTEROID_LABEL, asteroids);
0042 
0043     LabelTypeNode *comets = new LabelTypeNode;
0044     appendChildNode(comets);
0045     m_labelsLists.insert(label_t::COMET_LABEL, comets);
0046 
0047     LabelTypeNode *planets = new LabelTypeNode;
0048     appendChildNode(planets);
0049     m_labelsLists.insert(label_t::PLANET_LABEL, planets);
0050 
0051     LabelTypeNode *jupiter_moons = new LabelTypeNode;
0052     appendChildNode(jupiter_moons);
0053     m_labelsLists.insert(label_t::JUPITER_MOON_LABEL, jupiter_moons);
0054 
0055     LabelTypeNode *saturn_moons = new LabelTypeNode;
0056     appendChildNode(saturn_moons);
0057     m_labelsLists.insert(label_t::SATURN_MOON_LABEL, saturn_moons);
0058 
0059     LabelTypeNode *deep_sky = new LabelTypeNode;
0060     appendChildNode(deep_sky);
0061     m_labelsLists.insert(label_t::DEEP_SKY_LABEL, deep_sky);
0062 
0063     LabelTypeNode *dso_messier = new LabelTypeNode;
0064     deep_sky->appendChildNode(dso_messier);
0065     m_labelsLists.insert(label_t::DSO_MESSIER_LABEL, dso_messier);
0066 
0067     LabelTypeNode *dso_other = new LabelTypeNode;
0068     deep_sky->appendChildNode(dso_other);
0069     m_labelsLists.insert(label_t::DSO_OTHER_LABEL, dso_other);
0070 
0071     LabelTypeNode *catalog_dso = new LabelTypeNode;
0072     appendChildNode(catalog_dso);
0073     m_labelsLists.insert(label_t::CATALOG_DSO_LABEL, catalog_dso);
0074 
0075     LabelTypeNode *constellation = new LabelTypeNode;
0076     appendChildNode(constellation);
0077     m_labelsLists.insert(label_t::CONSTEL_NAME_LABEL, constellation);
0078 
0079     LabelTypeNode *satellite = new LabelTypeNode;
0080     appendChildNode(satellite);
0081     m_labelsLists.insert(label_t::SATELLITE_LABEL, satellite);
0082 
0083     LabelTypeNode *rude = new LabelTypeNode;
0084     appendChildNode(rude);
0085     m_labelsLists.insert(label_t::RUDE_LABEL, rude);
0086 
0087     LabelTypeNode *num_label = new LabelTypeNode;
0088     appendChildNode(num_label);
0089     m_labelsLists.insert(label_t::NUM_LABEL_TYPES, num_label);
0090 
0091     LabelTypeNode *horizon_label = new LabelTypeNode;
0092     appendChildNode(horizon_label);
0093     m_labelsLists.insert(label_t::HORIZON_LABEL, horizon_label);
0094 
0095     LabelTypeNode *equator = new LabelTypeNode;
0096     appendChildNode(equator);
0097     m_labelsLists.insert(label_t::EQUATOR_LABEL, equator);
0098 
0099     LabelTypeNode *ecliptic = new LabelTypeNode;
0100     appendChildNode(ecliptic);
0101     m_labelsLists.insert(label_t::ECLIPTIC_LABEL, ecliptic);
0102 
0103     LabelTypeNode *telescopeSymbol = new LabelTypeNode;
0104     appendChildNode(telescopeSymbol);
0105     m_labelsLists.insert(label_t::TELESCOPE_SYMBOL, telescopeSymbol);
0106 
0107     skyLabeler = SkyLabeler::Instance();
0108     skyLabeler->reset();
0109 }
0110 
0111 LabelNode *LabelsItem::addLabel(SkyObject *skyObject, label_t labelType)
0112 {
0113     LabelNode *label = new LabelNode(skyObject, labelType);
0114     m_labelsLists.value(labelType)->appendChildNode(label);
0115     return label;
0116 }
0117 
0118 LabelNode *LabelsItem::addLabel(SkyObject *skyObject, label_t labelType, Trixel trixel)
0119 {
0120     Q_ASSERT(labelType == STAR_LABEL || labelType == DSO_MESSIER_LABEL || labelType == DSO_NGC_LABEL ||
0121              labelType == DSO_IC_LABEL || labelType == DSO_OTHER_LABEL);
0122     TrixelNode *triNode = static_cast<TrixelNode *>(m_labelsLists.value(labelType)->firstChild());
0123     LabelNode *label    = 0;
0124 
0125     while (triNode != 0)
0126     {
0127         if (triNode->trixelID() == trixel)
0128         {
0129             label = new LabelNode(skyObject, labelType);
0130             triNode->appendChildNode(label);
0131             break;
0132         }
0133         triNode = static_cast<TrixelNode *>(triNode->nextSibling());
0134     }
0135     return label;
0136 }
0137 
0138 LabelNode *LabelsItem::addLabel(QString name, label_t labelType)
0139 {
0140     LabelNode *label = new LabelNode(name, labelType);
0141     m_labelsLists.value(labelType)->appendChildNode(label);
0142     return label;
0143 }
0144 
0145 GuideLabelNode *LabelsItem::addGuideLabel(QString name, label_t labelType)
0146 {
0147     GuideLabelNode *label = new GuideLabelNode(name, labelType);
0148     m_labelsLists.value(labelType)->appendChildNode(label);
0149     return label;
0150 }
0151 
0152 TrixelNode *LabelsItem::addTrixel(label_t labelType, Trixel trixel)
0153 {
0154     TrixelNode *triNode = new TrixelNode(trixel);
0155     getLabelNode(labelType)->appendChildNode(triNode);
0156     return triNode;
0157 }
0158 
0159 void LabelsItem::update()
0160 {
0161     SkyLabeler *skyLabeler = SkyLabeler::Instance();
0162     skyLabeler->reset();
0163 
0164     updateChildLabels(label_t::TELESCOPE_SYMBOL);
0165 
0166     updateChildLabels(label_t::HORIZON_LABEL);
0167 
0168     updateChildLabels(label_t::EQUATOR_LABEL);
0169     updateChildLabels(label_t::ECLIPTIC_LABEL);
0170 
0171     updateChildLabels(label_t::PLANET_LABEL);
0172 
0173     updateChildLabels(label_t::JUPITER_MOON_LABEL);
0174 
0175     updateChildLabels(label_t::SATURN_MOON_LABEL);
0176     updateChildLabels(label_t::ASTEROID_LABEL);
0177 
0178     updateChildLabels(label_t::COMET_LABEL);
0179 
0180     updateChildLabels(label_t::CONSTEL_NAME_LABEL);
0181 
0182     updateChildLabels(label_t::DSO_MESSIER_LABEL);
0183     updateChildLabels(label_t::DSO_OTHER_LABEL);
0184     updateChildLabels(label_t::CATALOG_DSO_LABEL);
0185 
0186     updateChildLabels(label_t::STAR_LABEL);
0187     updateChildLabels(label_t::CATALOG_STAR_LABEL);
0188 }
0189 
0190 void LabelsItem::hideLabels(label_t labelType)
0191 {
0192     if (labelType != NO_LABEL)
0193         m_labelsLists[labelType]->hide();
0194 }
0195 
0196 void LabelsItem::showLabels(label_t labelType)
0197 {
0198     if (labelType != NO_LABEL)
0199         m_labelsLists[labelType]->show();
0200 }
0201 
0202 void LabelsItem::setRootNode(RootNode *rootNode)
0203 {
0204     //Remove from previous parent if had any
0205     if (m_rootNode && parent() == m_rootNode)
0206         m_rootNode->removeChildNode(this);
0207 
0208     //Append to new parent if haven't already
0209     m_rootNode = rootNode;
0210     if (parent() != m_rootNode)
0211         m_rootNode->appendChildNode(this);
0212 }
0213 
0214 void LabelsItem::deleteLabels(label_t labelType)
0215 {
0216     if (labelType == STAR_LABEL)
0217     {
0218         LabelTypeNode *node = m_labelsLists[labelType];
0219         QSGNode *trixel     = node->firstChild();
0220         while (trixel != 0)
0221         {
0222             while (QSGNode *label = trixel->firstChild())
0223             {
0224                 trixel->removeChildNode(label);
0225                 delete label;
0226             }
0227             trixel = trixel->nextSibling();
0228         }
0229     }
0230     else if (labelType != NO_LABEL)
0231     {
0232         LabelTypeNode *node = m_labelsLists[labelType];
0233         while (QSGNode *n = node->firstChild())
0234         {
0235             node->removeChildNode(n);
0236             delete n;
0237         }
0238     }
0239 }
0240 
0241 void LabelsItem::deleteLabel(LabelNode *label)
0242 {
0243     if (label)
0244     {
0245         label_t type        = label->labelType();
0246         LabelTypeNode *node = m_labelsLists[type];
0247 
0248         if (type == STAR_LABEL || type == DSO_IC_LABEL || type == DSO_NGC_LABEL || type == DSO_MESSIER_LABEL ||
0249             type == DSO_OTHER_LABEL)
0250         {
0251             QSGNode *trixel = node->firstChild();
0252             bool found      = false;
0253 
0254             while (trixel != 0 && !found)
0255             {
0256                 QSGNode *l = trixel->firstChild();
0257                 while (l != 0)
0258                 {
0259                     if (l == label)
0260                     {
0261                         trixel->removeChildNode(label);
0262                         delete label;
0263 
0264                         found = true;
0265                         break;
0266                     }
0267                     l = l->nextSibling();
0268                 }
0269                 trixel = trixel->nextSibling();
0270             }
0271         }
0272         else
0273         {
0274             QSGNode *n = node->firstChild();
0275             while (n != 0)
0276             {
0277                 if (n == label)
0278                 {
0279                     node->removeChildNode(label);
0280                     delete label;
0281                     break;
0282                 }
0283                 n = n->nextSibling();
0284             }
0285         }
0286     }
0287 }
0288 
0289 void LabelsItem::updateChildLabels(label_t labelType)
0290 {
0291     LabelTypeNode *node = m_labelsLists[labelType];
0292     if (node->visible())
0293     {
0294         QSGNode *n = node->firstChild();
0295         while (n != 0)
0296         {
0297             if (labelType == STAR_LABEL || labelType == DSO_OTHER_LABEL)
0298             {
0299                 TrixelNode *trixel = static_cast<TrixelNode *>(n);
0300                 if (trixel->visible())
0301                 {
0302                     QSGNode *l = trixel->firstChild();
0303                     while (l != 0)
0304                     {
0305                         LabelNode *label = static_cast<LabelNode *>(l);
0306                         l                = l->nextSibling();
0307 
0308                         if (skyLabeler->markText(label->labelPos, label->name()))
0309                         {
0310                             label->update();
0311                         }
0312                         else
0313                         {
0314                             label->hide();
0315                         }
0316                     }
0317                 }
0318             }
0319             else
0320             {
0321                 LabelNode *label = static_cast<LabelNode *>(n);
0322 
0323                 if (label->visible())
0324                 {
0325                     if (label->zoomFont())
0326                         skyLabeler->resetFont();
0327                     if (skyLabeler->markText(label->labelPos, label->name()))
0328                     {
0329                         label->update();
0330                     }
0331                     else
0332                     {
0333                         label->hide();
0334                     }
0335                     skyLabeler->useStdFont();
0336                 }
0337             }
0338             n = n->nextSibling();
0339         }
0340     }
0341 }