InputCommon: fix serialization of control expression with line breaks

The control expression editor allows line breaks, but the serialization was
losing anything after the first line break (/r /n).
Instead of opting to encode them and decode them on serialization
(which I tried but was not safe, as it would lose /n written in the string by users),
I opted to replace them with a space.
This commit is contained in:
Filoppi 2021-05-11 16:30:29 +03:00
parent eb5cd9be78
commit 574477866f
4 changed files with 25 additions and 4 deletions

View File

@ -219,7 +219,7 @@ std::string ArrayToString(const u8* data, u32 size, int line_len, bool spaces)
return oss.str(); return oss.str();
} }
// Turns " hello " into "hello". Also handles tabs. // Turns "\n\r\t hello " into "hello" (trims at the start and end but not inside).
std::string_view StripSpaces(std::string_view str) std::string_view StripSpaces(std::string_view str)
{ {
const size_t s = str.find_first_not_of(" \t\r\n"); const size_t s = str.find_first_not_of(" \t\r\n");
@ -241,6 +241,13 @@ std::string_view StripQuotes(std::string_view s)
return s; return s;
} }
// Turns "\n\rhello" into " hello".
void ReplaceBreaksWithSpaces(std::string& str)
{
std::replace(str.begin(), str.end(), '\r', ' ');
std::replace(str.begin(), str.end(), '\n', ' ');
}
bool TryParse(const std::string& str, bool* const output) bool TryParse(const std::string& str, bool* const output)
{ {
float value; float value;

View File

@ -52,6 +52,8 @@ std::string_view StripQuotes(std::string_view s);
std::string ReplaceAll(std::string result, std::string_view src, std::string_view dest); std::string ReplaceAll(std::string result, std::string_view src, std::string_view dest);
void ReplaceBreaksWithSpaces(std::string& str);
bool TryParse(const std::string& str, bool* output); bool TryParse(const std::string& str, bool* output);
template <typename T, std::enable_if_t<std::is_integral_v<T> || std::is_enum_v<T>>* = nullptr> template <typename T, std::enable_if_t<std::is_integral_v<T> || std::is_enum_v<T>>* = nullptr>

View File

@ -117,7 +117,10 @@ void ControlGroup::SaveConfig(IniFile::Section* sec, const std::string& defdev,
for (auto& c : controls) for (auto& c : controls)
{ {
// control expression // control expression
sec->Set(group + c->name, c->control_ref->GetExpression(), ""); std::string expression = c->control_ref->GetExpression();
// We can't save line breaks in a single line config. Restoring them is too complicated.
ReplaceBreaksWithSpaces(expression);
sec->Set(group + c->name, expression, "");
// range // range
sec->Set(group + c->name + "/Range", c->control_ref->range * 100.0, 100.0); sec->Set(group + c->name + "/Range", c->control_ref->range * 100.0, 100.0);
@ -135,7 +138,9 @@ void ControlGroup::SaveConfig(IniFile::Section* sec, const std::string& defdev,
} }
else else
{ {
sec->Set(base + name, ext->GetSelectionSetting().GetInputReference().GetExpression(), "None"); std::string expression = ext->GetSelectionSetting().GetInputReference().GetExpression();
ReplaceBreaksWithSpaces(expression);
sec->Set(base + name, expression, "None");
} }
for (auto& ai : ext->GetAttachmentList()) for (auto& ai : ext->GetAttachmentList())

View File

@ -113,9 +113,16 @@ public:
void SaveToIni(IniFile::Section& section, const std::string& group_name) const override void SaveToIni(IniFile::Section& section, const std::string& group_name) const override
{ {
if (IsSimpleValue()) if (IsSimpleValue())
{
section.Set(group_name + m_details.ini_name, GetValue(), m_default_value); section.Set(group_name + m_details.ini_name, GetValue(), m_default_value);
}
else else
section.Set(group_name + m_details.ini_name, m_value.m_input.GetExpression(), ""); {
// We can't save line breaks in a single line config. Restoring them is too complicated.
std::string expression = m_value.m_input.GetExpression();
ReplaceBreaksWithSpaces(expression);
section.Set(group_name + m_details.ini_name, expression, "");
}
} }
bool IsSimpleValue() const override { return m_value.IsSimpleValue(); } bool IsSimpleValue() const override { return m_value.IsSimpleValue(); }