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 }