From b167e0689814306d22204398f3cae4d3400f5a02 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sat, 28 May 2022 20:09:17 +0300 Subject: [PATCH] Support user-supplied tag mapper in ui::label --- libs/ui/include/psemek/ui/label.hpp | 3 +++ libs/ui/include/psemek/ui/tagged_text.hpp | 3 +++ libs/ui/source/label.cpp | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/libs/ui/include/psemek/ui/label.hpp b/libs/ui/include/psemek/ui/label.hpp index 0f14a2f6..3b88e042 100644 --- a/libs/ui/include/psemek/ui/label.hpp +++ b/libs/ui/include/psemek/ui/label.hpp @@ -62,6 +62,8 @@ namespace psemek::ui virtual struct image_provider * set_image_provider(struct image_provider * provider); virtual struct image_provider * image_provider() const { return image_provider_; } + virtual void set_tag_mapper(tagged_text::mapper mapper); + using link_callback = std::function; virtual void on_link_click(link_callback callback); @@ -95,6 +97,7 @@ namespace psemek::ui bool skip_spaces_ = false; struct image_provider * image_provider_ = nullptr; + tagged_text::mapper tag_mapper_ = nullptr; link_callback link_callback_; diff --git a/libs/ui/include/psemek/ui/tagged_text.hpp b/libs/ui/include/psemek/ui/tagged_text.hpp index 9b3c7e00..a04e825c 100644 --- a/libs/ui/include/psemek/ui/tagged_text.hpp +++ b/libs/ui/include/psemek/ui/tagged_text.hpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace psemek::ui { @@ -41,6 +42,8 @@ namespace psemek::ui }; static tagged_text parse(std::string_view text); + + using mapper = std::function>(token const &)>; }; } diff --git a/libs/ui/source/label.cpp b/libs/ui/source/label.cpp index 98482675..6b95f4e4 100644 --- a/libs/ui/source/label.cpp +++ b/libs/ui/source/label.cpp @@ -65,6 +65,20 @@ namespace psemek::ui auto parse_result = tagged_text::parse(text_); + if (tag_mapper_) + { + std::vector mapped; + for (auto const & token : parse_result.tokens) + { + auto replace = tag_mapper_(token); + if (replace) + mapped.insert(mapped.end(), replace->begin(), replace->end()); + else + mapped.push_back(token); + } + parse_result.tokens = std::move(mapped); + } + std::unordered_map>> tags_stack; for (auto const & token : parse_result.tokens) @@ -153,6 +167,11 @@ namespace psemek::ui return provider; } + void label::set_tag_mapper(tagged_text::mapper mapper) + { + tag_mapper_ = std::move(mapper); + } + void label::on_link_click(link_callback callback) { link_callback_ = std::move(callback);