diff options
author | crupest <crupest@outlook.com> | 2018-10-04 01:47:49 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2018-10-04 01:47:49 +0800 |
commit | 01ab4511d3006e9f65ff96ae63b21de14b41bc48 (patch) | |
tree | e4fa991e7784571c164301ff7ade5aa1ef515744 /src/ui/controls | |
parent | 30ecda8bb354d5982978af97aa90b5f49d9ea195 (diff) | |
download | cru-01ab4511d3006e9f65ff96ae63b21de14b41bc48.tar.gz cru-01ab4511d3006e9f65ff96ae63b21de14b41bc48.tar.bz2 cru-01ab4511d3006e9f65ff96ae63b21de14b41bc48.zip |
...
Diffstat (limited to 'src/ui/controls')
-rw-r--r-- | src/ui/controls/border.cpp | 37 | ||||
-rw-r--r-- | src/ui/controls/border.h | 54 | ||||
-rw-r--r-- | src/ui/controls/border_delegate.cpp | 97 | ||||
-rw-r--r-- | src/ui/controls/border_delegate.h | 101 | ||||
-rw-r--r-- | src/ui/controls/button.cpp | 47 | ||||
-rw-r--r-- | src/ui/controls/button.h | 12 | ||||
-rw-r--r-- | src/ui/controls/linear_layout.cpp | 76 | ||||
-rw-r--r-- | src/ui/controls/linear_layout.h | 4 | ||||
-rw-r--r-- | src/ui/controls/margin_container.cpp | 35 | ||||
-rw-r--r-- | src/ui/controls/margin_container.h | 44 | ||||
-rw-r--r-- | src/ui/controls/text_box.cpp | 30 | ||||
-rw-r--r-- | src/ui/controls/text_box.h | 7 | ||||
-rw-r--r-- | src/ui/controls/text_control.cpp | 120 | ||||
-rw-r--r-- | src/ui/controls/text_control.h | 5 | ||||
-rw-r--r-- | src/ui/controls/toggle_button.cpp | 35 | ||||
-rw-r--r-- | src/ui/controls/toggle_button.h | 6 |
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, ¤t_anchor_length, rect](Control* control) + float current_main_side_anchor = 0; + ForeachChild([this, ¤t_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); |