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 }