comparison Samples/Sdl/RtViewer/RtViewerSdl.cpp @ 1406:5d7ee14dc1eb

Mouse wheel handler is now OK in SDL and Wasm
author Benjamin Golinvaux <bgo@osimis.io>
date Thu, 30 Apr 2020 00:25:55 +0200
parents 3e644f6fadd4
children 875c9a28236e
comparison
equal deleted inserted replaced
1405:e4fe346c021e 1406:5d7ee14dc1eb
180 loaders, for any command scheduled by the loader before the oracle is started will be lost. 180 loaders, for any command scheduled by the loader before the oracle is started will be lost.
181 */ 181 */
182 StartLoaders(); 182 StartLoaders();
183 183
184 184
185 std::vector<boost::shared_ptr<SdlViewport>> sdlViewports; 185 SdlRunLoop(views_, interactor);
186 for(size_t i = 0; i < views_.size(); ++i)
187 {
188 boost::shared_ptr<RtViewerView> view = views_[i];
189 boost::shared_ptr<IViewport> viewport = view->GetViewport();
190 boost::shared_ptr<SdlViewport> sdlViewport =
191 boost::dynamic_pointer_cast<SdlViewport>(viewport);
192 sdlViewports.push_back(sdlViewport);
193 }
194 OrthancStoneHelpers::SdlRunLoop(sdlViewports, interactor);
195 loadersContext->StopOracle(); 186 loadersContext->StopOracle();
196 } 187 }
197 188
198 void RtViewerView::TakeScreenshot(const std::string& target, 189 void RtViewerView::TakeScreenshot(const std::string& target,
199 unsigned int canvasWidth, 190 unsigned int canvasWidth,
213 Orthanc::Image png(Orthanc::PixelFormat_RGB24, canvas.GetWidth(), canvas.GetHeight(), false); 204 Orthanc::Image png(Orthanc::PixelFormat_RGB24, canvas.GetWidth(), canvas.GetHeight(), false);
214 Orthanc::ImageProcessing::Convert(png, canvas); 205 Orthanc::ImageProcessing::Convert(png, canvas);
215 206
216 Orthanc::PngWriter writer; 207 Orthanc::PngWriter writer;
217 writer.WriteToFile(target, png); 208 writer.WriteToFile(target, png);
209 }
210
211 static boost::shared_ptr<OrthancStone::RtViewerView> GetViewFromWindowId(
212 const std::vector<boost::shared_ptr<OrthancStone::RtViewerView> >& views,
213 Uint32 windowID)
214 {
215 using namespace OrthancStone;
216 for (size_t i = 0; i < views.size(); ++i)
217 {
218 boost::shared_ptr<OrthancStone::RtViewerView> view = views[i];
219 boost::shared_ptr<IViewport> viewport = view->GetViewport();
220 boost::shared_ptr<SdlViewport> sdlViewport = boost::dynamic_pointer_cast<SdlViewport>(viewport);
221 Uint32 curWindowID = sdlViewport->GetSdlWindowId();
222 if (windowID == curWindowID)
223 return view;
224 }
225 return NULL;
226 }
227
228 void RtViewerApp::SdlRunLoop(const std::vector<boost::shared_ptr<OrthancStone::RtViewerView> >& views,
229 OrthancStone::IViewportInteractor& interactor)
230 {
231 using namespace OrthancStone;
232
233 // const std::vector<boost::shared_ptr<OrthancStone::RtViewerView> >& views
234 std::vector<boost::shared_ptr<OrthancStone::SdlViewport> > viewports;
235 for (size_t i = 0; i < views.size(); ++i)
236 {
237 boost::shared_ptr<RtViewerView> view = views[i];
238 boost::shared_ptr<IViewport> viewport = view->GetViewport();
239 boost::shared_ptr<SdlViewport> sdlViewport =
240 boost::dynamic_pointer_cast<SdlViewport>(viewport);
241 viewports.push_back(sdlViewport);
242 }
243
244 {
245 int scancodeCount = 0;
246 const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount);
247
248 bool stop = false;
249 while (!stop)
250 {
251 bool paint = false;
252 SDL_Event event;
253 while (SDL_PollEvent(&event))
254 {
255 if (event.type == SDL_QUIT)
256 {
257 stop = true;
258 break;
259 }
260 else if (event.type == SDL_WINDOWEVENT &&
261 (event.window.event == SDL_WINDOWEVENT_RESIZED ||
262 event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED))
263 {
264 boost::shared_ptr<RtViewerView> view = GetViewFromWindowId(
265 views, event.window.windowID);
266
267 boost::shared_ptr<SdlViewport> sdlViewport =
268 boost::dynamic_pointer_cast<SdlViewport>(view->GetViewport());
269
270 sdlViewport->UpdateSize(event.window.data1, event.window.data2);
271 }
272 else if (event.type == SDL_WINDOWEVENT &&
273 (event.window.event == SDL_WINDOWEVENT_SHOWN ||
274 event.window.event == SDL_WINDOWEVENT_EXPOSED))
275 {
276 boost::shared_ptr<RtViewerView> view = GetViewFromWindowId(
277 views, event.window.windowID);
278 boost::shared_ptr<SdlViewport> sdlViewport =
279 boost::dynamic_pointer_cast<SdlViewport>(view->GetViewport());
280 sdlViewport->Paint();
281 }
282 else if (event.type == SDL_KEYDOWN &&
283 event.key.repeat == 0 /* Ignore key bounce */)
284 {
285 boost::shared_ptr<RtViewerView> view = GetViewFromWindowId(
286 views, event.window.windowID);
287
288 switch (event.key.keysym.sym)
289 {
290 case SDLK_f:
291 {
292 boost::shared_ptr<SdlViewport> sdlViewport =
293 boost::dynamic_pointer_cast<SdlViewport>(view->GetViewport());
294 sdlViewport->ToggleMaximize();
295 }
296 break;
297
298 case SDLK_s:
299 {
300 std::unique_ptr<OrthancStone::IViewport::ILock> lock(view->GetViewport()->Lock());
301 lock->GetCompositor().FitContent(lock->GetController().GetScene());
302 lock->Invalidate();
303 }
304 break;
305
306 case SDLK_q:
307 stop = true;
308 break;
309
310 default:
311 break;
312 }
313 }
314 else if (event.type == SDL_MOUSEBUTTONDOWN ||
315 event.type == SDL_MOUSEMOTION ||
316 event.type == SDL_MOUSEBUTTONUP)
317 {
318 boost::shared_ptr<RtViewerView> view = GetViewFromWindowId(
319 views, event.window.windowID);
320
321 std::auto_ptr<OrthancStone::IViewport::ILock> lock(view->GetViewport()->Lock());
322 if (lock->HasCompositor())
323 {
324 OrthancStone::PointerEvent p;
325 OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(),
326 event, keyboardState, scancodeCount);
327
328 switch (event.type)
329 {
330 case SDL_MOUSEBUTTONDOWN:
331 lock->GetController().HandleMousePress(interactor, p,
332 lock->GetCompositor().GetCanvasWidth(),
333 lock->GetCompositor().GetCanvasHeight());
334 lock->Invalidate();
335 break;
336
337 case SDL_MOUSEMOTION:
338 if (lock->GetController().HandleMouseMove(p))
339 {
340 lock->Invalidate();
341 }
342 break;
343
344 case SDL_MOUSEBUTTONUP:
345 lock->GetController().HandleMouseRelease(p);
346 lock->Invalidate();
347 break;
348
349 default:
350 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
351 }
352 }
353 }
354 else if (event.type == SDL_MOUSEWHEEL)
355 {
356 boost::shared_ptr<RtViewerView> view = GetViewFromWindowId(
357 views, event.window.windowID);
358
359 int delta = 0;
360 if (event.wheel.y < 0)
361 delta = -1;
362 if (event.wheel.y > 0)
363 delta = 1;
364
365 view->Scroll(delta);
366 }
367 else
368 {
369 for (size_t i = 0; i < views.size(); ++i)
370 {
371 boost::shared_ptr<SdlViewport> sdlViewport =
372 boost::dynamic_pointer_cast<SdlViewport>(views[i]->GetViewport());
373 if (sdlViewport->IsRefreshEvent(event))
374 sdlViewport->Paint();
375 }
376 }
377 }
378 }
379 // Small delay to avoid using 100% of CPU
380 SDL_Delay(1);
381 }
218 } 382 }
219 } 383 }
220 384
221 boost::weak_ptr<OrthancStone::RtViewerApp> g_app; 385 boost::weak_ptr<OrthancStone::RtViewerApp> g_app;
222 386