#pragma once #include #include #include #include #include #include #include #include #include #include #include namespace luma { enum class dialog_result { NONE, ACCEPTED, CANCELED, }; struct dialog_options { std::string title{}; std::unique_ptr body{}; std::string accept_text{"OK"}; std::string cancel_text{"Cancel"}; std::function on_close{}; }; struct toast { std::string message{}; std::chrono::milliseconds duration{2500}; }; class overlay_host final : public luma::control { public: auto show_dialog(luma::dialog_options options) -> std::expected; auto close_dialog(luma::dialog_result result) -> std::expected; auto show_toast(luma::toast toast) -> std::expected; auto tick(std::chrono::steady_clock::duration delta) -> std::bool_t; auto measure(luma::draw_context &context, luma::theme const &theme, luma::constraints limits) -> luma::size override; auto arrange(luma::rect bounds) -> void override; auto draw(luma::draw_context &context, luma::theme const &theme) const -> void override; auto handle_touch(luma::touch_event const &event) -> std::bool_t override; auto invalidate_layout() -> void override; auto bind_layout_invalidator(std::function invalidator) -> void override; private: friend auto overlays(std::unique_ptr content) -> std::expected, modulus::error>; explicit overlay_host(std::unique_ptr content); auto begin_traversal() const -> void; auto end_traversal() const -> void; auto retire_dialog_body(std::unique_ptr body) -> void; auto flush_retired_dialog_bodies() const -> void; std::unique_ptr content_{}; std::optional dialog_{}; std::deque toasts_{}; std::chrono::steady_clock::duration toast_elapsed_{}; mutable std::vector> retired_dialog_bodies_{}; mutable std::uint32_t traversal_depth_{}; }; auto overlays(std::unique_ptr content) -> std::expected, modulus::error>; }