Skip to content

Commit

Permalink
WIP commit, towards full access for set statements to window variables
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Nov 28, 2017
1 parent ff50087 commit a500eaa
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 15 deletions.
3 changes: 3 additions & 0 deletions include/igui.h
Expand Up @@ -239,6 +239,9 @@ class IGuiWindowDef

// Prepares renderable objects, to be called by the parent Gui only
virtual void pepareRendering(bool prepareChildren = true) = 0;

// Returns a reference to the named variable, or throws a std::invalid_argument exception
virtual IWindowVariable& findVariableByName(const std::string& name) = 0;
};

/**
Expand Down
26 changes: 17 additions & 9 deletions plugins/dm.gui/gui/GuiScript.cpp
Expand Up @@ -349,12 +349,6 @@ VariablePtr GuiScript::getVariableFromExpression(const std::shared_ptr<IGuiExpre
{
std::string expr = expression->evaluate();

if (string::starts_with(expr, "gui::"))
{
// Is a GUI state variable
return std::make_shared<GuiStateVariable>(_owner.getGui(), expr.substr(5));
}

// Not a gui:: variable, check if a namespace has been specified
std::size_t ddPos = expr.find("::");

Expand All @@ -363,13 +357,19 @@ VariablePtr GuiScript::getVariableFromExpression(const std::shared_ptr<IGuiExpre
// Retrieve the windowDef name
std::string windowDefName = expr.substr(0, ddPos);

if (windowDefName == "gui")
{
// Is a GUI state variable
return std::make_shared<GuiStateVariable>(_owner.getGui(), expr.substr(ddPos + 2));
}

// Look up the windowDef
IGuiWindowDefPtr windowDef = _owner.getGui().findWindowDef(windowDefName);

if (windowDef != NULL)
if (windowDef)
{
// Cut off the "<windowDef>::" from the name
return std::make_shared<WindowDefVariable>(*windowDef, expr.substr(ddPos+2));
return std::make_shared<AssignableWindowVariable>(*windowDef, expr.substr(ddPos+2));
}
else
{
Expand All @@ -380,7 +380,7 @@ VariablePtr GuiScript::getVariableFromExpression(const std::shared_ptr<IGuiExpre
else
{
// Use the owner windowDef if no namespace was defined
return std::make_shared<WindowDefVariable>(_owner, expr);
return std::make_shared<AssignableWindowVariable>(_owner, expr);
}
}

Expand Down Expand Up @@ -419,6 +419,14 @@ void GuiScript::execute()
// Try to find the target variable
VariablePtr var = getVariableFromExpression(st.args[0]);

if (!var)
{
rWarning() << "Cannot assign to variable " << st.args[0] << std::endl;
continue;
}

// TODO

std::string value = getValueFromExpression(st.args[1]);

if (var == NULL || !var->assignValueFromString(value))
Expand Down
41 changes: 41 additions & 0 deletions plugins/dm.gui/gui/GuiWindowDef.cpp
Expand Up @@ -64,6 +64,9 @@ GuiWindowDef::GuiWindowDef(IGui& owner) :

_textChanged = true;
text.signal_variableChanged().connect([this]() { _textChanged = true; });

// Clear the shader if the background variable changes
background.signal_variableChanged().connect([this]() { backgroundShader.reset(); });
}

IGui& GuiWindowDef::getGui() const
Expand Down Expand Up @@ -529,4 +532,42 @@ void GuiWindowDef::pepareRendering(bool prepareChildren)
}
}

IWindowVariable& GuiWindowDef::findVariableByName(const std::string& name)
{
if (name == "text") return text;
if (name == "rect") return rect;
if (name == "visible") return visible;
if (name == "text") return text;
if (name == "menugui") return menugui;
if (name == "forecolor") return forecolor;
if (name == "hovercolor") return hovercolor;
if (name == "backcolor") return backcolor;
if (name == "bordercolor") return bordercolor;
if (name == "bordersize") return bordersize;
if (name == "matcolor") return matcolor;
if (name == "rotate") return rotate;
if (name == "background") return background;
if (name == "font") return font;
if (name == "textscale") return textscale;
if (name == "textalign") return textalign;
if (name == "textalignx") return textalignx;
if (name == "textaligny") return textaligny;
if (name == "forceaspectwidth") return forceaspectwidth;
if (name == "forceaspectheight") return forceaspectheight;
if (name == "noevents") return noevents;
if (name == "noclip") return noclip;
if (name == "notime") return notime;
if (name == "nocursor") return nocursor;
if (name == "nowrap") return nowrap;

// Check the user-defined variables
NamedVariables::const_iterator i = variables.find(name);
if (i != variables.end())
{
return *(i->second);
}

throw std::invalid_argument("Cannot find variable with name " + name);
}

} // namespace
2 changes: 2 additions & 0 deletions plugins/dm.gui/gui/GuiWindowDef.h
Expand Up @@ -73,6 +73,8 @@ class GuiWindowDef :
// Prepares renderable objects, to be called by the parent Gui only
void pepareRendering(bool prepareChildren = true) override;

IWindowVariable& findVariableByName(const std::string& name) override;

public:
std::shared_ptr<IGuiExpression<Vector4>> parseVector4(parser::DefTokeniser& tokeniser);
std::shared_ptr<IGuiExpression<float>> parseFloat(parser::DefTokeniser& tokeniser);
Expand Down
28 changes: 26 additions & 2 deletions plugins/dm.gui/gui/Variable.cpp
Expand Up @@ -7,17 +7,41 @@
namespace gui
{

WindowDefVariable::WindowDefVariable(IGuiWindowDef& windowDef,
AssignableWindowVariable::AssignableWindowVariable(IGuiWindowDef& windowDef,
const std::string& name) :
_windowDef(windowDef),
_name(string::to_lower_copy(name))
{}

// Assign a value to this Variable (returns TRUE on success)
bool WindowDefVariable::assignValueFromString(const std::string& val)
bool AssignableWindowVariable::assignValueFromString(const std::string& val)
{
if (_name.empty()) return false;

// Lookup the target window variable by name
try
{
IWindowVariable& variable = _windowDef.findVariableByName(_name);

try
{
WindowVariable<Vector4>& vec4var = dynamic_cast<WindowVariable<Vector4>&>(variable);
}
catch (std::bad_cast&)
{
// Must be an ordinary value
}
// TODO: Switch on value type

return true;
}
catch (std::invalid_argument&)
{
rError() << "[GUI Script]: Cannot assign value to unknown variable: " <<
_windowDef.name << "::" << _name << std::endl;
return false;
}

if (_name == "text")
{
_windowDef.text.setValue(ConstantExpression<std::string>::Create(val));
Expand Down
8 changes: 4 additions & 4 deletions plugins/dm.gui/gui/Variable.h
Expand Up @@ -22,7 +22,7 @@ class Variable
typedef std::shared_ptr<Variable> VariablePtr;

// A variable pointing to a specific item of a windowDef
class WindowDefVariable :
class AssignableWindowVariable :
public Variable
{
private:
Expand All @@ -33,10 +33,10 @@ class WindowDefVariable :
std::string _name;

public:
WindowDefVariable(IGuiWindowDef& windowDef, const std::string& name);
AssignableWindowVariable(IGuiWindowDef& windowDef, const std::string& name);

// Assign a value to this Variable (returns TRUE on success)
bool assignValueFromString(const std::string& val);
bool assignValueFromString(const std::string& val) override;
};

// A variable pointing to a GUI state variable
Expand All @@ -53,7 +53,7 @@ class GuiStateVariable :
public:
GuiStateVariable(IGui& gui, const std::string& key);

bool assignValueFromString(const std::string& val);
bool assignValueFromString(const std::string& val) override;
};

} // namespace

0 comments on commit a500eaa

Please sign in to comment.