engine/src/GUIManager/WidgetXmlParsers.cpp
2013-01-19 20:02:34 +00:00

514 lines
17 KiB
C++

#include "include/Engine.h"
namespace SE
{
void TStaticWidgetParser::Serialize(boost::property_tree::ptree& propertyTree)
{
std::string widgetType = propertyTree.get<std::string>("<xmlattr>.type");
std::string name = propertyTree.get<std::string>("<xmlattr>.name");
std::string group = propertyTree.get<std::string>("<xmlattr>.group");
float xCenter = propertyTree.get<float>("<xmlattr>.xCenter");
float yCenter = propertyTree.get<float>("<xmlattr>.yCenter");
float width = propertyTree.get<float>("<xmlattr>.width");
float height = propertyTree.get<float>("<xmlattr>.height");
int order = propertyTree.get<int>("<xmlattr>.order", 0);
vec2 posFrom(xCenter - width*0.5f, yCenter - height*0.5f);
vec2 posTo(xCenter + width*0.5f, yCenter + height*0.5f);
//boost::property_tree::ptree& fillerTree = propertyTree.find("Filler")->second;
std::vector<boost::function<void(TSquareStatic*)>> fillerFuncArr;
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, propertyTree)
{
if (v.first == "Filler")
{
boost::property_tree::ptree& fillerTree = v.second;
if (fillerTree.get<std::string>("<xmlattr>.type") == "StaticTextureFiller")
{
std::string normTexName = fillerTree.get<std::string>("<xmlattr>.texName");
fillerFuncArr.push_back(boost::bind(TSquareStatic::StaticTextureFiller, posFrom, posTo, normTexName, _1));
}
else if (fillerTree.get<std::string>("<xmlattr>.type") == "StaticTextFiller")
{
TTextParams textParamsNormal;
boost::property_tree::ptree& textParamsNormalTree = fillerTree.find("TextParams")->second;
textParamsNormal.Serialize(textParamsNormalTree);
fillerFuncArr.push_back(boost::bind(TSquareStatic::StaticTextFiller, posFrom, posTo, textParamsNormal, _1));
}
}
}
ResourceManager->GUIManager.AddWidget(
std::shared_ptr<TInstancingWidgetAncestor>(TSquareStatic::CreateStaticWithFillers(posFrom, posTo, fillerFuncArr)),
name,
group,
order);
}
void TDynamicTextWidgetParser::Serialize(boost::property_tree::ptree& propertyTree)
{
std::string widgetType = propertyTree.get<std::string>("<xmlattr>.type");
std::string name = propertyTree.get<std::string>("<xmlattr>.name");
std::string group = propertyTree.get<std::string>("<xmlattr>.group");
float xCenter = propertyTree.get<float>("<xmlattr>.xCenter");
float yCenter = propertyTree.get<float>("<xmlattr>.yCenter");
float width = propertyTree.get<float>("<xmlattr>.width");
float height = propertyTree.get<float>("<xmlattr>.height");
int order = propertyTree.get<int>("<xmlattr>.order", 0);
vec2 posFrom(xCenter - width*0.5f, yCenter - height*0.5f);
vec2 posTo(xCenter + width*0.5f, yCenter + height*0.5f);
//boost::property_tree::ptree& fillerTree = propertyTree.find("Filler")->second;
std::vector<boost::function<void(TDynamicText*)>> fillerFuncArr;
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, propertyTree)
{
if (v.first == "Filler")
{
boost::property_tree::ptree& fillerTree = v.second;
if (fillerTree.get<std::string>("<xmlattr>.type") == "TextParamsFiller")
{
TTextParams textParamsNormal;
boost::property_tree::ptree& textParamsNormalTree = fillerTree.find("TextParams")->second;
textParamsNormal.Serialize(textParamsNormalTree);
fillerFuncArr.push_back(boost::bind(TDynamicText::TextParamsFiller, posFrom, posTo, textParamsNormal, _1));
}
else if (fillerTree.get<std::string>("<xmlattr>.type") == "SmartValueTextFiller")
{
std::string dictionaryName = fillerTree.get<std::string>("<xmlattr>.dictionaryName");
std::string smartValueName = fillerTree.get<std::string>("<xmlattr>.smartValueName");
fillerFuncArr.push_back(boost::bind(TDynamicText::SmartValueTextFiller, dictionaryName, smartValueName, _1));
}
}
}
ResourceManager->GUIManager.AddWidget(
std::shared_ptr<TInstancingWidgetAncestor>(TDynamicText::CreateDynamicTextWithFillers(posFrom, posTo, fillerFuncArr)),
name,
group,
order);
}
void TButtonWidgetParser::Serialize(boost::property_tree::ptree& propertyTree)
{
std::string widgetType = propertyTree.get<std::string>("<xmlattr>.type");
std::string name = propertyTree.get<std::string>("<xmlattr>.name");
std::string group = propertyTree.get<std::string>("<xmlattr>.group");
float xCenter = propertyTree.get<float>("<xmlattr>.xCenter");
float yCenter = propertyTree.get<float>("<xmlattr>.yCenter");
float width = propertyTree.get<float>("<xmlattr>.width");
float height = propertyTree.get<float>("<xmlattr>.height");
int order = propertyTree.get<int>("<xmlattr>.order", 0);
vec2 posFrom(xCenter - width*0.5f, yCenter - height*0.5f);
vec2 posTo(xCenter + width*0.5f, yCenter + height*0.5f);
std::vector<boost::function<void(TUniversalButton*)> > fillerFuncArr;
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, propertyTree)
{
if (v.first == "Filler")
{
boost::property_tree::ptree& fillerTree = v.second;
if (fillerTree.get<std::string>("<xmlattr>.type") == "SquareButtonFiller")
{
std::string normTexName = fillerTree.get<std::string>("<xmlattr>.normTexName");
std::string pressedTexName = fillerTree.get<std::string>("<xmlattr>.pressedTexName");
fillerFuncArr.push_back(boost::bind(TUniversalButton::SquareButtonFiller, posFrom, posTo, normTexName, pressedTexName, _1));
}
else if (fillerTree.get<std::string>("<xmlattr>.type") == "TextButtonFiller")
{
TTextParams textParamsNormal;
TTextParams textParamsPressed;
boost::property_tree::ptree& textParamsNormalTree = fillerTree.find("TextParamsNormal")->second;
textParamsNormal.Serialize(textParamsNormalTree);
boost::property_tree::ptree& textParamsPressedTree = fillerTree.find("TextParamsPressed")->second;
textParamsPressed.Serialize(textParamsPressedTree);
fillerFuncArr.push_back(boost::bind(TUniversalButton::TextButtonFiller, posFrom, posTo, textParamsNormal, textParamsPressed, _1));
}
}
}
ResourceManager->GUIManager.AddWidget(
std::shared_ptr<TInstancingWidgetAncestor>(
TUniversalButton::CreateButtonWithFillers(posFrom, posTo, fillerFuncArr)
),
name,
group,
order);
}
void TEditWidgetParser::Serialize(boost::property_tree::ptree& propertyTree)
{
std::string widgetType = propertyTree.get<std::string>("<xmlattr>.type");
std::string name = propertyTree.get<std::string>("<xmlattr>.name");
std::string group = propertyTree.get<std::string>("<xmlattr>.group");
float xCenter = propertyTree.get<float>("<xmlattr>.xCenter");
float yCenter = propertyTree.get<float>("<xmlattr>.yCenter");
float width = propertyTree.get<float>("<xmlattr>.width");
float height = propertyTree.get<float>("<xmlattr>.height");
int order = propertyTree.get<int>("<xmlattr>.order", 0);
vec2 posFrom(xCenter - width*0.5f, yCenter - height*0.5f);
vec2 posTo(xCenter + width*0.5f, yCenter + height*0.5f);
/*
//The only one filler
std::string texName = propertyTree.get<std::string>("Filler.<xmlattr>.texName");
TTextParams textParams;
boost::property_tree::ptree& textParamsTree = propertyTree.find("Filler")->second.find("TextParams")->second;
textParams.Serialize(textParamsTree);
ResourceManager->GUIManager.AddWidget(
std::shared_ptr<TInstancingWidgetAncestor>(TEdit::CreateEdit(posFrom, posTo, texName, textParams)),
name,
group,
order);*/
std::vector<boost::function<void(TEdit*)>> fillerFuncArr;
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, propertyTree)
{
if (v.first == "Filler")
{
boost::property_tree::ptree& fillerTree = v.second;
if (fillerTree.get<std::string>("<xmlattr>.type") == "EditFiller")
{
std::string texName = fillerTree.get<std::string>("<xmlattr>.texName");
TTextParams textParams;
boost::property_tree::ptree& textParamsTree = fillerTree.find("TextParams")->second;
textParams.Serialize(textParamsTree);
fillerFuncArr.push_back(boost::bind(TEdit::EditFiller, posFrom, posTo, texName, textParams, _1));
}
else if (fillerTree.get<std::string>("<xmlattr>.type") == "SmartValueTextFiller")
{
std::string dictionaryName = fillerTree.get<std::string>("<xmlattr>.dictionaryName");
std::string smartValueName = fillerTree.get<std::string>("<xmlattr>.smartValueName");
fillerFuncArr.push_back(boost::bind(TEdit::SmartValueTextFiller, dictionaryName, smartValueName, _1));
}
}
}
ResourceManager->GUIManager.AddWidget(
std::shared_ptr<TInstancingWidgetAncestor>(
TEdit::CreateEditWithFillers(posFrom, posTo, fillerFuncArr)
),
name,
group,
order);
}
void TCheckBoxWidgetParser::Serialize(boost::property_tree::ptree& propertyTree)
{
std::string widgetType = propertyTree.get<std::string>("<xmlattr>.type");
std::string name = propertyTree.get<std::string>("<xmlattr>.name");
std::string group = propertyTree.get<std::string>("<xmlattr>.group");
float xCenter = propertyTree.get<float>("<xmlattr>.xCenter");
float yCenter = propertyTree.get<float>("<xmlattr>.yCenter");
float width = propertyTree.get<float>("<xmlattr>.width");
float height = propertyTree.get<float>("<xmlattr>.height");
int order = propertyTree.get<int>("<xmlattr>.order", 0);
vec2 posFrom(xCenter - width*0.5f, yCenter - height*0.5f);
vec2 posTo(xCenter + width*0.5f, yCenter + height*0.5f);
std::vector<boost::function<void(TCheckBox*)> > fillerFuncArr;
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, propertyTree)
{
if (v.first == "Filler")
{
boost::property_tree::ptree& fillerTree = v.second;
if (fillerTree.get<std::string>("<xmlattr>.type") == "TextureFiller")
{
std::string texName = fillerTree.get<std::string>("<xmlattr>.texName");
std::string checkedTexName = fillerTree.get<std::string>("<xmlattr>.checkedTexName");
fillerFuncArr.push_back(boost::bind(TCheckBox::TextureFiller, posFrom, posTo, texName, checkedTexName, _1));
}
else if (fillerTree.get<std::string>("<xmlattr>.type") == "TextFiller")
{
TTextParams textParams;
boost::property_tree::ptree& textParamsTree = fillerTree.find("TextParams")->second;
textParams.Serialize(textParamsTree);
float textXCenter = fillerTree.get<float>("<xmlattr>.xCenter");
float textYCenter = fillerTree.get<float>("<xmlattr>.yCenter");
float textWidth = fillerTree.get<float>("<xmlattr>.width");
float textHeight = fillerTree.get<float>("<xmlattr>.height");
vec2 textPosFrom(textXCenter - textWidth*0.5f, textYCenter - textHeight*0.5f);
vec2 textPosTo(textXCenter + textWidth*0.5f, textYCenter + textHeight*0.5f);
fillerFuncArr.push_back(boost::bind(TCheckBox::TextFiller, textPosFrom, textPosTo, textParams, _1));
}
else if (fillerTree.get<std::string>("<xmlattr>.type") == "RadioButtonGroupFiller")
{
//std::string radioGroupName = fillerTree.get<std::string>("");
//fillerFuncArr.push_back(boost::bind(TCheckBox::RadioButtonGroupFiller, radioGroupName, _1));
throw ErrorToLog("RadioButtonGroupFiller is not allowed for checkboxes!");
}
else if (fillerTree.get<std::string>("<xmlattr>.type") == "SmartValueFiller")
{
std::string dictionaryName = fillerTree.get<std::string>("<xmlattr>.dictionaryName");
std::string smartValueName = fillerTree.get<std::string>("<xmlattr>.smartValueName");
fillerFuncArr.push_back(boost::bind(TCheckBox::SmartValueFiller, dictionaryName, smartValueName, _1));
}
}
}
ResourceManager->GUIManager.AddWidget(
std::shared_ptr<TInstancingWidgetAncestor>(
TCheckBox::CreateCheckBoxWithFillers(posFrom, posTo, fillerFuncArr)
),
name,
group,
order);
}
void TRadioButtonWidgetParser::Serialize(boost::property_tree::ptree& propertyTree)
{
std::string widgetType = propertyTree.get<std::string>("<xmlattr>.type");
std::string name = propertyTree.get<std::string>("<xmlattr>.name");
std::string group = propertyTree.get<std::string>("<xmlattr>.group");
float xCenter = propertyTree.get<float>("<xmlattr>.xCenter");
float yCenter = propertyTree.get<float>("<xmlattr>.yCenter");
float width = propertyTree.get<float>("<xmlattr>.width");
float height = propertyTree.get<float>("<xmlattr>.height");
int order = propertyTree.get<int>("<xmlattr>.order", 0);
vec2 posFrom(xCenter - width*0.5f, yCenter - height*0.5f);
vec2 posTo(xCenter + width*0.5f, yCenter + height*0.5f);
std::vector<boost::function<void(TRadioButton*)> > fillerFuncArr;
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, propertyTree)
{
if (v.first == "Filler")
{
boost::property_tree::ptree& fillerTree = v.second;
if (fillerTree.get<std::string>("<xmlattr>.type") == "TextureFiller")
{
std::string texName = fillerTree.get<std::string>("<xmlattr>.texName");
std::string checkedTexName = fillerTree.get<std::string>("<xmlattr>.checkedTexName");
fillerFuncArr.push_back(boost::bind(TRadioButton::TextureFiller, posFrom, posTo, texName, checkedTexName, _1));
}
else if (fillerTree.get<std::string>("<xmlattr>.type") == "TextFiller")
{
TTextParams textParams;
boost::property_tree::ptree& textParamsTree = fillerTree.find("TextParams")->second;
textParams.Serialize(textParamsTree);
float textXCenter = fillerTree.get<float>("<xmlattr>.xCenter");
float textYCenter = fillerTree.get<float>("<xmlattr>.yCenter");
float textWidth = fillerTree.get<float>("<xmlattr>.width");
float textHeight = fillerTree.get<float>("<xmlattr>.height");
vec2 textPosFrom(textXCenter - textWidth*0.5f, textYCenter - textHeight*0.5f);
vec2 textPosTo(textXCenter + textWidth*0.5f, textYCenter + textHeight*0.5f);
fillerFuncArr.push_back(boost::bind(TRadioButton::TextFiller, textPosFrom, textPosTo, textParams, _1));
}
else if (fillerTree.get<std::string>("<xmlattr>.type") == "SmartValueFiller")
{
std::string dictionaryName = fillerTree.get<std::string>("<xmlattr>.dictionaryName");
std::string smartValueName = fillerTree.get<std::string>("<xmlattr>.smartValueName");
std::string smartValueType = fillerTree.get<std::string>("type");
if (smartValueType == "int")
{
int value = fillerTree.get<int>("value");
fillerFuncArr.push_back(boost::bind(TRadioButton::SmartValueFiller<int>, dictionaryName, smartValueName, value, _1));
}
else if (smartValueType == "float")
{
float value = fillerTree.get<float>("value");
fillerFuncArr.push_back(boost::bind(TRadioButton::SmartValueFiller<float>, dictionaryName, smartValueName, value, _1));
}
else if (smartValueType == "bool")
{
bool value = fillerTree.get<bool>("value");
fillerFuncArr.push_back(boost::bind(TRadioButton::SmartValueFiller<bool>, dictionaryName, smartValueName, value, _1));
}
else if (smartValueType == "string")
{
std::string value = fillerTree.get<std::string>("value");
fillerFuncArr.push_back(boost::bind(TRadioButton::SmartValueFiller<std::string>, dictionaryName, smartValueName, value, _1));
}
else
{
throw ErrorToLog("Unknown type: "+smartValueType);
}
}
}
}
ResourceManager->GUIManager.AddWidget(
std::shared_ptr<TInstancingWidgetAncestor>(
TRadioButton::CreateRadioButtonWithFillers(posFrom, posTo, fillerFuncArr)
),
name,
group,
order);
}
/*
void TWidgetParser::Serialize(boost::property_tree::ptree& propertyTree)
{
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, propertyTree.begin()->second)
{
std::string widgetType = v.second.get<std::string>("<xmlattr>.type");
if (widgetType == "Button")
{
TButtonWidgetParser().Serialize(v.second);
}
if (widgetType == "Static")
{
TStaticWidgetParser().Serialize(v.second);
}
if (widgetType == "Edit")
{
TEditWidgetParser().Serialize(v.second);
}
if (widgetType == "CheckBox")
{
TCheckBoxWidgetParser().Serialize(v.second);
}
}
}
*/
void TWidgetParser::Serialize(boost::property_tree::ptree& propertyTree)
{
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, propertyTree)
{
std::string widgetType = v.second.get<std::string>("<xmlattr>.type");
if (widgetType == "Button")
{
TButtonWidgetParser().Serialize(v.second);
}
if (widgetType == "Static")
{
TStaticWidgetParser().Serialize(v.second);
}
if (widgetType == "DynamicText")
{
TDynamicTextWidgetParser().Serialize(v.second);
}
if (widgetType == "Edit")
{
TEditWidgetParser().Serialize(v.second);
}
if (widgetType == "CheckBox")
{
TCheckBoxWidgetParser().Serialize(v.second);
}
if (widgetType == "RadioButton")
{
TRadioButtonWidgetParser().Serialize(v.second);
}
}
}
void TWidgetListParser::Serialize(boost::property_tree::ptree& propertyTree)
{
TWidgetParser().Serialize(propertyTree.begin()->second);
}
} //namespace SE