Files
luma/include/luma/overlays.hpp
T
khodowany 522254dfc1
publish / publish (push) Successful in 14m40s
Cleanup
2026-09-24 19:43:50 -05:00

69 lines
2.3 KiB
C++

#pragma once
#include <chrono>
#include <cstdint>
#include <deque>
#include <expected>
#include <functional>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include <modulus.hpp>
#include <luma/control.hpp>
namespace luma {
enum class dialog_result {
NONE,
ACCEPTED,
CANCELED,
};
struct dialog_options {
std::string title{};
std::unique_ptr<luma::control> body{};
std::string accept_text{"OK"};
std::string cancel_text{"Cancel"};
std::function<void(luma::dialog_result)> 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<void, modulus::error>;
auto close_dialog(luma::dialog_result result) -> std::expected<void, modulus::error>;
auto show_toast(luma::toast toast) -> std::expected<void, modulus::error>;
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<void()> invalidator) -> void override;
private:
friend auto overlays(std::unique_ptr<luma::control> content) -> std::expected<std::unique_ptr<luma::overlay_host>, modulus::error>;
explicit overlay_host(std::unique_ptr<luma::control> content);
auto begin_traversal() const -> void;
auto end_traversal() const -> void;
auto retire_dialog_body(std::unique_ptr<luma::control> body) -> void;
auto flush_retired_dialog_bodies() const -> void;
std::unique_ptr<luma::control> content_{};
std::optional<luma::dialog_options> dialog_{};
std::deque<luma::toast> toasts_{};
std::chrono::steady_clock::duration toast_elapsed_{};
mutable std::vector<std::unique_ptr<luma::control>> retired_dialog_bodies_{};
mutable std::uint32_t traversal_depth_{};
};
auto overlays(std::unique_ptr<luma::control> content) -> std::expected<std::unique_ptr<luma::overlay_host>, modulus::error>;
}