Mercurial > hg > orthanc-stone
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) |