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