1 /* 2 KBlackBox - A simple game inspired by an emacs module 3 4 SPDX-FileCopyrightText: 2007 Nicolas Roffet <nicolas-kde@roffet.com> 5 6 SPDX-License-Identifier: GPL-2.0-or-later 7 */ 8 9 10 #include "kbbthememanager.h" 11 12 #include <KCompressionDevice> 13 14 #include <QColor> 15 #include <QDomDocument> 16 #include <QFile> 17 #include <QStringList> 18 19 // 20 // Constructor / Destructor 21 // 22 KBBThemeManager(const QString & svgzFileName)23KBBThemeManager::KBBThemeManager(const QString &svgzFileName) 24 { 25 // 1. for SVG items 26 m_svgRenderer.load(svgzFileName); 27 28 29 // 2. for non SVG items 30 QFile svgzFile(svgzFileName); 31 KCompressionDevice *f = new KCompressionDevice(&svgzFile, false, KCompressionDevice::GZip); 32 33 if (f) { 34 QDomDocument doc; 35 if (doc.setContent(f,true)) { 36 m_root = doc.documentElement(); 37 } 38 39 delete f; 40 } 41 } 42 43 44 45 // 46 // Public 47 // 48 color(const KBBScalableGraphicWidget::itemType itemType)49QColor KBBThemeManager::color(const KBBScalableGraphicWidget::itemType itemType) 50 { 51 return QColor(value(itemType, QStringLiteral("stroke"))); 52 } 53 54 elementId(const KBBScalableGraphicWidget::itemType itemType)55QString KBBThemeManager::elementId(const KBBScalableGraphicWidget::itemType itemType) 56 { 57 QString eId; 58 59 switch (itemType) { 60 case KBBScalableGraphicWidget::background: 61 eId = QStringLiteral("background"); 62 break; 63 case KBBScalableGraphicWidget::blackbox: 64 eId = QStringLiteral("blackbox"); 65 break; 66 case KBBScalableGraphicWidget::blackboxGrid: 67 eId = QStringLiteral("blackbox_grid"); 68 break; 69 case KBBScalableGraphicWidget::cursor: 70 eId = QStringLiteral("cursor"); 71 break; 72 case KBBScalableGraphicWidget::informationBackground: 73 eId = QStringLiteral("information_background"); 74 break; 75 case KBBScalableGraphicWidget::interactionInfoDeflection: 76 eId = QStringLiteral("interaction_info_deflection"); 77 break; 78 case KBBScalableGraphicWidget::interactionInfoHit: 79 eId = QStringLiteral("interaction_info_hit"); 80 break; 81 case KBBScalableGraphicWidget::interactionInfoNothing: 82 eId = QStringLiteral("interaction_info_nothing"); 83 break; 84 case KBBScalableGraphicWidget::interactionInfoReflection: 85 eId = QStringLiteral("interaction_info_reflection"); 86 break; 87 case KBBScalableGraphicWidget::interactionInfoReflectionSym: 88 eId = QStringLiteral("interaction_info_reflection_sym"); 89 break; 90 case KBBScalableGraphicWidget::laser0: 91 eId = QStringLiteral("laser_0"); 92 break; 93 case KBBScalableGraphicWidget::laser90: 94 eId = QStringLiteral("laser_90"); 95 break; 96 case KBBScalableGraphicWidget::laser180: 97 eId = QStringLiteral("laser_180"); 98 break; 99 case KBBScalableGraphicWidget::laser270: 100 eId = QStringLiteral("laser_270"); 101 break; 102 case KBBScalableGraphicWidget::markerNothing: 103 eId = QStringLiteral("marker_nothing"); 104 break; 105 case KBBScalableGraphicWidget::playerBall: 106 eId = QStringLiteral("player_ball"); 107 break; 108 case KBBScalableGraphicWidget::playerRay: 109 eId = QStringLiteral("player_ray"); 110 break; 111 case KBBScalableGraphicWidget::resultBackground: 112 eId = QStringLiteral("result_background"); 113 break; 114 case KBBScalableGraphicWidget::resultBackgroundHighlight: 115 eId = QStringLiteral("result_background_highlight"); 116 break; 117 case KBBScalableGraphicWidget::resultHit: 118 eId = QStringLiteral("result_hit"); 119 break; 120 case KBBScalableGraphicWidget::resultReflection: 121 eId = QStringLiteral("result_reflection"); 122 break; 123 case KBBScalableGraphicWidget::rightPlayerBall: 124 eId = QStringLiteral("right_player_ball"); 125 break; 126 case KBBScalableGraphicWidget::solutionBall: 127 eId = QStringLiteral("solution_ball"); 128 break; 129 case KBBScalableGraphicWidget::solutionRay: 130 eId = QStringLiteral("solution_ray"); 131 break; 132 case KBBScalableGraphicWidget::tutorialMarker: 133 eId = QStringLiteral("tutorial_marker"); 134 break; 135 case KBBScalableGraphicWidget::unsureBall: 136 eId = QStringLiteral("unsure_ball"); 137 break; 138 case KBBScalableGraphicWidget::wrongPlayerBall: 139 eId = QStringLiteral("wrong_player_ball"); 140 break; 141 default: 142 eId = QStringLiteral("none"); 143 break; 144 } 145 146 return eId; 147 } 148 149 style(const KBBScalableGraphicWidget::itemType itemType)150Qt::PenStyle KBBThemeManager::style(const KBBScalableGraphicWidget::itemType itemType) 151 { 152 if (value(itemType, QStringLiteral("stroke-dasharray"))==QLatin1String("none")) { 153 return Qt::SolidLine; 154 } else 155 return Qt::DotLine; 156 } 157 158 svgRenderer()159QSvgRenderer* KBBThemeManager::svgRenderer() 160 { 161 return &m_svgRenderer; 162 } 163 164 width(const KBBScalableGraphicWidget::itemType itemType)165qreal KBBThemeManager::width(const KBBScalableGraphicWidget::itemType itemType) 166 { 167 return value(itemType, QStringLiteral("stroke-width")).toFloat(); 168 } 169 170 zValue(const KBBScalableGraphicWidget::itemType itemType)171int KBBThemeManager::zValue(const KBBScalableGraphicWidget::itemType itemType) 172 { 173 return itemType; 174 } 175 176 177 178 // 179 // Private 180 // 181 value(const KBBScalableGraphicWidget::itemType itemType,const QString & styleElement)182QString KBBThemeManager::value(const KBBScalableGraphicWidget::itemType itemType, const QString &styleElement) 183 { 184 const QString id = elementId(itemType); 185 QString style; 186 QString v; 187 188 QDomNode node = m_root.firstChild(); 189 while(!node.isNull()) { 190 if (node.toElement().attribute(QStringLiteral("id")) == id) 191 style = node.toElement().attribute(QStringLiteral("style")); 192 node = node.nextSibling(); 193 } 194 195 QStringList styleList = style.split(QLatin1Char(';')); 196 for (int i = 0; i < styleList.size(); i++) { 197 styleList.replace(i, styleList.at(i).trimmed()); 198 if (styleList.at(i).startsWith(styleElement + QLatin1Char(':'))) { 199 QString s = styleList.at(i); 200 v = s.right(s.length()-styleElement.length()-1); 201 } 202 } 203 204 return v; 205 } 206