69 lines
2.3 KiB
C++
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>;
|
|
|
|
}
|