aboutsummaryrefslogtreecommitdiff
path: root/src/ui/controls/scroll_control.hpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2018-11-25 22:57:07 +0800
committercrupest <crupest@outlook.com>2018-11-25 22:57:07 +0800
commit22322daf6f51da53740ff95ef2eaceed9a6efcae (patch)
tree06b17b482e2e15cb0692d05b279c61cbd6923b4d /src/ui/controls/scroll_control.hpp
parent5391e781e4682731721c841462904809bc618870 (diff)
downloadcru-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.hpp87
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;
};
}