diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/cru/common/String.hpp | 28 | ||||
-rw-r--r-- | include/cru/osx/graphics/quartz/TextLayout.hpp | 18 | ||||
-rw-r--r-- | include/cru/platform/graphics/TextLayout.hpp | 5 | ||||
-rw-r--r-- | include/cru/ui/render/TextRenderObject.hpp | 3 |
4 files changed, 39 insertions, 15 deletions
diff --git a/include/cru/common/String.hpp b/include/cru/common/String.hpp index 264a44ff..4dab5b5a 100644 --- a/include/cru/common/String.hpp +++ b/include/cru/common/String.hpp @@ -132,18 +132,20 @@ class CRU_BASE_API String { const_iterator end() const { return this->buffer_ + this->size_; } const_iterator cend() const { return this->buffer_ + this->size_; } - reverse_iterator rbegin() { return reverse_iterator{begin()}; } + reverse_iterator rbegin() { return reverse_iterator{end()}; } const_reverse_iterator rbegin() const { - return const_reverse_iterator{begin()}; + return const_reverse_iterator{end()}; } const_reverse_iterator crbegin() const { - return const_reverse_iterator{cbegin()}; + return const_reverse_iterator{cend()}; } - reverse_iterator rend() { return reverse_iterator{end()}; } - const_reverse_iterator rend() const { return const_reverse_iterator{end()}; } + reverse_iterator rend() { return reverse_iterator{begin()}; } + const_reverse_iterator rend() const { + return const_reverse_iterator{begin()}; + } const_reverse_iterator crend() const { - return const_reverse_iterator{cend()}; + return const_reverse_iterator{cbegin()}; } public: @@ -246,18 +248,20 @@ class CRU_BASE_API StringView { const_iterator end() const { return this->ptr_ + this->size_; } const_iterator cend() const { return this->ptr_ + this->size_; } - reverse_iterator rbegin() { return reverse_iterator{begin()}; } + reverse_iterator rbegin() { return reverse_iterator{end()}; } const_reverse_iterator rbegin() const { - return const_reverse_iterator{begin()}; + return const_reverse_iterator{end()}; } const_reverse_iterator crbegin() const { - return const_reverse_iterator{cbegin()}; + return const_reverse_iterator{cend()}; } - reverse_iterator rend() { return reverse_iterator{end()}; } - const_reverse_iterator rend() const { return const_reverse_iterator{end()}; } + reverse_iterator rend() { return reverse_iterator{begin()}; } + const_reverse_iterator rend() const { + return const_reverse_iterator{begin()}; + } const_reverse_iterator crend() const { - return const_reverse_iterator{cend()}; + return const_reverse_iterator{cbegin()}; } StringView substr(Index pos); diff --git a/include/cru/osx/graphics/quartz/TextLayout.hpp b/include/cru/osx/graphics/quartz/TextLayout.hpp index 35bcc32d..b9bf5e44 100644 --- a/include/cru/osx/graphics/quartz/TextLayout.hpp +++ b/include/cru/osx/graphics/quartz/TextLayout.hpp @@ -28,6 +28,9 @@ class OsxCTTextLayout : public OsxQuartzResource, public virtual ITextLayout { void SetMaxWidth(float max_width) override; void SetMaxHeight(float max_height) override; + bool IsEditMode() override; + void SetEditMode(bool enable) override; + Rect GetTextBounds(bool includingTrailingSpace = false) override; std::vector<Rect> TextRangeRect(const TextRange& text_range) override; Rect TextSinglePoint(Index position, bool trailing) override; @@ -45,17 +48,22 @@ class OsxCTTextLayout : public OsxQuartzResource, public virtual ITextLayout { void ReleaseResource(); void RecreateFrame(); - Rect DoGetTextBounds(bool includingTrailingSpace = false); - std::vector<Rect> DoTextRangeRect(const TextRange& text_range); - Rect DoTextSinglePoint(Index position, bool trailing); + CGRect DoGetTextBounds(bool includingTrailingSpace = false); + CGRect DoGetTextBoundsIncludingEmptyLines( + bool includingTrailingSpace = false); + std::vector<CGRect> DoTextRangeRect(const TextRange& text_range); + CGRect DoTextSinglePoint(Index position, bool trailing); private: float max_width_; float max_height_; + bool edit_mode_; + std::shared_ptr<OsxCTFont> font_; String text_; + String actual_text_; CFMutableAttributedStringRef cf_attributed_text_; CTFramesetterRef ct_framesetter_ = nullptr; @@ -64,6 +72,10 @@ class OsxCTTextLayout : public OsxQuartzResource, public virtual ITextLayout { int line_count_; std::vector<CGPoint> line_origins_; std::vector<CTLineRef> lines_; + // 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_; Matrix transform_; }; diff --git a/include/cru/platform/graphics/TextLayout.hpp b/include/cru/platform/graphics/TextLayout.hpp index 5f98696d..d10c9f22 100644 --- a/include/cru/platform/graphics/TextLayout.hpp +++ b/include/cru/platform/graphics/TextLayout.hpp @@ -5,6 +5,8 @@ #include <vector> namespace cru::platform::graphics { +// Requirement: +// All text must be left-top aligned. struct ITextLayout : virtual IGraphicsResource { virtual String GetText() = 0; virtual void SetText(String new_text) = 0; @@ -15,6 +17,9 @@ struct ITextLayout : virtual IGraphicsResource { virtual void SetMaxWidth(float max_width) = 0; virtual void SetMaxHeight(float max_height) = 0; + virtual bool IsEditMode() = 0; + virtual void SetEditMode(bool enable) = 0; + virtual Rect GetTextBounds(bool includingTrailingSpace = false) = 0; virtual std::vector<Rect> TextRangeRect(const TextRange& text_range) = 0; // Width is always 0, height is line height. diff --git a/include/cru/ui/render/TextRenderObject.hpp b/include/cru/ui/render/TextRenderObject.hpp index 68d2d0ce..d6395f85 100644 --- a/include/cru/ui/render/TextRenderObject.hpp +++ b/include/cru/ui/render/TextRenderObject.hpp @@ -42,6 +42,9 @@ class TextRenderObject : public RenderObject { std::shared_ptr<platform::graphics::IFont> GetFont() const; void SetFont(std::shared_ptr<platform::graphics::IFont> font); + bool IsEditMode(); + void SetEditMode(bool enable); + std::vector<Rect> TextRangeRect(const TextRange& text_range); Rect TextSinglePoint(gsl::index position, bool trailing); platform::graphics::TextHitTestResult TextHitTest(const Point& point); |