aboutsummaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorVicent Marti2008-07-10 15:50:44 +0000
committerVicent Marti2008-07-10 15:50:44 +0000
commitccf9368c533110a5c72df3607466a16651ec6497 (patch)
tree7b4d08bb75a897e39f476f9e571fd701585c2209 /gui
parent24a8fb1820ab27c050ff65f8447f3680d9e8064a (diff)
downloadscummvm-rg350-ccf9368c533110a5c72df3607466a16651ec6497.tar.gz
scummvm-rg350-ccf9368c533110a5c72df3607466a16651ec6497.tar.bz2
scummvm-rg350-ccf9368c533110a5c72df3607466a16651ec6497.zip
Added support for Text Steps in the Vector Renderer.
svn-id: r32991
Diffstat (limited to 'gui')
-rw-r--r--gui/ThemeDefaultXML.cpp3
-rw-r--r--gui/ThemeParser.cpp53
-rw-r--r--gui/ThemeParser.h1
-rw-r--r--gui/ThemeRenderer.cpp32
-rw-r--r--gui/ThemeRenderer.h7
5 files changed, 90 insertions, 6 deletions
diff --git a/gui/ThemeDefaultXML.cpp b/gui/ThemeDefaultXML.cpp
index fe14fbb403..3793fcc82b 100644
--- a/gui/ThemeDefaultXML.cpp
+++ b/gui/ThemeDefaultXML.cpp
@@ -51,14 +51,17 @@ bool ThemeRenderer::loadDefaultXML() {
"</drawdata>"
"<drawdata id = 'button_idle' cache = false>"
+ "<text align = 'center' color = '255, 0, 0' />"
"<drawstep func = 'roundedsq' radius = '8' stroke = 0 fill = 'gradient' gradient_start = '206, 121, 99' gradient_end = '173, 40, 8' size = 'auto' shadow = 3 />"
"</drawdata>"
"<drawdata id = 'button_hover' cache = false>"
+ "<text align = 'center' color = '255, 0, 0' />"
"<drawstep func = 'roundedsq' radius = '8' fill = 'gradient' gradient_start = '206, 121, 99' gradient_end = '173, 40, 8' size = 'auto' shadow = 3 />"
"</drawdata>"
"<drawdata id = 'checkbox_disabled' cache = false>"
+ "<text align = 'center' color = '255, 0, 0' />"
"<drawstep func = 'square' fill = 'gradient' gradient_start = '206, 121, 99' gradient_end = '173, 40, 8' size = 'auto' shadow = 0 />"
"</drawdata>"
diff --git a/gui/ThemeParser.cpp b/gui/ThemeParser.cpp
index 463e8c81ea..eae131af50 100644
--- a/gui/ThemeParser.cpp
+++ b/gui/ThemeParser.cpp
@@ -48,7 +48,8 @@ ThemeParser::ThemeParser(ThemeRenderer *parent) : XMLParser() {
_callbacks["render_info"] = &ThemeParser::parserCallback_renderInfo;
_callbacks["layout_info"] = &ThemeParser::parserCallback_layoutInfo;
_callbacks["default"] = &ThemeParser::parserCallback_defaultSet;
-
+ _callbacks["text"] = &ThemeParser::parserCallback_text;
+
_drawFunctions["circle"] = &Graphics::VectorRenderer::drawCallback_CIRCLE;
_drawFunctions["square"] = &Graphics::VectorRenderer::drawCallback_SQUARE;
_drawFunctions["roundedsq"] = &Graphics::VectorRenderer::drawCallback_ROUNDSQ;
@@ -136,6 +137,56 @@ bool ThemeParser::parserCallback_defaultSet() {
return parseDrawStep(defNode, step, false);
}
+bool ThemeParser::parserCallback_text() {
+ ParserNode *tNode = getActiveNode();
+ ParserNode *parentNode = getParentNode(tNode);
+
+ if (parentNode == 0 || parentNode->name != "drawdata")
+ return parserError("Text Steps must be contained inside <drawdata> keys.");
+
+ Graphics::TextStep step;
+
+ if (tNode->values.contains("align") == false)
+ return parserError("Text inside widgets requires an alignement key.");
+
+ if (tNode->values["align"] == "left")
+ step.align = GUI::Theme::kTextAlignLeft;
+ else if (tNode->values["align"] == "right")
+ step.align = GUI::Theme::kTextAlignRight;
+ else if (tNode->values["align"] == "center")
+ step.align = GUI::Theme::kTextAlignCenter;
+ else return parserError("Invalid value for text alignment.");
+
+
+ if (tNode->values.contains("color")) {
+ int red, green, blue;
+
+ if (parseIntegerKey(tNode->values["color"].c_str(), 3, &red, &green, &blue) == false ||
+ red < 0 || red > 255 || green < 0 || green > 255 || blue < 0 || blue > 255)
+ return parserError("Error when parsing color value for text definition");
+
+ step.color.r = red;
+ step.color.g = green;
+ step.color.b = blue;
+ step.color.set = true;
+ } else if (_defaultStepLocal && _defaultStepLocal->fgColor.set) {
+ step.color.r = _defaultStepLocal->fgColor.r;
+ step.color.g = _defaultStepLocal->fgColor.g;
+ step.color.b = _defaultStepLocal->fgColor.b;
+ step.color.set = true;
+ } else if (_defaultStepGlobal && _defaultStepGlobal->fgColor.set) {
+ step.color.r = _defaultStepGlobal->fgColor.r;
+ step.color.g = _defaultStepGlobal->fgColor.g;
+ step.color.b = _defaultStepGlobal->fgColor.b;
+ step.color.set = true;
+ } else {
+ return parserError("Cannot assign color for text drawing.");
+ }
+
+ _theme->addTextStep(parentNode->values["id"], step);
+ return true;
+}
+
bool ThemeParser::parserCallback_renderInfo() {
ParserNode *infoNode = getActiveNode();
diff --git a/gui/ThemeParser.h b/gui/ThemeParser.h
index cddb91b21e..778158bff0 100644
--- a/gui/ThemeParser.h
+++ b/gui/ThemeParser.h
@@ -328,6 +328,7 @@ protected:
bool parserCallback_renderInfo();
bool parserCallback_layoutInfo();
bool parserCallback_defaultSet();
+ bool parserCallback_text();
void cleanup();
diff --git a/gui/ThemeRenderer.cpp b/gui/ThemeRenderer.cpp
index bf481fabb8..71943e2586 100644
--- a/gui/ThemeRenderer.cpp
+++ b/gui/ThemeRenderer.cpp
@@ -180,6 +180,19 @@ void ThemeRenderer::addDrawStep(Common::String &drawDataId, Graphics::DrawStep s
_widgets[id]->_steps.push_back(step);
}
+bool ThemeRenderer::addTextStep(Common::String &drawDataId, Graphics::TextStep step) {
+ DrawData id = getDrawDataId(drawDataId);
+
+ assert(_widgets[id] != 0);
+ if (_widgets[id]->_hasText == true)
+ return false;
+
+ _widgets[id]->_textStep = step;
+ _widgets[id]->_hasText = true;
+
+ return true;
+}
+
bool ThemeRenderer::addDrawData(DrawData data_id, bool cached) {
assert(data_id >= 0 && data_id < kDrawDataMAX);
@@ -189,6 +202,7 @@ bool ThemeRenderer::addDrawData(DrawData data_id, bool cached) {
_widgets[data_id] = new WidgetDrawData;
_widgets[data_id]->_cached = cached;
_widgets[data_id]->_surfaceCache = 0;
+ _widgets[data_id]->_hasText = false;
return true;
}
@@ -252,9 +266,12 @@ void ThemeRenderer::drawCached(DrawData type, const Common::Rect &r) {
}
void ThemeRenderer::drawDD(DrawData type, const Common::Rect &r) {
+ if (_widgets[type] == 0)
+ return;
+
if (isWidgetCached(type, r)) {
drawCached(type, r);
- } else if (_widgets[type] != 0) {
+ } else {
for (Common::List<Graphics::DrawStep>::const_iterator step = _widgets[type]->_steps.begin();
step != _widgets[type]->_steps.end(); ++step)
_vectorRenderer->drawStep(r, *step);
@@ -264,15 +281,20 @@ void ThemeRenderer::drawDD(DrawData type, const Common::Rect &r) {
void ThemeRenderer::drawButton(const Common::Rect &r, const Common::String &str, WidgetStateInfo state, uint16 hints) {
if (!ready())
return;
+
+ DrawData dd;
if (state == kStateEnabled)
- drawDD(kDDButtonIdle, r);
+ dd = kDDButtonIdle;
else if (state == kStateHighlight)
- drawDD(kDDButtonHover, r);
+ dd = kDDButtonHover;
else if (state == kStateDisabled)
- drawDD(kDDButtonDisabled, r);
+ dd = kDDButtonDisabled;
- // TODO: Add text drawing.
+ drawDD(dd, r);
+ if (hasWidgetText(dd))
+ _vectorRenderer->textStep(str, r, _widgets[dd]->_textStep);
+
addDirtyRect(r);
debugWidgetPosition(r);
diff --git a/gui/ThemeRenderer.h b/gui/ThemeRenderer.h
index 9450186b34..74225d035c 100644
--- a/gui/ThemeRenderer.h
+++ b/gui/ThemeRenderer.h
@@ -43,6 +43,8 @@ struct WidgetDrawData;
struct WidgetDrawData {
Common::List<Graphics::DrawStep> _steps;
+ Graphics::TextStep _textStep;
+ bool _hasText;
bool _cached;
Graphics::Surface *_surfaceCache;
@@ -175,6 +177,7 @@ public:
void addDrawStep(Common::String &drawDataId, Graphics::DrawStep step);
bool addDrawData(DrawData data_id, bool cached);
+ bool addTextStep(Common::String &drawDataId, Graphics::TextStep step);
ThemeParser *parser() {
return _parser;
@@ -227,6 +230,10 @@ protected:
void redrawDialogStack();
+ bool hasWidgetText(DrawData type) {
+ return (_widgets[type] != 0 && _widgets[type]->_hasText);
+ }
+
bool isWidgetCached(DrawData type, const Common::Rect &r);
void drawCached(DrawData type, const Common::Rect &r);