File indexing completed on 2024-04-28 03:44:25

0001 /*
0002     SPDX-FileCopyrightText: 2016 Artem Fedoskin <afedoskin3@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "skyobject.h"
0007 #include "Options.h"
0008 
0009 #include <QSGSimpleTextureNode>
0010 #include <QQuickWindow>
0011 
0012 #include "skymaplite.h"
0013 #include "labelnode.h"
0014 
0015 LabelNode::LabelNode(SkyObject *skyObject, LabelsItem::label_t type)
0016     : SkyNode(skyObject), m_name(skyObject->labelString()), m_textTexture(new QSGSimpleTextureNode), m_labelType(type),
0017       m_fontSize(0), m_zoomFont(false)
0018 {
0019     initialize();
0020 }
0021 
0022 LabelNode::LabelNode(QString name, LabelsItem::label_t type)
0023     : m_name(name), m_textTexture(new QSGSimpleTextureNode), m_labelType(type), m_fontSize(0), m_zoomFont(false)
0024 {
0025     initialize();
0026 }
0027 
0028 LabelNode::~LabelNode()
0029 {
0030     m_opacity->removeChildNode(m_textTexture);
0031     m_textTexture->setOwnsTexture(true);
0032     delete m_textTexture;
0033 }
0034 
0035 void LabelNode::initialize()
0036 {
0037     switch (m_labelType)
0038     {
0039         case LabelsItem::label_t::PLANET_LABEL:
0040         case LabelsItem::label_t::SATURN_MOON_LABEL:
0041         case LabelsItem::label_t::JUPITER_MOON_LABEL:
0042         case LabelsItem::label_t::COMET_LABEL:
0043         case LabelsItem::label_t::RUDE_LABEL:
0044         case LabelsItem::label_t::ASTEROID_LABEL:
0045             m_schemeColor = "PNameColor";
0046             m_zoomFont    = true;
0047             break;
0048         case LabelsItem::label_t::DEEP_SKY_LABEL:
0049         case LabelsItem::label_t::DSO_OTHER_LABEL:
0050         case LabelsItem::label_t::CATALOG_DSO_LABEL:
0051             m_schemeColor = "DSNameColor";
0052             m_zoomFont    = true;
0053             break;
0054         case LabelsItem::label_t::TELESCOPE_SYMBOL:
0055             m_schemeColor = "TargetColor";
0056             m_zoomFont    = true;
0057             break;
0058         case LabelsItem::label_t::CONSTEL_NAME_LABEL:
0059             m_schemeColor = "CNameColor";
0060             break;
0061         case LabelsItem::label_t::STAR_LABEL:
0062         case LabelsItem::label_t::CATALOG_STAR_LABEL:
0063             m_schemeColor = "SNameColor";
0064             break;
0065         default:
0066             m_schemeColor = "UserLabelColor";
0067             break;
0068     }
0069 
0070     createTexture(KStarsData::Instance()->colorScheme()->colorNamed(m_schemeColor));
0071     m_opacity->appendChildNode(m_textTexture);
0072 }
0073 
0074 void LabelNode::createTexture(QColor color)
0075 {
0076     switch (m_labelType)
0077     {
0078         case LabelsItem::label_t::SATURN_MOON_LABEL:
0079         case LabelsItem::label_t::JUPITER_MOON_LABEL:
0080             SkyLabeler::Instance()->shrinkFont(2);
0081             break;
0082         default:
0083             break;
0084     }
0085 
0086     QSGTexture *oldTexture = m_textTexture->texture();
0087 
0088     m_textTexture->setTexture(SkyMapLite::Instance()->textToTexture(m_name, color, m_zoomFont));
0089     m_color = color;
0090 
0091     if (m_zoomFont)
0092         m_fontSize = SkyLabeler::Instance()->drawFont().pointSize();
0093 
0094     switch (m_labelType)
0095     {
0096         case LabelsItem::label_t::SATURN_MOON_LABEL:
0097         case LabelsItem::label_t::JUPITER_MOON_LABEL:
0098             SkyLabeler::Instance()->resetFont();
0099             break;
0100         default:
0101             break;
0102     }
0103 
0104     if (oldTexture)
0105         delete oldTexture;
0106 
0107     m_textSize     = m_textTexture->texture()->textureSize();
0108     QRectF oldRect = m_textTexture->rect();
0109     qreal ratio    = SkyMapLite::Instance()->window()->effectiveDevicePixelRatio();
0110 
0111     m_textTexture->setRect(QRect(oldRect.x(), oldRect.y(), m_textSize.width() / ratio, m_textSize.height() / ratio));
0112 }
0113 
0114 void LabelNode::changePos(QPointF pos)
0115 {
0116     QMatrix4x4 m(1, 0, 0, pos.x(), 0, 1, 0, pos.y(), 0, 0, 1, 0, 0, 0, 0, 1);
0117     //m.translate(-0.5*size.width(), -0.5*size.height());
0118 
0119     setMatrix(m);
0120     markDirty(QSGNode::DirtyMatrix);
0121 }
0122 
0123 void LabelNode::setLabelPos(QPointF pos)
0124 {
0125     show();
0126     qreal ratio = SkyMapLite::Instance()->window()->effectiveDevicePixelRatio();
0127     //We need to subtract the height of texture from final y to follow the way QPainter draws the text
0128     if (m_skyObject)
0129         labelPos = QPointF(pos.x() + m_skyObject->labelOffset(),
0130                            pos.y() + m_skyObject->labelOffset() - m_textSize.height() / ratio);
0131     else
0132         labelPos = QPointF(pos.x(), pos.y());
0133 }
0134 
0135 void LabelNode::update()
0136 {
0137     QColor newColor = KStarsData::Instance()->colorScheme()->colorNamed(m_schemeColor);
0138     if ((m_zoomFont && m_fontSize != SkyLabeler::Instance()->skyFont().pointSize()) || m_color != newColor)
0139     {
0140         createTexture(newColor);
0141     }
0142     changePos(labelPos);
0143 }