From 8caa7d3f8b1146fafc6dff6de4f801eb2e8b61ae Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Tue, 24 Jun 2008 19:48:01 +0000 Subject: Common: - Added function to get the active host type as a string. XMLParser: - Added support for ignoring keys while parsing (check documentation). Backwards compatible. - parserError() has been revamped. Shows all kinds of detailed information regarding the error ala Python InterfaceManager/ThemeParser: - DrawData keys and their DrawStep subkeys are now successfully parsed and loaded into structs. That's a win. - Bug fixes. svn-id: r32768 --- gui/ThemeParser.cpp | 111 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 100 insertions(+), 11 deletions(-) (limited to 'gui/ThemeParser.cpp') diff --git a/gui/ThemeParser.cpp b/gui/ThemeParser.cpp index 9f029a874e..afc623c3d8 100644 --- a/gui/ThemeParser.cpp +++ b/gui/ThemeParser.cpp @@ -42,6 +42,15 @@ using namespace Common; ThemeParser::ThemeParser() : XMLParser() { _callbacks["drawstep"] = &ThemeParser::parserCallback_DRAWSTEP; _callbacks["drawdata"] = &ThemeParser::parserCallback_DRAWDATA; + + _drawFunctions["circle"] = &Graphics::VectorRenderer::drawCallback_CIRCLE; + _drawFunctions["square"] = &Graphics::VectorRenderer::drawCallback_SQUARE; + _drawFunctions["roundedsq"] = &Graphics::VectorRenderer::drawCallback_ROUNDSQ; + _drawFunctions["bevelsq"] = &Graphics::VectorRenderer::drawCallback_BEVELSQ; + _drawFunctions["line"] = &Graphics::VectorRenderer::drawCallback_LINE; + _drawFunctions["triangle"] = &Graphics::VectorRenderer::drawCallback_TRIANGLE; + _drawFunctions["fill"] = &Graphics::VectorRenderer::drawCallback_FILLSURFACE; + _drawFunctions["void"] = &Graphics::VectorRenderer::drawCallback_VOID; } bool ThemeParser::keyCallback(Common::String keyName) { @@ -73,8 +82,12 @@ Graphics::DrawStep *ThemeParser::newDrawStep() { } bool ThemeParser::parserCallback_DRAWSTEP() { - ParserNode *stepNode = _activeKey.pop(); - ParserNode *drawdataNode = _activeKey.pop(); + ParserNode *stepNode = _activeKey.top(); + + // HACK: Any cleaner way to access the second item from + // the top without popping? Let's keep it this way and hope + // the internal representation doesn't change + ParserNode *drawdataNode = _activeKey[_activeKey.size() - 2]; assert(stepNode->name == "drawstep"); assert(drawdataNode->name == "drawdata"); @@ -85,32 +98,108 @@ bool ThemeParser::parserCallback_DRAWSTEP() { Common::String functionName = stepNode->values["func"]; if (_drawFunctions.contains(functionName) == false) { - parserError("Invalid drawing function in draw step."); - _activeKey.push(drawdataNode); - _activeKey.push(stepNode); + parserError("%s is not a valid drawing function name", functionName.c_str()); return false; } drawstep->drawingCall = _drawFunctions[functionName]; - if (stepNode->values.contains("stroke")) { + uint32 red, green, blue; +/** + * Helper macro to sanitize and assign an integer value from a key + * to the draw step. + * + * @param struct_name Name of the field of a DrawStep struct that must be + * assigned. + * @param key_name Name as STRING of the key identifier as it appears in the + * theme description format. + */ +#define __PARSER_ASSIGN_INT(struct_name, key_name) \ + if (stepNode->values.contains(key_name)) { \ + if (!validateKeyInt(stepNode->values[key_name].c_str())) \ + return false; \ + \ + drawstep->struct_name = atoi(stepNode->values[key_name].c_str()); \ + } + +/** + * Helper macro to sanitize and assign a RGB value from a key to the draw + * step. RGB values have the following syntax: "R, G, B". + * + * TODO: Handle also specific name colors such as "red", "green", etc. + * + * @param struct_name Name of the field of a DrawStep struct that must be + * assigned. + * @param key_name Name as STRING of the key identifier as it appears in the + * theme description format. + */ +#define __PARSER_ASSIGN_RGB(struct_name, key_name) \ + if (stepNode->values.contains(key_name)) { \ + if (sscanf(stepNode->values[key_name].c_str(), "%d, %d, %d", &red, &green, &blue) != 3) \ + return false; \ + \ + drawstep->struct_name.r = red; \ + drawstep->struct_name.g = green; \ + drawstep->struct_name.b = blue; \ } - if (functionName == "roundedsq") { + __PARSER_ASSIGN_INT(stroke, "stroke"); + __PARSER_ASSIGN_INT(shadow, "shadow"); + __PARSER_ASSIGN_INT(factor, "gradient_factor"); + __PARSER_ASSIGN_RGB(fgColor, "fg_color"); + __PARSER_ASSIGN_RGB(bgColor, "bg_color"); + __PARSER_ASSIGN_RGB(gradColor1, "gradient_start"); + __PARSER_ASSIGN_RGB(gradColor2, "gradient_end"); + + if (functionName == "roundedsq" || functionName == "circle") { + __PARSER_ASSIGN_INT(radius, "radius"); } - g_InterfaceManager.addDrawStep(drawdataNode->values["id"], drawstep); + if (functionName == "bevelsq") { + __PARSER_ASSIGN_INT(extraData, "bevel"); + } - _activeKey.push(drawdataNode); - _activeKey.push(stepNode); +#undef __PARSER_ASSIGN_INT +#undef __PARSER_ASSIGN_RGB + g_InterfaceManager.addDrawStep(drawdataNode->values["id"], drawstep); return true; } bool ThemeParser::parserCallback_DRAWDATA() { - printf("Drawdata callback!\n"); + ParserNode *drawdataNode = _activeKey.top(); + bool cached = false; + + if (drawdataNode->values.contains("id") == false) { + parserError("DrawData notes must contain an identifier."); + return false; + } + + InterfaceManager::DrawData id = g_InterfaceManager.getDrawDataId(drawdataNode->values["id"]); + + if (id == -1) { + parserError("%d is not a valid DrawData set identifier.", drawdataNode->values["id"].c_str()); + return false; + } + + if (drawdataNode->values.contains("cached") && drawdataNode->values["cached"] == "true") { + cached = true; + } + + if (drawdataNode->values.contains("platform")) { + if (drawdataNode->values["platform"].compareToIgnoreCase(Common::getHostPlatformString()) != 0) { + drawdataNode->ignore = true; + return true; + } + } + + if (g_InterfaceManager.addDrawData(id, cached) == false) { + parserError("Repeated DrawData: Only one set of Drawing Data for a widget may be specified on each platform."); + return false; + } + return true; } -- cgit v1.2.3