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