diff --git a/CMakeLists.txt b/CMakeLists.txt index e76e73c..b09a999 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -149,6 +149,8 @@ PRIVATE ui/text/text_isolated_emoji.h ui/text/text_utilities.cpp ui/text/text_utilities.h + ui/text/text_variant.cpp + ui/text/text_variant.h ui/toast/toast.cpp ui/toast/toast.h ui/toast/toast_manager.cpp diff --git a/ui/text/text_variant.cpp b/ui/text/text_variant.cpp new file mode 100644 index 0000000..b795d94 --- /dev/null +++ b/ui/text/text_variant.cpp @@ -0,0 +1,48 @@ +// This file is part of Desktop App Toolkit, +// a set of libraries for developing nice desktop applications. +// +// For license and copyright information please follow this link: +// https://github.com/desktop-app/legal/blob/master/LEGAL +// +#include "ui/text/text_variant.h" + +namespace v::text { + +rpl::producer take_plain( + data &&d, + rpl::producer &&fallback) { + if (const auto empty = std::get_if<0>(&d)) { + return std::move(fallback); + } else if (const auto plainPtr = std::get_if<1>(&d)) { + return rpl::single(base::take(*plainPtr)); + } else if (const auto rplPlainPtr = std::get_if<2>(&d)) { + return base::take(*rplPlainPtr); + } else if (const auto markedPtr = std::get_if<3>(&d)) { + return rpl::single(base::take(*markedPtr).text); + } else if (const auto rplMarkedPtr = std::get_if<4>(&d)) { + return base::take(*rplMarkedPtr) | rpl::map([](const auto &marked) { + return marked.text; + }); + } + Unexpected("Bad variant in take_plain."); +} + +rpl::producer take_marked( + data &&d, + rpl::producer &&fallback) { + if (const auto empty = std::get_if<0>(&d)) { + return std::move(fallback); + } else if (const auto plainPtr = std::get_if<1>(&d)) { + return rpl::single(TextWithEntities{ base::take(*plainPtr) }); + } else if (const auto rplPlainPtr = std::get_if<2>(&d)) { + return base::take(*rplPlainPtr) | rpl::map(TextWithEntities::Simple); + } else if (const auto markedPtr = std::get_if<3>(&d)) { + return rpl::single(base::take(*markedPtr)); + } else if (const auto rplMarkedPtr = std::get_if<4>(&d)) { + return base::take(*rplMarkedPtr); + } + Unexpected("Bad variant in take_marked."); +} + +} // namespace v::text + diff --git a/ui/text/text_variant.h b/ui/text/text_variant.h new file mode 100644 index 0000000..e0ed379 --- /dev/null +++ b/ui/text/text_variant.h @@ -0,0 +1,28 @@ +// This file is part of Desktop App Toolkit, +// a set of libraries for developing nice desktop applications. +// +// For license and copyright information please follow this link: +// https://github.com/desktop-app/legal/blob/master/LEGAL +// +#pragma once + +#include "ui/text/text_entity.h" + +namespace v::text { + +using data = std::variant< + v::null_t, + QString, + rpl::producer, + TextWithEntities, + rpl::producer>; + +[[nodiscard]] rpl::producer take_plain( + data &&d, + rpl::producer &&fallback = rpl::never()); +[[nodiscard]] rpl::producer take_marked( + data &&d, + rpl::producer &&fallback + = rpl::never()); + +} // namespace v::text