aboutsummaryrefslogtreecommitdiff
path: root/src/ui/controls/border_delegate.cpp
blob: c8855e0f8437011541d49895e1e74f9c58fa344a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#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()
        );
    }
}