From 8ad2966933957ac5d6ff8dcd5e732736fd5e4dc6 Mon Sep 17 00:00:00 2001 From: crupest Date: Sun, 15 May 2022 14:08:06 +0800 Subject: ... --- include/cru/osx/Convert.h | 2 - include/cru/osx/Exception.h | 3 - include/cru/osx/Resource.h | 13 --- include/cru/osx/graphics/quartz/Brush.h | 47 ----------- include/cru/osx/graphics/quartz/Convert.h | 24 ------ include/cru/osx/graphics/quartz/Factory.h | 35 -------- include/cru/osx/graphics/quartz/Font.h | 27 ------ include/cru/osx/graphics/quartz/Geometry.h | 57 ------------- include/cru/osx/graphics/quartz/Image.h | 37 --------- include/cru/osx/graphics/quartz/ImageFactory.h | 22 ----- include/cru/osx/graphics/quartz/Painter.h | 82 ------------------- include/cru/osx/graphics/quartz/Resource.h | 25 ------ include/cru/osx/graphics/quartz/TextLayout.h | 95 ---------------------- include/cru/osx/gui/Clipboard.h | 31 ------- include/cru/osx/gui/Cursor.h | 43 ---------- include/cru/osx/gui/InputMethod.h | 56 ------------- include/cru/osx/gui/Keyboard.h | 7 -- include/cru/osx/gui/Menu.h | 67 --------------- include/cru/osx/gui/Resource.h | 24 ------ include/cru/osx/gui/UiApplication.h | 64 --------------- include/cru/osx/gui/Window.h | 90 -------------------- include/cru/platform/graphics/quartz/Brush.h | 47 +++++++++++ include/cru/platform/graphics/quartz/Convert.h | 24 ++++++ include/cru/platform/graphics/quartz/Factory.h | 35 ++++++++ include/cru/platform/graphics/quartz/Font.h | 27 ++++++ include/cru/platform/graphics/quartz/Geometry.h | 57 +++++++++++++ include/cru/platform/graphics/quartz/Image.h | 37 +++++++++ .../cru/platform/graphics/quartz/ImageFactory.h | 22 +++++ include/cru/platform/graphics/quartz/Painter.h | 82 +++++++++++++++++++ include/cru/platform/graphics/quartz/Resource.h | 25 ++++++ include/cru/platform/graphics/quartz/TextLayout.h | 95 ++++++++++++++++++++++ include/cru/platform/gui/osx/Clipboard.h | 31 +++++++ include/cru/platform/gui/osx/Cursor.h | 43 ++++++++++ include/cru/platform/gui/osx/InputMethod.h | 56 +++++++++++++ include/cru/platform/gui/osx/Keyboard.h | 7 ++ include/cru/platform/gui/osx/Menu.h | 67 +++++++++++++++ include/cru/platform/gui/osx/Resource.h | 24 ++++++ include/cru/platform/gui/osx/UiApplication.h | 64 +++++++++++++++ include/cru/platform/gui/osx/Window.h | 90 ++++++++++++++++++++ include/cru/platform/osx/Convert.h | 2 + include/cru/platform/osx/Exception.h | 3 + include/cru/platform/osx/Resource.h | 13 +++ 42 files changed, 851 insertions(+), 851 deletions(-) delete mode 100644 include/cru/osx/Convert.h delete mode 100644 include/cru/osx/Exception.h delete mode 100644 include/cru/osx/Resource.h delete mode 100644 include/cru/osx/graphics/quartz/Brush.h delete mode 100644 include/cru/osx/graphics/quartz/Convert.h delete mode 100644 include/cru/osx/graphics/quartz/Factory.h delete mode 100644 include/cru/osx/graphics/quartz/Font.h delete mode 100644 include/cru/osx/graphics/quartz/Geometry.h delete mode 100644 include/cru/osx/graphics/quartz/Image.h delete mode 100644 include/cru/osx/graphics/quartz/ImageFactory.h delete mode 100644 include/cru/osx/graphics/quartz/Painter.h delete mode 100644 include/cru/osx/graphics/quartz/Resource.h delete mode 100644 include/cru/osx/graphics/quartz/TextLayout.h delete mode 100644 include/cru/osx/gui/Clipboard.h delete mode 100644 include/cru/osx/gui/Cursor.h delete mode 100644 include/cru/osx/gui/InputMethod.h delete mode 100644 include/cru/osx/gui/Keyboard.h delete mode 100644 include/cru/osx/gui/Menu.h delete mode 100644 include/cru/osx/gui/Resource.h delete mode 100644 include/cru/osx/gui/UiApplication.h delete mode 100644 include/cru/osx/gui/Window.h create mode 100644 include/cru/platform/graphics/quartz/Brush.h create mode 100644 include/cru/platform/graphics/quartz/Convert.h create mode 100644 include/cru/platform/graphics/quartz/Factory.h create mode 100644 include/cru/platform/graphics/quartz/Font.h create mode 100644 include/cru/platform/graphics/quartz/Geometry.h create mode 100644 include/cru/platform/graphics/quartz/Image.h create mode 100644 include/cru/platform/graphics/quartz/ImageFactory.h create mode 100644 include/cru/platform/graphics/quartz/Painter.h create mode 100644 include/cru/platform/graphics/quartz/Resource.h create mode 100644 include/cru/platform/graphics/quartz/TextLayout.h create mode 100644 include/cru/platform/gui/osx/Clipboard.h create mode 100644 include/cru/platform/gui/osx/Cursor.h create mode 100644 include/cru/platform/gui/osx/InputMethod.h create mode 100644 include/cru/platform/gui/osx/Keyboard.h create mode 100644 include/cru/platform/gui/osx/Menu.h create mode 100644 include/cru/platform/gui/osx/Resource.h create mode 100644 include/cru/platform/gui/osx/UiApplication.h create mode 100644 include/cru/platform/gui/osx/Window.h create mode 100644 include/cru/platform/osx/Convert.h create mode 100644 include/cru/platform/osx/Exception.h create mode 100644 include/cru/platform/osx/Resource.h (limited to 'include/cru') diff --git a/include/cru/osx/Convert.h b/include/cru/osx/Convert.h deleted file mode 100644 index bf32174a..00000000 --- a/include/cru/osx/Convert.h +++ /dev/null @@ -1,2 +0,0 @@ -#pragma once -#include "cru/common/platform/osx/Convert.h" diff --git a/include/cru/osx/Exception.h b/include/cru/osx/Exception.h deleted file mode 100644 index c346b970..00000000 --- a/include/cru/osx/Exception.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once -#include "cru/common/platform/osx/Exception.h" -#include "cru/platform/Exception.h" diff --git a/include/cru/osx/Resource.h b/include/cru/osx/Resource.h deleted file mode 100644 index d30ee31b..00000000 --- a/include/cru/osx/Resource.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once -#include "cru/platform/Resource.h" - -namespace cru::platform::osx { -class OsxResource : public Object, public virtual IPlatformResource { - public: - CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(OsxResource) - CRU_DELETE_COPY(OsxResource) - CRU_DELETE_MOVE(OsxResource) - - String GetPlatformId() const override { return u"OSX"; } -}; -} // namespace cru::platform::osx diff --git a/include/cru/osx/graphics/quartz/Brush.h b/include/cru/osx/graphics/quartz/Brush.h deleted file mode 100644 index 677a0b6c..00000000 --- a/include/cru/osx/graphics/quartz/Brush.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include "Resource.h" -#include "cru/common/Base.h" -#include "cru/platform/graphics/Base.h" -#include "cru/platform/graphics/Brush.h" - -#include - -#include - -namespace cru::platform::graphics::osx::quartz { -class QuartzBrush : public OsxQuartzResource, public virtual IBrush { - public: - QuartzBrush(IGraphicsFactory* graphics_factory) - : OsxQuartzResource(graphics_factory) {} - CRU_DELETE_COPY(QuartzBrush) - CRU_DELETE_MOVE(QuartzBrush) - ~QuartzBrush() override = default; - - public: - virtual void Select(CGContextRef context) = 0; -}; - -class QuartzSolidColorBrush : public QuartzBrush, - public virtual ISolidColorBrush { - public: - QuartzSolidColorBrush(IGraphicsFactory* graphics_factory, const Color& color); - - CRU_DELETE_COPY(QuartzSolidColorBrush) - CRU_DELETE_MOVE(QuartzSolidColorBrush) - - ~QuartzSolidColorBrush() override; - - Color GetColor() override { return color_; } - void SetColor(const Color& color) override; - - CGColorRef GetCGColorRef() const { return cg_color_; } - - void Select(CGContextRef context) override; - - String GetDebugString() override; - - private: - Color color_; - CGColorRef cg_color_; -}; -} // namespace cru::platform::graphics::osx::quartz diff --git a/include/cru/osx/graphics/quartz/Convert.h b/include/cru/osx/graphics/quartz/Convert.h deleted file mode 100644 index be56b959..00000000 --- a/include/cru/osx/graphics/quartz/Convert.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once -#include "cru/common/Range.h" -#include "cru/common/String.h" -#include "cru/common/io/Stream.h" -#include "cru/platform/Matrix.h" - -#include - -namespace cru::platform::graphics::osx::quartz { -CGAffineTransform Convert(const Matrix& matrix); -Matrix Convert(const CGAffineTransform& matrix); - -CGPoint Convert(const Point& point); -Point Convert(const CGPoint& point); - -CGSize Convert(const Size& size); -Size Convert(const CGSize& size); - -CGRect Convert(const Rect& rect); -Rect Convert(const CGRect& rect); - -CGDataProviderRef ConvertStreamToCGDataProvider(io::Stream* stream); -CGDataConsumerRef ConvertStreamToCGDataConsumer(io::Stream* stream); -} // namespace cru::platform::graphics::osx::quartz diff --git a/include/cru/osx/graphics/quartz/Factory.h b/include/cru/osx/graphics/quartz/Factory.h deleted file mode 100644 index 1a5abdc1..00000000 --- a/include/cru/osx/graphics/quartz/Factory.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once -#include "Resource.h" -#include "cru/common/Base.h" -#include "cru/osx/graphics/quartz/ImageFactory.h" -#include "cru/platform/graphics/Factory.h" -#include "cru/platform/graphics/ImageFactory.h" - -namespace cru::platform::graphics::osx::quartz { -class QuartzGraphicsFactory : public OsxQuartzResource, - public virtual IGraphicsFactory { - public: - QuartzGraphicsFactory(); - - CRU_DELETE_COPY(QuartzGraphicsFactory) - CRU_DELETE_MOVE(QuartzGraphicsFactory) - - ~QuartzGraphicsFactory() override; - - public: - std::unique_ptr CreateSolidColorBrush() override; - - std::unique_ptr CreateGeometryBuilder() override; - - std::unique_ptr CreateFont(String font_family, - float font_size) override; - - std::unique_ptr CreateTextLayout(std::shared_ptr font, - String text) override; - - IImageFactory* GetImageFactory() override; - - private: - std::unique_ptr image_factory_; -}; -} // namespace cru::platform::graphics::osx::quartz diff --git a/include/cru/osx/graphics/quartz/Font.h b/include/cru/osx/graphics/quartz/Font.h deleted file mode 100644 index 50703dfe..00000000 --- a/include/cru/osx/graphics/quartz/Font.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once -#include "Resource.h" -#include "cru/common/Base.h" -#include "cru/platform/graphics/Font.h" - -#include - -namespace cru::platform::graphics::osx::quartz { -class OsxCTFont : public OsxQuartzResource, public virtual IFont { - public: - OsxCTFont(IGraphicsFactory* graphics_factory, const String& name, float size); - - CRU_DELETE_COPY(OsxCTFont) - CRU_DELETE_MOVE(OsxCTFont) - - ~OsxCTFont() override; - - CTFontRef GetCTFont() const { return ct_font_; } - - String GetFontName() override; - float GetFontSize() override; - - private: - String name_; - CTFontRef ct_font_; -}; -} // namespace cru::platform::graphics::osx::quartz diff --git a/include/cru/osx/graphics/quartz/Geometry.h b/include/cru/osx/graphics/quartz/Geometry.h deleted file mode 100644 index e0bdd5b6..00000000 --- a/include/cru/osx/graphics/quartz/Geometry.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once -#include "Resource.h" -#include "cru/platform/graphics/Geometry.h" - -#include - -#include - -namespace cru::platform::graphics::osx::quartz { -class QuartzGeometry : public OsxQuartzResource, public virtual IGeometry { - public: - QuartzGeometry(IGraphicsFactory *graphics_factory, CGPathRef cg_path); - - CRU_DELETE_COPY(QuartzGeometry) - CRU_DELETE_MOVE(QuartzGeometry) - - ~QuartzGeometry() override; - - CGPathRef GetCGPath() const { return cg_path_; } - - bool FillContains(const Point &point) override; - Rect GetBounds() override; - - std::unique_ptr Transform(const Matrix &matrix) override; - std::unique_ptr CreateStrokeGeometry(float width) override; - - private: - CGPathRef cg_path_; -}; - -class QuartzGeometryBuilder : public OsxQuartzResource, - public virtual IGeometryBuilder { - public: - explicit QuartzGeometryBuilder(IGraphicsFactory *graphics_factory); - - CRU_DELETE_COPY(QuartzGeometryBuilder) - CRU_DELETE_MOVE(QuartzGeometryBuilder) - - ~QuartzGeometryBuilder() override; - - Point GetCurrentPosition() override; - - void MoveTo(const Point &point) override; - void LineTo(const Point &point) override; - void CubicBezierTo(const Point &start_control_point, - const Point &end_control_point, - const Point &end_point) override; - void QuadraticBezierTo(const Point &control_point, - const Point &end_point) override; - void CloseFigure(bool close) override; - - std::unique_ptr Build() override; - - private: - CGMutablePathRef cg_mutable_path_; -}; -} // namespace cru::platform::graphics::osx::quartz diff --git a/include/cru/osx/graphics/quartz/Image.h b/include/cru/osx/graphics/quartz/Image.h deleted file mode 100644 index 5b3aead9..00000000 --- a/include/cru/osx/graphics/quartz/Image.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -#include "Resource.h" -#include "cru/platform/graphics/Image.h" -#include "cru/platform/graphics/ImageFactory.h" - -#include - -namespace cru::platform::graphics::osx::quartz { -class QuartzImage : public OsxQuartzResource, public virtual IImage { - public: - QuartzImage(IGraphicsFactory* graphics_factory, IImageFactory* image_factory, - CGImageRef image, bool auto_release, - unsigned char* buffer = nullptr); - - CRU_DELETE_COPY(QuartzImage) - CRU_DELETE_MOVE(QuartzImage) - - ~QuartzImage() override; - - public: - float GetWidth() override; - float GetHeight() override; - - std::unique_ptr CreateWithRect(const Rect& rect) override; - - std::unique_ptr CreatePainter() override; - - CGImageRef GetCGImage() const { return image_; } - - private: - IImageFactory* image_factory_; - CGImageRef image_; - bool auto_release_ = false; - - unsigned char* buffer_; -}; -} // namespace cru::platform::graphics::osx::quartz diff --git a/include/cru/osx/graphics/quartz/ImageFactory.h b/include/cru/osx/graphics/quartz/ImageFactory.h deleted file mode 100644 index 23d14332..00000000 --- a/include/cru/osx/graphics/quartz/ImageFactory.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once -#include "Resource.h" -#include "cru/platform/graphics/ImageFactory.h" - -namespace cru::platform::graphics::osx::quartz { -class QuartzImageFactory : public OsxQuartzResource, - public virtual IImageFactory { - public: - explicit QuartzImageFactory(IGraphicsFactory* graphics_factory); - - CRU_DELETE_COPY(QuartzImageFactory) - CRU_DELETE_MOVE(QuartzImageFactory) - - ~QuartzImageFactory() override; - - public: - std::unique_ptr DecodeFromStream(io::Stream* stream) override; - void EncodeToStream(IImage* image, io::Stream* stream, ImageFormat format, - float quality) override; - std::unique_ptr CreateBitmap(int width, int height) override; -}; -} // namespace cru::platform::graphics::osx::quartz diff --git a/include/cru/osx/graphics/quartz/Painter.h b/include/cru/osx/graphics/quartz/Painter.h deleted file mode 100644 index 87389437..00000000 --- a/include/cru/osx/graphics/quartz/Painter.h +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once -#include "Resource.h" -#include "cru/common/Base.h" -#include "cru/platform/graphics/Base.h" -#include "cru/platform/graphics/Painter.h" - -#include - -#include - -namespace cru::platform::graphics::osx::quartz { -class QuartzCGContextPainter : public OsxQuartzResource, - public virtual IPainter { - CRU_DEFINE_CLASS_LOG_TAG(u"QuartzCGContextPainter") - - public: - explicit QuartzCGContextPainter( - IGraphicsFactory* graphics_factory, CGContextRef cg_context, - bool auto_release, const Size& size, - std::function on_end_draw); - - CRU_DELETE_COPY(QuartzCGContextPainter) - CRU_DELETE_MOVE(QuartzCGContextPainter) - - ~QuartzCGContextPainter() override; - - public: - Matrix GetTransform() override; - void SetTransform(const Matrix& matrix) override; - - void ConcatTransform(const Matrix& matrix) override; - - void Clear(const Color& color) override; - - void DrawLine(const Point& start, const Point& end, IBrush* brush, - float width) override; - void StrokeRectangle(const Rect& rectangle, IBrush* brush, - float width) override; - void FillRectangle(const Rect& rectangle, IBrush* brush) override; - void StrokeEllipse(const Rect& outline_rect, IBrush* brush, - float width) override; - void FillEllipse(const Rect& outline_rect, IBrush* brush) override; - - void StrokeGeometry(IGeometry* geometry, IBrush* brush, float width) override; - void FillGeometry(IGeometry* geometry, IBrush* brush) override; - - void DrawText(const Point& offset, ITextLayout* text_layout, - IBrush* brush) override; - - void DrawImage(const Point& offset, IImage* image) override; - - void PushLayer(const Rect& bounds) override; - - void PopLayer() override; - - void EndDraw() override; - - void PushState() override; - - void PopState() override; - - private: - void SetLineWidth(float width); - - void DoEndDraw(); - - void Validate(); - - private: - CGContextRef cg_context_; - - bool auto_release_; - - Size size_; - - Matrix transform_; - - std::function on_end_draw_; - - std::vector clip_stack_; -}; -} // namespace cru::platform::graphics::osx::quartz diff --git a/include/cru/osx/graphics/quartz/Resource.h b/include/cru/osx/graphics/quartz/Resource.h deleted file mode 100644 index 916a376f..00000000 --- a/include/cru/osx/graphics/quartz/Resource.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once -#include "cru/osx/Resource.h" -#include "cru/platform/graphics/Base.h" -#include "cru/platform/graphics/Resource.h" - -namespace cru::platform::graphics::osx::quartz { -class OsxQuartzResource : public platform::osx::OsxResource, - public virtual IGraphicsResource { - public: - explicit OsxQuartzResource(IGraphicsFactory* graphics_factory) - : graphics_factory_(graphics_factory) {} - - CRU_DELETE_COPY(OsxQuartzResource) - CRU_DELETE_MOVE(OsxQuartzResource) - ~OsxQuartzResource() override = default; - - public: - String GetPlatformId() const override { return u"OSX Quartz"; } - - IGraphicsFactory* GetGraphicsFactory() override { return graphics_factory_; } - - private: - IGraphicsFactory* graphics_factory_; -}; -} // namespace cru::platform::graphics::osx::quartz diff --git a/include/cru/osx/graphics/quartz/TextLayout.h b/include/cru/osx/graphics/quartz/TextLayout.h deleted file mode 100644 index c0abc7f9..00000000 --- a/include/cru/osx/graphics/quartz/TextLayout.h +++ /dev/null @@ -1,95 +0,0 @@ -#pragma once -#include "Resource.h" - -#include "Font.h" -#include "cru/common/Base.h" -#include "cru/platform/graphics/TextLayout.h" - -#include - -namespace cru::platform::graphics::osx::quartz { -class OsxCTTextLayout : public OsxQuartzResource, public virtual ITextLayout { - public: - OsxCTTextLayout(IGraphicsFactory* graphics_factory, - std::shared_ptr font, const String& str); - - CRU_DELETE_COPY(OsxCTTextLayout) - CRU_DELETE_MOVE(OsxCTTextLayout) - - ~OsxCTTextLayout() override; - - public: - String GetText() override { return text_; } - void SetText(String new_text) override; - - std::shared_ptr GetFont() override { return font_; } - void SetFont(std::shared_ptr font) override; - - void SetMaxWidth(float max_width) override; - void SetMaxHeight(float max_height) override; - - bool IsEditMode() override; - void SetEditMode(bool enable) override; - - Index GetLineIndexFromCharIndex(Index char_index) override; - Index GetLineCount() override; - float GetLineHeight(Index line_index) override; - - Rect GetTextBounds(bool includingTrailingSpace = false) override; - std::vector TextRangeRect(const TextRange& text_range) override; - Rect TextSinglePoint(Index position, bool trailing) override; - TextHitTestResult HitTest(const Point& point) override; - - CTFrameRef GetCTFrameRef() const { return ct_frame_; } - - CTFrameRef CreateFrameWithColor(const Color& color); - - Matrix GetTransform() { return transform_; } - - String GetDebugString() override; - - private: - void DoSetText(String text); - - void ReleaseResource(); - void RecreateFrame(); - - CGRect DoGetTextBounds(bool includingTrailingSpace = false); - CGRect DoGetTextBoundsIncludingEmptyLines( - bool includingTrailingSpace = false); - std::vector DoTextRangeRect(const TextRange& text_range); - CGRect DoTextSinglePoint(Index position, bool trailing); - - private: - float max_width_; - float max_height_; - - bool edit_mode_; - - std::shared_ptr font_; - - String text_; - String actual_text_; - CFMutableAttributedStringRef cf_attributed_text_; - - CTFramesetterRef ct_framesetter_ = nullptr; - float suggest_height_; - CTFrameRef ct_frame_ = nullptr; - int line_count_; - std::vector line_origins_; - std::vector lines_; - std::vector line_ascents_; - std::vector line_descents_; - std::vector line_heights_; - // The empty line count in the front of the lines. - int head_empty_line_count_; - // The trailing empty line count in the back of the lines. - int tail_empty_line_count_; - - // Just for cache. - CGRect text_bounds_without_trailing_space_; - CGRect text_bounds_with_trailing_space_; - - Matrix transform_; -}; -} // namespace cru::platform::graphics::osx::quartz diff --git a/include/cru/osx/gui/Clipboard.h b/include/cru/osx/gui/Clipboard.h deleted file mode 100644 index b4dcce4c..00000000 --- a/include/cru/osx/gui/Clipboard.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once -#include "Resource.h" - -#include "cru/platform/gui/Base.h" -#include "cru/platform/gui/Clipboard.h" - -#include - -namespace cru::platform::gui::osx { -namespace details { -class OsxClipboardPrivate; -} - -class OsxClipboard : public OsxGuiResource, public virtual IClipboard { - public: - OsxClipboard(cru::platform::gui::IUiApplication* ui_application, - std::unique_ptr p); - - CRU_DELETE_COPY(OsxClipboard) - CRU_DELETE_MOVE(OsxClipboard) - - ~OsxClipboard() override; - - public: - String GetText() override; - void SetText(String text) override; - - private: - std::unique_ptr p_; -}; -} // namespace cru::platform::gui::osx diff --git a/include/cru/osx/gui/Cursor.h b/include/cru/osx/gui/Cursor.h deleted file mode 100644 index 6cfd400a..00000000 --- a/include/cru/osx/gui/Cursor.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once -#include "Resource.h" -#include "cru/platform/gui/Cursor.h" - -#include - -namespace cru::platform::gui::osx { -namespace details { -class OsxWindowPrivate; -class OsxCursorPrivate; -class OsxCursorManagerPrivate; -} // namespace details - -class OsxCursor : public OsxGuiResource, public virtual ICursor { - friend class OsxWindow; - friend class details::OsxWindowPrivate; - - public: - OsxCursor(IUiApplication* ui_application, SystemCursorType cursor_type); - CRU_DELETE_COPY(OsxCursor) - CRU_DELETE_MOVE(OsxCursor) - - ~OsxCursor() override; - - private: - std::unique_ptr p_; -}; - -class OsxCursorManager : public OsxGuiResource, public virtual ICursorManager { - public: - explicit OsxCursorManager(IUiApplication* ui_application); - - CRU_DELETE_COPY(OsxCursorManager) - CRU_DELETE_MOVE(OsxCursorManager) - - ~OsxCursorManager() override; - - std::shared_ptr GetSystemCursor(SystemCursorType type) override; - - private: - std::unique_ptr p_; -}; -} // namespace cru::platform::gui::osx diff --git a/include/cru/osx/gui/InputMethod.h b/include/cru/osx/gui/InputMethod.h deleted file mode 100644 index cbfdae6c..00000000 --- a/include/cru/osx/gui/InputMethod.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once -#include "Resource.h" - -#include "cru/platform/gui/InputMethod.h" - -namespace cru::platform::gui::osx { -class OsxWindow; - -namespace details { -class OsxWindowPrivate; -class OsxInputMethodContextPrivate; -} // namespace details - -class OsxInputMethodContext : public OsxGuiResource, - public virtual IInputMethodContext { - friend OsxWindow; - friend details::OsxWindowPrivate; - friend details::OsxInputMethodContextPrivate; - - public: - explicit OsxInputMethodContext(OsxWindow* window); - - CRU_DELETE_COPY(OsxInputMethodContext) - CRU_DELETE_MOVE(OsxInputMethodContext) - - ~OsxInputMethodContext() override; - - public: - bool ShouldManuallyDrawCompositionText() override; - - void EnableIME() override; - - void DisableIME() override; - - void CompleteComposition() override; - - void CancelComposition() override; - - CompositionText GetCompositionText() override; - - void SetCandidateWindowPosition(const Point& point) override; - - IEvent* CompositionStartEvent() override; - - IEvent* CompositionEndEvent() override; - - IEvent* CompositionEvent() override; - - IEvent* TextEvent() override; - - bool IsEnabled(); - - private: - std::unique_ptr p_; -}; -} // namespace cru::platform::gui::osx diff --git a/include/cru/osx/gui/Keyboard.h b/include/cru/osx/gui/Keyboard.h deleted file mode 100644 index 89e0fa05..00000000 --- a/include/cru/osx/gui/Keyboard.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once -#include "cru/platform/gui/Keyboard.h" - -namespace cru::platform::gui::osx { -KeyCode KeyCodeFromOsxToCru(unsigned short n); -unsigned short KeyCodeFromCruToOsx(KeyCode k); -} // namespace cru::platform::gui::osx diff --git a/include/cru/osx/gui/Menu.h b/include/cru/osx/gui/Menu.h deleted file mode 100644 index c5cc756a..00000000 --- a/include/cru/osx/gui/Menu.h +++ /dev/null @@ -1,67 +0,0 @@ -#pragma once -#include "Resource.h" - -#include "cru/platform/gui/Menu.h" - -namespace cru::platform::gui::osx { -namespace details { -struct OsxMenuItemPrivate; -struct OsxMenuPrivate; -} // namespace details - -class OsxMenu; - -class OsxMenuItem : public OsxGuiResource, public virtual IMenuItem { - friend OsxMenu; - friend details::OsxMenuPrivate; - - private: - explicit OsxMenuItem(IUiApplication* ui_application); - - public: - CRU_DELETE_COPY(OsxMenuItem) - CRU_DELETE_MOVE(OsxMenuItem) - - ~OsxMenuItem() override; - - public: - String GetTitle() override; - void SetTitle(String title) override; - bool IsEnabled() override; - void SetEnabled(bool enabled) override; - IMenu* GetParentMenu() override; - IMenu* GetSubmenu() override; - void SetKeyboardShortcut(KeyCode key, KeyModifier modifiers) override; - void DeleteKeyboardShortcut() override; - void SetOnClickHandler(std::function handler) override; - - private: - details::OsxMenuItemPrivate* p_; -}; - -class OsxMenu : public OsxGuiResource, public virtual IMenu { - friend OsxMenuItem; - friend details::OsxMenuPrivate; - friend details::OsxMenuItemPrivate; - - private: - explicit OsxMenu(IUiApplication* ui_application); - - public: - static OsxMenu* CreateOrGetApplicationMenu(IUiApplication* ui_application); - - CRU_DELETE_COPY(OsxMenu) - CRU_DELETE_MOVE(OsxMenu) - - ~OsxMenu() override; - - public: - IMenuItem* GetItemAt(int index) override; - int GetItemCount() override; - IMenuItem* CreateItemAt(int index) override; - void RemoveItemAt(int index) override; - - private: - details::OsxMenuPrivate* p_; -}; -} // namespace cru::platform::gui::osx diff --git a/include/cru/osx/gui/Resource.h b/include/cru/osx/gui/Resource.h deleted file mode 100644 index bc3f9cd6..00000000 --- a/include/cru/osx/gui/Resource.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once -#include "../Resource.h" - -#include "cru/platform/gui/Base.h" - -namespace cru::platform::gui::osx { -class OsxGuiResource : public platform::osx::OsxResource { - public: - explicit OsxGuiResource(IUiApplication* ui_application); - - CRU_DELETE_COPY(OsxGuiResource) - CRU_DELETE_MOVE(OsxGuiResource) - - ~OsxGuiResource() override = default; - - public: - String GetPlatformId() const override { return u"OSX GUI"; } - - IUiApplication* GetUiApplication() const { return ui_application_; } - - private: - IUiApplication* ui_application_; -}; -} // namespace cru::platform::gui::osx diff --git a/include/cru/osx/gui/UiApplication.h b/include/cru/osx/gui/UiApplication.h deleted file mode 100644 index 2d2c119c..00000000 --- a/include/cru/osx/gui/UiApplication.h +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once -#include "Resource.h" -#include "cru/platform/gui/UiApplication.h" - -#include -#include - -namespace cru::platform::gui::osx { -class OsxWindow; - -namespace details { -class OsxUiApplicationPrivate; -} - -class OsxUiApplication : public OsxGuiResource, public virtual IUiApplication { - friend details::OsxUiApplicationPrivate; - friend OsxWindow; - - public: - OsxUiApplication(); - - CRU_DELETE_COPY(OsxUiApplication) - CRU_DELETE_MOVE(OsxUiApplication) - - ~OsxUiApplication() override; - - 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; - - IMenu* GetApplicationMenu() override; - - std::optional ShowSaveDialog(SaveDialogOptions options) override; - - std::optional> ShowOpenDialog( - OpenDialogOptions options) override; - - private: - void UnregisterWindow(OsxWindow* window); - - std::unique_ptr p_; -}; -} // namespace cru::platform::gui::osx diff --git a/include/cru/osx/gui/Window.h b/include/cru/osx/gui/Window.h deleted file mode 100644 index 6cefbe8e..00000000 --- a/include/cru/osx/gui/Window.h +++ /dev/null @@ -1,90 +0,0 @@ -#pragma once -#include "Resource.h" -#include "cru/platform/gui/Base.h" -#include "cru/platform/gui/InputMethod.h" -#include "cru/platform/gui/Window.h" - -#include - -namespace cru::platform::gui::osx { -namespace details { -class OsxWindowPrivate; -class OsxInputMethodContextPrivate; -} // namespace details - -class OsxUiApplication; -class OsxInputMethodContext; - -class OsxWindow : public OsxGuiResource, public INativeWindow { - friend details::OsxWindowPrivate; - friend details::OsxInputMethodContextPrivate; - - public: - OsxWindow(OsxUiApplication* ui_application); - - CRU_DELETE_COPY(OsxWindow) - CRU_DELETE_MOVE(OsxWindow) - - ~OsxWindow() override; - - public: - 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 cursor) override; - - void SetToForeground() override; - - void RequestRepaint() override; - - std::unique_ptr BeginPaint() override; - - IEvent* CreateEvent() override; - IEvent* DestroyEvent() override; - IEvent* PaintEvent() override; - - IEvent* VisibilityChangeEvent() override; - IEvent* ResizeEvent() override; - IEvent* FocusEvent() override; - - IEvent* MouseEnterLeaveEvent() override; - IEvent* MouseMoveEvent() override; - IEvent* MouseDownEvent() override; - IEvent* MouseUpEvent() override; - IEvent* MouseWheelEvent() override; - IEvent* KeyDownEvent() override; - IEvent* KeyUpEvent() override; - - IInputMethodContext* GetInputMethodContext() override; - - private: - std::unique_ptr p_; -}; -} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/graphics/quartz/Brush.h b/include/cru/platform/graphics/quartz/Brush.h new file mode 100644 index 00000000..f3579771 --- /dev/null +++ b/include/cru/platform/graphics/quartz/Brush.h @@ -0,0 +1,47 @@ +#pragma once +#include "Resource.h" +#include "cru/common/Base.h" +#include "cru/platform/graphics/Base.h" +#include "cru/platform/graphics/Brush.h" + +#include + +#include + +namespace cru::platform::graphics::quartz { +class QuartzBrush : public OsxQuartzResource, public virtual IBrush { + public: + QuartzBrush(IGraphicsFactory* graphics_factory) + : OsxQuartzResource(graphics_factory) {} + CRU_DELETE_COPY(QuartzBrush) + CRU_DELETE_MOVE(QuartzBrush) + ~QuartzBrush() override = default; + + public: + virtual void Select(CGContextRef context) = 0; +}; + +class QuartzSolidColorBrush : public QuartzBrush, + public virtual ISolidColorBrush { + public: + QuartzSolidColorBrush(IGraphicsFactory* graphics_factory, const Color& color); + + CRU_DELETE_COPY(QuartzSolidColorBrush) + CRU_DELETE_MOVE(QuartzSolidColorBrush) + + ~QuartzSolidColorBrush() override; + + Color GetColor() override { return color_; } + void SetColor(const Color& color) override; + + CGColorRef GetCGColorRef() const { return cg_color_; } + + void Select(CGContextRef context) override; + + String GetDebugString() override; + + private: + Color color_; + CGColorRef cg_color_; +}; +} // namespace cru::platform::graphics::quartz diff --git a/include/cru/platform/graphics/quartz/Convert.h b/include/cru/platform/graphics/quartz/Convert.h new file mode 100644 index 00000000..c7dab7c9 --- /dev/null +++ b/include/cru/platform/graphics/quartz/Convert.h @@ -0,0 +1,24 @@ +#pragma once +#include "cru/common/Range.h" +#include "cru/common/String.h" +#include "cru/common/io/Stream.h" +#include "cru/platform/Matrix.h" + +#include + +namespace cru::platform::graphics::quartz { +CGAffineTransform Convert(const Matrix& matrix); +Matrix Convert(const CGAffineTransform& matrix); + +CGPoint Convert(const Point& point); +Point Convert(const CGPoint& point); + +CGSize Convert(const Size& size); +Size Convert(const CGSize& size); + +CGRect Convert(const Rect& rect); +Rect Convert(const CGRect& rect); + +CGDataProviderRef ConvertStreamToCGDataProvider(io::Stream* stream); +CGDataConsumerRef ConvertStreamToCGDataConsumer(io::Stream* stream); +} // namespace cru::platform::graphics::quartz diff --git a/include/cru/platform/graphics/quartz/Factory.h b/include/cru/platform/graphics/quartz/Factory.h new file mode 100644 index 00000000..57992d87 --- /dev/null +++ b/include/cru/platform/graphics/quartz/Factory.h @@ -0,0 +1,35 @@ +#pragma once +#include "Resource.h" +#include "cru/common/Base.h" +#include "cru/platform/graphics/quartz/ImageFactory.h" +#include "cru/platform/graphics/Factory.h" +#include "cru/platform/graphics/ImageFactory.h" + +namespace cru::platform::graphics::quartz { +class QuartzGraphicsFactory : public OsxQuartzResource, + public virtual IGraphicsFactory { + public: + QuartzGraphicsFactory(); + + CRU_DELETE_COPY(QuartzGraphicsFactory) + CRU_DELETE_MOVE(QuartzGraphicsFactory) + + ~QuartzGraphicsFactory() override; + + public: + std::unique_ptr CreateSolidColorBrush() override; + + std::unique_ptr CreateGeometryBuilder() override; + + std::unique_ptr CreateFont(String font_family, + float font_size) override; + + std::unique_ptr CreateTextLayout(std::shared_ptr font, + String text) override; + + IImageFactory* GetImageFactory() override; + + private: + std::unique_ptr image_factory_; +}; +} // namespace cru::platform::graphics::quartz diff --git a/include/cru/platform/graphics/quartz/Font.h b/include/cru/platform/graphics/quartz/Font.h new file mode 100644 index 00000000..36dba31a --- /dev/null +++ b/include/cru/platform/graphics/quartz/Font.h @@ -0,0 +1,27 @@ +#pragma once +#include "Resource.h" +#include "cru/common/Base.h" +#include "cru/platform/graphics/Font.h" + +#include + +namespace cru::platform::graphics::quartz { +class OsxCTFont : public OsxQuartzResource, public virtual IFont { + public: + OsxCTFont(IGraphicsFactory* graphics_factory, const String& name, float size); + + CRU_DELETE_COPY(OsxCTFont) + CRU_DELETE_MOVE(OsxCTFont) + + ~OsxCTFont() override; + + CTFontRef GetCTFont() const { return ct_font_; } + + String GetFontName() override; + float GetFontSize() override; + + private: + String name_; + CTFontRef ct_font_; +}; +} // namespace cru::platform::graphics::quartz diff --git a/include/cru/platform/graphics/quartz/Geometry.h b/include/cru/platform/graphics/quartz/Geometry.h new file mode 100644 index 00000000..18e2e25e --- /dev/null +++ b/include/cru/platform/graphics/quartz/Geometry.h @@ -0,0 +1,57 @@ +#pragma once +#include "Resource.h" +#include "cru/platform/graphics/Geometry.h" + +#include + +#include + +namespace cru::platform::graphics::quartz { +class QuartzGeometry : public OsxQuartzResource, public virtual IGeometry { + public: + QuartzGeometry(IGraphicsFactory *graphics_factory, CGPathRef cg_path); + + CRU_DELETE_COPY(QuartzGeometry) + CRU_DELETE_MOVE(QuartzGeometry) + + ~QuartzGeometry() override; + + CGPathRef GetCGPath() const { return cg_path_; } + + bool FillContains(const Point &point) override; + Rect GetBounds() override; + + std::unique_ptr Transform(const Matrix &matrix) override; + std::unique_ptr CreateStrokeGeometry(float width) override; + + private: + CGPathRef cg_path_; +}; + +class QuartzGeometryBuilder : public OsxQuartzResource, + public virtual IGeometryBuilder { + public: + explicit QuartzGeometryBuilder(IGraphicsFactory *graphics_factory); + + CRU_DELETE_COPY(QuartzGeometryBuilder) + CRU_DELETE_MOVE(QuartzGeometryBuilder) + + ~QuartzGeometryBuilder() override; + + Point GetCurrentPosition() override; + + void MoveTo(const Point &point) override; + void LineTo(const Point &point) override; + void CubicBezierTo(const Point &start_control_point, + const Point &end_control_point, + const Point &end_point) override; + void QuadraticBezierTo(const Point &control_point, + const Point &end_point) override; + void CloseFigure(bool close) override; + + std::unique_ptr Build() override; + + private: + CGMutablePathRef cg_mutable_path_; +}; +} // namespace cru::platform::graphics::quartz diff --git a/include/cru/platform/graphics/quartz/Image.h b/include/cru/platform/graphics/quartz/Image.h new file mode 100644 index 00000000..1dd8f0a6 --- /dev/null +++ b/include/cru/platform/graphics/quartz/Image.h @@ -0,0 +1,37 @@ +#pragma once +#include "Resource.h" +#include "cru/platform/graphics/Image.h" +#include "cru/platform/graphics/ImageFactory.h" + +#include + +namespace cru::platform::graphics::quartz { +class QuartzImage : public OsxQuartzResource, public virtual IImage { + public: + QuartzImage(IGraphicsFactory* graphics_factory, IImageFactory* image_factory, + CGImageRef image, bool auto_release, + unsigned char* buffer = nullptr); + + CRU_DELETE_COPY(QuartzImage) + CRU_DELETE_MOVE(QuartzImage) + + ~QuartzImage() override; + + public: + float GetWidth() override; + float GetHeight() override; + + std::unique_ptr CreateWithRect(const Rect& rect) override; + + std::unique_ptr CreatePainter() override; + + CGImageRef GetCGImage() const { return image_; } + + private: + IImageFactory* image_factory_; + CGImageRef image_; + bool auto_release_ = false; + + unsigned char* buffer_; +}; +} // namespace cru::platform::graphics::quartz diff --git a/include/cru/platform/graphics/quartz/ImageFactory.h b/include/cru/platform/graphics/quartz/ImageFactory.h new file mode 100644 index 00000000..bd2a929f --- /dev/null +++ b/include/cru/platform/graphics/quartz/ImageFactory.h @@ -0,0 +1,22 @@ +#pragma once +#include "Resource.h" +#include "cru/platform/graphics/ImageFactory.h" + +namespace cru::platform::graphics::quartz { +class QuartzImageFactory : public OsxQuartzResource, + public virtual IImageFactory { + public: + explicit QuartzImageFactory(IGraphicsFactory* graphics_factory); + + CRU_DELETE_COPY(QuartzImageFactory) + CRU_DELETE_MOVE(QuartzImageFactory) + + ~QuartzImageFactory() override; + + public: + std::unique_ptr DecodeFromStream(io::Stream* stream) override; + void EncodeToStream(IImage* image, io::Stream* stream, ImageFormat format, + float quality) override; + std::unique_ptr CreateBitmap(int width, int height) override; +}; +} // namespace cru::platform::graphics::quartz diff --git a/include/cru/platform/graphics/quartz/Painter.h b/include/cru/platform/graphics/quartz/Painter.h new file mode 100644 index 00000000..eba66a56 --- /dev/null +++ b/include/cru/platform/graphics/quartz/Painter.h @@ -0,0 +1,82 @@ +#pragma once +#include "Resource.h" +#include "cru/common/Base.h" +#include "cru/platform/graphics/Base.h" +#include "cru/platform/graphics/Painter.h" + +#include + +#include + +namespace cru::platform::graphics::quartz { +class QuartzCGContextPainter : public OsxQuartzResource, + public virtual IPainter { + CRU_DEFINE_CLASS_LOG_TAG(u"QuartzCGContextPainter") + + public: + explicit QuartzCGContextPainter( + IGraphicsFactory* graphics_factory, CGContextRef cg_context, + bool auto_release, const Size& size, + std::function on_end_draw); + + CRU_DELETE_COPY(QuartzCGContextPainter) + CRU_DELETE_MOVE(QuartzCGContextPainter) + + ~QuartzCGContextPainter() override; + + public: + Matrix GetTransform() override; + void SetTransform(const Matrix& matrix) override; + + void ConcatTransform(const Matrix& matrix) override; + + void Clear(const Color& color) override; + + void DrawLine(const Point& start, const Point& end, IBrush* brush, + float width) override; + void StrokeRectangle(const Rect& rectangle, IBrush* brush, + float width) override; + void FillRectangle(const Rect& rectangle, IBrush* brush) override; + void StrokeEllipse(const Rect& outline_rect, IBrush* brush, + float width) override; + void FillEllipse(const Rect& outline_rect, IBrush* brush) override; + + void StrokeGeometry(IGeometry* geometry, IBrush* brush, float width) override; + void FillGeometry(IGeometry* geometry, IBrush* brush) override; + + void DrawText(const Point& offset, ITextLayout* text_layout, + IBrush* brush) override; + + void DrawImage(const Point& offset, IImage* image) override; + + void PushLayer(const Rect& bounds) override; + + void PopLayer() override; + + void EndDraw() override; + + void PushState() override; + + void PopState() override; + + private: + void SetLineWidth(float width); + + void DoEndDraw(); + + void Validate(); + + private: + CGContextRef cg_context_; + + bool auto_release_; + + Size size_; + + Matrix transform_; + + std::function on_end_draw_; + + std::vector clip_stack_; +}; +} // namespace cru::platform::graphics::quartz diff --git a/include/cru/platform/graphics/quartz/Resource.h b/include/cru/platform/graphics/quartz/Resource.h new file mode 100644 index 00000000..d28e4055 --- /dev/null +++ b/include/cru/platform/graphics/quartz/Resource.h @@ -0,0 +1,25 @@ +#pragma once +#include "cru/platform/osx/Resource.h" +#include "cru/platform/graphics/Base.h" +#include "cru/platform/graphics/Resource.h" + +namespace cru::platform::graphics::quartz { +class OsxQuartzResource : public platform::osx::OsxResource, + public virtual IGraphicsResource { + public: + explicit OsxQuartzResource(IGraphicsFactory* graphics_factory) + : graphics_factory_(graphics_factory) {} + + CRU_DELETE_COPY(OsxQuartzResource) + CRU_DELETE_MOVE(OsxQuartzResource) + ~OsxQuartzResource() override = default; + + public: + String GetPlatformId() const override { return u"OSX Quartz"; } + + IGraphicsFactory* GetGraphicsFactory() override { return graphics_factory_; } + + private: + IGraphicsFactory* graphics_factory_; +}; +} // namespace cru::platform::graphics::quartz diff --git a/include/cru/platform/graphics/quartz/TextLayout.h b/include/cru/platform/graphics/quartz/TextLayout.h new file mode 100644 index 00000000..0d23360d --- /dev/null +++ b/include/cru/platform/graphics/quartz/TextLayout.h @@ -0,0 +1,95 @@ +#pragma once +#include "Resource.h" + +#include "Font.h" +#include "cru/common/Base.h" +#include "cru/platform/graphics/TextLayout.h" + +#include + +namespace cru::platform::graphics::quartz { +class OsxCTTextLayout : public OsxQuartzResource, public virtual ITextLayout { + public: + OsxCTTextLayout(IGraphicsFactory* graphics_factory, + std::shared_ptr font, const String& str); + + CRU_DELETE_COPY(OsxCTTextLayout) + CRU_DELETE_MOVE(OsxCTTextLayout) + + ~OsxCTTextLayout() override; + + public: + String GetText() override { return text_; } + void SetText(String new_text) override; + + std::shared_ptr GetFont() override { return font_; } + void SetFont(std::shared_ptr font) override; + + void SetMaxWidth(float max_width) override; + void SetMaxHeight(float max_height) override; + + bool IsEditMode() override; + void SetEditMode(bool enable) override; + + Index GetLineIndexFromCharIndex(Index char_index) override; + Index GetLineCount() override; + float GetLineHeight(Index line_index) override; + + Rect GetTextBounds(bool includingTrailingSpace = false) override; + std::vector TextRangeRect(const TextRange& text_range) override; + Rect TextSinglePoint(Index position, bool trailing) override; + TextHitTestResult HitTest(const Point& point) override; + + CTFrameRef GetCTFrameRef() const { return ct_frame_; } + + CTFrameRef CreateFrameWithColor(const Color& color); + + Matrix GetTransform() { return transform_; } + + String GetDebugString() override; + + private: + void DoSetText(String text); + + void ReleaseResource(); + void RecreateFrame(); + + CGRect DoGetTextBounds(bool includingTrailingSpace = false); + CGRect DoGetTextBoundsIncludingEmptyLines( + bool includingTrailingSpace = false); + std::vector DoTextRangeRect(const TextRange& text_range); + CGRect DoTextSinglePoint(Index position, bool trailing); + + private: + float max_width_; + float max_height_; + + bool edit_mode_; + + std::shared_ptr font_; + + String text_; + String actual_text_; + CFMutableAttributedStringRef cf_attributed_text_; + + CTFramesetterRef ct_framesetter_ = nullptr; + float suggest_height_; + CTFrameRef ct_frame_ = nullptr; + int line_count_; + std::vector line_origins_; + std::vector lines_; + std::vector line_ascents_; + std::vector line_descents_; + std::vector line_heights_; + // The empty line count in the front of the lines. + int head_empty_line_count_; + // The trailing empty line count in the back of the lines. + int tail_empty_line_count_; + + // Just for cache. + CGRect text_bounds_without_trailing_space_; + CGRect text_bounds_with_trailing_space_; + + Matrix transform_; +}; +} // namespace cru::platform::graphics::quartz diff --git a/include/cru/platform/gui/osx/Clipboard.h b/include/cru/platform/gui/osx/Clipboard.h new file mode 100644 index 00000000..b4dcce4c --- /dev/null +++ b/include/cru/platform/gui/osx/Clipboard.h @@ -0,0 +1,31 @@ +#pragma once +#include "Resource.h" + +#include "cru/platform/gui/Base.h" +#include "cru/platform/gui/Clipboard.h" + +#include + +namespace cru::platform::gui::osx { +namespace details { +class OsxClipboardPrivate; +} + +class OsxClipboard : public OsxGuiResource, public virtual IClipboard { + public: + OsxClipboard(cru::platform::gui::IUiApplication* ui_application, + std::unique_ptr p); + + CRU_DELETE_COPY(OsxClipboard) + CRU_DELETE_MOVE(OsxClipboard) + + ~OsxClipboard() override; + + public: + String GetText() override; + void SetText(String text) override; + + private: + std::unique_ptr p_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/Cursor.h b/include/cru/platform/gui/osx/Cursor.h new file mode 100644 index 00000000..6cfd400a --- /dev/null +++ b/include/cru/platform/gui/osx/Cursor.h @@ -0,0 +1,43 @@ +#pragma once +#include "Resource.h" +#include "cru/platform/gui/Cursor.h" + +#include + +namespace cru::platform::gui::osx { +namespace details { +class OsxWindowPrivate; +class OsxCursorPrivate; +class OsxCursorManagerPrivate; +} // namespace details + +class OsxCursor : public OsxGuiResource, public virtual ICursor { + friend class OsxWindow; + friend class details::OsxWindowPrivate; + + public: + OsxCursor(IUiApplication* ui_application, SystemCursorType cursor_type); + CRU_DELETE_COPY(OsxCursor) + CRU_DELETE_MOVE(OsxCursor) + + ~OsxCursor() override; + + private: + std::unique_ptr p_; +}; + +class OsxCursorManager : public OsxGuiResource, public virtual ICursorManager { + public: + explicit OsxCursorManager(IUiApplication* ui_application); + + CRU_DELETE_COPY(OsxCursorManager) + CRU_DELETE_MOVE(OsxCursorManager) + + ~OsxCursorManager() override; + + std::shared_ptr GetSystemCursor(SystemCursorType type) override; + + private: + std::unique_ptr p_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/InputMethod.h b/include/cru/platform/gui/osx/InputMethod.h new file mode 100644 index 00000000..cbfdae6c --- /dev/null +++ b/include/cru/platform/gui/osx/InputMethod.h @@ -0,0 +1,56 @@ +#pragma once +#include "Resource.h" + +#include "cru/platform/gui/InputMethod.h" + +namespace cru::platform::gui::osx { +class OsxWindow; + +namespace details { +class OsxWindowPrivate; +class OsxInputMethodContextPrivate; +} // namespace details + +class OsxInputMethodContext : public OsxGuiResource, + public virtual IInputMethodContext { + friend OsxWindow; + friend details::OsxWindowPrivate; + friend details::OsxInputMethodContextPrivate; + + public: + explicit OsxInputMethodContext(OsxWindow* window); + + CRU_DELETE_COPY(OsxInputMethodContext) + CRU_DELETE_MOVE(OsxInputMethodContext) + + ~OsxInputMethodContext() override; + + public: + bool ShouldManuallyDrawCompositionText() override; + + void EnableIME() override; + + void DisableIME() override; + + void CompleteComposition() override; + + void CancelComposition() override; + + CompositionText GetCompositionText() override; + + void SetCandidateWindowPosition(const Point& point) override; + + IEvent* CompositionStartEvent() override; + + IEvent* CompositionEndEvent() override; + + IEvent* CompositionEvent() override; + + IEvent* TextEvent() override; + + bool IsEnabled(); + + private: + std::unique_ptr p_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/Keyboard.h b/include/cru/platform/gui/osx/Keyboard.h new file mode 100644 index 00000000..89e0fa05 --- /dev/null +++ b/include/cru/platform/gui/osx/Keyboard.h @@ -0,0 +1,7 @@ +#pragma once +#include "cru/platform/gui/Keyboard.h" + +namespace cru::platform::gui::osx { +KeyCode KeyCodeFromOsxToCru(unsigned short n); +unsigned short KeyCodeFromCruToOsx(KeyCode k); +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/Menu.h b/include/cru/platform/gui/osx/Menu.h new file mode 100644 index 00000000..c5cc756a --- /dev/null +++ b/include/cru/platform/gui/osx/Menu.h @@ -0,0 +1,67 @@ +#pragma once +#include "Resource.h" + +#include "cru/platform/gui/Menu.h" + +namespace cru::platform::gui::osx { +namespace details { +struct OsxMenuItemPrivate; +struct OsxMenuPrivate; +} // namespace details + +class OsxMenu; + +class OsxMenuItem : public OsxGuiResource, public virtual IMenuItem { + friend OsxMenu; + friend details::OsxMenuPrivate; + + private: + explicit OsxMenuItem(IUiApplication* ui_application); + + public: + CRU_DELETE_COPY(OsxMenuItem) + CRU_DELETE_MOVE(OsxMenuItem) + + ~OsxMenuItem() override; + + public: + String GetTitle() override; + void SetTitle(String title) override; + bool IsEnabled() override; + void SetEnabled(bool enabled) override; + IMenu* GetParentMenu() override; + IMenu* GetSubmenu() override; + void SetKeyboardShortcut(KeyCode key, KeyModifier modifiers) override; + void DeleteKeyboardShortcut() override; + void SetOnClickHandler(std::function handler) override; + + private: + details::OsxMenuItemPrivate* p_; +}; + +class OsxMenu : public OsxGuiResource, public virtual IMenu { + friend OsxMenuItem; + friend details::OsxMenuPrivate; + friend details::OsxMenuItemPrivate; + + private: + explicit OsxMenu(IUiApplication* ui_application); + + public: + static OsxMenu* CreateOrGetApplicationMenu(IUiApplication* ui_application); + + CRU_DELETE_COPY(OsxMenu) + CRU_DELETE_MOVE(OsxMenu) + + ~OsxMenu() override; + + public: + IMenuItem* GetItemAt(int index) override; + int GetItemCount() override; + IMenuItem* CreateItemAt(int index) override; + void RemoveItemAt(int index) override; + + private: + details::OsxMenuPrivate* p_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/Resource.h b/include/cru/platform/gui/osx/Resource.h new file mode 100644 index 00000000..1eec7d09 --- /dev/null +++ b/include/cru/platform/gui/osx/Resource.h @@ -0,0 +1,24 @@ +#pragma once +#include "cru/platform/osx/Resource.h" + +#include "cru/platform/gui/Base.h" + +namespace cru::platform::gui::osx { +class OsxGuiResource : public platform::osx::OsxResource { + public: + explicit OsxGuiResource(IUiApplication* ui_application); + + CRU_DELETE_COPY(OsxGuiResource) + CRU_DELETE_MOVE(OsxGuiResource) + + ~OsxGuiResource() override = default; + + public: + String GetPlatformId() const override { return u"OSX GUI"; } + + IUiApplication* GetUiApplication() const { return ui_application_; } + + private: + IUiApplication* ui_application_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/UiApplication.h b/include/cru/platform/gui/osx/UiApplication.h new file mode 100644 index 00000000..2d2c119c --- /dev/null +++ b/include/cru/platform/gui/osx/UiApplication.h @@ -0,0 +1,64 @@ +#pragma once +#include "Resource.h" +#include "cru/platform/gui/UiApplication.h" + +#include +#include + +namespace cru::platform::gui::osx { +class OsxWindow; + +namespace details { +class OsxUiApplicationPrivate; +} + +class OsxUiApplication : public OsxGuiResource, public virtual IUiApplication { + friend details::OsxUiApplicationPrivate; + friend OsxWindow; + + public: + OsxUiApplication(); + + CRU_DELETE_COPY(OsxUiApplication) + CRU_DELETE_MOVE(OsxUiApplication) + + ~OsxUiApplication() override; + + 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; + + IMenu* GetApplicationMenu() override; + + std::optional ShowSaveDialog(SaveDialogOptions options) override; + + std::optional> ShowOpenDialog( + OpenDialogOptions options) override; + + private: + void UnregisterWindow(OsxWindow* window); + + std::unique_ptr p_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/Window.h b/include/cru/platform/gui/osx/Window.h new file mode 100644 index 00000000..6cefbe8e --- /dev/null +++ b/include/cru/platform/gui/osx/Window.h @@ -0,0 +1,90 @@ +#pragma once +#include "Resource.h" +#include "cru/platform/gui/Base.h" +#include "cru/platform/gui/InputMethod.h" +#include "cru/platform/gui/Window.h" + +#include + +namespace cru::platform::gui::osx { +namespace details { +class OsxWindowPrivate; +class OsxInputMethodContextPrivate; +} // namespace details + +class OsxUiApplication; +class OsxInputMethodContext; + +class OsxWindow : public OsxGuiResource, public INativeWindow { + friend details::OsxWindowPrivate; + friend details::OsxInputMethodContextPrivate; + + public: + OsxWindow(OsxUiApplication* ui_application); + + CRU_DELETE_COPY(OsxWindow) + CRU_DELETE_MOVE(OsxWindow) + + ~OsxWindow() override; + + public: + 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 cursor) override; + + void SetToForeground() override; + + void RequestRepaint() override; + + std::unique_ptr BeginPaint() override; + + IEvent* CreateEvent() override; + IEvent* DestroyEvent() override; + IEvent* PaintEvent() override; + + IEvent* VisibilityChangeEvent() override; + IEvent* ResizeEvent() override; + IEvent* FocusEvent() override; + + IEvent* MouseEnterLeaveEvent() override; + IEvent* MouseMoveEvent() override; + IEvent* MouseDownEvent() override; + IEvent* MouseUpEvent() override; + IEvent* MouseWheelEvent() override; + IEvent* KeyDownEvent() override; + IEvent* KeyUpEvent() override; + + IInputMethodContext* GetInputMethodContext() override; + + private: + std::unique_ptr p_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/osx/Convert.h b/include/cru/platform/osx/Convert.h new file mode 100644 index 00000000..bf32174a --- /dev/null +++ b/include/cru/platform/osx/Convert.h @@ -0,0 +1,2 @@ +#pragma once +#include "cru/common/platform/osx/Convert.h" diff --git a/include/cru/platform/osx/Exception.h b/include/cru/platform/osx/Exception.h new file mode 100644 index 00000000..c346b970 --- /dev/null +++ b/include/cru/platform/osx/Exception.h @@ -0,0 +1,3 @@ +#pragma once +#include "cru/common/platform/osx/Exception.h" +#include "cru/platform/Exception.h" diff --git a/include/cru/platform/osx/Resource.h b/include/cru/platform/osx/Resource.h new file mode 100644 index 00000000..d30ee31b --- /dev/null +++ b/include/cru/platform/osx/Resource.h @@ -0,0 +1,13 @@ +#pragma once +#include "cru/platform/Resource.h" + +namespace cru::platform::osx { +class OsxResource : public Object, public virtual IPlatformResource { + public: + CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(OsxResource) + CRU_DELETE_COPY(OsxResource) + CRU_DELETE_MOVE(OsxResource) + + String GetPlatformId() const override { return u"OSX"; } +}; +} // namespace cru::platform::osx -- cgit v1.2.3