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)23 KBBThemeManager::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)49 QColor KBBThemeManager::color(const KBBScalableGraphicWidget::itemType itemType)
50 {
51     return QColor(value(itemType, QStringLiteral("stroke")));
52 }
53 
54 
elementId(const KBBScalableGraphicWidget::itemType itemType)55 QString 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)150 Qt::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()159 QSvgRenderer* KBBThemeManager::svgRenderer()
160 {
161 	return &m_svgRenderer;
162 }
163 
164 
width(const KBBScalableGraphicWidget::itemType itemType)165 qreal KBBThemeManager::width(const KBBScalableGraphicWidget::itemType itemType)
166 {
167     return value(itemType, QStringLiteral("stroke-width")).toFloat();
168 }
169 
170 
zValue(const KBBScalableGraphicWidget::itemType itemType)171 int 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)182 QString 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