diff options
author | Łukasz Paczos <lukas.paczos@gmail.com> | 2018-11-13 18:29:25 +0100 |
---|---|---|
committer | Łukasz Paczos <lukasz.paczos@mapbox.com> | 2018-12-04 17:22:38 +0100 |
commit | 794b851f02b98c5f1652edc141b1a6feb459d59b (patch) | |
tree | 66fda491ea0a100d3a45092ce2840d590fc7fefa /src | |
parent | 1e7c7e048991a33167d5fb40f6c9ea2a44885104 (diff) | |
download | qtlocation-mapboxgl-794b851f02b98c5f1652edc141b1a6feb459d59b.tar.gz |
[android] expose Formatted text-field setter
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/style/expression/formatted.cpp | 60 |
1 files changed, 57 insertions, 3 deletions
diff --git a/src/mbgl/style/expression/formatted.cpp b/src/mbgl/style/expression/formatted.cpp index 6eb106dfec..8232d0c698 100644 --- a/src/mbgl/style/expression/formatted.cpp +++ b/src/mbgl/style/expression/formatted.cpp @@ -44,13 +44,67 @@ namespace conversion { using namespace mbgl::style::expression; -optional<Formatted> Converter<Formatted>::operator()(const Convertible& value, Error&) const { +optional<Formatted> Converter<Formatted>::operator()(const Convertible& value, Error& error) const { using namespace mbgl::style::expression; - auto result = toString(value); - if (result) { + if (isArray(value)) { + std::vector<FormattedSection> sections; + for (std::size_t i = 0; i < arrayLength(value); ++i) { + Convertible section = arrayMember(value, i); + std::size_t sectionLength = arrayLength(section); + if (sectionLength < 1) { + error.message = "Section has to contain a text and optional parameters."; + return nullopt; + } + + optional<std::string> sectionText = toString(arrayMember(section, 0)); + if (!sectionText) { + error.message = "Section has to contain a text."; + return nullopt; + } + + optional<double> fontScale; + optional<FontStack> textFont; + if (sectionLength > 1) { + Convertible sectionParams = arrayMember(section, 1); + if (!isObject(sectionParams)) { + error.message = "Parameters have to be enclosed in an object."; + return nullopt; + } + + optional<Convertible> fontScaleMember = objectMember(sectionParams, "font-scale"); + if (fontScaleMember) { + fontScale = toDouble(*fontScaleMember); + } + + optional<Convertible> textFontMember = objectMember(sectionParams, "text-font"); + if (textFontMember) { + if (isArray(*textFontMember)) { + std::vector<std::string> fontsVector; + for (std::size_t j = 0; j < arrayLength(*textFontMember); ++j) { + auto font = toString(arrayMember(*textFontMember, j)); + if (font) { + fontsVector.push_back(*font); + } else { + error.message = "Font has to be a string."; + return nullopt; + } + } + textFont = fontsVector; + } else { + error.message = "Font stack has to be an array."; + return nullopt; + } + } + } + + sections.push_back(FormattedSection(*sectionText, fontScale, textFont)); + } + return Formatted(sections); + } else if (optional<std::string> result = toString(value)) { return Formatted(result->c_str()); } else { + error.message = "Formatted must be plain string or array type."; return nullopt; } } |