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