Mercurial > hg > orthanc-stone
comparison Applications/Samples/SimpleViewerApplicationSingleFile.h @ 388:20f149669c1f
renamed LayerWidget as SliceViewerWidget
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 09 Nov 2018 17:26:39 +0100 |
parents | 8eb4fe74000f |
children | e7a494bdd956 |
comparison
equal
deleted
inserted
replaced
387:a8b5cf760473 | 388:20f149669c1f |
---|---|
24 #include "SampleApplicationBase.h" | 24 #include "SampleApplicationBase.h" |
25 | 25 |
26 #include "../../Framework/Layers/OrthancFrameLayerSource.h" | 26 #include "../../Framework/Layers/OrthancFrameLayerSource.h" |
27 #include "../../Framework/Layers/CircleMeasureTracker.h" | 27 #include "../../Framework/Layers/CircleMeasureTracker.h" |
28 #include "../../Framework/Layers/LineMeasureTracker.h" | 28 #include "../../Framework/Layers/LineMeasureTracker.h" |
29 #include "../../Framework/Widgets/LayerWidget.h" | 29 #include "../../Framework/Widgets/SliceViewerWidget.h" |
30 #include "../../Framework/Widgets/LayoutWidget.h" | 30 #include "../../Framework/Widgets/LayoutWidget.h" |
31 #include "../../Framework/Messages/IObserver.h" | 31 #include "../../Framework/Messages/IObserver.h" |
32 #include "../../Framework/SmartLoader.h" | 32 #include "../../Framework/SmartLoader.h" |
33 | 33 |
34 #if ORTHANC_ENABLE_WASM==1 | 34 #if ORTHANC_ENABLE_WASM==1 |
50 private: | 50 private: |
51 class ThumbnailInteractor : public IWorldSceneInteractor | 51 class ThumbnailInteractor : public IWorldSceneInteractor |
52 { | 52 { |
53 private: | 53 private: |
54 SimpleViewerApplication& application_; | 54 SimpleViewerApplication& application_; |
55 | |
55 public: | 56 public: |
56 ThumbnailInteractor(SimpleViewerApplication& application) : | 57 ThumbnailInteractor(SimpleViewerApplication& application) : |
57 application_(application) | 58 application_(application) |
58 { | 59 { |
59 } | 60 } |
74 std::string seriesId = widget.GetName().substr(strlen("thumbnail-series-")); | 75 std::string seriesId = widget.GetName().substr(strlen("thumbnail-series-")); |
75 application_.SelectSeriesInMainViewport(seriesId); | 76 application_.SelectSeriesInMainViewport(seriesId); |
76 } | 77 } |
77 return NULL; | 78 return NULL; |
78 } | 79 } |
80 | |
79 virtual void MouseOver(CairoContext& context, | 81 virtual void MouseOver(CairoContext& context, |
80 WorldSceneWidget& widget, | 82 WorldSceneWidget& widget, |
81 const ViewportGeometry& view, | 83 const ViewportGeometry& view, |
82 double x, | 84 double x, |
83 double y, | 85 double y, |
84 IStatusBar* statusBar) | 86 IStatusBar* statusBar) |
85 {} | 87 { |
88 } | |
86 | 89 |
87 virtual void MouseWheel(WorldSceneWidget& widget, | 90 virtual void MouseWheel(WorldSceneWidget& widget, |
88 MouseWheelDirection direction, | 91 MouseWheelDirection direction, |
89 KeyboardModifiers modifiers, | 92 KeyboardModifiers modifiers, |
90 IStatusBar* statusBar) | 93 IStatusBar* statusBar) |
91 {} | 94 { |
95 } | |
92 | 96 |
93 virtual void KeyPressed(WorldSceneWidget& widget, | 97 virtual void KeyPressed(WorldSceneWidget& widget, |
94 KeyboardKeys key, | 98 KeyboardKeys key, |
95 char keyChar, | 99 char keyChar, |
96 KeyboardModifiers modifiers, | 100 KeyboardModifiers modifiers, |
97 IStatusBar* statusBar) | 101 IStatusBar* statusBar) |
98 {} | 102 { |
99 | 103 } |
100 }; | 104 }; |
101 | 105 |
102 class MainWidgetInteractor : public IWorldSceneInteractor | 106 class MainWidgetInteractor : public IWorldSceneInteractor |
103 { | 107 { |
104 private: | 108 private: |
122 { | 126 { |
123 if (button == MouseButton_Left) | 127 if (button == MouseButton_Left) |
124 { | 128 { |
125 if (application_.currentTool_ == Tools_LineMeasure) | 129 if (application_.currentTool_ == Tools_LineMeasure) |
126 { | 130 { |
127 return new LineMeasureTracker(statusBar, dynamic_cast<LayerWidget&>(widget).GetSlice(), | 131 return new LineMeasureTracker(statusBar, dynamic_cast<SliceViewerWidget&>(widget).GetSlice(), |
128 x, y, 255, 0, 0, application_.GetFont()); | 132 x, y, 255, 0, 0, application_.GetFont()); |
129 } | 133 } |
130 else if (application_.currentTool_ == Tools_CircleMeasure) | 134 else if (application_.currentTool_ == Tools_CircleMeasure) |
131 { | 135 { |
132 return new CircleMeasureTracker(statusBar, dynamic_cast<LayerWidget&>(widget).GetSlice(), | 136 return new CircleMeasureTracker(statusBar, dynamic_cast<SliceViewerWidget&>(widget).GetSlice(), |
133 x, y, 255, 0, 0, application_.GetFont()); | 137 x, y, 255, 0, 0, application_.GetFont()); |
134 } | 138 } |
135 } | 139 } |
136 return NULL; | 140 return NULL; |
137 } | 141 } |
143 double y, | 147 double y, |
144 IStatusBar* statusBar) | 148 IStatusBar* statusBar) |
145 { | 149 { |
146 if (statusBar != NULL) | 150 if (statusBar != NULL) |
147 { | 151 { |
148 Vector p = dynamic_cast<LayerWidget&>(widget).GetSlice().MapSliceToWorldCoordinates(x, y); | 152 Vector p = dynamic_cast<SliceViewerWidget&>(widget).GetSlice().MapSliceToWorldCoordinates(x, y); |
149 | 153 |
150 char buf[64]; | 154 char buf[64]; |
151 sprintf(buf, "X = %.02f Y = %.02f Z = %.02f (in cm)", | 155 sprintf(buf, "X = %.02f Y = %.02f Z = %.02f (in cm)", |
152 p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); | 156 p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); |
153 statusBar->SetMessage(buf); | 157 statusBar->SetMessage(buf); |
196 public: | 200 public: |
197 SimpleViewerApplicationAdapter(MessageBroker& broker, SimpleViewerApplication& application) | 201 SimpleViewerApplicationAdapter(MessageBroker& broker, SimpleViewerApplication& application) |
198 : WasmPlatformApplicationAdapter(broker, application), | 202 : WasmPlatformApplicationAdapter(broker, application), |
199 viewerApplication_(application) | 203 viewerApplication_(application) |
200 { | 204 { |
201 | 205 } |
202 } | 206 |
203 | 207 virtual void HandleMessageFromWeb(std::string& output, const std::string& input) |
204 virtual void HandleMessageFromWeb(std::string& output, const std::string& input) { | 208 { |
205 if (input == "select-tool:line-measure") | 209 if (input == "select-tool:line-measure") |
206 { | 210 { |
207 viewerApplication_.currentTool_ = Tools_LineMeasure; | 211 viewerApplication_.currentTool_ = Tools_LineMeasure; |
208 NotifyStatusUpdateFromCppToWeb("currentTool=line-measure"); | 212 NotifyStatusUpdateFromCppToWeb("currentTool=line-measure"); |
209 } | 213 } |
214 } | 218 } |
215 | 219 |
216 output = "ok"; | 220 output = "ok"; |
217 } | 221 } |
218 | 222 |
219 virtual void NotifyStatusUpdateFromCppToWeb(const std::string& statusUpdateMessage) { | 223 virtual void NotifyStatusUpdateFromCppToWeb(const std::string& statusUpdateMessage) |
224 { | |
220 UpdateStoneApplicationStatusFromCpp(statusUpdateMessage.c_str()); | 225 UpdateStoneApplicationStatusFromCpp(statusUpdateMessage.c_str()); |
221 } | 226 } |
222 | 227 |
223 }; | 228 }; |
224 #endif | 229 #endif |
230 Tools currentTool_; | 235 Tools currentTool_; |
231 std::auto_ptr<MainWidgetInteractor> mainWidgetInteractor_; | 236 std::auto_ptr<MainWidgetInteractor> mainWidgetInteractor_; |
232 std::auto_ptr<ThumbnailInteractor> thumbnailInteractor_; | 237 std::auto_ptr<ThumbnailInteractor> thumbnailInteractor_; |
233 LayoutWidget* mainLayout_; | 238 LayoutWidget* mainLayout_; |
234 LayoutWidget* thumbnailsLayout_; | 239 LayoutWidget* thumbnailsLayout_; |
235 std::vector<LayerWidget*> thumbnails_; | 240 std::vector<SliceViewerWidget*> thumbnails_; |
236 | 241 |
237 std::map<std::string, std::vector<std::string> > instancesIdsPerSeriesId_; | 242 std::map<std::string, std::vector<std::string> > instancesIdsPerSeriesId_; |
238 std::map<std::string, Json::Value> seriesTags_; | 243 std::map<std::string, Json::Value> seriesTags_; |
239 | 244 |
240 unsigned int currentInstanceIndex_; | 245 unsigned int currentInstanceIndex_; |
291 thumbnailsLayout_->SetPadding(10); | 296 thumbnailsLayout_->SetPadding(10); |
292 thumbnailsLayout_->SetBackgroundCleared(true); | 297 thumbnailsLayout_->SetBackgroundCleared(true); |
293 thumbnailsLayout_->SetBackgroundColor(50, 50, 50); | 298 thumbnailsLayout_->SetBackgroundColor(50, 50, 50); |
294 thumbnailsLayout_->SetVertical(); | 299 thumbnailsLayout_->SetVertical(); |
295 | 300 |
296 mainWidget_ = new LayerWidget(broker_, "main-viewport"); | 301 mainWidget_ = new SliceViewerWidget(broker_, "main-viewport"); |
297 //mainWidget_->RegisterObserver(*this); | 302 //mainWidget_->RegisterObserver(*this); |
298 | 303 |
299 // hierarchy | 304 // hierarchy |
300 mainLayout_->AddWidget(thumbnailsLayout_); | 305 mainLayout_->AddWidget(thumbnailsLayout_); |
301 mainLayout_->AddWidget(mainWidget_); | 306 mainLayout_->AddWidget(mainWidget_); |
317 | 322 |
318 | 323 |
319 if (parameters.count("studyId") < 1) | 324 if (parameters.count("studyId") < 1) |
320 { | 325 { |
321 LOG(WARNING) << "The study ID is missing, will take the first studyId found in Orthanc"; | 326 LOG(WARNING) << "The study ID is missing, will take the first studyId found in Orthanc"; |
322 orthancApiClient_->GetJsonAsync("/studies", | 327 orthancApiClient_->GetJsonAsync( |
323 new Callable<SimpleViewerApplication, OrthancApiClient::JsonResponseReadyMessage> | 328 "/studies", |
324 (*this, &SimpleViewerApplication::OnStudyListReceived)); | 329 new Callable<SimpleViewerApplication, OrthancApiClient::JsonResponseReadyMessage> |
330 (*this, &SimpleViewerApplication::OnStudyListReceived)); | |
325 } | 331 } |
326 else | 332 else |
327 { | 333 { |
328 SelectStudy(parameters["studyId"].as<std::string>()); | 334 SelectStudy(parameters["studyId"].as<std::string>()); |
329 } | 335 } |
344 | 350 |
345 if (response.isObject() && response["Series"].isArray()) | 351 if (response.isObject() && response["Series"].isArray()) |
346 { | 352 { |
347 for (size_t i=0; i < response["Series"].size(); i++) | 353 for (size_t i=0; i < response["Series"].size(); i++) |
348 { | 354 { |
349 orthancApiClient_->GetJsonAsync("/series/" + response["Series"][(int)i].asString(), | 355 orthancApiClient_->GetJsonAsync( |
350 new Callable<SimpleViewerApplication, OrthancApiClient::JsonResponseReadyMessage> | 356 "/series/" + response["Series"][(int)i].asString(), |
351 (*this, &SimpleViewerApplication::OnSeriesReceived)); | 357 new Callable<SimpleViewerApplication, OrthancApiClient::JsonResponseReadyMessage> |
358 (*this, &SimpleViewerApplication::OnSeriesReceived)); | |
352 } | 359 } |
353 } | 360 } |
354 } | 361 } |
355 | 362 |
356 void OnSeriesReceived(const OrthancApiClient::JsonResponseReadyMessage& message) | 363 void OnSeriesReceived(const OrthancApiClient::JsonResponseReadyMessage& message) |
373 | 380 |
374 // load the first instance in the thumbnail | 381 // load the first instance in the thumbnail |
375 LoadThumbnailForSeries(seriesId, instancesIdsPerSeriesId_[seriesId][0]); | 382 LoadThumbnailForSeries(seriesId, instancesIdsPerSeriesId_[seriesId][0]); |
376 | 383 |
377 // if this is the first thumbnail loaded, load the first instance in the mainWidget | 384 // if this is the first thumbnail loaded, load the first instance in the mainWidget |
378 LayerWidget& widget = *dynamic_cast<LayerWidget*>(mainWidget_); | 385 SliceViewerWidget& widget = *dynamic_cast<SliceViewerWidget*>(mainWidget_); |
379 if (widget.GetLayerCount() == 0) | 386 if (widget.GetLayerCount() == 0) |
380 { | 387 { |
381 smartLoader_->SetFrameInWidget(widget, 0, instancesIdsPerSeriesId_[seriesId][0], 0); | 388 smartLoader_->SetFrameInWidget(widget, 0, instancesIdsPerSeriesId_[seriesId][0], 0); |
382 } | 389 } |
383 } | 390 } |
384 } | 391 } |
385 | 392 |
386 void LoadThumbnailForSeries(const std::string& seriesId, const std::string& instanceId) | 393 void LoadThumbnailForSeries(const std::string& seriesId, const std::string& instanceId) |
387 { | 394 { |
388 LOG(INFO) << "Loading thumbnail for series " << seriesId; | 395 LOG(INFO) << "Loading thumbnail for series " << seriesId; |
389 LayerWidget* thumbnailWidget = new LayerWidget(IObserver::broker_, "thumbnail-series-" + seriesId); | 396 SliceViewerWidget* thumbnailWidget = new SliceViewerWidget(IObserver::broker_, "thumbnail-series-" + seriesId); |
390 thumbnails_.push_back(thumbnailWidget); | 397 thumbnails_.push_back(thumbnailWidget); |
391 thumbnailsLayout_->AddWidget(thumbnailWidget); | 398 thumbnailsLayout_->AddWidget(thumbnailWidget); |
392 thumbnailWidget->RegisterObserverCallback(new Callable<SimpleViewerApplication, LayerWidget::GeometryChangedMessage>(*this, &SimpleViewerApplication::OnWidgetGeometryChanged)); | 399 thumbnailWidget->RegisterObserverCallback(new Callable<SimpleViewerApplication, SliceViewerWidget::GeometryChangedMessage>(*this, &SimpleViewerApplication::OnWidgetGeometryChanged)); |
393 smartLoader_->SetFrameInWidget(*thumbnailWidget, 0, instanceId, 0); | 400 smartLoader_->SetFrameInWidget(*thumbnailWidget, 0, instanceId, 0); |
394 thumbnailWidget->SetInteractor(*thumbnailInteractor_); | 401 thumbnailWidget->SetInteractor(*thumbnailInteractor_); |
395 } | 402 } |
396 | 403 |
397 void SelectStudy(const std::string& studyId) | 404 void SelectStudy(const std::string& studyId) |
398 { | 405 { |
399 orthancApiClient_->GetJsonAsync("/studies/" + studyId, new Callable<SimpleViewerApplication, OrthancApiClient::JsonResponseReadyMessage>(*this, &SimpleViewerApplication::OnStudyReceived)); | 406 orthancApiClient_->GetJsonAsync("/studies/" + studyId, new Callable<SimpleViewerApplication, OrthancApiClient::JsonResponseReadyMessage>(*this, &SimpleViewerApplication::OnStudyReceived)); |
400 } | 407 } |
401 | 408 |
402 void OnWidgetGeometryChanged(const LayerWidget::GeometryChangedMessage& message) | 409 void OnWidgetGeometryChanged(const SliceViewerWidget::GeometryChangedMessage& message) |
403 { | 410 { |
404 message.GetOrigin().FitContent(); | 411 message.GetOrigin().FitContent(); |
405 } | 412 } |
406 | 413 |
407 void SelectSeriesInMainViewport(const std::string& seriesId) | 414 void SelectSeriesInMainViewport(const std::string& seriesId) |
408 { | 415 { |
409 LayerWidget& widget = *dynamic_cast<LayerWidget*>(mainWidget_); | 416 SliceViewerWidget& widget = *dynamic_cast<SliceViewerWidget*>(mainWidget_); |
410 smartLoader_->SetFrameInWidget(widget, 0, instancesIdsPerSeriesId_[seriesId][0], 0); | 417 smartLoader_->SetFrameInWidget(widget, 0, instancesIdsPerSeriesId_[seriesId][0], 0); |
411 } | 418 } |
412 | 419 |
413 const Orthanc::Font& GetFont() const | 420 const Orthanc::Font& GetFont() const |
414 { | 421 { |
438 AttachWidgetToWasmViewport("canvas2", mainWidget_); | 445 AttachWidgetToWasmViewport("canvas2", mainWidget_); |
439 } | 446 } |
440 #endif | 447 #endif |
441 | 448 |
442 }; | 449 }; |
443 | |
444 | |
445 } | 450 } |
446 } | 451 } |