Mercurial > hg > orthanc-stone
comparison Applications/Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp @ 1789:462d7a0e064e
added line measures to sdl single frame viewer sample
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 17 May 2021 11:55:21 +0200 |
parents | 9ac2a65d4172 |
children | b325761e0bd3 |
comparison
equal
deleted
inserted
replaced
1788:4fd065ad1fc0 | 1789:462d7a0e064e |
---|---|
22 #include "SdlSimpleViewerApplication.h" | 22 #include "SdlSimpleViewerApplication.h" |
23 #include "../SdlHelpers.h" | 23 #include "../SdlHelpers.h" |
24 #include "../../Common/SampleHelpers.h" | 24 #include "../../Common/SampleHelpers.h" |
25 | 25 |
26 #include "../../../../OrthancStone/Sources/Loaders/GenericLoadersContext.h" | 26 #include "../../../../OrthancStone/Sources/Loaders/GenericLoadersContext.h" |
27 #include "../../../../OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h" | |
28 #include "../../../../OrthancStone/Sources/Scene2DViewport/UndoStack.h" | |
27 #include "../../../../OrthancStone/Sources/StoneEnumerations.h" | 29 #include "../../../../OrthancStone/Sources/StoneEnumerations.h" |
28 #include "../../../../OrthancStone/Sources/StoneException.h" | 30 #include "../../../../OrthancStone/Sources/StoneException.h" |
29 #include "../../../../OrthancStone/Sources/StoneInitialization.h" | 31 #include "../../../../OrthancStone/Sources/StoneInitialization.h" |
30 #include "../../../../OrthancStone/Sources/Viewport/DefaultViewportInteractor.h" | 32 #include "../../../../OrthancStone/Sources/Viewport/DefaultViewportInteractor.h" |
31 #include "../../../Platforms/Sdl/SdlViewport.h" | 33 #include "../../../Platforms/Sdl/SdlViewport.h" |
32 | 34 |
35 #include <EmbeddedResources.h> | |
33 #include <Compatibility.h> // For std::unique_ptr<> | 36 #include <Compatibility.h> // For std::unique_ptr<> |
34 #include <OrthancException.h> | 37 #include <OrthancException.h> |
35 | 38 |
36 #include <boost/program_options.hpp> | 39 #include <boost/program_options.hpp> |
37 #include <SDL.h> | 40 #include <SDL.h> |
62 ("frame_index", po::value<int>()->default_value(0), | 65 ("frame_index", po::value<int>()->default_value(0), |
63 "The zero-based index of the frame (for multi-frame instances)") | 66 "The zero-based index of the frame (for multi-frame instances)") |
64 ; | 67 ; |
65 | 68 |
66 std::cout << desc << std::endl; | 69 std::cout << desc << std::endl; |
70 | |
71 std::cout << std::endl << "Keyboard shorcuts:" << std::endl | |
72 << " f\tToggle fullscreen display" << std::endl | |
73 << " l\tEnable/disable the line measure tool" << std::endl | |
74 << " q\tExit" << std::endl | |
75 << " s\tFit the viewpoint to the image" << std::endl | |
76 << std::endl << "Mouse buttons:" << std::endl | |
77 << " left \tChange windowing, or edit measure" << std::endl | |
78 << " center\tMove the viewpoint, or move measure" << std::endl | |
79 << " right \tZoom, or move measure" << std::endl | |
80 << std::endl; | |
67 | 81 |
68 po::variables_map vm; | 82 po::variables_map vm; |
69 try | 83 try |
70 { | 84 { |
71 po::store(po::parse_command_line(argc, argv, desc), vm); | 85 po::store(po::parse_command_line(argc, argv, desc), vm); |
125 #else | 139 #else |
126 boost::shared_ptr<OrthancStone::SdlViewport> viewport = | 140 boost::shared_ptr<OrthancStone::SdlViewport> viewport = |
127 OrthancStone::SdlCairoViewport::Create("Stone of Orthanc", 800, 600); | 141 OrthancStone::SdlCairoViewport::Create("Stone of Orthanc", 800, 600); |
128 #endif | 142 #endif |
129 | 143 |
144 boost::shared_ptr<OrthancStone::UndoStack> undoStack(new OrthancStone::UndoStack); | |
145 | |
130 OrthancStone::GenericLoadersContext context(1, 4, 1); | 146 OrthancStone::GenericLoadersContext context(1, 4, 1); |
131 | 147 |
132 Orthanc::WebServiceParameters orthancWebService; | 148 Orthanc::WebServiceParameters orthancWebService; |
133 orthancWebService.SetUrl(orthancUrl); | 149 orthancWebService.SetUrl(orthancUrl); |
134 context.SetOrthancParameters(orthancWebService); | 150 context.SetOrthancParameters(orthancWebService); |
135 | 151 |
136 context.StartOracle(); | 152 context.StartOracle(); |
137 | 153 |
138 { | 154 { |
155 { | |
156 std::string font; | |
157 Orthanc::EmbeddedResources::GetFileResource(font, Orthanc::EmbeddedResources::UBUNTU_FONT); | |
158 | |
159 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); | |
160 lock->GetCompositor().SetFont(0, font, 16, Orthanc::Encoding_Latin1); | |
161 lock->GetController().SetUndoStack(undoStack); | |
162 } | |
163 | |
164 boost::shared_ptr<OrthancStone::LineMeasureTool> lineMeasureTool(OrthancStone::LineMeasureTool::Create(viewport)); | |
165 bool lineMeasureFirst = true; | |
166 bool lineMeasureEnabled = false; | |
167 lineMeasureTool->Disable(); | |
139 | 168 |
140 boost::shared_ptr<SdlSimpleViewerApplication> application( | 169 boost::shared_ptr<SdlSimpleViewerApplication> application( |
141 SdlSimpleViewerApplication::Create(context, viewport)); | 170 SdlSimpleViewerApplication::Create(context, viewport)); |
142 | 171 |
143 OrthancStone::DicomSource source; | 172 OrthancStone::DicomSource source; |
183 else if (event.type == SDL_KEYDOWN && | 212 else if (event.type == SDL_KEYDOWN && |
184 event.key.repeat == 0 /* Ignore key bounce */) | 213 event.key.repeat == 0 /* Ignore key bounce */) |
185 { | 214 { |
186 switch (event.key.keysym.sym) | 215 switch (event.key.keysym.sym) |
187 { | 216 { |
188 case SDLK_f: | 217 case SDLK_f: |
189 viewport->ToggleMaximize(); | 218 viewport->ToggleMaximize(); |
190 break; | 219 break; |
191 | 220 |
192 case SDLK_s: | 221 case SDLK_s: |
193 application->FitContent(); | 222 application->FitContent(); |
194 break; | 223 break; |
195 | 224 |
196 case SDLK_q: | 225 case SDLK_q: |
197 stop = true; | 226 stop = true; |
198 break; | 227 break; |
199 | 228 |
200 default: | 229 case SDLK_l: |
201 break; | 230 if (lineMeasureEnabled) |
231 { | |
232 lineMeasureTool->Disable(); | |
233 lineMeasureEnabled = false; | |
234 } | |
235 else | |
236 { | |
237 if (lineMeasureFirst) | |
238 { | |
239 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); | |
240 OrthancStone::Extent2D extent; | |
241 lock->GetController().GetScene().GetBoundingBox(extent); | |
242 if (!extent.IsEmpty()) | |
243 { | |
244 OrthancStone::ScenePoint2D p(extent.GetCenterX(), extent.GetCenterY()); | |
245 lineMeasureTool->Set(p, p); | |
246 } | |
247 lineMeasureFirst = false; | |
248 } | |
249 | |
250 lineMeasureTool->Enable(); | |
251 lineMeasureEnabled = true; | |
252 } | |
253 break; | |
254 | |
255 default: | |
256 break; | |
202 } | 257 } |
203 } | 258 } |
204 else if (event.type == SDL_MOUSEBUTTONDOWN || | 259 else if (event.type == SDL_MOUSEBUTTONDOWN || |
205 event.type == SDL_MOUSEMOTION || | 260 event.type == SDL_MOUSEMOTION || |
206 event.type == SDL_MOUSEBUTTONUP) | 261 event.type == SDL_MOUSEBUTTONUP) |
212 OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(), | 267 OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(), |
213 event, keyboardState, scancodeCount); | 268 event, keyboardState, scancodeCount); |
214 | 269 |
215 switch (event.type) | 270 switch (event.type) |
216 { | 271 { |
217 case SDL_MOUSEBUTTONDOWN: | 272 case SDL_MOUSEBUTTONDOWN: |
218 lock->GetController().HandleMousePress(interactor, p, | |
219 lock->GetCompositor().GetCanvasWidth(), | |
220 lock->GetCompositor().GetCanvasHeight()); | |
221 lock->Invalidate(); | |
222 break; | |
223 | |
224 case SDL_MOUSEMOTION: | |
225 if (lock->GetController().HandleMouseMove(p)) | |
226 { | 273 { |
274 boost::shared_ptr<OrthancStone::IFlexiblePointerTracker> t; | |
275 if (lineMeasureEnabled) | |
276 { | |
277 t = lineMeasureTool->CreateEditionTracker(p); | |
278 } | |
279 | |
280 if (t.get() != NULL) | |
281 { | |
282 lock->GetController().AcquireActiveTracker(t); | |
283 } | |
284 else | |
285 { | |
286 lock->GetController().HandleMousePress(interactor, p, | |
287 lock->GetCompositor().GetCanvasWidth(), | |
288 lock->GetCompositor().GetCanvasHeight()); | |
289 } | |
227 lock->Invalidate(); | 290 lock->Invalidate(); |
291 break; | |
228 } | 292 } |
229 break; | 293 |
230 | 294 case SDL_MOUSEMOTION: |
231 case SDL_MOUSEBUTTONUP: | 295 if (lock->GetController().HandleMouseMove(p)) |
232 lock->GetController().HandleMouseRelease(p); | 296 { |
233 lock->Invalidate(); | 297 lock->Invalidate(); |
234 break; | 298 } |
235 | 299 break; |
236 default: | 300 |
237 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | 301 case SDL_MOUSEBUTTONUP: |
302 lock->GetController().HandleMouseRelease(p); | |
303 lock->Invalidate(); | |
304 break; | |
305 | |
306 default: | |
307 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
238 } | 308 } |
239 } | 309 } |
240 } | 310 } |
241 } | 311 } |
242 | 312 |