Mercurial > hg > orthanc-stone
comparison Samples/Sdl/SdlHelpers.h @ 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 | b424028392cf |
comparison
equal
deleted
inserted
replaced
1405:e4fe346c021e | 1406:5d7ee14dc1eb |
---|---|
112 if (windowID == curWindowID) | 112 if (windowID == curWindowID) |
113 return sdlViewport; | 113 return sdlViewport; |
114 } | 114 } |
115 return NULL; | 115 return NULL; |
116 } | 116 } |
117 | |
118 inline void SdlRunLoop(const std::vector<boost::shared_ptr<OrthancStone::SdlViewport> >& viewports, | |
119 OrthancStone::IViewportInteractor& interactor) | |
120 { | |
121 using namespace OrthancStone; | |
122 { | |
123 int scancodeCount = 0; | |
124 const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); | |
125 | |
126 bool stop = false; | |
127 while (!stop) | |
128 { | |
129 bool paint = false; | |
130 SDL_Event event; | |
131 while (SDL_PollEvent(&event)) | |
132 { | |
133 if (event.type == SDL_QUIT) | |
134 { | |
135 stop = true; | |
136 break; | |
137 } | |
138 else if (event.type == SDL_WINDOWEVENT && | |
139 (event.window.event == SDL_WINDOWEVENT_RESIZED || | |
140 event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)) | |
141 { | |
142 boost::shared_ptr<SdlViewport> viewport = GetSdlViewportFromWindowId( | |
143 viewports, event.window.windowID); | |
144 viewport->UpdateSize(event.window.data1, event.window.data2); | |
145 } | |
146 else if (event.type == SDL_WINDOWEVENT && | |
147 (event.window.event == SDL_WINDOWEVENT_SHOWN || | |
148 event.window.event == SDL_WINDOWEVENT_EXPOSED)) | |
149 { | |
150 boost::shared_ptr<SdlViewport> viewport = GetSdlViewportFromWindowId( | |
151 viewports, event.window.windowID); | |
152 viewport->Paint(); | |
153 } | |
154 else if (event.type == SDL_KEYDOWN && | |
155 event.key.repeat == 0 /* Ignore key bounce */) | |
156 { | |
157 boost::shared_ptr<SdlViewport> viewport = GetSdlViewportFromWindowId( | |
158 viewports, event.window.windowID); | |
159 | |
160 switch (event.key.keysym.sym) | |
161 { | |
162 case SDLK_f: | |
163 viewport->ToggleMaximize(); | |
164 break; | |
165 | |
166 case SDLK_s: | |
167 { | |
168 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); | |
169 lock->GetCompositor().FitContent(lock->GetController().GetScene()); | |
170 lock->Invalidate(); | |
171 } | |
172 break; | |
173 | |
174 case SDLK_q: | |
175 stop = true; | |
176 break; | |
177 | |
178 default: | |
179 break; | |
180 } | |
181 } | |
182 else if (event.type == SDL_MOUSEBUTTONDOWN || | |
183 event.type == SDL_MOUSEMOTION || | |
184 event.type == SDL_MOUSEBUTTONUP) | |
185 { | |
186 boost::shared_ptr<SdlViewport> viewport = GetSdlViewportFromWindowId( | |
187 viewports, event.window.windowID); | |
188 | |
189 std::auto_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); | |
190 if (lock->HasCompositor()) | |
191 { | |
192 OrthancStone::PointerEvent p; | |
193 OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(), | |
194 event, keyboardState, scancodeCount); | |
195 | |
196 switch (event.type) | |
197 { | |
198 case SDL_MOUSEBUTTONDOWN: | |
199 lock->GetController().HandleMousePress(interactor, p, | |
200 lock->GetCompositor().GetCanvasWidth(), | |
201 lock->GetCompositor().GetCanvasHeight()); | |
202 lock->Invalidate(); | |
203 break; | |
204 | |
205 case SDL_MOUSEMOTION: | |
206 if (lock->GetController().HandleMouseMove(p)) | |
207 { | |
208 lock->Invalidate(); | |
209 } | |
210 break; | |
211 | |
212 case SDL_MOUSEBUTTONUP: | |
213 lock->GetController().HandleMouseRelease(p); | |
214 lock->Invalidate(); | |
215 break; | |
216 | |
217 default: | |
218 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
219 } | |
220 } | |
221 } | |
222 else | |
223 { | |
224 for (size_t i = 0; i < viewports.size(); ++i) | |
225 { | |
226 boost::shared_ptr<SdlViewport> viewport = viewports[i]; | |
227 if (viewport->IsRefreshEvent(event)) | |
228 viewport->Paint(); | |
229 } | |
230 } | |
231 } | |
232 } | |
233 // Small delay to avoid using 100% of CPU | |
234 SDL_Delay(1); | |
235 } | |
236 } | |
237 } | 117 } |
238 | 118 |
239 | 119 |