1#include <ciso646>
2#include "PanZoomTracker.hpp"
3
4/////////////////////////////////
5// PanZoomTracker methods
6void
7PanZoomTracker::
8handle_down(const fastuidraw::vec2 &pos)
9{
10 m_zoom_time.restart();
11 m_button_down = true;
12 m_zoom_pivot = pos;
13 m_start_gesture = m_transformation;
14}
15
16void
17PanZoomTracker::
18handle_up(void)
19{
20 m_is_zooming = false;
21 m_button_down = false;
22}
23
24
25void
26PanZoomTracker::
27handle_motion(const fastuidraw::vec2 &pos, const fastuidraw::vec2 &delta)
28{
29 if (!m_button_down)
30 {
31 return;
32 }
33
34 if (m_zoom_time.elapsed() > m_zoom_gesture_begin_time)
35 {
36 m_is_zooming = true;
37 }
38
39 float zdivide(m_scale_zooming * m_zoom_divider);
40
41 if (!m_is_zooming)
42 {
43 float zdx(pos.x() - m_zoom_pivot.x());
44 float zdy(pos.y() - m_zoom_pivot.y());
45
46 m_transformation.translation( m_transformation.translation() + delta);
47
48 if (fastuidraw::t_abs(zdx) > zdivide || fastuidraw::t_abs(zdy) > zdivide)
49 {
50 m_zoom_time.restart();
51 m_zoom_pivot = pos;
52 m_start_gesture = m_transformation;
53 }
54 }
55 else
56 {
57 float zoom_factor(pos.y() - m_zoom_pivot.y());
58 ScaleTranslate<float> R;
59
60 if (m_zoom_direction == zoom_direction_negative_y)
61 {
62 zoom_factor = -zoom_factor;
63 }
64
65 zoom_factor /= zdivide;
66 if (zoom_factor < 0.0f)
67 {
68 zoom_factor = -1.0f/fastuidraw::t_min(-1.0f, zoom_factor);
69 }
70 else
71 {
72 zoom_factor = fastuidraw::t_max(1.0f, zoom_factor);
73 }
74 R.scale(zoom_factor);
75 R.translation( (1.0f - zoom_factor) * m_zoom_pivot);
76 m_transformation = R * m_start_gesture;
77 }
78}
79
80
81void
82PanZoomTracker::
83transformation(const ScaleTranslate<float> &v)
84{
85 m_transformation = v;
86 if (m_button_down)
87 {
88 m_start_gesture = m_transformation;
89 }
90}
91
92/////////////////////////////////
93// PanZoomTrackerSDLEvent methods
94void
95PanZoomTrackerSDLEvent::
96handle_event(const SDL_Event &ev)
97{
98 switch(ev.type)
99 {
100 case SDL_MOUSEBUTTONDOWN:
101 if (ev.button.button == 1)
102 {
103 handle_down(m_scale_event * fastuidraw::vec2(ev.button.x, ev.button.y) + m_translate_event);
104 }
105 break;
106
107 case SDL_MOUSEBUTTONUP:
108 if (ev.button.button == 1)
109 {
110 handle_up();
111 }
112 break;
113
114 case SDL_MOUSEMOTION:
115 handle_motion(m_scale_event * fastuidraw::vec2(ev.motion.x, ev.motion.y) + m_translate_event,
116 m_scale_event * fastuidraw::vec2(ev.motion.xrel, ev.motion.yrel));
117 break;
118 }
119}
120