aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/cru/common/String.hpp28
-rw-r--r--include/cru/osx/graphics/quartz/TextLayout.hpp18
-rw-r--r--include/cru/platform/graphics/TextLayout.hpp5
-rw-r--r--include/cru/ui/render/TextRenderObject.hpp3
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);