1 | #include <ciso646> |
---|---|
2 | #include "PanZoomTracker.hpp" |
3 | |
4 | ///////////////////////////////// |
5 | // PanZoomTracker methods |
6 | void |
7 | PanZoomTracker:: |
8 | handle_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 | |
16 | void |
17 | PanZoomTracker:: |
18 | handle_up(void) |
19 | { |
20 | m_is_zooming = false; |
21 | m_button_down = false; |
22 | } |
23 | |
24 | |
25 | void |
26 | PanZoomTracker:: |
27 | handle_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 | |
81 | void |
82 | PanZoomTracker:: |
83 | transformation(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 |
94 | void |
95 | PanZoomTrackerSDLEvent:: |
96 | handle_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 |