diff options
author | Vicent Marti | 2008-08-01 10:18:47 +0000 |
---|---|---|
committer | Vicent Marti | 2008-08-01 10:18:47 +0000 |
commit | 9bd3b07647bfbd5016f06a4f055a4310b3269587 (patch) | |
tree | 0ebafb8d7d9d9275aac96282395972e46d099d0a | |
parent | 7d797c878dd8f880a9e0045a93a3a7c44cb14c04 (diff) | |
download | scummvm-rg350-9bd3b07647bfbd5016f06a4f055a4310b3269587.tar.gz scummvm-rg350-9bd3b07647bfbd5016f06a4f055a4310b3269587.tar.bz2 scummvm-rg350-9bd3b07647bfbd5016f06a4f055a4310b3269587.zip |
Support for XML layout with unspecified keys.
XML Layout parsing. WIP.
svn-id: r33488
-rw-r--r-- | common/xmlparser.cpp | 2 | ||||
-rw-r--r-- | common/xmlparser.h | 9 | ||||
-rw-r--r-- | gui/ThemeParser.cpp | 20 | ||||
-rw-r--r-- | gui/ThemeParser.h | 1 |
4 files changed, 27 insertions, 5 deletions
diff --git a/common/xmlparser.cpp b/common/xmlparser.cpp index 89dd5d7e32..25c79e65c0 100644 --- a/common/xmlparser.cpp +++ b/common/xmlparser.cpp @@ -112,7 +112,7 @@ bool XMLParser::parseActiveKey(bool closed) { return parserError("Missing required property '%s' inside key '%s'", i->name.c_str(), key->name.c_str()); } - if (localMap.empty() == false) + if (key->layout.anyProps == false && localMap.empty() == false) return parserError("Unhandled property inside key '%s': '%s'", key->name.c_str(), localMap.begin()->_key.c_str()); // check if any of the parents must be ignored. diff --git a/common/xmlparser.h b/common/xmlparser.h index 11028dbaa8..9308524388 100644 --- a/common/xmlparser.h +++ b/common/xmlparser.h @@ -108,6 +108,10 @@ namespace Common { contained children keys, using the XML_KEY() macro again. The scope of a XML key is closed with the KEY_END() macro. + Keys which may contain any kind of Property names may be defined with the + XML_PROP_ANY() macro instead of the XML_PROP() macro. This macro takes no + arguments. + As an example, the following XML layout: XML_KEY(palette) @@ -178,6 +182,7 @@ namespace Common { #define XML_KEY(keyName) {\ lay = new XMLKeyLayout; \ + lay->anyProps = false; \ lay->custom = new kLocalParserName::CustomParserCallback; \ ((kLocalParserName::CustomParserCallback*)(lay->custom))->callback = (&kLocalParserName::parserCallback_##keyName); \ layout.top()->children[#keyName] = lay; \ @@ -189,6 +194,9 @@ namespace Common { prop.name = #propName; \ prop.required = req; \ layout.top()->properties.push_back(prop); }\ + +#define XML_PROP_ANY() {\ + layout.top()->anyProps = true; } #define CUSTOM_XML_PARSER(parserName) \ protected: \ @@ -291,6 +299,7 @@ public: }; Common::List<XMLKeyProperty> properties; + bool anyProps; ChildMap children; ~XMLKeyLayout() { diff --git a/gui/ThemeParser.cpp b/gui/ThemeParser.cpp index a7c310b5bc..4ac6a65932 100644 --- a/gui/ThemeParser.cpp +++ b/gui/ThemeParser.cpp @@ -446,7 +446,6 @@ bool ThemeParser::parserCallback_def(ParserNode *node) { bool ThemeParser::parserCallback_widget(ParserNode *node) { Common::String var; - int width, height, x, y, paddingL, paddingR, paddingT, paddingB; if (getParentNode(node)->name == "globals") var = "Globals." + node->values["name"] + "."; @@ -455,25 +454,38 @@ bool ThemeParser::parserCallback_widget(ParserNode *node) { else assert(!"Corruption in XML parser."); + if (!parseCommonLayoutProps(node, var)) + return parserError("Error when parsing Layout properties of '%s'.", var.c_str()); + + return true; +} + +bool ThemeParser::parseCommonLayoutProps(ParserNode *node, const Common::String &var) { if (node->values.contains("size")) { + int width, height; + if (!parseIntegerKey(node->values["size"].c_str(), 2, &width, &height)) - return parserError("Invalid definition for '%sSize'.", var.c_str()); + return false; _theme->themeEval()->setVar(var + "Width", width); _theme->themeEval()->setVar(var + "Height", height); } if (node->values.contains("pos")) { + int x, y; + if (!parseIntegerKey(node->values["pos"].c_str(), 2, &x, &y)) - return parserError("Invalid definition for '%sPosition'.", var.c_str()); + return false; _theme->themeEval()->setVar(var + "X", x); _theme->themeEval()->setVar(var + "Y", y); } if (node->values.contains("padding")) { + int paddingL, paddingR, paddingT, paddingB; + if (!parseIntegerKey(node->values["padding"].c_str(), 4, &paddingL, &paddingR, &paddingT, &paddingB)) - return parserError("Invalid definition for '%sPadding'.", var.c_str()); + return false; _theme->themeEval()->setVar(var + "Padding.Left", paddingL); _theme->themeEval()->setVar(var + "Padding.Right", paddingR); diff --git a/gui/ThemeParser.h b/gui/ThemeParser.h index c9483fcc8d..c4e744c44c 100644 --- a/gui/ThemeParser.h +++ b/gui/ThemeParser.h @@ -468,6 +468,7 @@ protected: Graphics::DrawStep *newDrawStep(); Graphics::DrawStep *defaultDrawStep(); bool parseDrawStep(ParserNode *stepNode, Graphics::DrawStep *drawstep, bool functionSpecific); + bool parseCommonLayoutProps(ParserNode *node, const Common::String &var); Graphics::DrawStep *_defaultStepGlobal; Graphics::DrawStep *_defaultStepLocal; |