20#include <initializer_list>
29namespace osc {
class AppMetadata; }
30namespace osc {
class AppSettings; }
31namespace osc {
class Cursor; }
32namespace osc {
class Event; }
33namespace osc {
class FileDialogResponse; }
34namespace osc {
class Widget; }
48 template<std::destructible
T,
typename... Args>
49 requires std::constructible_from<
T, Args&&...>
52 const auto singleton_constructor = [args_tuple = std::make_tuple(std::forward<Args>(args)...)]()
mutable -> std::shared_ptr<void>
54 return std::apply([](
auto&&... inner_args) -> std::shared_ptr<void>
56 return std::make_shared<T>(std::forward<Args>(inner_args)...);
57 }, std::move(args_tuple));
60 return std::static_pointer_cast<T>(
App::upd().upd_singleton(
typeid(
T), singleton_constructor));
93 template<std::derived_from<W
idget> TW
idget,
typename... Args>
94 requires std::constructible_from<TWidget, Args&&...>
99 return main_internal(
metadata, [args_tuple = std::make_tuple(std::forward<Args>(args)...)]()
mutable -> std::unique_ptr<Widget>
101 return std::apply([](
auto&&... inner_args) -> std::unique_ptr<Widget>
103 return std::make_unique<TWidget>(std::forward<Args>(inner_args)...);
104 }, std::move(args_tuple));
140 template<std::derived_from<
Widget> TWidget, typename... Args>
141 requires std::constructible_from<TWidget, Args&&...>
144 setup_main_loop(std::make_unique<TWidget>(std::forward<Args>(args)...));
156 template<std::derived_from<Event> TEvent,
typename... Args>
157 requires std::constructible_from<TEvent, Args&&...>
160 return post_event(receiver, std::make_unique<TEvent>(std::forward<Args>(args)...));
170 template<std::derived_from<Event> TEvent,
typename... Args>
171 requires std::constructible_from<TEvent, Args&&...>
174 TEvent
event{std::forward<Args>(args)...};
175 return notify(receiver, event);
195 void show(std::unique_ptr<Widget>);
198 template<std::derived_from<W
idget> TW
idget,
typename... Args>
199 requires std::constructible_from<TWidget, Args&&...>
202 show(std::make_unique<TWidget>(std::forward<Args>(args)...));
221 template<std::derived_from<W
idget> TW
idget,
typename... Args>
222 requires std::constructible_from<TWidget, Args&&...>
269 std::span<const FileDialogFilter> filters = {},
270 std::optional<std::filesystem::path> initial_directory_to_show = std::nullopt,
271 bool allow_many = false
275 std::initializer_list<const FileDialogFilter> filters = {},
276 std::optional<std::filesystem::path> initial_directory_to_show = std::nullopt,
277 bool allow_many =
false)
281 std::span<const FileDialogFilter>{filters},
282 std::move(initial_directory_to_show),
302 std::optional<std::filesystem::path> initial_directory_to_show = std::nullopt,
303 bool allow_many =
false
322 std::span<const FileDialogFilter> filters = {},
323 std::optional<std::filesystem::path> initial_directory_to_show = std::nullopt
327 std::initializer_list<const FileDialogFilter> filters = {},
328 std::optional<std::filesystem::path> initial_directory_to_show = std::nullopt)
333 std::move(initial_directory_to_show)
351 std::function<
void(std::optional<std::filesystem::path>)> callback,
352 std::optional<std::string_view> maybe_extension = std::nullopt,
353 std::optional<std::filesystem::path> initial_directory_to_show = std::nullopt
585 static int main_internal(
const AppMetadata&
metadata,
const std::function<std::unique_ptr<Widget>()>& widget_ctor);
597 std::optional<std::filesystem::path> get_resource_filepath(
const ResourcePath&)
const;
600 std::shared_ptr<void> upd_singleton(
const std::type_info&,
const std::function<std::shared_ptr<void>()>&);
606 std::unique_ptr<AppPrivate> impl_;
Definition anti_aliasing_level.h:11
Definition app_main_loop_status.h:10
Definition app_settings.h:14
const AppMetadata & metadata() const
std::string graphics_backend_vendor_string() const
WindowID main_window_id() const
static bool notify(Widget &receiver, Event &event)
AppClock::time_point startup_time() const
AppMainLoopStatus do_main_loop_step()
std::string application_name_with_version_and_buildid() const
bool vsync_enabled() const
void set_main_loop_waiting(bool)
void prompt_user_to_save_file_async(std::function< void(FileDialogResponse &&)> callback, std::span< const FileDialogFilter > filters={}, std::optional< std::filesystem::path > initial_directory_to_show=std::nullopt)
void set_main_window_mouse_confinement(std::nullopt_t)
std::string graphics_backend_renderer_string() const
static const App * try_get()
void show(std::unique_ptr< Widget >)
std::string human_readable_name() const
void prompt_user_to_select_directory_async(std::function< void(FileDialogResponse &&)> callback, std::optional< std::filesystem::path > initial_directory_to_show=std::nullopt, bool allow_many=false)
static ResourceLoader & resource_loader()
static void post_event(Widget &receiver, Args &&... args)
Definition app.h:158
bool main_window_showing() const
std::future< Screenshot > main_window_request_screenshot()
void stop_text_input(WindowID)
void main_window_clear(const Color &=Color::clear())
bool is_main_loop_waiting() const
static AppSettings & upd_settings()
void prompt_user_to_select_file_async(std::function< void(FileDialogResponse &&)> callback, std::initializer_list< const FileDialogFilter > filters={}, std::optional< std::filesystem::path > initial_directory_to_show=std::nullopt, bool allow_many=false)
Definition app.h:273
void set_main_window_mouse_confinement(std::optional< Rect > confinement_rect)
float highest_device_pixel_ratio() const
void make_main_loop_waiting()
void set_main_window_mouse_confinement(std::optional< Vector2 > confinement_point)
std::string graphics_backend_version_string() const
void pop_cursor_override()
bool has_input_focus(WindowID) const
static std::shared_ptr< T > singleton(Args &&... args)
Definition app.h:50
Vector2i main_window_pixel_dimensions() const
static bool notify(Widget &receiver, Args &&... args)
Definition app.h:172
void request_transition(Args &&... args)
Definition app.h:223
Vector2 main_window_dimensions() const
bool main_window_grabbing() const
void set_main_window_grabbing(bool)
AntiAliasingLevel max_anti_aliasing_level() const
float main_window_device_pixel_ratio() const
void start_text_input(WindowID)
void set_debug_mode(bool)
std::optional< Rect > main_window_mouse_confinement() const
void make_main_window_windowed()
static void post_event(Widget &receiver, std::unique_ptr< Event > event)
AntiAliasingLevel anti_aliasing_level() const
App(App &&) noexcept=delete
void make_main_window_fullscreen()
void set_main_window_dimensions(Vector2)
void show(Args &&... args)
Definition app.h:200
static ResourceStream open_resource(const ResourcePath &)
void set_main_window_unicode_input_rect(const Rect &screen_rect)
void push_cursor_override(const Cursor &)
void set_main_window_relative_mouse_mode(bool)
void set_vsync_enabled(bool)
void main_window_add_frame_annotation(std::string_view label, const Rect &screen_rect)
void set_prompt_initial_directory_to_show_fallback(std::optional< std::filesystem::path >)
const std::filesystem::path & user_data_directory() const
AppClock::duration frame_delta_since_startup() const
void prompt_user_to_save_file_async(std::function< void(FileDialogResponse &&)> callback, std::initializer_list< const FileDialogFilter > filters={}, std::optional< std::filesystem::path > initial_directory_to_show=std::nullopt)
Definition app.h:325
static std::optional< std::filesystem::path > resource_filepath(const ResourcePath &)
void request_invoke_on_main_thread(std::function< void()>)
void set_main_window_subtitle(std::optional< std::string_view >)
std::optional< std::filesystem::path > prompt_initial_directory_to_show_fallback()
void prompt_user_to_save_file_with_extension_async(std::function< void(std::optional< std::filesystem::path >)> callback, std::optional< std::string_view > maybe_extension=std::nullopt, std::optional< std::filesystem::path > initial_directory_to_show=std::nullopt)
AppClock::time_point frame_start_time() const
void prompt_user_to_select_file_async(std::function< void(FileDialogResponse &&)> callback, std::span< const FileDialogFilter > filters={}, std::optional< std::filesystem::path > initial_directory_to_show=std::nullopt, bool allow_many=false)
void teardown_main_loop()
void setup_main_loop(std::unique_ptr< Widget >)
void request_transition(std::unique_ptr< Widget >)
std::optional< std::filesystem::path > executable_directory() const
void set_anti_aliasing_level(AntiAliasingLevel)
static int main(const AppMetadata &metadata, Args &&... args)
Definition app.h:95
void make_main_loop_polling()
void set_main_window_showing(bool)
AppClock::duration frame_delta_since_last_frame() const
size_t num_frames_drawn() const
WindowID get_keyboard_focus() const
std::optional< Vector2 > main_window_mouse_position() const
bool is_main_window_minimized() const
bool main_window_relative_mouse_mode() const
static const AppSettings & settings()
std::string graphics_backend_shading_language_version_string() const
static std::string slurp(const ResourcePath &)
Definition file_dialog_response.h:18
Definition resource_loader.h:24
Definition resource_path.h:12
Definition resource_stream.h:11
Definition custom_decoration_generator.h:5
std::chrono::time_point< AppClock > time_point
Definition app_clock.h:13
std::chrono::duration< rep, period > duration
Definition app_clock.h:12
static constexpr Rgba clear()
Definition rgba.h:29