#pragma once #include "../resource.hpp" #include "../graph_base.hpp" #include "basic_types.hpp" #include "cru/common/event.hpp" #include "cursor.hpp" #include "event.hpp" namespace cru::platform::graph { struct IPainter; } namespace cru::platform::native { struct INativeWindowResolver; // Represents a native window, which exposes some low-level events and // operations. // // Usually you save an INativeWindowResolver after creating a window. Because // window may be destroyed when user do certain actions like click the close // button. Then the INativeWindow instance is destroyed and // INativeWindowResolver::Resolve return nullptr to indicate the fact. struct INativeWindow : virtual INativeResource { virtual std::shared_ptr GetResolver() = 0; virtual void Close() = 0; virtual INativeWindow* GetParent() = 0; virtual bool IsVisible() = 0; virtual void SetVisible(bool is_visible) = 0; virtual Size GetClientSize() = 0; virtual void SetClientSize(const Size& size) = 0; // Get the rect of the window containing frame. // The lefttop of the rect is relative to screen lefttop. virtual Rect GetWindowRect() = 0; // Set the rect of the window containing frame. // The lefttop of the rect is relative to screen lefttop. virtual void SetWindowRect(const Rect& rect) = 0; // Relative to client lefttop. virtual Point GetMousePosition() = 0; virtual bool CaptureMouse() = 0; virtual bool ReleaseMouse() = 0; virtual void SetCursor(std::shared_ptr cursor) = 0; virtual void RequestRepaint() = 0; // Remember to call EndDraw on return value and destroy it. virtual std::unique_ptr BeginPaint() = 0; virtual IEvent* DestroyEvent() = 0; virtual IEvent* PaintEvent() = 0; virtual IEvent* ResizeEvent() = 0; virtual IEvent* FocusEvent() = 0; virtual IEvent* MouseEnterLeaveEvent() = 0; virtual IEvent* MouseMoveEvent() = 0; virtual IEvent* MouseDownEvent() = 0; virtual IEvent* MouseUpEvent() = 0; virtual IEvent* KeyDownEvent() = 0; virtual IEvent* KeyUpEvent() = 0; }; // See INativeWindow for more info. struct INativeWindowResolver : virtual INativeResource { // Think twice before you save the return value. virtual INativeWindow* Resolve() = 0; }; } // namespace cru::platform::native