comparison Samples/Sdl/TrackerSampleApp.cpp @ 700:059e1fd05fd6 refactor-viewport-controller

Introduced the ViewportController that sits between the application and the Scene2D to handle the trackers and measuring tools. This is a work in progress. The Scene2D is no longer an observable. Message sending is managed by the ViewportController. Move some refs to shared and weak to prevent lifetime issues.
author Benjamin Golinvaux <bgo@osimis.io>
date Sun, 19 May 2019 16:26:17 +0200
parents 5c551f078c18
children ef07304d4423
comparison
equal deleted inserted replaced
699:5c551f078c18 700:059e1fd05fd6
68 return descs[i]; 68 return descs[i];
69 } 69 }
70 70
71 Scene2DPtr TrackerSampleApp::GetScene() 71 Scene2DPtr TrackerSampleApp::GetScene()
72 { 72 {
73 return controller_.GetScene(); 73 return controller_->GetScene();
74 } 74 }
75 75
76 void TrackerSampleApp::SelectNextTool() 76 void TrackerSampleApp::SelectNextTool()
77 { 77 {
78 currentTool_ = static_cast<GuiTool>(currentTool_ + 1); 78 currentTool_ = static_cast<GuiTool>(currentTool_ + 1);
190 // "event.button.y = " << event.button.y; 190 // "event.button.y = " << event.button.y;
191 //LOG(TRACE) << "activeTracker_->PointerMove(e); " << 191 //LOG(TRACE) << "activeTracker_->PointerMove(e); " <<
192 // e.GetMainPosition().GetX() << " " << e.GetMainPosition().GetY(); 192 // e.GetMainPosition().GetX() << " " << e.GetMainPosition().GetY();
193 193
194 activeTracker_->PointerMove(e); 194 activeTracker_->PointerMove(e);
195 if (!activeTracker_->IsActive()) 195 if (!activeTracker_->IsAlive())
196 activeTracker_ = NULL; 196 activeTracker_ = NULL;
197 } 197 }
198 } 198 }
199 } 199 }
200 else if (event.type == SDL_MOUSEBUTTONUP) 200 else if (event.type == SDL_MOUSEBUTTONUP)
202 if (activeTracker_) 202 if (activeTracker_)
203 { 203 {
204 PointerEvent e; 204 PointerEvent e;
205 e.AddPosition(compositor_->GetPixelCenterCoordinates(event.button.x, event.button.y)); 205 e.AddPosition(compositor_->GetPixelCenterCoordinates(event.button.x, event.button.y));
206 activeTracker_->PointerUp(e); 206 activeTracker_->PointerUp(e);
207 if (!activeTracker_->IsActive()) 207 if (!activeTracker_->IsAlive())
208 activeTracker_ = NULL; 208 activeTracker_ = NULL;
209 } 209 }
210 } 210 }
211 else if (event.type == SDL_MOUSEBUTTONDOWN) 211 else if (event.type == SDL_MOUSEBUTTONDOWN)
212 { 212 {
214 e.AddPosition(compositor_->GetPixelCenterCoordinates( 214 e.AddPosition(compositor_->GetPixelCenterCoordinates(
215 event.button.x, event.button.y)); 215 event.button.x, event.button.y));
216 if (activeTracker_) 216 if (activeTracker_)
217 { 217 {
218 activeTracker_->PointerDown(e); 218 activeTracker_->PointerDown(e);
219 if (!activeTracker_->IsActive()) 219 if (!activeTracker_->IsAlive())
220 activeTracker_ = NULL; 220 activeTracker_ = NULL;
221 } 221 }
222 else 222 else
223 { 223 {
224 // we ATTEMPT to create a tracker if need be 224 // we ATTEMPT to create a tracker if need be
232 { 232 {
233 case SDLK_ESCAPE: 233 case SDLK_ESCAPE:
234 if (activeTracker_) 234 if (activeTracker_)
235 { 235 {
236 activeTracker_->Cancel(); 236 activeTracker_->Cancel();
237 if (!activeTracker_->IsActive()) 237 if (!activeTracker_->IsAlive())
238 activeTracker_ = NULL; 238 activeTracker_ = NULL;
239 } 239 }
240 break; 240 break;
241 241
242 case SDLK_t: 242 case SDLK_t:
266 } 266 }
267 } 267 }
268 } 268 }
269 269
270 270
271 void TrackerSampleApp::OnSceneTransformChanged(const Scene2D::SceneTransformChanged& message) 271 void TrackerSampleApp::OnSceneTransformChanged(
272 const ViewportController::SceneTransformChanged& message)
272 { 273 {
273 DisplayInfoText(); 274 DisplayInfoText();
274 } 275 }
275 276
276 FlexiblePointerTrackerPtr TrackerSampleApp::CreateSuitableTracker( 277 FlexiblePointerTrackerPtr TrackerSampleApp::CreateSuitableTracker(
278 const PointerEvent & e) 279 const PointerEvent & e)
279 { 280 {
280 switch (event.button.button) 281 switch (event.button.button)
281 { 282 {
282 case SDL_BUTTON_MIDDLE: 283 case SDL_BUTTON_MIDDLE:
283 return CreateSimpleTrackerAdapter(PointerTrackerPtr( 284 return FlexiblePointerTrackerPtr(new PanSceneTracker
284 new PanSceneTracker(*GetScene(), e))); 285 (controller_, e));
285 286
286 case SDL_BUTTON_RIGHT: 287 case SDL_BUTTON_RIGHT:
287 return CreateSimpleTrackerAdapter(PointerTrackerPtr( 288 return FlexiblePointerTrackerPtr(new ZoomSceneTracker
288 new ZoomSceneTracker(*GetScene(), e, compositor_->GetCanvasHeight()))); 289 (controller_, e, compositor_->GetCanvasHeight()));
289 290
290 case SDL_BUTTON_LEFT: 291 case SDL_BUTTON_LEFT:
291 { 292 {
292 //LOG(TRACE) << "CreateSuitableTracker: case SDL_BUTTON_LEFT:"; 293 //LOG(TRACE) << "CreateSuitableTracker: case SDL_BUTTON_LEFT:";
293 // TODO: we need to iterate on the set of measuring tool and perform 294 // TODO: we need to iterate on the set of measuring tool and perform
308 { 309 {
309 switch (currentTool_) 310 switch (currentTool_)
310 { 311 {
311 case GuiTool_Rotate: 312 case GuiTool_Rotate:
312 //LOG(TRACE) << "Creating RotateSceneTracker"; 313 //LOG(TRACE) << "Creating RotateSceneTracker";
313 return CreateSimpleTrackerAdapter(PointerTrackerPtr( 314 return FlexiblePointerTrackerPtr(new RotateSceneTracker(
314 new RotateSceneTracker(*GetScene(), e))); 315 controller_, e));
315 case GuiTool_Pan: 316 case GuiTool_Pan:
316 return CreateSimpleTrackerAdapter(PointerTrackerPtr( 317 return FlexiblePointerTrackerPtr(new PanSceneTracker(
317 new PanSceneTracker(*GetScene(), e))); 318 controller_, e));
318 case GuiTool_Zoom: 319 case GuiTool_Zoom:
319 return CreateSimpleTrackerAdapter(PointerTrackerPtr( 320 return FlexiblePointerTrackerPtr(new ZoomSceneTracker(
320 new ZoomSceneTracker(*GetScene(), e, compositor_->GetCanvasHeight()))); 321 controller_, e, compositor_->GetCanvasHeight()));
321 //case GuiTool_AngleMeasure: 322 //case GuiTool_AngleMeasure:
322 // return new AngleMeasureTracker(GetScene(), measureTools_, undoStack_, e); 323 // return new AngleMeasureTracker(GetScene(), measureTools_, undoStack_, e);
323 //case GuiTool_CircleMeasure: 324 //case GuiTool_CircleMeasure:
324 // return new CircleMeasureTracker(GetScene(), measureTools_, undoStack_, e); 325 // return new CircleMeasureTracker(GetScene(), measureTools_, undoStack_, e);
325 //case GuiTool_EllipseMeasure: 326 //case GuiTool_EllipseMeasure:
326 // return new EllipseMeasureTracker(GetScene(), measureTools_, undoStack_, e); 327 // return new EllipseMeasureTracker(GetScene(), measureTools_, undoStack_, e);
327 case GuiTool_LineMeasure: 328 case GuiTool_LineMeasure:
328 return FlexiblePointerTrackerPtr(new CreateLineMeasureTracker( 329 return FlexiblePointerTrackerPtr(new CreateLineMeasureTracker(
329 IObserver::GetBroker(), GetScene(), undoStack_, measureTools_, e)); 330 IObserver::GetBroker(), controller_, undoStack_, measureTools_, e));
330 case GuiTool_AngleMeasure: 331 case GuiTool_AngleMeasure:
331 return FlexiblePointerTrackerPtr(new CreateAngleMeasureTracker( 332 return FlexiblePointerTrackerPtr(new CreateAngleMeasureTracker(
332 IObserver::GetBroker(), GetScene(), undoStack_, measureTools_, e)); 333 IObserver::GetBroker(), controller_, undoStack_, measureTools_, e));
333 return NULL; 334 return NULL;
334 case GuiTool_CircleMeasure: 335 case GuiTool_CircleMeasure:
335 LOG(ERROR) << "Not implemented yet!"; 336 LOG(ERROR) << "Not implemented yet!";
336 return NULL; 337 return NULL;
337 case GuiTool_EllipseMeasure: 338 case GuiTool_EllipseMeasure:
347 } 348 }
348 } 349 }
349 350
350 351
351 TrackerSampleApp::TrackerSampleApp(MessageBroker& broker) : IObserver(broker) 352 TrackerSampleApp::TrackerSampleApp(MessageBroker& broker) : IObserver(broker)
352 , scene_(broker)
353 , currentTool_(GuiTool_Rotate) 353 , currentTool_(GuiTool_Rotate)
354 { 354 {
355 controller_ = ViewportControllerPtr(new ViewportController(broker)); 355 controller_ = ViewportControllerPtr(new ViewportController(broker));
356 356
357 controller_->RegisterObserverCallback( 357 controller_->RegisterObserverCallback(
467 467
468 void TrackerSampleApp::TakeScreenshot(const std::string& target, 468 void TrackerSampleApp::TakeScreenshot(const std::string& target,
469 unsigned int canvasWidth, 469 unsigned int canvasWidth,
470 unsigned int canvasHeight) 470 unsigned int canvasHeight)
471 { 471 {
472 CairoCompositor compositor(GetScene(), canvasWidth, canvasHeight); 472 CairoCompositor compositor(*GetScene(), canvasWidth, canvasHeight);
473 compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1); 473 compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1);
474 compositor.Refresh(); 474 compositor.Refresh();
475 475
476 Orthanc::ImageAccessor canvas; 476 Orthanc::ImageAccessor canvas;
477 compositor.GetCanvas().GetReadOnlyAccessor(canvas); 477 compositor.GetCanvas().GetReadOnlyAccessor(canvas);
518 GetScene()->FitContent(window.GetCanvasWidth(), window.GetCanvasHeight()); 518 GetScene()->FitContent(window.GetCanvasWidth(), window.GetCanvasHeight());
519 519
520 glEnable(GL_DEBUG_OUTPUT); 520 glEnable(GL_DEBUG_OUTPUT);
521 glDebugMessageCallback(OpenGLMessageCallback, 0); 521 glDebugMessageCallback(OpenGLMessageCallback, 0);
522 522
523 compositor_.reset(new OpenGLCompositor(window, GetScene())); 523 compositor_.reset(new OpenGLCompositor(window, *GetScene()));
524 524
525 compositor_->SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, 525 compositor_->SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT,
526 FONT_SIZE_0, Orthanc::Encoding_Latin1); 526 FONT_SIZE_0, Orthanc::Encoding_Latin1);
527 compositor_->SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT, 527 compositor_->SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT,
528 FONT_SIZE_1, Orthanc::Encoding_Latin1); 528 FONT_SIZE_1, Orthanc::Encoding_Latin1);
563 } 563 }
564 HandleApplicationEvent(event); 564 HandleApplicationEvent(event);
565 } 565 }
566 SDL_Delay(1); 566 SDL_Delay(1);
567 } 567 }
568
569 // the following is paramount because the compositor holds a reference
570 // to the scene and we do not want this reference to become dangling
568 compositor_.reset(NULL); 571 compositor_.reset(NULL);
569 } 572 }
570 573
571 void TrackerSampleApp::SetInfoDisplayMessage( 574 void TrackerSampleApp::SetInfoDisplayMessage(
572 std::string key, std::string value) 575 std::string key, std::string value)