aboutsummaryrefslogtreecommitdiff
path: root/CruUI/ui/controls/text_block.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2018-09-23 23:08:54 +0800
committercrupest <crupest@outlook.com>2018-09-23 23:08:54 +0800
commitbe84ddd03d3b59c0c27aa538d5ef5129f94d511c (patch)
tree66448a2559b216352cca5ee28a470cbc8fb9c08a /CruUI/ui/controls/text_block.cpp
parent800c98a732f82df09a98fddba91eddb5d675318d (diff)
downloadcru-be84ddd03d3b59c0c27aa538d5ef5129f94d511c.tar.gz
cru-be84ddd03d3b59c0c27aa538d5ef5129f94d511c.tar.bz2
cru-be84ddd03d3b59c0c27aa538d5ef5129f94d511c.zip
Add keyboard events to control.
Diffstat (limited to 'CruUI/ui/controls/text_block.cpp')
-rw-r--r--CruUI/ui/controls/text_block.cpp37
1 files changed, 16 insertions, 21 deletions
diff --git a/CruUI/ui/controls/text_block.cpp b/CruUI/ui/controls/text_block.cpp
index f0ef41d9..4ecbb672 100644
--- a/CruUI/ui/controls/text_block.cpp
+++ b/CruUI/ui/controls/text_block.cpp
@@ -20,12 +20,11 @@ namespace cru
TextBlock::TextBlock(const Microsoft::WRL::ComPtr<IDWriteTextFormat>& init_text_format,
const Microsoft::WRL::ComPtr<ID2D1Brush>& init_brush) : Control(false)
{
- text_format_ = init_text_format;
+ text_format_ = init_text_format == nullptr ? graph::CreateDefaultTextFormat() : init_text_format;
- if (init_brush == nullptr)
- brush_ = CreateSolidBrush(D2D1::ColorF(D2D1::ColorF::Black));
- else
- brush_ = init_brush;
+ RecreateTextLayout();
+
+ brush_ = init_brush == nullptr ? CreateSolidBrush(D2D1::ColorF(D2D1::ColorF::Black)) : init_brush;
selection_brush_ = CreateSolidBrush(D2D1::ColorF(D2D1::ColorF::LightSkyBlue));
}
@@ -126,15 +125,18 @@ namespace cru
}
}
- std::optional<unsigned> TextLayoutHitTest(IDWriteTextLayout* text_layout, const Point& point, bool test_inside = true)
+ namespace
{
- BOOL is_trailing, is_inside;
- DWRITE_HIT_TEST_METRICS metrics{};
- text_layout->HitTestPoint(point.x, point.y, &is_trailing, &is_inside, &metrics);
- if (!test_inside || is_inside)
- return is_trailing == 0 ? metrics.textPosition : metrics.textPosition + 1;
- else
- return std::nullopt;
+ std::optional<unsigned> TextLayoutHitTest(IDWriteTextLayout* text_layout, const Point& point, const bool test_inside = true)
+ {
+ BOOL is_trailing, is_inside;
+ DWRITE_HIT_TEST_METRICS metrics{};
+ text_layout->HitTestPoint(point.x, point.y, &is_trailing, &is_inside, &metrics);
+ if (!test_inside || is_inside)
+ return is_trailing == 0 ? metrics.textPosition : metrics.textPosition + 1;
+ else
+ return std::nullopt;
+ }
}
void TextBlock::OnMouseDownCore(events::MouseButtonEventArgs& args)
@@ -264,17 +266,10 @@ namespace cru
void TextBlock::RecreateTextLayout()
{
- if (text_.empty())
- {
- text_layout_ = nullptr;
- return;
- }
+ assert(text_format_ != nullptr);
const auto dwrite_factory = GetDWriteFactory();
- if (text_format_ == nullptr)
- text_format_ = graph::CreateDefaultTextFormat();
-
const auto&& size = GetSize();
ThrowIfFailed(dwrite_factory->CreateTextLayout(