aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/xmlparser.cpp2
-rw-r--r--common/xmlparser.h9
-rw-r--r--gui/ThemeParser.cpp20
-rw-r--r--gui/ThemeParser.h1
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;