ShishGL  1.0
A simple modular cross-platform graphics library
UIScrollbar.hpp
Go to the documentation of this file.
1 /*============================================================================*/
2 #ifndef SHISHGL_UI_SCROLLBAR_HPP
3 #define SHISHGL_UI_SCROLLBAR_HPP
4 /*============================================================================*/
5 #include "Clickable.hpp"
6 #include "Slidable.hpp"
7 #include "UISlider.hpp"
8 #include "UIButton.hpp"
9 /*============================================================================*/
10 namespace Sh {
11 
12  class ScrollSlidable : public Slidable {
13  public:
14 
17  { }
18 
19  bool onMouseScroll(MouseScrollEvent& event) override {
20 
21  if (event.type() == Mouse::VERTICAL) {
22  slide(Vector2<double>{0, event.delta()});
23  Holdable::n_held = 0;
24  } else {
25  slide(Vector2<double>{event.delta(), 0});
26  Holdable::n_held = 0;
27  }
28 
29  return true;
30  }
31  };
32 
33  class ClickToScroll : public Holdable {
34  public:
35 
37  Mouse::ScrollType scroll_type,
38  double scroll_delta)
39  : Holdable(target)
40  , type(scroll_type)
41  , delta(scroll_delta)
42  { }
43 
44  void reactOnHold(TimerEvent&) override {
45  EventSystem::sendEvent<MouseScrollEvent>(target<Window>(),
46  target<Window>()->getPos(), delta, type);
47  }
48 
49  private:
50 
51  Mouse::ScrollType type;
52  double delta;
53  };
54 
55 
56  template <typename Behavior>
57  class UIVerticalScrollbar : public UIWindow {
58  public:
59 
60  template <typename... Args>
61  explicit UIVerticalScrollbar(const Frame& frame,
62  double slider_size_ratio,
63  Args&&... args)
64  : UIWindow(frame) {
65 
66  if (slider_size_ratio < 0.2) {
67  slider_size_ratio = 0.2;
68  } else if (slider_size_ratio > 1.0) {
69  slider_size_ratio = 1.0;
70  }
71 
72  Vector2<double> button_size = {frame.size.x, frame.size.x};
73 
74  up_button = attach<UIButton<ClickToScroll>>(
75  Frame{ {0, 0}, button_size },
76  Mouse::VERTICAL, -1.0
77  );
78 
79  down_button = attach<UIButton<ClickToScroll>>(
80  Frame{ {0, frame.size.y - button_size.y}, button_size },
81  Mouse::VERTICAL, 1.0
82  );
83 
84  double slide_len = frame.size.y - 2 * button_size.y;
85 
86  slider = attach<UIVerticalSlider<Behavior>>(
87  Frame{ {0, button_size.y}, {frame.size.x, slide_len} },
88  slide_len * slider_size_ratio, std::forward<Args>(args)...
89  );
90 
91  SubscriptionManager::subscribe(slider->slider->getBehavior(), up_button, MOUSE_SCROLL);
92  SubscriptionManager::subscribe(slider->slider->getBehavior(), down_button, MOUSE_SCROLL);
93  }
94 
98  };
99 
100  template <typename Behavior>
102  public:
103 
104  template <typename... Args>
105  explicit UIHorizontalScrollbar(const Frame& frame,
106  double slider_size_ratio,
107  Args&&... args)
108  : UIWindow(frame) {
109 
110  Vector2<double> button_size = {frame.size.y, frame.size.y};
111 
112  left_button = attach<UIButton<ClickToScroll>>(
113  Frame{ {0, 0}, button_size },
114  Mouse::HORIZONTAL, -1.0
115  );
116 
117  right_button = attach<UIButton<ClickToScroll>>(
118  Frame{ {frame.size.x - button_size.x, 0}, button_size },
119  Mouse::HORIZONTAL, 1.0
120  );
121 
122  double slide_len = frame.size.x - 2 * button_size.x;
123 
124  slider = attach<UIHorizontalSlider<Behavior>>(
125  Frame{ {button_size.x, 0}, {slide_len, frame.size.y} },
126  slide_len * slider_size_ratio, std::forward<Args>(args)...
127  );
128 
129  SubscriptionManager::subscribe(slider->slider->getBehavior(), left_button, MOUSE_SCROLL);
130  SubscriptionManager::subscribe(slider->slider->getBehavior(), right_button, MOUSE_SCROLL);
131  }
132 
136  };
137 
138 }
139 /*============================================================================*/
140 #endif //SHISHGL_UI_SCROLLBAR_HPP
141 /*============================================================================*/
Sh::Slidable
Definition: Slidable.hpp:11
Sh::UIHorizontalScrollbar::UIHorizontalScrollbar
UIHorizontalScrollbar(const Frame &frame, double slider_size_ratio, Args &&... args)
Definition: UIScrollbar.hpp:105
Sh::UIVerticalScrollbar::UIVerticalScrollbar
UIVerticalScrollbar(const Frame &frame, double slider_size_ratio, Args &&... args)
Definition: UIScrollbar.hpp:61
Sh::UIVerticalScrollbar::down_button
UIWindow * down_button
Definition: UIScrollbar.hpp:96
UISlider.hpp
Sh::ClickToScroll::ClickToScroll
ClickToScroll(UIWindow *target, Mouse::ScrollType scroll_type, double scroll_delta)
Definition: UIScrollbar.hpp:36
Sh::Vector2::x
T x
Definition: Vector2.hpp:10
Sh::Mouse::ScrollType
ScrollType
Definition: Mouse.hpp:21
Sh::Mouse::VERTICAL
@ VERTICAL
Definition: Mouse.hpp:22
Slidable.hpp
Sh::Frame
Definition: Frame.hpp:9
Sh::Vector2< double >
Sh::Mouse::HORIZONTAL
@ HORIZONTAL
Definition: Mouse.hpp:23
Sh::MouseScrollEvent::type
Mouse::ScrollType type() const
Definition: MouseEvent.cpp:73
Sh::ScrollSlidable
Definition: UIScrollbar.hpp:12
Sh::Vector2::y
T y
Definition: Vector2.hpp:10
Sh::UIHorizontalScrollbar
Definition: UIScrollbar.hpp:101
Sh::Behavior::target
SomeWindow * target() const
Definition: Behavior.hpp:17
Sh::UIVerticalScrollbar
Definition: UIScrollbar.hpp:57
Sh::UIWindow
Definition: UIWindow.hpp:16
Sh::ScrollSlidable::onMouseScroll
bool onMouseScroll(MouseScrollEvent &event) override
Definition: UIScrollbar.hpp:19
Clickable.hpp
Sh::TimerEvent
Definition: TimerEvent.hpp:11
Sh::UIHorizontalScrollbar::left_button
UIWindow * left_button
Definition: UIScrollbar.hpp:133
Sh::ClickToScroll::reactOnHold
void reactOnHold(TimerEvent &) override
Definition: UIScrollbar.hpp:44
Sh
Definition: CoreApplication.hpp:10
Sh::Holdable
Definition: Clickable.hpp:26
Sh::Holdable::n_held
uint8_t n_held
Definition: Clickable.hpp:45
Sh::UIVerticalScrollbar::slider
UIVerticalSlider< Behavior > * slider
Definition: UIScrollbar.hpp:97
Sh::UIVerticalScrollbar::up_button
UIWindow * up_button
Definition: UIScrollbar.hpp:95
Sh::UIHorizontalScrollbar::right_button
UIWindow * right_button
Definition: UIScrollbar.hpp:134
Sh::UIHorizontalSlider
Definition: UISlider.hpp:35
Sh::UIHorizontalScrollbar::slider
UIHorizontalSlider< Behavior > * slider
Definition: UIScrollbar.hpp:135
Sh::UIVerticalSlider
Definition: UISlider.hpp:13
Sh::ClickToScroll
Definition: UIScrollbar.hpp:33
Sh::MouseScrollEvent
Definition: MouseEvent.hpp:68
Sh::Frame::size
Vector2< double > size
Definition: Frame.hpp:12
Sh::ScrollSlidable::ScrollSlidable
ScrollSlidable(UIWindow *target, const Frame &frame)
Definition: UIScrollbar.hpp:15
Sh::SubscriptionManager::subscribe
static void subscribe(Listener *receiver, Listener *sender, EventMask mask)
Definition: SubscriptionManager.cpp:18
UIButton.hpp
Sh::Slidable::slide
void slide(const Vector2< double > &delta)
Definition: Slidable.hpp:77
Sh::Slidable::frame
Frame frame
Definition: Slidable.hpp:98