Mercurial > hg > orthanc-stone
comparison Samples/Sdl/SdlHelpers.h @ 1392:ffdb82850e98
Sdl run loop in /Common (might revert if need to customize)
Segregation ongoing between sdl wasm
Both samples ok SDL msvc v141 x64
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Tue, 28 Apr 2020 13:52:21 +0200 |
parents | 240531afdd2d |
children | 3e644f6fadd4 |
comparison
equal
deleted
inserted
replaced
1391:32272ecfc6c2 | 1392:ffdb82850e98 |
---|---|
2 | 2 |
3 #if ORTHANC_ENABLE_SDL != 1 | 3 #if ORTHANC_ENABLE_SDL != 1 |
4 # error This file cannot be used if ORTHANC_ENABLE_SDL != 1 | 4 # error This file cannot be used if ORTHANC_ENABLE_SDL != 1 |
5 #endif | 5 #endif |
6 | 6 |
7 #include <Framework/Viewport/SdlViewport.h> | |
8 | |
9 #include <boost/shared_ptr.hpp> | |
10 | |
7 #include <SDL.h> | 11 #include <SDL.h> |
8 | 12 |
9 #include <map> | 13 #include <map> |
10 #include <string> | 14 #include <string> |
11 | 15 |
12 namespace OrthancStoneHelpers | 16 namespace OrthancStoneHelpers |
13 { | 17 { |
18 | |
14 inline OrthancStone::KeyboardModifiers GetKeyboardModifiers(const uint8_t* keyboardState, | 19 inline OrthancStone::KeyboardModifiers GetKeyboardModifiers(const uint8_t* keyboardState, |
15 const int scancodeCount) | 20 const int scancodeCount) |
16 { | 21 { |
17 using namespace OrthancStone; | 22 using namespace OrthancStone; |
18 int result = KeyboardModifiers_None; | 23 int result = KeyboardModifiers_None; |
91 p.AddPosition(compositor.GetPixelCenterCoordinates(event.button.x, event.button.y)); | 96 p.AddPosition(compositor.GetPixelCenterCoordinates(event.button.x, event.button.y)); |
92 p.SetAltModifier(modifiers & KeyboardModifiers_Alt); | 97 p.SetAltModifier(modifiers & KeyboardModifiers_Alt); |
93 p.SetControlModifier(modifiers & KeyboardModifiers_Control); | 98 p.SetControlModifier(modifiers & KeyboardModifiers_Control); |
94 p.SetShiftModifier(modifiers & KeyboardModifiers_Shift); | 99 p.SetShiftModifier(modifiers & KeyboardModifiers_Shift); |
95 } | 100 } |
101 | |
102 | |
103 inline void SdlRunLoop(boost::shared_ptr<OrthancStone::SdlViewport> viewport, | |
104 OrthancStone::IViewportInteractor& interactor) | |
105 { | |
106 using namespace OrthancStone; | |
107 { | |
108 int scancodeCount = 0; | |
109 const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); | |
110 | |
111 bool stop = false; | |
112 while (!stop) | |
113 { | |
114 bool paint = false; | |
115 SDL_Event event; | |
116 while (SDL_PollEvent(&event)) | |
117 { | |
118 if (event.type == SDL_QUIT) | |
119 { | |
120 stop = true; | |
121 break; | |
122 } | |
123 else if (viewport->IsRefreshEvent(event)) | |
124 { | |
125 paint = true; | |
126 } | |
127 else if (event.type == SDL_WINDOWEVENT && | |
128 (event.window.event == SDL_WINDOWEVENT_RESIZED || | |
129 event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)) | |
130 { | |
131 viewport->UpdateSize(event.window.data1, event.window.data2); | |
132 } | |
133 else if (event.type == SDL_WINDOWEVENT && | |
134 (event.window.event == SDL_WINDOWEVENT_SHOWN || | |
135 event.window.event == SDL_WINDOWEVENT_EXPOSED)) | |
136 { | |
137 paint = true; | |
138 } | |
139 else if (event.type == SDL_KEYDOWN && | |
140 event.key.repeat == 0 /* Ignore key bounce */) | |
141 { | |
142 switch (event.key.keysym.sym) | |
143 { | |
144 case SDLK_f: | |
145 viewport->ToggleMaximize(); | |
146 break; | |
147 | |
148 case SDLK_s: | |
149 { | |
150 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); | |
151 lock->GetCompositor().FitContent(lock->GetController().GetScene()); | |
152 lock->Invalidate(); | |
153 } | |
154 break; | |
155 | |
156 case SDLK_q: | |
157 stop = true; | |
158 break; | |
159 | |
160 default: | |
161 break; | |
162 } | |
163 } | |
164 else if (event.type == SDL_MOUSEBUTTONDOWN || | |
165 event.type == SDL_MOUSEMOTION || | |
166 event.type == SDL_MOUSEBUTTONUP) | |
167 { | |
168 std::auto_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); | |
169 if (lock->HasCompositor()) | |
170 { | |
171 OrthancStone::PointerEvent p; | |
172 OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(), | |
173 event, keyboardState, scancodeCount); | |
174 | |
175 switch (event.type) | |
176 { | |
177 case SDL_MOUSEBUTTONDOWN: | |
178 lock->GetController().HandleMousePress(interactor, p, | |
179 lock->GetCompositor().GetCanvasWidth(), | |
180 lock->GetCompositor().GetCanvasHeight()); | |
181 lock->Invalidate(); | |
182 break; | |
183 | |
184 case SDL_MOUSEMOTION: | |
185 if (lock->GetController().HandleMouseMove(p)) | |
186 { | |
187 lock->Invalidate(); | |
188 } | |
189 break; | |
190 | |
191 case SDL_MOUSEBUTTONUP: | |
192 lock->GetController().HandleMouseRelease(p); | |
193 lock->Invalidate(); | |
194 break; | |
195 | |
196 default: | |
197 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
198 } | |
199 } | |
200 } | |
201 } | |
202 | |
203 if (paint) | |
204 { | |
205 viewport->Paint(); | |
206 } | |
207 | |
208 // Small delay to avoid using 100% of CPU | |
209 SDL_Delay(1); | |
210 } | |
211 } | |
212 } | |
213 | |
214 | |
215 | |
216 | |
96 } | 217 } |
97 | 218 |