diff options
Diffstat (limited to 'include/cru/platform/gui')
-rw-r--r-- | include/cru/platform/gui/sdl/Base.h | 24 | ||||
-rw-r--r-- | include/cru/platform/gui/sdl/UiApplication.h | 69 | ||||
-rw-r--r-- | include/cru/platform/gui/sdl/Window.h | 104 |
3 files changed, 197 insertions, 0 deletions
diff --git a/include/cru/platform/gui/sdl/Base.h b/include/cru/platform/gui/sdl/Base.h new file mode 100644 index 00000000..9dd2eff6 --- /dev/null +++ b/include/cru/platform/gui/sdl/Base.h @@ -0,0 +1,24 @@ + +#pragma once + +#include <cru/base/Exception.h> + +#include "../../Resource.h" + +namespace cru::platform::gui::sdl { +class SdlResource : public Object, public virtual IPlatformResource { + public: + static constexpr const char16_t* kPlatformId = u"SDL"; + + protected: + SdlResource() = default; + + public: + String GetPlatformId() const final { return String(kPlatformId); } +}; + +class SdlException : public PlatformException { + public: + using PlatformException::PlatformException; +}; +} // namespace cru::platform::gui::xcb diff --git a/include/cru/platform/gui/sdl/UiApplication.h b/include/cru/platform/gui/sdl/UiApplication.h new file mode 100644 index 00000000..f47e26bb --- /dev/null +++ b/include/cru/platform/gui/sdl/UiApplication.h @@ -0,0 +1,69 @@ + +#pragma once +#include "../UiApplication.h" +#include "Base.h" + +#include <cru/base/platform/unix/EventLoop.h> +#include <cru/platform/graphics/cairo/CairoGraphicsFactory.h> + +#include <functional> + +namespace cru::platform::gui::sdl { +class SdlWindow; + +class SdlUiApplication : public SdlResource, public virtual IUiApplication { + friend SdlWindow; + + public: + explicit SdlUiApplication( + graphics::cairo::CairoGraphicsFactory* cairo_factory = nullptr); + ~SdlUiApplication(); + + public: + graphics::cairo::CairoGraphicsFactory* GetCairoFactory(); + + public: + int Run() override; + + void RequestQuit(int quit_code) override; + + void AddOnQuitHandler(std::function<void()> handler) override; + + bool IsQuitOnAllWindowClosed() override; + void SetQuitOnAllWindowClosed(bool quit_on_all_window_closed) override; + + long long SetImmediate(std::function<void()> action) override; + long long SetTimeout(std::chrono::milliseconds milliseconds, + std::function<void()> action) override; + long long SetInterval(std::chrono::milliseconds milliseconds, + std::function<void()> action) override; + void CancelTimer(long long id) override; + + std::vector<INativeWindow*> 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); + + private: + graphics::cairo::CairoGraphicsFactory* cairo_factory_; + bool release_cairo_factory_; + + cru::platform::unix::UnixEventLoop event_loop_; + std::vector<std::function<void()>> quit_handlers_; + + bool is_quit_on_all_window_closed_; + std::vector<SdlWindow*> windows_; +}; +} // namespace cru::platform::gui::xcb diff --git a/include/cru/platform/gui/sdl/Window.h b/include/cru/platform/gui/sdl/Window.h new file mode 100644 index 00000000..1bcd42bf --- /dev/null +++ b/include/cru/platform/gui/sdl/Window.h @@ -0,0 +1,104 @@ +#pragma once +#include <cru/base/Base.h> +#include "../../GraphicsBase.h" +#include "../Window.h" +#include "Base.h" + +#include <SDL_video.h> +#include <cstddef> +#include <optional> + +namespace cru::platform::gui::sdl { +class SdlUiApplication; + +class SdlWindow : public SdlResource, public virtual INativeWindow { + CRU_DEFINE_CLASS_LOG_TAG("cru::platform::gui::xcb::SdlWindow") + + friend SdlUiApplication; + + public: + explicit SdlWindow(SdlUiApplication* application); + ~SdlWindow() override; + + bool IsCreated() override; + void Close() override; + + INativeWindow* GetParent() override; + void SetParent(INativeWindow* parent) override; + + WindowStyleFlag GetStyleFlag() override; + void SetStyleFlag(WindowStyleFlag flag) override; + + String GetTitle() override; + void SetTitle(String title) override; + + WindowVisibilityType GetVisibility() override; + void SetVisibility(WindowVisibilityType visibility) override; + + Size GetClientSize() override; + void SetClientSize(const Size& size) override; + + Rect GetClientRect() override; + void SetClientRect(const Rect& rect) override; + + Rect GetWindowRect() override; + void SetWindowRect(const Rect& rect) override; + + bool RequestFocus() override; + + Point GetMousePosition() override; + + bool CaptureMouse() override; + bool ReleaseMouse() override; + + void SetCursor(std::shared_ptr<ICursor> cursor) override; + + void SetToForeground() override; + + void RequestRepaint() override; + + std::unique_ptr<graphics::IPainter> BeginPaint() override; + + IEvent<std::nullptr_t>* CreateEvent() override; + IEvent<std::nullptr_t>* DestroyEvent() override; + IEvent<std::nullptr_t>* PaintEvent() override; + + IEvent<WindowVisibilityType>* VisibilityChangeEvent() override; + IEvent<Size>* ResizeEvent() override; + IEvent<FocusChangeType>* FocusEvent() override; + + IEvent<MouseEnterLeaveType>* MouseEnterLeaveEvent() override; + IEvent<Point>* MouseMoveEvent() override; + IEvent<NativeMouseButtonEventArgs>* MouseDownEvent() override; + IEvent<NativeMouseButtonEventArgs>* MouseUpEvent() override; + IEvent<NativeMouseWheelEventArgs>* MouseWheelEvent() override; + IEvent<NativeKeyEventArgs>* KeyDownEvent() override; + IEvent<NativeKeyEventArgs>* KeyUpEvent() override; + + IInputMethodContext* GetInputMethodContext() override; + + public: + std::optional<SDL_Window*> GetSdlWindow(); + SdlUiApplication* GetSdlUiApplication(); + + private: + SdlUiApplication* application_; + std::optional<SDL_Window*> sdl_window_; + SdlWindow* parent_; + WindowStyleFlag style_; + + Event<std::nullptr_t> create_event_; + Event<std::nullptr_t> destroy_event_; + Event<std::nullptr_t> paint_event_; + Event<WindowVisibilityType> visibility_change_event_; + Event<Size> resize_event_; + Event<FocusChangeType> focus_event_; + Event<MouseEnterLeaveType> mouse_enter_leave_event_; + Event<Point> mouse_move_event_; + Event<NativeMouseButtonEventArgs> mouse_down_event_; + Event<NativeMouseButtonEventArgs> mouse_up_event_; + Event<NativeMouseWheelEventArgs> mouse_wheel_event_; + Event<NativeKeyEventArgs> key_down_event_; + Event<NativeKeyEventArgs> key_up_event_; +}; +} // namespace cru::platform::gui::xcb |