aboutsummaryrefslogtreecommitdiff
path: root/src/ui/controls/scroll_control.hpp
blob: c39b18f4f64c303e07d25e9e0d77fe1d431ab2da (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
#pragma once

#include "ui/control.hpp"

namespace cru::ui::controls
{
    // Done: OnMeasureContent
    // Done: OnLayoutContent
    // TODO: HitTest
    // TODO: Draw
    // TODO: ScrollBar
    // TODO: MouseEvent
    class ScrollControl : public Control
    {
    public:
        enum class ScrollBarVisibility
        {
            None,
            Auto,
            Always
        };

    protected:
        explicit ScrollControl(bool container);
    public:
        ScrollControl(const ScrollControl& other) = delete;
        ScrollControl(ScrollControl&& other) = delete;
        ScrollControl& operator=(const ScrollControl& other) = delete;
        ScrollControl& operator=(ScrollControl&& other) = delete;
        ~ScrollControl() override;


        bool IsHorizontalScrollEnabled() const
        {
            return horizontal_scroll_enabled_;
        }

        void SetHorizontalScrollEnabled(bool enable);

        bool IsVerticalScrollEnabled() const
        {
            return vertical_scroll_enabled_;
        }

        void SetVerticalScrollEnabled(bool enable);


        ScrollBarVisibility GetHorizontalScrollBarVisibility() const;
        void SetHorizontalScrollBarVisibility(ScrollBarVisibility visibility);
        ScrollBarVisibility GetVerticalScrollBarVisibility() const;
        void SetVerticalScrollBarVisibility(ScrollBarVisibility visibility);

        Control* HitTest(const Point& point) override final;

    protected:
        float GetViewWidth() const
        {
            return view_width_;
        }

        float GetViewHeight() const
        {
            return view_height_;
        }

        void SetViewWidth(float length);
        void SetViewHeight(float length);

        Size OnMeasureContent(const Size& available_size) override final;
        void OnLayoutContent(const Rect& rect) override final;

    private:
        bool horizontal_scroll_enabled_ = true;
        bool vertical_scroll_enabled_ = true;

        ScrollBarVisibility horizontal_scroll_bar_visibility_ = ScrollBarVisibility::Auto;
        ScrollBarVisibility vertical_scroll_bar_visibility_ = ScrollBarVisibility::Auto;

        float offset_x_ = 0.0f;
        float offset_y_ = 0.0f;

        float view_width_ = 0.0f;
        float view_height_ = 0.0f;
    };
}