#pragma once #include "../UiApplication.h" #include "Base.h" #include #include #include #include #include #include namespace cru::platform::gui::sdl { class SdlWindow; class SdlUiApplication : public SdlResource, public virtual IUiApplication { friend SdlWindow; public: explicit SdlUiApplication(graphics::IGraphicsFactory* graphics_factory, bool release_graphics_factory); ~SdlUiApplication(); public: int Run() override; void RequestQuit(int quit_code) override; void AddOnQuitHandler(std::function handler) override; bool IsQuitOnAllWindowClosed() override; void SetQuitOnAllWindowClosed(bool quit_on_all_window_closed) override; long long SetImmediate(std::function action) override; long long SetTimeout(std::chrono::milliseconds milliseconds, std::function action) override; long long SetInterval(std::chrono::milliseconds milliseconds, std::function action) override; void CancelTimer(long long id) override; std::vector GetAllWindow() override; INativeWindow* CreateWindow() override; cru::platform::graphics::IGraphicsFactory* GetGraphicsFactory() override; ICursorManager* GetCursorManager() override; IClipboard* GetClipboard() override; // If return nullptr, it means the menu is not supported. IMenu* GetApplicationMenu() override; private: void RegisterWindow(SdlWindow* window); void UnregisterWindow(SdlWindow* window); void RunOnMainThread(std::function action); void PostEmptyEvent(); long long SetTimer(std::chrono::milliseconds milliseconds, std::function action, bool repeat); private: graphics::IGraphicsFactory* graphics_factory_; bool release_graphics_factory_; std::uint32_t empty_event_type_; TimerRegistry> timers_; std::atomic_int quit_code_; std::vector> quit_handlers_; bool is_quit_on_all_window_closed_; std::vector windows_; }; } // namespace cru::platform::gui::sdl