aboutsummaryrefslogtreecommitdiff
path: root/src/ui/controls
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2018-10-04 01:47:49 +0800
committercrupest <crupest@outlook.com>2018-10-04 01:47:49 +0800
commit01ab4511d3006e9f65ff96ae63b21de14b41bc48 (patch)
treee4fa991e7784571c164301ff7ade5aa1ef515744 /src/ui/controls
parent30ecda8bb354d5982978af97aa90b5f49d9ea195 (diff)
downloadcru-01ab4511d3006e9f65ff96ae63b21de14b41bc48.tar.gz
cru-01ab4511d3006e9f65ff96ae63b21de14b41bc48.tar.bz2
cru-01ab4511d3006e9f65ff96ae63b21de14b41bc48.zip
...
Diffstat (limited to 'src/ui/controls')
-rw-r--r--src/ui/controls/border.cpp37
-rw-r--r--src/ui/controls/border.h54
-rw-r--r--src/ui/controls/border_delegate.cpp97
-rw-r--r--src/ui/controls/border_delegate.h101
-rw-r--r--src/ui/controls/button.cpp47
-rw-r--r--src/ui/controls/button.h12
-rw-r--r--src/ui/controls/linear_layout.cpp76
-rw-r--r--src/ui/controls/linear_layout.h4
-rw-r--r--src/ui/controls/margin_container.cpp35
-rw-r--r--src/ui/controls/margin_container.h44
-rw-r--r--src/ui/controls/text_box.cpp30
-rw-r--r--src/ui/controls/text_box.h7
-rw-r--r--src/ui/controls/text_control.cpp120
-rw-r--r--src/ui/controls/text_control.h5
-rw-r--r--src/ui/controls/toggle_button.cpp35
-rw-r--r--src/ui/controls/toggle_button.h6
16 files changed, 66 insertions, 644 deletions
diff --git a/src/ui/controls/border.cpp b/src/ui/controls/border.cpp
deleted file mode 100644
index 1caed91d..00000000
--- a/src/ui/controls/border.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "border.h"
-
-#include "graph/graph.h"
-
-namespace cru::ui::controls
-{
- using graph::CreateSolidBrush;
-
- Border::Border() : Control(true), border_delegate_(this)
- {
-
- }
-
- void Border::SetDrawBorder(const bool draw_border)
- {
- draw_border_ = draw_border;
- Repaint();
- }
-
- void Border::OnDraw(ID2D1DeviceContext* device_context)
- {
- if (draw_border_)
- {
- border_delegate_.Draw(device_context, GetSize());
- }
- }
-
- Size Border::OnMeasure(const Size& available_size)
- {
- return Control::DefaultMeasureWithPadding(available_size, border_delegate_.GetBorderThickness());
- }
-
- void Border::OnLayout(const Rect& rect)
- {
- Control::DefaultLayoutWithPadding(rect, border_delegate_.GetBorderThickness());
- }
-}
diff --git a/src/ui/controls/border.h b/src/ui/controls/border.h
deleted file mode 100644
index 7880e690..00000000
--- a/src/ui/controls/border.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#pragma once
-
-#include <initializer_list>
-
-#include "ui/control.h"
-#include "border_delegate.h"
-
-namespace cru::ui::controls
-{
- class Border : public Control
- {
- public:
- static Border* Create(const std::initializer_list<Control*>& children = std::initializer_list<Control*>())
- {
- const auto border = new Border();
- for (const auto control : children)
- border->AddChild(control);
- return border;
- }
-
- protected:
- Border();
-
- public:
- Border(const Border& other) = delete;
- Border(Border&& other) = delete;
- Border& operator=(const Border& other) = delete;
- Border& operator=(Border&& other) = delete;
- ~Border() override = default;
-
- bool IsDrawBorder() const
- {
- return draw_border_;
- }
-
- void SetDrawBorder(bool draw_border);
-
- BorderProperty::Ptr GetBorderProperty() const
- {
- return border_delegate_.GetBorderProperty();
- }
-
- protected:
- void OnDraw(ID2D1DeviceContext* device_context) override;
-
- Size OnMeasure(const Size& available_size) override;
- void OnLayout(const Rect& rect) override;
-
- private:
- bool draw_border_ = true;
-
- BorderDelegate border_delegate_;
- };
-}
diff --git a/src/ui/controls/border_delegate.cpp b/src/ui/controls/border_delegate.cpp
deleted file mode 100644
index c8855e0f..00000000
--- a/src/ui/controls/border_delegate.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-#include "border_delegate.h"
-#include "graph/graph.h"
-
-namespace cru::ui::controls
-{
- BorderProperty::Ptr BorderProperty::Create()
- {
- return std::make_shared<BorderProperty>(graph::CreateSolidBrush(D2D1::ColorF(D2D1::ColorF::Black)));
- }
-
- BorderProperty::BorderProperty(Microsoft::WRL::ComPtr<ID2D1Brush> brush)
- : brush_(std::move(brush))
- {
-
- }
-
- void BorderProperty::SetBrush(Microsoft::WRL::ComPtr<ID2D1Brush> brush)
- {
- brush_ = std::move(brush);
- RaisePropertyChangedEvent(brush_property_name);
- }
-
- void BorderProperty::SetWidth(const float width)
- {
- width_ = width;
- RaisePropertyChangedEvent(width_property_name);
- }
-
- void BorderProperty::SetStrokeStyle(Microsoft::WRL::ComPtr<ID2D1StrokeStyle> stroke_style)
- {
- stroke_style_ = std::move(stroke_style);
- RaisePropertyChangedEvent(stroke_style_property_name);
- }
-
- void BorderProperty::SetRadiusX(const float radius_x)
- {
- radius_x_ = radius_x;
- RaisePropertyChangedEvent(radius_x_property_name);
- }
-
- void BorderProperty::SetRadiusY(const float radius_y)
- {
- radius_y_ = radius_y;
- RaisePropertyChangedEvent(radius_y_property_name);
- }
-
- BorderDelegate::BorderDelegate(Control* control)
- : BorderDelegate(control, BorderProperty::Create())
- {
-
- }
-
- BorderDelegate::BorderDelegate(Control* control, std::shared_ptr<BorderProperty> border_property)\
- : control_(control),
- border_property_changed_listener_(CreateFunctionPtr<void(String)>([this](String property_name)
- {
- if (property_name == BorderProperty::width_property_name)
- control_->InvalidateLayout();
- control_->Repaint();
- }))
- {
- border_property_ = std::move(border_property);
- border_property_->AddPropertyChangedListener(border_property_changed_listener_);
- }
-
- BorderDelegate::~BorderDelegate()
- {
- border_property_->RemovePropertyChangedListener(border_property_changed_listener_);
- }
-
- void BorderDelegate::SetBorderProperty(std::shared_ptr<BorderProperty> border_property)
- {
- border_property_->RemovePropertyChangedListener(border_property_changed_listener_);
- border_property_ = std::move(border_property);
- border_property_->AddPropertyChangedListener(border_property_changed_listener_);
- control_->Repaint();
- }
-
- void BorderDelegate::Draw(ID2D1DeviceContext* device_context, const Size& size) const
- {
- device_context->DrawRoundedRectangle(
- D2D1::RoundedRect(
- D2D1::RectF(
- border_property_->GetWidth() / 2.0f,
- border_property_->GetWidth() / 2.0f,
- size.width - border_property_->GetWidth(),
- size.height - border_property_->GetWidth()
- ),
- border_property_->GetRadiusX(),
- border_property_->GetRadiusY()
- ),
- border_property_->GetBrush().Get(),
- border_property_->GetWidth(),
- border_property_->GetStrokeStyle().Get()
- );
- }
-}
diff --git a/src/ui/controls/border_delegate.h b/src/ui/controls/border_delegate.h
deleted file mode 100644
index 6d8663e9..00000000
--- a/src/ui/controls/border_delegate.h
+++ /dev/null
@@ -1,101 +0,0 @@
-#pragma once
-
-#include "ui/control.h"
-
-namespace cru::ui::controls
-{
- class BorderProperty : public PropertyChangedNotifyObject
- {
- public:
- using Ptr = std::shared_ptr<BorderProperty>;
- static Ptr Create();
-
- constexpr static auto brush_property_name = L"Brush";
- constexpr static auto width_property_name = L"Width";
- constexpr static auto stroke_style_property_name = L"StrokeStyle";
- constexpr static auto radius_x_property_name = L"RadiusX";
- constexpr static auto radius_y_property_name = L"RadiusY";
-
- BorderProperty() = default;
- explicit BorderProperty(Microsoft::WRL::ComPtr<ID2D1Brush> brush);
- BorderProperty(const BorderProperty& other) = delete;
- BorderProperty(BorderProperty&& other) = delete;
- BorderProperty& operator=(const BorderProperty& other) = delete;
- BorderProperty& operator=(BorderProperty&& other) = delete;
- ~BorderProperty() override = default;
-
-
- Microsoft::WRL::ComPtr<ID2D1Brush> GetBrush() const
- {
- return brush_;
- }
-
- float GetWidth() const
- {
- return width_;
- }
-
- Microsoft::WRL::ComPtr<ID2D1StrokeStyle> GetStrokeStyle() const
- {
- return stroke_style_;
- }
-
- float GetRadiusX() const
- {
- return radius_x_;
- }
-
- float GetRadiusY() const
- {
- return radius_y_;
- }
-
- void SetBrush(Microsoft::WRL::ComPtr<ID2D1Brush> brush);
- void SetWidth(float width);
- void SetStrokeStyle(Microsoft::WRL::ComPtr<ID2D1StrokeStyle> stroke_style);
- void SetRadiusX(float radius_x);
- void SetRadiusY(float radius_y);
-
- private:
- Microsoft::WRL::ComPtr<ID2D1Brush> brush_ = nullptr;
- float width_ = 1.0f;
- Microsoft::WRL::ComPtr<ID2D1StrokeStyle> stroke_style_ = nullptr;
- float radius_x_ = 0.0f;
- float radius_y_ = 0.0f;
- };
-
-
- // BorderDelegate is a delegate for border painting and layout.
- // It must bind a control and not change the binding.
- // But multiple BorderDelegate may share a common BorderProperty.
- class BorderDelegate : public Object
- {
- public:
- explicit BorderDelegate(Control* control);
- BorderDelegate(Control* control, std::shared_ptr<BorderProperty> border_property);
- BorderDelegate(const BorderDelegate& other) = delete;
- BorderDelegate(BorderDelegate&& other) = delete;
- BorderDelegate& operator=(const BorderDelegate& other) = delete;
- BorderDelegate& operator=(BorderDelegate&& other) = delete;
- ~BorderDelegate() override;
-
- std::shared_ptr<BorderProperty> GetBorderProperty() const
- {
- return border_property_;
- }
-
- void SetBorderProperty(std::shared_ptr<BorderProperty> border_property);
-
- void Draw(ID2D1DeviceContext* device_context, const Size& size) const;
-
- Thickness GetBorderThickness() const
- {
- return Thickness(border_property_->GetWidth());
- }
-
- private:
- Control* control_;
- std::shared_ptr<BorderProperty> border_property_;
- FunctionPtr<void(String)> border_property_changed_listener_;
- };
-}
diff --git a/src/ui/controls/button.cpp b/src/ui/controls/button.cpp
index 2ecc9f14..db0b71c2 100644
--- a/src/ui/controls/button.cpp
+++ b/src/ui/controls/button.cpp
@@ -8,46 +8,31 @@ namespace cru::ui::controls
Button::Button() : Control(true)
{
- normal_border_border_ = BorderProperty::Create();
- normal_border_border_->SetBrush(CreateSolidBrush(D2D1::ColorF(D2D1::ColorF::RoyalBlue)));
- normal_border_border_->SetWidth(2);
- normal_border_border_->SetRadiusX(6);
- normal_border_border_->SetRadiusY(6);
-
- pressed_border_border_ = BorderProperty::Create();
- pressed_border_border_->SetBrush(CreateSolidBrush(D2D1::ColorF(D2D1::ColorF::Blue)));
- pressed_border_border_->SetWidth(2);
- pressed_border_border_->SetRadiusX(6);
- pressed_border_border_->SetRadiusY(6);
-
- border_delegate_ = std::make_unique<BorderDelegate>(this, normal_border_border_);
- }
-
- void Button::OnDraw(ID2D1DeviceContext* device_context)
- {
- Control::OnDraw(device_context);
- border_delegate_->Draw(device_context, GetSize());
- }
-
- Size Button::OnMeasure(const Size& available_size)
- {
- return Control::DefaultMeasureWithPadding(available_size, border_delegate_->GetBorderThickness());
- }
-
- void Button::OnLayout(const Rect& rect)
- {
- Control::DefaultLayoutWithPadding(rect, border_delegate_->GetBorderThickness());
+ normal_border_ = BorderProperty::Create();
+ normal_border_->SetBrush(CreateSolidBrush(D2D1::ColorF(D2D1::ColorF::RoyalBlue)));
+ normal_border_->SetWidth(2);
+ normal_border_->SetRadiusX(6);
+ normal_border_->SetRadiusY(6);
+
+ pressed_border_ = BorderProperty::Create();
+ pressed_border_->SetBrush(CreateSolidBrush(D2D1::ColorF(D2D1::ColorF::Blue)));
+ pressed_border_->SetWidth(2);
+ pressed_border_->SetRadiusX(6);
+ pressed_border_->SetRadiusY(6);
+
+ SetBordered(true);
+ SetBorderProperty(normal_border_);
}
void Button::OnMouseClickBegin(MouseButton button)
{
- border_delegate_->SetBorderProperty(pressed_border_border_);
+ SetBorderProperty(pressed_border_);
Repaint();
}
void Button::OnMouseClickEnd(MouseButton button)
{
- border_delegate_->SetBorderProperty(normal_border_border_);
+ SetBorderProperty(normal_border_);
Repaint();
}
}
diff --git a/src/ui/controls/button.h b/src/ui/controls/button.h
index 4b57a5a3..011f97d2 100644
--- a/src/ui/controls/button.h
+++ b/src/ui/controls/button.h
@@ -3,7 +3,6 @@
#include <initializer_list>
#include "ui/control.h"
-#include "border_delegate.h"
namespace cru::ui::controls
{
@@ -29,18 +28,11 @@ namespace cru::ui::controls
~Button() override = default;
protected:
- void OnDraw(ID2D1DeviceContext* device_context) override;
-
- Size OnMeasure(const Size& available_size) override;
- void OnLayout(const Rect& rect) override;
-
void OnMouseClickBegin(MouseButton button) override final;
void OnMouseClickEnd(MouseButton button) override final;
private:
- std::unique_ptr<BorderDelegate> border_delegate_;
-
- BorderProperty::Ptr normal_border_border_;
- BorderProperty::Ptr pressed_border_border_;
+ BorderProperty::Ptr normal_border_;
+ BorderProperty::Ptr pressed_border_;
};
}
diff --git a/src/ui/controls/linear_layout.cpp b/src/ui/controls/linear_layout.cpp
index 8f537ea8..681ed087 100644
--- a/src/ui/controls/linear_layout.cpp
+++ b/src/ui/controls/linear_layout.cpp
@@ -18,37 +18,9 @@ namespace cru::ui::controls
return Size(AtLeast0(size.width), AtLeast0(size.height));
}
- Size LinearLayout::OnMeasure(const Size& available_size)
+ Size LinearLayout::OnMeasureContent(const Size& available_size)
{
- const auto layout_params = GetLayoutParams();
-
- if (!layout_params->Validate())
- throw std::runtime_error("LayoutParams is not valid. Please check it.");
-
- auto&& get_available_length_for_child = [](const LayoutSideParams& layout_length, const float available_length) -> float
- {
- switch (layout_length.mode)
- {
- case MeasureMode::Exactly:
- {
- return std::min(layout_length.length, available_length);
- }
- case MeasureMode::Stretch:
- case MeasureMode::Content:
- {
- return available_length;
- }
- default:
- UnreachableCode();
- }
- };
-
- Size total_available_size_for_children(
- get_available_length_for_child(layout_params->width, available_size.width),
- get_available_length_for_child(layout_params->height, available_size.height)
- );
-
- auto rest_available_size_for_children = total_available_size_for_children;
+ auto rest_available_size_for_children = available_size;
float secondary_side_child_max_length = 0;
@@ -107,7 +79,7 @@ namespace cru::ui::controls
}
}
- auto actual_size_for_children = total_available_size_for_children;
+ auto actual_size_for_children = available_size;
if (orientation_ == Orientation::Horizontal)
{
actual_size_for_children.width -= rest_available_size_for_children.width;
@@ -119,36 +91,19 @@ namespace cru::ui::controls
actual_size_for_children.height -= rest_available_size_for_children.height;
}
- auto&& calculate_final_length = [](const LayoutSideParams& layout_length, const float length_for_children, const float max_child_length) -> float
- {
- switch (layout_length.mode)
- {
- case MeasureMode::Exactly:
- case MeasureMode::Stretch:
- return length_for_children;
- case MeasureMode::Content:
- return max_child_length;
- default:
- UnreachableCode();
- }
- };
-
- return Size(
- calculate_final_length(layout_params->width, total_available_size_for_children.width, actual_size_for_children.width),
- calculate_final_length(layout_params->height, total_available_size_for_children.height, actual_size_for_children.height)
- );
+ return actual_size_for_children;
}
- void LinearLayout::OnLayout(const Rect& rect)
+ void LinearLayout::OnLayoutContent(const Rect& rect)
{
- float current_anchor_length = 0;
- ForeachChild([this, &current_anchor_length, rect](Control* control)
+ float current_main_side_anchor = 0;
+ ForeachChild([this, &current_main_side_anchor, rect](Control* control)
{
const auto layout_params = control->GetLayoutParams();
- const auto size = control->GetDesiredSize();
+ const auto size = control->GetSize();
const auto alignment = orientation_ == Orientation::Horizontal ? layout_params->height.alignment : layout_params->width.alignment;
- auto&& calculate_anchor = [alignment](const float layout_length, const float control_length) -> float
+ auto&& calculate_secondary_side_anchor = [alignment](const float layout_length, const float control_length) -> float
{
switch (alignment)
{
@@ -163,15 +118,20 @@ namespace cru::ui::controls
}
};
+ auto&& calculate_rect = [rect, size](const float anchor_left, const float anchor_top)
+ {
+ return Rect(Point(rect.left + anchor_left, rect.top + anchor_top), size);
+ };
+
if (orientation_ == Orientation::Horizontal)
{
- control->Layout(Rect(Point(current_anchor_length, calculate_anchor(rect.height, size.height)), size));
- current_anchor_length += size.width;
+ control->Layout(calculate_rect(current_main_side_anchor, calculate_secondary_side_anchor(rect.height, size.height)));
+ current_main_side_anchor += size.width;
}
else
{
- control->Layout(Rect(Point(calculate_anchor(rect.width, size.width), current_anchor_length), size));
- current_anchor_length += size.height;
+ control->Layout(calculate_rect(calculate_secondary_side_anchor(rect.width, size.width), current_main_side_anchor));
+ current_main_side_anchor += size.height;
}
});
}
diff --git a/src/ui/controls/linear_layout.h b/src/ui/controls/linear_layout.h
index 369824d4..997f28ea 100644
--- a/src/ui/controls/linear_layout.h
+++ b/src/ui/controls/linear_layout.h
@@ -32,8 +32,8 @@ namespace cru::ui::controls
~LinearLayout() override = default;
protected:
- Size OnMeasure(const Size& available_size) override;
- void OnLayout(const Rect& rect) override;
+ Size OnMeasureContent(const Size& available_size) override;
+ void OnLayoutContent(const Rect& rect) override;
private:
Orientation orientation_;
diff --git a/src/ui/controls/margin_container.cpp b/src/ui/controls/margin_container.cpp
deleted file mode 100644
index 12dde025..00000000
--- a/src/ui/controls/margin_container.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-#include "margin_container.h"
-
-namespace cru::ui::controls
-{
- inline float AtLeast0(const float value)
- {
- return value < 0 ? 0 : value;
- }
-
- inline Size AtLeast0(const Size& size)
- {
- return Size(AtLeast0(size.width), AtLeast0(size.height));
- }
-
- MarginContainer::MarginContainer(const Thickness& margin)
- : Control(true), margin_(margin)
- {
- }
-
- void MarginContainer::SetMargin(const Thickness& margin)
- {
- margin_ = margin;
- InvalidateLayout();
- }
-
- Size MarginContainer::OnMeasure(const Size& available_size)
- {
- return DefaultMeasureWithPadding(available_size, margin_);
- }
-
- void MarginContainer::OnLayout(const Rect& rect)
- {
- DefaultLayoutWithPadding(rect, margin_);
- }
-}
diff --git a/src/ui/controls/margin_container.h b/src/ui/controls/margin_container.h
deleted file mode 100644
index 0eafc40e..00000000
--- a/src/ui/controls/margin_container.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#pragma once
-
-#include <initializer_list>
-
-#include "ui/control.h"
-
-namespace cru::ui::controls
-{
- class MarginContainer : public Control
- {
- public:
- static MarginContainer* Create(const Thickness& margin = Thickness::Zero(), const std::initializer_list<Control*>& children = std::initializer_list<Control*>())
- {
- const auto margin_container = new MarginContainer(margin);
- for (const auto control : children)
- margin_container->AddChild(control);
- return margin_container;
- }
-
- protected:
- explicit MarginContainer(const Thickness& margin);
-
- public:
- MarginContainer(const MarginContainer& other) = delete;
- MarginContainer(MarginContainer&& other) = delete;
- MarginContainer& operator=(const MarginContainer& other) = delete;
- MarginContainer& operator=(MarginContainer&& other) = delete;
- ~MarginContainer() override = default;
-
- Thickness GetMargin() const
- {
- return margin_;
- }
-
- void SetMargin(const Thickness& margin);
-
- protected:
- Size OnMeasure(const Size& available_size) override;
- void OnLayout(const Rect& rect) override;
-
- private:
- Thickness margin_;
- };
-}
diff --git a/src/ui/controls/text_box.cpp b/src/ui/controls/text_box.cpp
index 0d65f1ad..30b9069a 100644
--- a/src/ui/controls/text_box.cpp
+++ b/src/ui/controls/text_box.cpp
@@ -27,27 +27,22 @@ namespace cru::ui::controls
Repaint();
});
- border_delegate_ = std::make_unique<BorderDelegate>(this);
+ SetBordered(true);
}
TextBox::~TextBox() = default;
- void TextBox::OnDraw(ID2D1DeviceContext* device_context)
+ void TextBox::OnDrawContent(ID2D1DeviceContext* device_context)
{
- border_delegate_->Draw(device_context, GetSize());
- const auto border_thickness = border_delegate_->GetBorderThickness();
- graph::WithTransform(device_context, D2D1::Matrix3x2F::Translation(border_thickness.left, border_thickness.top), [this](ID2D1DeviceContext* device_context)
+ TextControl::OnDrawContent(device_context);
+ if (is_caret_show_)
{
- TextControl::OnDraw(device_context);
- if (is_caret_show_)
- {
- const auto caret_half_width = Application::GetInstance()->GetCaretInfo().half_caret_width;
- FLOAT x, y;
- DWRITE_HIT_TEST_METRICS metrics{};
- ThrowIfFailed(text_layout_->HitTestTextPosition(caret_position_, FALSE, &x, &y, &metrics));
- device_context->FillRectangle(D2D1::RectF(metrics.left - caret_half_width, metrics.top, metrics.left + caret_half_width, metrics.top + metrics.height), caret_brush_.Get());
- }
- });
+ const auto caret_half_width = Application::GetInstance()->GetCaretInfo().half_caret_width;
+ FLOAT x, y;
+ DWRITE_HIT_TEST_METRICS metrics{};
+ ThrowIfFailed(text_layout_->HitTestTextPosition(caret_position_, FALSE, &x, &y, &metrics));
+ device_context->FillRectangle(D2D1::RectF(metrics.left - caret_half_width, metrics.top, metrics.left + caret_half_width, metrics.top + metrics.height), caret_brush_.Get());
+ }
}
void TextBox::OnGetFocusCore(events::FocusChangeEventArgs& args)
@@ -138,11 +133,6 @@ namespace cru::ui::controls
}
}
- Size TextBox::OnMeasure(const Size& available_size)
- {
- return TextMeasureWithPadding(available_size, border_delegate_->GetBorderThickness());
- }
-
void TextBox::RequestChangeCaretPosition(const unsigned position)
{
caret_position_ = position;
diff --git a/src/ui/controls/text_box.h b/src/ui/controls/text_box.h
index a6e4566d..540ac758 100644
--- a/src/ui/controls/text_box.h
+++ b/src/ui/controls/text_box.h
@@ -2,7 +2,6 @@
#include "text_control.h"
#include "timer.h"
-#include "border_delegate.h"
namespace cru::ui::controls
{
@@ -29,7 +28,7 @@ namespace cru::ui::controls
~TextBox() override;
protected:
- void OnDraw(ID2D1DeviceContext* device_context) override;
+ void OnDrawContent(ID2D1DeviceContext* device_context) override;
void OnGetFocusCore(events::FocusChangeEventArgs& args) override final;
void OnLoseFocusCore(events::FocusChangeEventArgs& args) override final;
@@ -37,8 +36,6 @@ namespace cru::ui::controls
void OnKeyDownCore(events::KeyEventArgs& args) override final;
void OnCharCore(events::CharEventArgs& args) override final;
- Size OnMeasure(const Size& available_size) override;
-
void RequestChangeCaretPosition(unsigned position) override;
private:
@@ -47,7 +44,5 @@ namespace cru::ui::controls
ActionPtr caret_action_;
Microsoft::WRL::ComPtr<ID2D1Brush> caret_brush_;
bool is_caret_show_ = false;
-
- std::unique_ptr<BorderDelegate> border_delegate_;
};
}
diff --git a/src/ui/controls/text_control.cpp b/src/ui/controls/text_control.cpp
index 0b730500..da0113f3 100644
--- a/src/ui/controls/text_control.cpp
+++ b/src/ui/controls/text_control.cpp
@@ -130,9 +130,9 @@ namespace cru::ui::controls
}
}
}
- void TextControl::OnDraw(ID2D1DeviceContext* device_context)
+ void TextControl::OnDrawContent(ID2D1DeviceContext* device_context)
{
- Control::OnDraw(device_context);
+ Control::OnDrawContent(device_context);
DrawSelectionRect(device_context, text_layout_.Get(), selection_brush_.Get(), selected_range_);
device_context->DrawTextLayout(D2D1::Point2F(), text_layout_.Get(), brush_.Get());
}
@@ -207,103 +207,10 @@ namespace cru::ui::controls
}
- Size TextControl::OnMeasure(const Size& available_size)
+ Size TextControl::OnMeasureContent(const Size& available_size)
{
- const auto layout_params = GetLayoutParams();
-
- auto&& get_measure_length = [](const LayoutSideParams& layout_length, const float available_length) -> float
- {
- switch (layout_length.mode)
- {
- case MeasureMode::Exactly:
- {
- return std::min(layout_length.length, available_length);
- }
- case MeasureMode::Stretch:
- case MeasureMode::Content:
- {
- return available_length;
- }
- default:
- UnreachableCode();
- }
- };
-
- const Size measure_size(get_measure_length(layout_params->width, available_size.width),
- get_measure_length(layout_params->height, available_size.height));
-
- ThrowIfFailed(text_layout_->SetMaxWidth(measure_size.width));
- ThrowIfFailed(text_layout_->SetMaxHeight(measure_size.height));
-
- DWRITE_TEXT_METRICS metrics{};
-
- ThrowIfFailed(text_layout_->GetMetrics(&metrics));
-
- const Size measure_result(metrics.width, metrics.height);
-
- auto&& calculate_final_length = [](const LayoutSideParams& layout_length, const float measure_length, const float measure_result_length) -> float
- {
- if ((layout_length.mode == MeasureMode::Stretch ||
- layout_length.mode == MeasureMode::Exactly)
- && measure_result_length < measure_length)
- return measure_length;
- else
- return measure_result_length;
- };
-
- const Size result_size(
- calculate_final_length(layout_params->width, measure_size.width, measure_result.width),
- calculate_final_length(layout_params->height, measure_size.height, measure_result.height)
- );
-
- return result_size;
- }
-
- inline Size ThicknessToSize(const Thickness& thickness)
- {
- return Size(thickness.left + thickness.right, thickness.top + thickness.bottom);
- }
-
- inline float AtLeast0(const float value)
- {
- return value < 0 ? 0 : value;
- }
-
- inline Size AtLeast0(const Size& size)
- {
- return Size(AtLeast0(size.width), AtLeast0(size.height));
- }
-
- Size TextControl::TextMeasureWithPadding(const Size& available_size, const Thickness& padding)
- {
- const auto layout_params = GetLayoutParams();
- const auto padding_size = ThicknessToSize(padding);
-
- auto&& get_measure_length = [](const LayoutSideParams& layout_length, const float available_length) -> float
- {
- switch (layout_length.mode)
- {
- case MeasureMode::Exactly:
- {
- return std::min(layout_length.length, available_length);
- }
- case MeasureMode::Stretch:
- case MeasureMode::Content:
- {
- return available_length;
- }
- default:
- UnreachableCode();
- }
- };
-
- Size measure_size(get_measure_length(layout_params->width, available_size.width),
- get_measure_length(layout_params->height, available_size.height));
-
- measure_size = AtLeast0(measure_size - padding_size);
-
- ThrowIfFailed(text_layout_->SetMaxWidth(measure_size.width));
- ThrowIfFailed(text_layout_->SetMaxHeight(measure_size.height));
+ ThrowIfFailed(text_layout_->SetMaxWidth(available_size.width));
+ ThrowIfFailed(text_layout_->SetMaxHeight(available_size.height));
DWRITE_TEXT_METRICS metrics{};
@@ -311,22 +218,7 @@ namespace cru::ui::controls
const Size measure_result(metrics.width, metrics.height);
- auto&& calculate_final_length = [](const LayoutSideParams& layout_length, const float measure_length, const float measure_result_length) -> float
- {
- if ((layout_length.mode == MeasureMode::Stretch ||
- layout_length.mode == MeasureMode::Exactly)
- && measure_result_length < measure_length)
- return measure_length;
- else
- return measure_result_length;
- };
-
- const Size result_size(
- calculate_final_length(layout_params->width, measure_size.width, measure_result.width),
- calculate_final_length(layout_params->height, measure_size.height, measure_result.height)
- );
-
- return result_size + padding_size;
+ return measure_result;
}
void TextControl::RequestChangeCaretPosition(unsigned position)
diff --git a/src/ui/controls/text_control.h b/src/ui/controls/text_control.h
index 2ead7c54..01bb5565 100644
--- a/src/ui/controls/text_control.h
+++ b/src/ui/controls/text_control.h
@@ -68,7 +68,7 @@ namespace cru::ui::controls
protected:
void OnSizeChangedCore(events::SizeChangedEventArgs& args) override final;
- void OnDraw(ID2D1DeviceContext* device_context) override;
+ void OnDrawContent(ID2D1DeviceContext* device_context) override;
void OnMouseDownCore(events::MouseButtonEventArgs& args) override final;
void OnMouseMoveCore(events::MouseEventArgs& args) override final;
@@ -76,9 +76,8 @@ namespace cru::ui::controls
void OnLoseFocusCore(events::FocusChangeEventArgs& args) override;
- Size OnMeasure(const Size& available_size) override;
+ Size OnMeasureContent(const Size& available_size) override;
- Size TextMeasureWithPadding(const Size& available_size, const Thickness& padding);
virtual void RequestChangeCaretPosition(unsigned position);
diff --git a/src/ui/controls/toggle_button.cpp b/src/ui/controls/toggle_button.cpp
index 68bd0fc9..3cd5d3ef 100644
--- a/src/ui/controls/toggle_button.cpp
+++ b/src/ui/controls/toggle_button.cpp
@@ -1,4 +1,4 @@
-#include "toggle_button.h"
+#include "toggle_button.h"
#include <fmt/format.h>
@@ -83,9 +83,9 @@ namespace cru::ui::controls
}
- void ToggleButton::OnDraw(ID2D1DeviceContext* device_context)
+ void ToggleButton::OnDrawContent(ID2D1DeviceContext* device_context)
{
- Control::OnDraw(device_context);
+ Control::OnDrawContent(device_context);
const auto size = GetSize();
graph::WithTransform(device_context, D2D1::Matrix3x2F::Translation(size.width / 2, size.height / 2), [this](ID2D1DeviceContext* device_context)
{
@@ -108,34 +108,11 @@ namespace cru::ui::controls
Toggle();
}
- Size ToggleButton::OnMeasure(const Size& available_size)
+ Size ToggleButton::OnMeasureContent(const Size& available_size)
{
- const auto layout_params = GetLayoutParams();
-
- auto&& get_measure_length = [](const LayoutSideParams& layout_length, const float available_length, const float fix_length) -> float
- {
- switch (layout_length.mode)
- {
- case MeasureMode::Exactly:
- {
- return std::max(std::min(layout_length.length, available_length), fix_length);
- }
- case MeasureMode::Stretch:
- {
- return std::max(available_length, fix_length);
- }
- case MeasureMode::Content:
- {
- return fix_length;
- }
- default:
- UnreachableCode();
- }
- };
-
const Size result_size(
- get_measure_length(layout_params->width, available_size.width, half_width * 2 + stroke_width),
- get_measure_length(layout_params->height, available_size.height, half_height * 2 + stroke_width)
+ half_width * 2 + stroke_width,
+ half_height * 2 + stroke_width
);
return result_size;
diff --git a/src/ui/controls/toggle_button.h b/src/ui/controls/toggle_button.h
index d496f21a..90bbd49b 100644
--- a/src/ui/controls/toggle_button.h
+++ b/src/ui/controls/toggle_button.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
#include "ui/control.h"
@@ -40,11 +40,11 @@ namespace cru::ui::controls
virtual void OnToggle(events::ToggleEventArgs& args);
protected:
- void OnDraw(ID2D1DeviceContext* device_context) override;
+ void OnDrawContent(ID2D1DeviceContext* device_context) override;
void OnMouseClickCore(events::MouseButtonEventArgs& args) override;
- Size OnMeasure(const Size& available_size) override;
+ Size OnMeasureContent(const Size& available_size) override;
private:
void RaiseToggleEvent(bool new_state);