ControlReference: don't reparse expression when references are updated

This commit is contained in:
Michael M
2017-06-07 19:02:16 -07:00
parent c332580b83
commit 31f1c06226
8 changed files with 41 additions and 25 deletions

View File

@ -25,13 +25,12 @@ bool ControlReference::InputGateOn()
// UpdateReference
//
// Updates a controlreference's binded devices/controls
// need to call this to re-parse a control reference's expression after changing it
// need to call this to re-bind a control reference after changing its expression
//
void ControlReference::UpdateReference(const ciface::Core::DeviceContainer& devices,
const ciface::Core::DeviceQualifier& default_device)
{
ControlFinder finder(devices, default_device, IsInput());
std::tie(m_parse_status, m_parsed_expression) = ParseExpression(expression);
if (m_parsed_expression)
m_parsed_expression->UpdateReferences(finder);
}
@ -49,6 +48,17 @@ ParseStatus ControlReference::GetParseStatus() const
return m_parse_status;
}
std::string ControlReference::GetExpression() const
{
return m_expression;
}
void ControlReference::SetExpression(std::string expr)
{
m_expression = std::move(expr);
std::tie(m_parse_status, m_parsed_expression) = ParseExpression(m_expression);
}
ControlReference::ControlReference() : range(1), m_parsed_expression(nullptr)
{
}

View File

@ -34,12 +34,14 @@ public:
ciface::ExpressionParser::ParseStatus GetParseStatus() const;
void UpdateReference(const ciface::Core::DeviceContainer& devices,
const ciface::Core::DeviceQualifier& default_device);
std::string GetExpression() const;
void SetExpression(std::string expr);
ControlState range;
std::string expression;
protected:
ControlReference();
std::string m_expression;
std::unique_ptr<ciface::ExpressionParser::Expression> m_parsed_expression;
ciface::ExpressionParser::ParseStatus m_parse_status;
};

View File

@ -216,7 +216,7 @@ public:
// Keep a shared_ptr to the device so the control pointer doesn't become invalid
std::shared_ptr<Device> m_device;
ControlExpression(ControlQualifier qualifier_) : qualifier(qualifier_) {}
explicit ControlExpression(ControlQualifier qualifier_) : qualifier(qualifier_) {}
ControlState GetValue() const override { return control ? control->ToInput()->GetState() : 0.0; }
void SetValue(ControlState value) override
{

View File

@ -54,8 +54,12 @@ void ControlGroup::LoadConfig(IniFile::Section* sec, const std::string& defdev,
for (auto& c : controls)
{
// control expression
sec->Get(group + c->name, &c->control_ref->expression, "");
{
// control expression
std::string expression;
sec->Get(group + c->name, &expression, "");
c->control_ref->SetExpression(std::move(expression));
}
// range
sec->Get(group + c->name + "/Range", &c->control_ref->range, 100.0);
@ -109,7 +113,7 @@ void ControlGroup::SaveConfig(IniFile::Section* sec, const std::string& defdev,
for (auto& c : controls)
{
// control expression
sec->Set(group + c->name, c->control_ref->expression, "");
sec->Set(group + c->name, c->control_ref->GetExpression(), "");
// range
sec->Set(group + c->name + "/Range", c->control_ref->range * 100.0, 100.0);
@ -128,6 +132,6 @@ void ControlGroup::SaveConfig(IniFile::Section* sec, const std::string& defdev,
void ControlGroup::SetControlExpression(int index, const std::string& expression)
{
controls.at(index)->control_ref->expression = expression;
controls.at(index)->control_ref->SetExpression(expression);
}
} // namespace ControllerEmu