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 }