Kstars

labelsitem.h
1 /*
2  SPDX-FileCopyrightText: 2016 Artem Fedoskin <[email protected]>
3  SPDX-License-Identifier: GPL-2.0-or-later
4 */
5 
6 #pragma once
7 
8 #include "skylabeler.h"
9 #include "typedef.h"
10 #include "typedeflite.h"
11 
12 #include "skyopacitynode.h"
13 
14 class StarItem;
15 class LabelNode;
16 class GuideLabelNode;
17 class RootNode;
18 class TrixelNode;
19 
20 class SkyObject;
21 
23 
24 /**
25  * @class LabelsItem
26  *
27  * This class is in charge of labels in SkyMapLite. Labels can be instantiated by calling addLabel with
28  * either SkyObject or plain QString as a name. There are two types of label nodes available - LabelNode
29  * that can't be rotated and GuideLabelNode that supports rotation (but it is not used anywhere yet).
30  *
31  * To prevent labels from overlapping this class uses SkyLabeler. We check LabelNode for overlapping by
32  * calling SkyLabeler::markText() (SkyLabeler::markRegion() for GuideLabelNode) and update().
33  *
34  * Each of SkyItems that uses labels has its own label type in enum label_t (copied from SkyLabeler but
35  * was extended). Labels of particular type are reparented to LabelTypeNode(QSGOpacityNode) so
36  * to hide all labels of some type you just need to set opacity of LabelTypeNode that corresponds to
37  * this type to 0.
38  *
39  * Order of drawing can be changed in LabelsItem's constructor. Order of labels update can be changed in
40  * update().
41  *
42  * This class is not derived from SkyItem as it doesn't have label type and SkyItem's header needs an
43  * inclusion of this header to allow use of label_t enum. (Might be a good idea to fix this)
44  *
45  * @note font size is set in SkyLabeler::SkyLabeler() by initializing m_stdFont with default font
46  *
47  * @short Handles labels in SkyMapLite
48  * @author Artem Fedoskin
49  * @version 1.0
50  */
51 
52 class LabelsItem : public SkyOpacityNode
53 {
54  public:
55  /**
56  * @brief Constructor
57  */
58  LabelsItem();
59 
60  /** @short The label_t enum. Holds types of labels */
61  enum label_t
62  {
63  STAR_LABEL,
64  ASTEROID_LABEL,
65  COMET_LABEL,
66  PLANET_LABEL,
67  JUPITER_MOON_LABEL,
68  SATURN_MOON_LABEL,
69  DEEP_SKY_LABEL,
70  DSO_MESSIER_LABEL,
71  DSO_OTHER_LABEL,
72  CONSTEL_NAME_LABEL,
73  SATELLITE_LABEL,
74  RUDE_LABEL, ///Rude labels block other labels FIXME: find a better solution
76  HORIZON_LABEL,
77  EQUATOR_LABEL,
78  ECLIPTIC_LABEL,
79  TELESCOPE_SYMBOL,
80  CATALOG_STAR_LABEL,
81  CATALOG_DSO_LABEL,
82  NO_LABEL //used in LinesItem
83  };
84 
85  /**
86  * Create LabelNode with given skyObject and append it to LabelTypeNode that corresponds
87  * to type
88  * @param skyObject for which the label is created
89  * @param labelType type of LabelTypeNode to which this label has to be reparented
90  * @return pointer to newly created LabelNode
91  */
92  LabelNode *addLabel(SkyObject *skyObject, label_t labelType);
93 
94  /**
95  * Create LabelNode and append it to corresponding TrixelNode so that all labels
96  * can be hidden whenever Trixel is not displayed. Use for sky objects that are indexed by SkyMesh
97  * @param skyObject for which the label is created
98  * @param labelType type of LabelTypeNode to which this label has to be reparented
99  * @param trixel id of trixel
100  **/
101  LabelNode *addLabel(SkyObject *skyObject, label_t labelType, Trixel trixel);
102 
103  /** @short does the same as above but with QString instead of SkyObject */
104  LabelNode *addLabel(QString name, label_t labelType);
105 
106  /**
107  * @short does the same as above but instead creates GuideLabelNode
108  * @note currently GuideLabelNode is not used anywhere so it is not fully supported yet
109  */
110  GuideLabelNode *addGuideLabel(QString name, label_t labelType);
111 
112  /**
113  * The order of labels update can be changed here.
114  * @short updates all child labels
115  */
116  void update();
117 
118  /**
119  * @short updates child labels of LabelTypeNode that corresponds to type in m_labelsLists
120  * Labels for stars and DSOs we update labels only if corresponding TrixelNode is visible.
121  * @param labelType type of LabelTypeNode (see m_labelsLists)
122  */
123  void updateChildLabels(label_t labelType);
124 
125  /** @return LabelTypeNode that holds labels of labelType */
126  LabelTypeNode *getLabelNode(label_t labelType) { return m_labelsLists.value(labelType); }
127 
128  /** @short deletes all labels of type labelType */
129  void deleteLabels(label_t labelType);
130 
131  /** @short deletes particular label */
132  void deleteLabel(LabelNode *label);
133 
134  /** @short hides all labels of type labelType */
135  void hideLabels(label_t labelType);
136 
137  /**
138  * @short shows all labels of type labelType
139  */
140 
141  void showLabels(label_t labelType);
142 
143  /** @short adds trixel to the node corresponding to labelType */
144  TrixelNode *addTrixel(label_t labelType, Trixel trixel);
145 
146  /**
147  * @short sets m_rootNode and appends to it this node
148  * @param rootNode parent RootNode that instantiates this object
149  */
151 
152  /** @return pointer to RootNode that instantiated this object */
153  RootNode *rootNode() { return m_rootNode; }
154 
155  private:
156  QMap<label_t, LabelTypeNode *> m_labelsLists;
157 
158  /** @short because this class is not derived from SkyItem it has to store pointer to RootNode */
159  RootNode *m_rootNode { nullptr };
160  SkyLabeler *skyLabeler { nullptr };
161 };
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
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
Handles labels in SkyMapLite.
Definition: labelsitem.h:52
@ NUM_LABEL_TYPES
Rude labels block other labels FIXME: find a better solution.
Definition: labelsitem.h:75
label_t
The label_t enum.
Definition: labelsitem.h:61
Class that handles Stars.
Definition: staritem.h:22
void hideLabels(label_t labelType)
hides all labels of type labelType
Definition: labelsitem.cpp:190
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
GuideLabelNode * addGuideLabel(QString name, label_t labelType)
does the same as above but instead creates GuideLabelNode
Definition: labelsitem.cpp:145
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 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
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.