diff options
author | crupest <crupest@outlook.com> | 2018-11-25 22:57:07 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2018-11-25 22:57:07 +0800 |
commit | 22322daf6f51da53740ff95ef2eaceed9a6efcae (patch) | |
tree | 06b17b482e2e15cb0692d05b279c61cbd6923b4d /src/ui/controls/scroll_control.hpp | |
parent | 5391e781e4682731721c841462904809bc618870 (diff) | |
download | cru-22322daf6f51da53740ff95ef2eaceed9a6efcae.tar.gz cru-22322daf6f51da53740ff95ef2eaceed9a6efcae.tar.bz2 cru-22322daf6f51da53740ff95ef2eaceed9a6efcae.zip |
Develop basic functions of ScrollControl.
Diffstat (limited to 'src/ui/controls/scroll_control.hpp')
-rw-r--r-- | src/ui/controls/scroll_control.hpp | 87 |
1 files changed, 79 insertions, 8 deletions
diff --git a/src/ui/controls/scroll_control.hpp b/src/ui/controls/scroll_control.hpp index c39b18f4..faf192ad 100644 --- a/src/ui/controls/scroll_control.hpp +++ b/src/ui/controls/scroll_control.hpp @@ -1,17 +1,34 @@ #pragma once +#include <optional> +#include <initializer_list> + #include "ui/control.hpp" namespace cru::ui::controls { // Done: OnMeasureContent // Done: OnLayoutContent - // TODO: HitTest - // TODO: Draw - // TODO: ScrollBar + // Done: HitTest(no need) + // Done: Draw(no need) + // Done: API + // Done: ScrollBar // TODO: MouseEvent class ScrollControl : public Control { + private: + struct ScrollBarInfo + { + Rect border = Rect(); + Rect bar = Rect(); + }; + + enum class Orientation + { + Horizontal, + Vertical + }; + public: enum class ScrollBarVisibility { @@ -20,6 +37,16 @@ namespace cru::ui::controls Always }; + static ScrollControl* Create(const std::initializer_list<Control*>& children = std::initializer_list<Control*>{}) + { + const auto control = new ScrollControl(true); + for (auto child : children) + control->AddChild(child); + return control; + } + + static constexpr auto control_type = L"ScrollControl"; + protected: explicit ScrollControl(bool container); public: @@ -29,6 +56,7 @@ namespace cru::ui::controls ScrollControl& operator=(ScrollControl&& other) = delete; ~ScrollControl() override; + StringView GetControlType() const override final; bool IsHorizontalScrollEnabled() const { @@ -45,14 +73,20 @@ namespace cru::ui::controls void SetVerticalScrollEnabled(bool enable); - ScrollBarVisibility GetHorizontalScrollBarVisibility() const; + ScrollBarVisibility GetHorizontalScrollBarVisibility() const + { + return horizontal_scroll_bar_visibility_; + } + void SetHorizontalScrollBarVisibility(ScrollBarVisibility visibility); - ScrollBarVisibility GetVerticalScrollBarVisibility() const; - void SetVerticalScrollBarVisibility(ScrollBarVisibility visibility); - Control* HitTest(const Point& point) override final; + ScrollBarVisibility GetVerticalScrollBarVisibility() const + { + return vertical_scroll_bar_visibility_; + } + + void SetVerticalScrollBarVisibility(ScrollBarVisibility visibility); - protected: float GetViewWidth() const { return view_width_; @@ -63,12 +97,40 @@ namespace cru::ui::controls return view_height_; } + float GetScrollOffsetX() const + { + return offset_x_; + } + + float GetScrollOffsetY() const + { + return offset_y_; + } + + // nullopt for not set. value is auto-coerced. + void SetScrollOffset(std::optional<float> x, std::optional<float> y); + + protected: void SetViewWidth(float length); void SetViewHeight(float length); Size OnMeasureContent(const Size& available_size) override final; void OnLayoutContent(const Rect& rect) override final; + void AfterLayoutSelf() override; + + void OnDrawForeground(ID2D1DeviceContext* device_context) override; + + void OnMouseDownCore(events::MouseButtonEventArgs& args) override final; + void OnMouseMoveCore(events::MouseEventArgs& args) override final; + void OnMouseUpCore(events::MouseButtonEventArgs& args) override final; + + private: + void CoerceAndSetOffsets(float offset_x, float offset_y, bool update_children = true); + void UpdateScrollBarVisibility(); + void UpdateScrollBarBorderInfo(); + void UpdateScrollBarBarInfo(); + private: bool horizontal_scroll_enabled_ = true; bool vertical_scroll_enabled_ = true; @@ -76,10 +138,19 @@ namespace cru::ui::controls ScrollBarVisibility horizontal_scroll_bar_visibility_ = ScrollBarVisibility::Auto; ScrollBarVisibility vertical_scroll_bar_visibility_ = ScrollBarVisibility::Auto; + bool is_horizontal_scroll_bar_visible_ = false; + bool is_vertical_scroll_bar_visible_ = false; + float offset_x_ = 0.0f; float offset_y_ = 0.0f; float view_width_ = 0.0f; float view_height_ = 0.0f; + + ScrollBarInfo horizontal_bar_info_; + ScrollBarInfo vertical_bar_info_; + + std::optional<Orientation> is_pressing_scroll_bar_ = std::nullopt; + float pressing_delta_ = 0.0f; }; } |