Mercurial > hg > orthanc-stone
comparison Applications/Samples/SimpleViewerApplication.h @ 287:2038d76bf13f am-2
interaction with HTML/JS
author | am@osimis.io |
---|---|
date | Thu, 30 Aug 2018 11:36:36 +0200 |
parents | 3c190e2bb3af |
children | 8c8da145fefa |
comparison
equal
deleted
inserted
replaced
286:6b3d91857b96 | 287:2038d76bf13f |
---|---|
29 #include "../../Framework/Widgets/LayerWidget.h" | 29 #include "../../Framework/Widgets/LayerWidget.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 | |
35 #include "../../Platforms/Wasm/IStoneApplicationToWebApplicationAdapter.h" | |
36 #include "../../Platforms/Wasm/Defaults.h" | |
37 #endif | |
34 #include <Core/Logging.h> | 38 #include <Core/Logging.h> |
35 | 39 |
36 namespace OrthancStone | 40 namespace OrthancStone |
37 { | 41 { |
38 namespace Samples | 42 namespace Samples |
39 { | 43 { |
40 class SimpleViewerApplication : | 44 class SimpleViewerApplication : |
41 public SampleApplicationBase, | 45 public SampleApplicationBase, |
46 #if ORTHANC_ENABLE_WASM==1 | |
47 public IStoneApplicationToWebApplicationAdapter, | |
48 #endif | |
42 public IObserver | 49 public IObserver |
43 { | 50 { |
44 private: | 51 private: |
45 class ThumbnailInteractor : public IWorldSceneInteractor | 52 class ThumbnailInteractor : public IWorldSceneInteractor |
46 { | 53 { |
176 LayoutWidget* mainLayout_; | 183 LayoutWidget* mainLayout_; |
177 LayoutWidget* thumbnailsLayout_; | 184 LayoutWidget* thumbnailsLayout_; |
178 LayerWidget* mainWidget_; | 185 LayerWidget* mainWidget_; |
179 std::vector<LayerWidget*> thumbnails_; | 186 std::vector<LayerWidget*> thumbnails_; |
180 std::map<std::string, std::vector<std::string>> instancesIdsPerSeriesId_; | 187 std::map<std::string, std::vector<std::string>> instancesIdsPerSeriesId_; |
188 std::map<std::string, Json::Value> seriesTags_; | |
181 | 189 |
182 unsigned int currentInstanceIndex_; | 190 unsigned int currentInstanceIndex_; |
183 OrthancStone::WidgetViewport* wasmViewport1_; | 191 OrthancStone::WidgetViewport* wasmViewport1_; |
184 OrthancStone::WidgetViewport* wasmViewport2_; | 192 OrthancStone::WidgetViewport* wasmViewport2_; |
185 | 193 |
295 { | 303 { |
296 if (response.isObject() && response["Instances"].isArray() && response["Instances"].size() > 0) | 304 if (response.isObject() && response["Instances"].isArray() && response["Instances"].size() > 0) |
297 { | 305 { |
298 // keep track of all instances IDs | 306 // keep track of all instances IDs |
299 const std::string& seriesId = response["ID"].asString(); | 307 const std::string& seriesId = response["ID"].asString(); |
308 seriesTags_[seriesId] = response; | |
300 instancesIdsPerSeriesId_[seriesId] = std::vector<std::string>(); | 309 instancesIdsPerSeriesId_[seriesId] = std::vector<std::string>(); |
301 for (size_t i = 0; i < response["Instances"].size(); i++) | 310 for (size_t i = 0; i < response["Instances"].size(); i++) |
302 { | 311 { |
303 const std::string& instanceId = response["Instances"][static_cast<int>(i)].asString(); | 312 const std::string& instanceId = response["Instances"][static_cast<int>(i)].asString(); |
304 instancesIdsPerSeriesId_[seriesId].push_back(instanceId); | 313 instancesIdsPerSeriesId_[seriesId].push_back(instanceId); |
349 default: | 358 default: |
350 VLOG("unhandled message type" << message.GetType()); | 359 VLOG("unhandled message type" << message.GetType()); |
351 } | 360 } |
352 } | 361 } |
353 | 362 |
363 void SelectSeriesInMainViewport(const std::string& seriesId) | |
364 { | |
365 mainWidget_->ReplaceLayer(0, smartLoader_->GetFrame(instancesIdsPerSeriesId_[seriesId][0], 0)); | |
354 #if ORTHANC_ENABLE_WASM==1 | 366 #if ORTHANC_ENABLE_WASM==1 |
355 virtual void InitializeWasm() { | 367 NotifyStatusUpdateFromCppToWeb("series-description=" + seriesTags_[seriesId]["MainDicomTags"]["SeriesDescription"].asString()); |
356 | |
357 AttachWidgetToWasmViewport("canvas", thumbnailsLayout_); | |
358 AttachWidgetToWasmViewport("canvas2", mainWidget_); | |
359 } | |
360 #endif | 368 #endif |
361 | |
362 | |
363 | |
364 void SelectSeriesInMainViewport(const std::string& seriesId) | |
365 { | |
366 mainWidget_->ReplaceLayer(0, smartLoader_->GetFrame(instancesIdsPerSeriesId_[seriesId][0], 0)); | |
367 } | 369 } |
368 | 370 |
369 virtual void OnPushButton1Clicked() {} | 371 virtual void OnPushButton1Clicked() {} |
370 virtual void OnPushButton2Clicked() {} | 372 virtual void OnPushButton2Clicked() {} |
371 virtual void OnTool1Clicked() { currentTool_ = Tools_LineMeasure;} | 373 virtual void OnTool1Clicked() { currentTool_ = Tools_LineMeasure;} |
379 tool1 = "line"; | 381 tool1 = "line"; |
380 tool2 = "circle"; | 382 tool2 = "circle"; |
381 pushButton1 = "action1"; | 383 pushButton1 = "action1"; |
382 pushButton2 = "action2"; | 384 pushButton2 = "action2"; |
383 } | 385 } |
386 | |
387 #if ORTHANC_ENABLE_WASM==1 | |
388 virtual void HandleMessageFromWeb(std::string& output, const std::string& input) { | |
389 if (input == "select-tool:line-measure") | |
390 { | |
391 currentTool_ = Tools_LineMeasure; | |
392 NotifyStatusUpdateFromCppToWeb("currentTool=line-measure"); | |
393 } | |
394 else if (input == "select-tool:circle-measure") | |
395 { | |
396 currentTool_ = Tools_CircleMeasure; | |
397 NotifyStatusUpdateFromCppToWeb("currentTool=circle-measure"); | |
398 } | |
399 | |
400 output = "ok"; | |
401 } | |
402 | |
403 virtual void NotifyStatusUpdateFromCppToWeb(const std::string& statusUpdateMessage) { | |
404 UpdateStoneApplicationStatusFromCpp(statusUpdateMessage.c_str()); | |
405 } | |
406 | |
407 virtual void InitializeWasm() { | |
408 | |
409 AttachWidgetToWasmViewport("canvas", thumbnailsLayout_); | |
410 AttachWidgetToWasmViewport("canvas2", mainWidget_); | |
411 } | |
412 #endif | |
384 }; | 413 }; |
385 | 414 |
386 | 415 |
387 } | 416 } |
388 } | 417 } |