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:
parent
eb5cd9be78
commit
574477866f
|
@ -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;
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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(); }
|
||||||
|
|
Loading…
Reference in New Issue