GUI: Some cleanup and renaming; moved some parsing code from ThemeEngine to ThemeParser

svn-id: r35898
This commit is contained in:
Max Horn 2009-01-18 14:48:00 +00:00
parent c69638d915
commit c9e97bf6f9
3 changed files with 71 additions and 67 deletions

View file

@ -62,7 +62,7 @@ struct WidgetDrawData {
/** List of all the steps needed to draw this widget */
Common::List<Graphics::DrawStep> _steps;
int _textDataId;
TextData _textDataId;
Graphics::TextAlign _textAlignH;
GUI::ThemeEngine::TextAlignVertical _textAlignV;
@ -72,6 +72,16 @@ struct WidgetDrawData {
uint16 _backgroundOffset;
bool _buffer;
/**
* Calculates the background threshold offset of a given DrawData item.
* After fully loading all DrawSteps of a DrawData item, this function must be
* called in order to calculate if such draw steps would be drawn outside of
* the actual widget drawing zone (e.g. shadows). If this is the case, a constant
* value will be added when restoring the background of the widget.
*/
void calcBackgroundOffset();
};
class ThemeItem {
@ -191,21 +201,6 @@ static const DrawDataInfo kDrawDataDefaults[] = {
{kDDSeparator, "separator", true, kDDNone},
};
struct TextDataInfo {
TextData id;
const char *name;
};
static const TextDataInfo kTextDataDefaults[] = {
{kTextDataDefault, "text_default"},
{kTextDataHover, "text_hover"},
{kTextDataDisabled, "text_disabled"},
{kTextDataInverted, "text_inverted"},
{kTextDataButton, "text_button"},
{kTextDataButtonHover, "text_button_hover"},
{kTextDataNormalFont, "text_normal"}
};
/**********************************************************
* ThemeItem functions for drawing queues.
@ -486,10 +481,10 @@ void ThemeEngine::setGraphicsMode(GraphicsMode mode) {
_vectorRenderer->setSurface(&_screen);
}
void ThemeEngine::calcBackgroundOffset(DrawData type) {
void WidgetDrawData::calcBackgroundOffset() {
uint maxShadow = 0;
for (Common::List<Graphics::DrawStep>::const_iterator step = _widgets[type]->_steps.begin();
step != _widgets[type]->_steps.end(); ++step) {
for (Common::List<Graphics::DrawStep>::const_iterator step = _steps.begin();
step != _steps.end(); ++step) {
if ((step->autoWidth || step->autoHeight) && step->shadow > maxShadow)
maxShadow = step->shadow;
@ -497,7 +492,7 @@ void ThemeEngine::calcBackgroundOffset(DrawData type) {
maxShadow = step->bevel;
}
_widgets[type]->_backgroundOffset = maxShadow;
_backgroundOffset = maxShadow;
}
void ThemeEngine::restoreBackground(Common::Rect r) {
@ -511,15 +506,14 @@ void ThemeEngine::restoreBackground(Common::Rect r) {
* Theme elements management
*********************************************************/
void ThemeEngine::addDrawStep(const Common::String &drawDataId, const Graphics::DrawStep &step) {
DrawData id = getDrawDataId(drawDataId);
DrawData id = parseDrawDataId(drawDataId);
assert(_widgets[id] != 0);
_widgets[id]->_steps.push_back(step);
}
bool ThemeEngine::addTextData(const Common::String &drawDataId, const Common::String &textDataId, Graphics::TextAlign alignH, TextAlignVertical alignV) {
DrawData id = getDrawDataId(drawDataId);
TextData textId = getTextDataId(textDataId);
bool ThemeEngine::addTextData(const Common::String &drawDataId, TextData textId, Graphics::TextAlign alignH, TextAlignVertical alignV) {
DrawData id = parseDrawDataId(drawDataId);
if (id == -1 || textId == -1 || !_widgets[id])
return false;
@ -531,9 +525,7 @@ bool ThemeEngine::addTextData(const Common::String &drawDataId, const Common::St
return true;
}
bool ThemeEngine::addFont(const Common::String &fontId, const Common::String &file, int r, int g, int b) {
TextData textId = getTextDataId(fontId);
bool ThemeEngine::addFont(TextData textId, const Common::String &file, int r, int g, int b) {
if (textId == -1)
return false;
@ -551,7 +543,7 @@ bool ThemeEngine::addFont(const Common::String &fontId, const Common::String &fi
_texts[textId]->_fontPtr = loadFont(file);
if (!_texts[textId]->_fontPtr)
error("Couldn't load %s font '%s'", fontId.c_str(), file.c_str());
error("Couldn't load font '%s'", file.c_str());
FontMan.assignFontToName(file, _texts[textId]->_fontPtr);
}
@ -587,17 +579,17 @@ bool ThemeEngine::addBitmap(const Common::String &filename) {
}
bool ThemeEngine::addDrawData(const Common::String &data, bool cached) {
DrawData data_id = getDrawDataId(data);
DrawData id = parseDrawDataId(data);
if (data_id == -1)
if (id == -1)
return false;
if (_widgets[data_id] != 0)
delete _widgets[data_id];
if (_widgets[id] != 0)
delete _widgets[id];
_widgets[data_id] = new WidgetDrawData;
_widgets[data_id]->_buffer = kDrawDataDefaults[data_id].buffer;
_widgets[data_id]->_textDataId = -1;
_widgets[id] = new WidgetDrawData;
_widgets[id]->_buffer = kDrawDataDefaults[id].buffer;
_widgets[id]->_textDataId = kTextDataNone;
return true;
}
@ -625,7 +617,7 @@ void ThemeEngine::loadTheme(const Common::String &themeId) {
if (_widgets[i] == 0) {
warning("Missing data asset: '%s'", kDrawDataDefaults[i].name);
} else {
calcBackgroundOffset((DrawData)i);
_widgets[i]->calcBackgroundOffset();
}
}
}
@ -1221,7 +1213,7 @@ TextData ThemeEngine::getTextData(DrawData ddId) const {
}
DrawData ThemeEngine::getDrawDataId(const Common::String &name) const {
DrawData ThemeEngine::parseDrawDataId(const Common::String &name) const {
for (int i = 0; i < kDrawDataMAX; ++i)
if (name.compareToIgnoreCase(kDrawDataDefaults[i].name) == 0)
return kDrawDataDefaults[i].id;
@ -1229,14 +1221,6 @@ DrawData ThemeEngine::getDrawDataId(const Common::String &name) const {
return kDDNone;
}
TextData ThemeEngine::getTextDataId(const Common::String &name) const {
for (int i = 0; i < kTextDataMAX; ++i)
if (name.compareToIgnoreCase(kTextDataDefaults[i].name) == 0)
return kTextDataDefaults[i].id;
return kTextDataNone;
}
/**********************************************************
* External data loading
*********************************************************/

View file

@ -100,6 +100,7 @@ enum DrawData {
kDDNone = -1
};
// FIXME: TextData is really a bad name, not conveying what this enum is about.
enum TextData {
kTextDataNone = -1,
kTextDataDefault = 0,
@ -334,9 +335,7 @@ public:
* @param name The representing name, as found on Theme Description XML files.
* @see kDrawDataDefaults[]
*/
DrawData getDrawDataId(const Common::String &name) const;
TextData getTextDataId(const Common::String &name) const;
DrawData parseDrawDataId(const Common::String &name) const;
TextData getTextData(DrawData ddId) const;
@ -372,7 +371,7 @@ public:
* @param file Name of the font file.
* @param r, g, b Color of the font.
*/
bool addFont(const Common::String &fontName, const Common::String &file, int r, int g, int b);
bool addFont(TextData textId, const Common::String &file, int r, int g, int b);
/**
@ -385,9 +384,9 @@ public:
/**
* Adds a new TextStep from the ThemeParser. This will be deprecated/removed once the
* new Font API is in place.
* new Font API is in place. FIXME: Is that so ???
*/
bool addTextData(const Common::String &drawDataId, const Common::String &textDataId, Graphics::TextAlign alignH, TextAlignVertical alignV);
bool addTextData(const Common::String &drawDataId, TextData textId, Graphics::TextAlign alignH, TextAlignVertical alignV);
protected:
/**
@ -503,17 +502,6 @@ protected:
*/
void renderDirtyScreen();
/**
* Calculates the background threshold offset of a given DrawData item.
* After fully loading all DrawSteps of a DrawData item, this function must be
* called in order to calculate if such draw steps would be drawn outside of
* the actual widget drawing zone (e.g. shadows). If this is the case, a constant
* value will be added when restoring the background of the widget.
*
* @param type DrawData type of the widget.
*/
void calcBackgroundOffset(DrawData type);
/**
* Generates a DrawQueue item and enqueues it so it's drawn to the screen
* when the drawing queue is processed.

View file

@ -38,6 +38,31 @@
namespace GUI {
struct TextDataInfo {
TextData id;
const char *name;
};
static const TextDataInfo kTextDataDefaults[] = {
{kTextDataDefault, "text_default"},
{kTextDataHover, "text_hover"},
{kTextDataDisabled, "text_disabled"},
{kTextDataInverted, "text_inverted"},
{kTextDataButton, "text_button"},
{kTextDataButtonHover, "text_button_hover"},
{kTextDataNormalFont, "text_normal"}
};
static TextData parseTextDataId(const Common::String &name) {
for (int i = 0; i < kTextDataMAX; ++i)
if (name.compareToIgnoreCase(kTextDataDefaults[i].name) == 0)
return kTextDataDefaults[i].id;
return kTextDataNone;
}
ThemeParser::ThemeParser(ThemeEngine *parent) : XMLParser() {
_drawFunctions["circle"] = &Graphics::VectorRenderer::drawCallback_CIRCLE;
@ -134,7 +159,8 @@ bool ThemeParser::parserCallback_font(ParserNode *node) {
else if (!parseIntegerKey(node->values["color"].c_str(), 3, &red, &green, &blue))
return parserError("Error parsing color value for font definition.");
if (!_theme->addFont(node->values["id"], node->values["file"], red, green, blue))
TextData textDataId = parseTextDataId(node->values["id"]);
if (!_theme->addFont(textDataId, node->values["file"], red, green, blue))
return parserError("Error loading Font in theme engine.");
return true;
@ -186,7 +212,8 @@ bool ThemeParser::parserCallback_text(ParserNode *node) {
alignH = Graphics::kTextAlignRight;
else if (node->values["horizontal_align"] == "center")
alignH = Graphics::kTextAlignCenter;
else return parserError("Invalid value for text alignment.");
else
return parserError("Invalid value for text alignment.");
if (node->values["vertical_align"] == "top")
alignV = GUI::ThemeEngine::kTextAlignVTop;
@ -194,10 +221,14 @@ bool ThemeParser::parserCallback_text(ParserNode *node) {
alignV = GUI::ThemeEngine::kTextAlignVCenter;
else if (node->values["vertical_align"] == "bottom")
alignV = GUI::ThemeEngine::kTextAlignVBottom;
else return parserError("Invalid value for text alignment.");
else
return parserError("Invalid value for text alignment.");
if (!_theme->addTextData(getParentNode(node)->values["id"], node->values["font"], alignH, alignV))
return parserError("Error adding Text Data for '%s'.", getParentNode(node)->values["id"].c_str());
Common::String id = getParentNode(node)->values["id"];
TextData textDataId = parseTextDataId(node->values["font"]);
if (!_theme->addTextData(id, textDataId, alignH, alignV))
return parserError("Error adding Text Data for '%s'.", id.c_str());
return true;
}
@ -506,6 +537,7 @@ bool ThemeParser::parserCallback_widget(ParserNode *node) {
return parserError("Error parsing Layout properties of '%s'.", var.c_str());
} else {
// FIXME: Shouldn't we distinguish the name/id and the label of a widget?
var = node->values["name"];
int width = -1;
int height = -1;