82 lines
3.6 KiB
C++
82 lines
3.6 KiB
C++
#pragma once
|
|
|
|
#include <chrono>
|
|
#include <cstdint>
|
|
#include <expected>
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <mutex>
|
|
#include <string>
|
|
#include <type_traits>
|
|
#include <utility>
|
|
|
|
#include <modulus.hpp>
|
|
|
|
#include <luma/animation.hpp>
|
|
#include <luma/config.hpp>
|
|
#include <luma/control.hpp>
|
|
#include <luma/geometry.hpp>
|
|
#include <luma/overlays.hpp>
|
|
#include <luma/render.hpp>
|
|
#include <luma/window.hpp>
|
|
|
|
namespace luma {
|
|
|
|
namespace detail {
|
|
struct application_core;
|
|
}
|
|
|
|
struct frame_stats {
|
|
std::uint64_t frame{};
|
|
std::chrono::steady_clock::duration delta{};
|
|
};
|
|
|
|
class application {
|
|
public:
|
|
explicit application(luma::application_config config = {});
|
|
application(luma::application const&) = delete;
|
|
application(luma::application&&) noexcept;
|
|
~application();
|
|
auto operator=(luma::application const&) -> luma::application& = delete;
|
|
auto operator=(luma::application&&) noexcept -> luma::application&;
|
|
auto dispatch(std::function<std::expected<void, modulus::error>()> task) -> std::expected<void, modulus::error>;
|
|
auto register_route(std::string name, std::function<std::expected<std::unique_ptr<luma::control>, modulus::error>()> factory) -> std::expected<void, modulus::error>;
|
|
auto replace_route(std::string name) -> std::expected<void, modulus::error>;
|
|
auto push_route(std::string name) -> std::expected<void, modulus::error>;
|
|
auto pop_route() -> std::expected<void, modulus::error>;
|
|
auto current_route() const -> std::expected<std::string, modulus::error>;
|
|
auto add_animation(luma::animation animation) -> std::expected<void, modulus::error>;
|
|
auto clear_animations() -> std::expected<void, modulus::error>;
|
|
auto animations_empty() const -> std::expected<std::bool_t, modulus::error>;
|
|
auto open_window(luma::window_options options, std::unique_ptr<luma::control> content) -> std::expected<std::uint64_t, modulus::error>;
|
|
auto close_window(std::uint64_t id) -> std::expected<void, modulus::error>;
|
|
auto bring_window_to_front(std::uint64_t id) -> std::expected<void, modulus::error>;
|
|
auto set_window_bounds(std::uint64_t id, luma::rect bounds) -> std::expected<void, modulus::error>;
|
|
auto set_window_visible(std::uint64_t id, std::bool_t visible) -> std::expected<void, modulus::error>;
|
|
auto load_texture(std::string path) -> std::expected<std::shared_ptr<luma::texture>, modulus::error>;
|
|
auto request_layout() -> std::expected<void, modulus::error>;
|
|
auto set_root(std::expected<std::unique_ptr<luma::control>, modulus::error> root) -> std::expected<void, modulus::error>;
|
|
auto set_root(std::unique_ptr<luma::control> root) -> std::expected<void, modulus::error>;
|
|
template <typename CONTROL>
|
|
requires (std::is_base_of_v<luma::control, CONTROL> && !std::is_same_v<luma::control, CONTROL>)
|
|
auto set_root(std::unique_ptr<CONTROL> root) -> std::expected<void, modulus::error>;
|
|
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 request_stop() -> void;
|
|
auto should_stop() const -> std::bool_t;
|
|
auto run() -> std::expected<void, modulus::error>;
|
|
private:
|
|
auto core_snapshot() const -> std::shared_ptr<luma::detail::application_core>;
|
|
mutable std::mutex core_mutex_{};
|
|
std::shared_ptr<luma::detail::application_core> core_{};
|
|
};
|
|
|
|
template <typename CONTROL>
|
|
requires (std::is_base_of_v<luma::control, CONTROL> && !std::is_same_v<luma::control, CONTROL>)
|
|
auto application::set_root(std::unique_ptr<CONTROL> root) -> std::expected<void, modulus::error> {
|
|
return set_root(std::unique_ptr<luma::control>{std::move(root)});
|
|
}
|
|
|
|
}
|