comparison Framework/Widgets/WorldSceneWidget.cpp @ 457:3b4df9925db6 am-touch-events

added support for 'touch' in mouse trackers. This is still a bit hacky and we need to refactor it to make it clean. Thanks to that, Pan and zoom are available together with 2 touches
author Alain Mazy <alain@mazy.be>
date Thu, 24 Jan 2019 16:42:27 +0100
parents b70e9be013e4
children 1201b12eb9f8
comparison
equal deleted inserted replaced
456:b70fcc134ba4 457:3b4df9925db6
21 21
22 #include "WorldSceneWidget.h" 22 #include "WorldSceneWidget.h"
23 23
24 #include "PanMouseTracker.h" 24 #include "PanMouseTracker.h"
25 #include "ZoomMouseTracker.h" 25 #include "ZoomMouseTracker.h"
26 #include "PanZoomMouseTracker.h"
26 27
27 #include <Core/Logging.h> 28 #include <Core/Logging.h>
28 #include <Core/OrthancException.h> 29 #include <Core/OrthancException.h>
29 30
30 #include <math.h> 31 #include <math.h>
70 { 71 {
71 tracker_->MouseUp(); 72 tracker_->MouseUp();
72 } 73 }
73 74
74 virtual void MouseMove(int x, 75 virtual void MouseMove(int x,
75 int y) 76 int y,
77 const std::vector<Touch>& displayTouches)
76 { 78 {
77 double sceneX, sceneY; 79 double sceneX, sceneY;
78 view_.MapPixelCenterToScene(sceneX, sceneY, x, y); 80 view_.MapPixelCenterToScene(sceneX, sceneY, x, y);
79 tracker_->MouseMove(x, y, sceneX, sceneY); 81
82 std::vector<Touch> sceneTouches;
83 for (size_t t = 0; t < displayTouches.size(); t++)
84 {
85 double sx, sy;
86 view_.MapPixelCenterToScene(sx, sy, (int)displayTouches[t].x, (int)displayTouches[t].y);
87 sceneTouches.push_back(Touch(sx, sy));
88 }
89 tracker_->MouseMove(x, y, sceneX, sceneY, displayTouches, sceneTouches);
80 } 90 }
81 }; 91 };
82 92
83 93
84 bool WorldSceneWidget::RenderCairo(CairoContext& context) 94 bool WorldSceneWidget::RenderCairo(CairoContext& context)
143 153
144 154
145 IMouseTracker* WorldSceneWidget::CreateMouseTracker(MouseButton button, 155 IMouseTracker* WorldSceneWidget::CreateMouseTracker(MouseButton button,
146 int x, 156 int x,
147 int y, 157 int y,
148 KeyboardModifiers modifiers) 158 KeyboardModifiers modifiers,
159 const std::vector<Touch>& touches)
149 { 160 {
150 double sceneX, sceneY; 161 double sceneX, sceneY;
151 view_.MapPixelCenterToScene(sceneX, sceneY, x, y); 162 view_.MapPixelCenterToScene(sceneX, sceneY, x, y);
152 163
153 // asks the Widget Interactor to provide a mouse tracker 164 // asks the Widget Interactor to provide a mouse tracker
154 std::auto_ptr<IWorldSceneMouseTracker> tracker; 165 std::auto_ptr<IWorldSceneMouseTracker> tracker;
155 166
156 if (interactor_) 167 if (interactor_)
157 { 168 {
158 tracker.reset(interactor_->CreateMouseTracker(*this, view_, button, modifiers, x, y, sceneX, sceneY, GetStatusBar())); 169 tracker.reset(interactor_->CreateMouseTracker(*this, view_, button, modifiers, x, y, sceneX, sceneY, GetStatusBar(), touches));
159 } 170 }
160 171
161 if (tracker.get() != NULL) 172 if (tracker.get() != NULL)
162 { 173 {
163 return new SceneMouseTracker(view_, tracker.release()); 174 return new SceneMouseTracker(view_, tracker.release());
164 } 175 }
165 else if (hasDefaultMouseEvents_) 176 else if (hasDefaultMouseEvents_)
166 { 177 {
167 switch (button) 178 printf("has default mouse events\n");
168 { 179 if (touches.size() == 2)
169 case MouseButton_Middle: 180 {
170 return new SceneMouseTracker(view_, new PanMouseTracker(*this, x, y)); 181 printf("2 touches !\n");
171 182 return new SceneMouseTracker(view_, new PanZoomMouseTracker(*this, touches));
172 case MouseButton_Right: 183 }
173 return new SceneMouseTracker(view_, new ZoomMouseTracker(*this, x, y)); 184 else
174 185 {
175 default: 186 switch (button)
176 return NULL; 187 {
177 } 188 case MouseButton_Middle:
189 return new SceneMouseTracker(view_, new PanMouseTracker(*this, x, y));
190
191 case MouseButton_Right:
192 return new SceneMouseTracker(view_, new ZoomMouseTracker(*this, x, y));
193
194 default:
195 return NULL;
196 }
197 }
178 } 198 }
179 else 199 else
180 { 200 {
181 return NULL; 201 return NULL;
182 } 202 }