Kstars

labelsitem.cpp
1 /*
2  SPDX-FileCopyrightText: 2016 Artem Fedoskin <[email protected]>
3  SPDX-License-Identifier: GPL-2.0-or-later
4 */
5 
6 #include "Options.h"
7 #include <QSGNode>
8 #include "labelsitem.h"
9 #include "skylabeler.h"
10 #include "skynodes/labelnode.h"
11 #include "skynodes/guidelabelnode.h"
12 
13 #include "cometsitem.h"
14 #include "staritem.h"
15 #include "rootnode.h"
16 #include "skymesh.h"
17 #include "skynodes/trixelnode.h"
18 
19 LabelsItem::LabelsItem() : m_rootNode(0)
20 {
21  LabelTypeNode *stars = new LabelTypeNode;
22  appendChildNode(stars);
23 
24  //Add trixels to hold star labels
25  int trixelNum = SkyMesh::Instance()->size();
26 
27  for (int i = 0; i < trixelNum; ++i)
28  {
29  TrixelNode *trixel = new TrixelNode(i);
30  stars->appendChildNode(trixel);
31  }
32 
33  m_labelsLists.insert(label_t::STAR_LABEL, stars);
34 
35  LabelTypeNode *catalog_stars = new LabelTypeNode;
36  appendChildNode(catalog_stars);
37  m_labelsLists.insert(label_t::CATALOG_STAR_LABEL, catalog_stars);
38 
39  LabelTypeNode *asteroids = new LabelTypeNode;
40  appendChildNode(asteroids);
41  m_labelsLists.insert(label_t::ASTEROID_LABEL, asteroids);
42 
43  LabelTypeNode *comets = new LabelTypeNode;
44  appendChildNode(comets);
45  m_labelsLists.insert(label_t::COMET_LABEL, comets);
46 
47  LabelTypeNode *planets = new LabelTypeNode;
48  appendChildNode(planets);
49  m_labelsLists.insert(label_t::PLANET_LABEL, planets);
50 
51  LabelTypeNode *jupiter_moons = new LabelTypeNode;
52  appendChildNode(jupiter_moons);
53  m_labelsLists.insert(label_t::JUPITER_MOON_LABEL, jupiter_moons);
54 
55  LabelTypeNode *saturn_moons = new LabelTypeNode;
56  appendChildNode(saturn_moons);
57  m_labelsLists.insert(label_t::SATURN_MOON_LABEL, saturn_moons);
58 
59  LabelTypeNode *deep_sky = new LabelTypeNode;
60  appendChildNode(deep_sky);
61  m_labelsLists.insert(label_t::DEEP_SKY_LABEL, deep_sky);
62 
63  LabelTypeNode *dso_messier = new LabelTypeNode;
64  deep_sky->appendChildNode(dso_messier);
65  m_labelsLists.insert(label_t::DSO_MESSIER_LABEL, dso_messier);
66 
67  LabelTypeNode *dso_other = new LabelTypeNode;
68  deep_sky->appendChildNode(dso_other);
69  m_labelsLists.insert(label_t::DSO_OTHER_LABEL, dso_other);
70 
71  LabelTypeNode *catalog_dso = new LabelTypeNode;
72  appendChildNode(catalog_dso);
73  m_labelsLists.insert(label_t::CATALOG_DSO_LABEL, catalog_dso);
74 
75  LabelTypeNode *constellation = new LabelTypeNode;
76  appendChildNode(constellation);
77  m_labelsLists.insert(label_t::CONSTEL_NAME_LABEL, constellation);
78 
79  LabelTypeNode *satellite = new LabelTypeNode;
80  appendChildNode(satellite);
81  m_labelsLists.insert(label_t::SATELLITE_LABEL, satellite);
82 
83  LabelTypeNode *rude = new LabelTypeNode;
84  appendChildNode(rude);
85  m_labelsLists.insert(label_t::RUDE_LABEL, rude);
86 
87  LabelTypeNode *num_label = new LabelTypeNode;
88  appendChildNode(num_label);
89  m_labelsLists.insert(label_t::NUM_LABEL_TYPES, num_label);
90 
91  LabelTypeNode *horizon_label = new LabelTypeNode;
92  appendChildNode(horizon_label);
93  m_labelsLists.insert(label_t::HORIZON_LABEL, horizon_label);
94 
95  LabelTypeNode *equator = new LabelTypeNode;
96  appendChildNode(equator);
97  m_labelsLists.insert(label_t::EQUATOR_LABEL, equator);
98 
99  LabelTypeNode *ecliptic = new LabelTypeNode;
100  appendChildNode(ecliptic);
101  m_labelsLists.insert(label_t::ECLIPTIC_LABEL, ecliptic);
102 
103  LabelTypeNode *telescopeSymbol = new LabelTypeNode;
104  appendChildNode(telescopeSymbol);
105  m_labelsLists.insert(label_t::TELESCOPE_SYMBOL, telescopeSymbol);
106 
107  skyLabeler = SkyLabeler::Instance();
108  skyLabeler->reset();
109 }
110 
112 {
113  LabelNode *label = new LabelNode(skyObject, labelType);
114  m_labelsLists.value(labelType)->appendChildNode(label);
115  return label;
116 }
117 
118 LabelNode *LabelsItem::addLabel(SkyObject *skyObject, label_t labelType, Trixel trixel)
119 {
120  Q_ASSERT(labelType == STAR_LABEL || labelType == DSO_MESSIER_LABEL || labelType == DSO_NGC_LABEL ||
121  labelType == DSO_IC_LABEL || labelType == DSO_OTHER_LABEL);
122  TrixelNode *triNode = static_cast<TrixelNode *>(m_labelsLists.value(labelType)->firstChild());
123  LabelNode *label = 0;
124 
125  while (triNode != 0)
126  {
127  if (triNode->trixelID() == trixel)
128  {
129  label = new LabelNode(skyObject, labelType);
130  triNode->appendChildNode(label);
131  break;
132  }
133  triNode = static_cast<TrixelNode *>(triNode->nextSibling());
134  }
135  return label;
136 }
137 
139 {
140  LabelNode *label = new LabelNode(name, labelType);
141  m_labelsLists.value(labelType)->appendChildNode(label);
142  return label;
143 }
144 
146 {
147  GuideLabelNode *label = new GuideLabelNode(name, labelType);
148  m_labelsLists.value(labelType)->appendChildNode(label);
149  return label;
150 }
151 
152 TrixelNode *LabelsItem::addTrixel(label_t labelType, Trixel trixel)
153 {
154  TrixelNode *triNode = new TrixelNode(trixel);
155  getLabelNode(labelType)->appendChildNode(triNode);
156  return triNode;
157 }
158 
160 {
161  SkyLabeler *skyLabeler = SkyLabeler::Instance();
162  skyLabeler->reset();
163 
164  updateChildLabels(label_t::TELESCOPE_SYMBOL);
165 
166  updateChildLabels(label_t::HORIZON_LABEL);
167 
168  updateChildLabels(label_t::EQUATOR_LABEL);
169  updateChildLabels(label_t::ECLIPTIC_LABEL);
170 
171  updateChildLabels(label_t::PLANET_LABEL);
172 
173  updateChildLabels(label_t::JUPITER_MOON_LABEL);
174 
175  updateChildLabels(label_t::SATURN_MOON_LABEL);
176  updateChildLabels(label_t::ASTEROID_LABEL);
177 
178  updateChildLabels(label_t::COMET_LABEL);
179 
180  updateChildLabels(label_t::CONSTEL_NAME_LABEL);
181 
182  updateChildLabels(label_t::DSO_MESSIER_LABEL);
183  updateChildLabels(label_t::DSO_OTHER_LABEL);
184  updateChildLabels(label_t::CATALOG_DSO_LABEL);
185 
186  updateChildLabels(label_t::STAR_LABEL);
187  updateChildLabels(label_t::CATALOG_STAR_LABEL);
188 }
189 
191 {
192  if (labelType != NO_LABEL)
193  m_labelsLists[labelType]->hide();
194 }
195 
197 {
198  if (labelType != NO_LABEL)
199  m_labelsLists[labelType]->show();
200 }
201 
203 {
204  //Remove from previous parent if had any
205  if (m_rootNode && parent() == m_rootNode)
206  m_rootNode->removeChildNode(this);
207 
208  //Append to new parent if haven't already
209  m_rootNode = rootNode;
210  if (parent() != m_rootNode)
211  m_rootNode->appendChildNode(this);
212 }
213 
215 {
216  if (labelType == STAR_LABEL)
217  {
218  LabelTypeNode *node = m_labelsLists[labelType];
219  QSGNode *trixel = node->firstChild();
220  while (trixel != 0)
221  {
222  while (QSGNode *label = trixel->firstChild())
223  {
224  trixel->removeChildNode(label);
225  delete label;
226  }
227  trixel = trixel->nextSibling();
228  }
229  }
230  else if (labelType != NO_LABEL)
231  {
232  LabelTypeNode *node = m_labelsLists[labelType];
233  while (QSGNode *n = node->firstChild())
234  {
235  node->removeChildNode(n);
236  delete n;
237  }
238  }
239 }
240 
242 {
243  if (label)
244  {
245  label_t type = label->labelType();
246  LabelTypeNode *node = m_labelsLists[type];
247 
248  if (type == STAR_LABEL || type == DSO_IC_LABEL || type == DSO_NGC_LABEL || type == DSO_MESSIER_LABEL ||
249  type == DSO_OTHER_LABEL)
250  {
251  QSGNode *trixel = node->firstChild();
252  bool found = false;
253 
254  while (trixel != 0 && !found)
255  {
256  QSGNode *l = trixel->firstChild();
257  while (l != 0)
258  {
259  if (l == label)
260  {
261  trixel->removeChildNode(label);
262  delete label;
263 
264  found = true;
265  break;
266  }
267  l = l->nextSibling();
268  }
269  trixel = trixel->nextSibling();
270  }
271  }
272  else
273  {
274  QSGNode *n = node->firstChild();
275  while (n != 0)
276  {
277  if (n == label)
278  {
279  node->removeChildNode(label);
280  delete label;
281  break;
282  }
283  n = n->nextSibling();
284  }
285  }
286  }
287 }
288 
290 {
291  LabelTypeNode *node = m_labelsLists[labelType];
292  if (node->visible())
293  {
294  QSGNode *n = node->firstChild();
295  while (n != 0)
296  {
297  if (labelType == STAR_LABEL || labelType == DSO_OTHER_LABEL)
298  {
299  TrixelNode *trixel = static_cast<TrixelNode *>(n);
300  if (trixel->visible())
301  {
302  QSGNode *l = trixel->firstChild();
303  while (l != 0)
304  {
305  LabelNode *label = static_cast<LabelNode *>(l);
306  l = l->nextSibling();
307 
308  if (skyLabeler->markText(label->labelPos, label->name()))
309  {
310  label->update();
311  }
312  else
313  {
314  label->hide();
315  }
316  }
317  }
318  }
319  else
320  {
321  LabelNode *label = static_cast<LabelNode *>(n);
322 
323  if (label->visible())
324  {
325  if (label->zoomFont())
326  skyLabeler->resetFont();
327  if (skyLabeler->markText(label->labelPos, label->name()))
328  {
329  label->update();
330  }
331  else
332  {
333  label->hide();
334  }
335  skyLabeler->useStdFont();
336  }
337  }
338  n = n->nextSibling();
339  }
340  }
341 }
LabelsItem()
Constructor.
Definition: labelsitem.cpp:19
A container for nodes that holds collection of textures for stars and provides clipping.
Definition: rootnode.h:59
void showLabels(label_t labelType)
shows all labels of type labelType
Definition: labelsitem.cpp:196
A SkyNode derived class used for displaying labels.
Definition: labelnode.h:26
void deleteLabels(label_t labelType)
deletes all labels of type labelType
Definition: labelsitem.cpp:214
void appendChildNode(QSGNode *node)
QSGNode * firstChild() const const
void resetFont()
sets the font in SkyLabeler and in psky back to the zoom dependent value that was set in reset().
Definition: skylabeler.cpp:222
RootNode * rootNode()
Definition: labelsitem.h:153
LabelTypeNode * getLabelNode(label_t labelType)
Definition: labelsitem.h:126
void updateChildLabels(label_t labelType)
updates child labels of LabelTypeNode that corresponds to type in m_labelsLists Labels for stars and ...
Definition: labelsitem.cpp:289
label_t
The label_t enum.
Definition: labelsitem.h:61
void hideLabels(label_t labelType)
hides all labels of type labelType
Definition: labelsitem.cpp:190
int size() const
returns the total number of trixels in the HTM.
Definition: HTMesh.h:118
Convenience class that represents trixel in SkyMapLite.
Definition: trixelnode.h:20
A wrapper for QSGOpacityNode that provides hide() and show() functions. If node is invisible (opacity...
void deleteLabel(LabelNode *label)
deletes particular label
Definition: labelsitem.cpp:241
bool markText(const QPointF &p, const QString &text, qreal padding_factor=1)
tells the labeler the location and text of a label you want to draw.
Definition: skylabeler.cpp:408
QSGNode * parent() const const
static SkyMesh * Instance()
returns the default instance of SkyMesh or null if it has not yet been created.
Definition: skymesh.cpp:39
GuideLabelNode * addGuideLabel(QString name, label_t labelType)
does the same as above but instead creates GuideLabelNode
Definition: labelsitem.cpp:145
QSGNode::NodeType type() const const
void update()
The order of labels update can be changed here.
Definition: labelsitem.cpp:159
TrixelNode * addTrixel(label_t labelType, Trixel trixel)
adds trixel to the node corresponding to labelType
Definition: labelsitem.cpp:152
void useStdFont()
sets the font in SkyLabeler and in psky to the font psky had originally when reset() was called.
Definition: skylabeler.cpp:217
QSGNode * nextSibling() const const
void setRootNode(RootNode *rootNode)
sets m_rootNode and appends to it this node
Definition: labelsitem.cpp:202
Information about an object in the sky.
Definition: skyobject.h:41
LabelNode * addLabel(SkyObject *skyObject, label_t labelType)
Create LabelNode with given skyObject and append it to LabelTypeNode that corresponds to type.
Definition: labelsitem.cpp:111
void removeChildNode(QSGNode *node)
void reset(SkyMap *skyMap)
clears the virtual screen (if needed) and resizes the virtual screen (if needed) to match skyMap.
Definition: skylabeler.cpp:250
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Tue Dec 5 2023 03:58:29 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.