Mercurial > hg > orthanc-stone
annotate Applications/Samples/SimpleViewerApplication.h @ 292:df5011cf903c am-2
renaming
author | am@osimis.io |
---|---|
date | Thu, 30 Aug 2018 17:09:31 +0200 |
parents | 8c8da145fefa |
children | 3897f9f28cfa |
rev | line source |
---|---|
235 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium | |
6 * | |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
249 | 16 * |
235 | 17 * You should have received a copy of the GNU Affero General Public License |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
22 #pragma once | |
23 | |
24 #include "SampleApplicationBase.h" | |
25 | |
26 #include "../../Framework/Layers/OrthancFrameLayerSource.h" | |
285
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
27 #include "../../Framework/Layers/CircleMeasureTracker.h" |
281 | 28 #include "../../Framework/Layers/LineMeasureTracker.h" |
235 | 29 #include "../../Framework/Widgets/LayerWidget.h" |
30 #include "../../Framework/Widgets/LayoutWidget.h" | |
251
192e6e349e69
first usage of new message system (in SDL only)
am@osimis.io
parents:
249
diff
changeset
|
31 #include "../../Framework/Messages/IObserver.h" |
258 | 32 #include "../../Framework/SmartLoader.h" |
235 | 33 |
287 | 34 #if ORTHANC_ENABLE_WASM==1 |
35 #include "../../Platforms/Wasm/IStoneApplicationToWebApplicationAdapter.h" | |
36 #include "../../Platforms/Wasm/Defaults.h" | |
37 #endif | |
235 | 38 #include <Core/Logging.h> |
39 | |
40 namespace OrthancStone | |
41 { | |
42 namespace Samples | |
43 { | |
44 class SimpleViewerApplication : | |
249 | 45 public SampleApplicationBase, |
287 | 46 #if ORTHANC_ENABLE_WASM==1 |
47 public IStoneApplicationToWebApplicationAdapter, | |
48 #endif | |
251
192e6e349e69
first usage of new message system (in SDL only)
am@osimis.io
parents:
249
diff
changeset
|
49 public IObserver |
235 | 50 { |
51 private: | |
273
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
52 class ThumbnailInteractor : public IWorldSceneInteractor |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
53 { |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
54 private: |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
55 SimpleViewerApplication& application_; |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
56 public: |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
57 ThumbnailInteractor(SimpleViewerApplication& application) : |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
58 application_(application) |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
59 { |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
60 } |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
61 |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
62 virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
63 const ViewportGeometry& view, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
64 MouseButton button, |
281 | 65 KeyboardModifiers modifiers, |
273
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
66 double x, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
67 double y, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
68 IStatusBar* statusBar) |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
69 { |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
70 if (button == MouseButton_Left) |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
71 { |
279
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
72 statusBar->SetMessage("selected thumbnail " + widget.GetName()); |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
73 std::string seriesId = widget.GetName().substr(strlen("thumbnail-series-")); |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
74 application_.SelectSeriesInMainViewport(seriesId); |
273
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
75 } |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
76 return NULL; |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
77 } |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
78 virtual void MouseOver(CairoContext& context, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
79 WorldSceneWidget& widget, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
80 const ViewportGeometry& view, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
81 double x, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
82 double y, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
83 IStatusBar* statusBar) |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
84 {} |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
85 |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
86 virtual void MouseWheel(WorldSceneWidget& widget, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
87 MouseWheelDirection direction, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
88 KeyboardModifiers modifiers, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
89 IStatusBar* statusBar) |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
90 {} |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
91 |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
92 virtual void KeyPressed(WorldSceneWidget& widget, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
93 char key, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
94 KeyboardModifiers modifiers, |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
95 IStatusBar* statusBar) |
281 | 96 {} |
273
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
97 |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
98 }; |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
99 |
281 | 100 class MainWidgetInteractor : public IWorldSceneInteractor |
235 | 101 { |
102 private: | |
103 SimpleViewerApplication& application_; | |
104 | |
105 public: | |
281 | 106 MainWidgetInteractor(SimpleViewerApplication& application) : |
235 | 107 application_(application) |
108 { | |
109 } | |
110 | |
111 virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, | |
112 const ViewportGeometry& view, | |
113 MouseButton button, | |
281 | 114 KeyboardModifiers modifiers, |
235 | 115 double x, |
116 double y, | |
117 IStatusBar* statusBar) | |
118 { | |
281 | 119 if (button == MouseButton_Left) |
120 { | |
285
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
121 if (application_.currentTool_ == Tools_LineMeasure) |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
122 { |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
123 return new LineMeasureTracker(statusBar, dynamic_cast<LayerWidget&>(widget).GetSlice(), x, y, 255, 0, 0, 10); |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
124 } |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
125 else if (application_.currentTool_ == Tools_CircleMeasure) |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
126 { |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
127 return new CircleMeasureTracker(statusBar, dynamic_cast<LayerWidget&>(widget).GetSlice(), x, y, 255, 0, 0, 10); |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
128 } |
281 | 129 } |
235 | 130 return NULL; |
131 } | |
132 | |
133 virtual void MouseOver(CairoContext& context, | |
134 WorldSceneWidget& widget, | |
135 const ViewportGeometry& view, | |
136 double x, | |
137 double y, | |
138 IStatusBar* statusBar) | |
139 { | |
140 if (statusBar != NULL) | |
141 { | |
142 Vector p = dynamic_cast<LayerWidget&>(widget).GetSlice().MapSliceToWorldCoordinates(x, y); | |
143 | |
144 char buf[64]; | |
249 | 145 sprintf(buf, "X = %.02f Y = %.02f Z = %.02f (in cm)", |
235 | 146 p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); |
147 statusBar->SetMessage(buf); | |
148 } | |
149 } | |
150 | |
151 virtual void MouseWheel(WorldSceneWidget& widget, | |
152 MouseWheelDirection direction, | |
153 KeyboardModifiers modifiers, | |
154 IStatusBar* statusBar) | |
155 { | |
156 } | |
157 | |
158 virtual void KeyPressed(WorldSceneWidget& widget, | |
159 char key, | |
160 KeyboardModifiers modifiers, | |
161 IStatusBar* statusBar) | |
162 { | |
163 switch (key) | |
164 { | |
249 | 165 case 's': |
166 widget.SetDefaultView(); | |
167 break; | |
235 | 168 |
249 | 169 default: |
170 break; | |
235 | 171 } |
172 } | |
173 }; | |
174 | |
285
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
175 enum Tools { |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
176 Tools_LineMeasure, |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
177 Tools_CircleMeasure |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
178 }; |
235 | 179 |
285
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
180 Tools currentTool_; |
281 | 181 std::unique_ptr<MainWidgetInteractor> mainWidgetInteractor_; |
273
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
182 std::unique_ptr<ThumbnailInteractor> thumbnailInteractor_; |
235 | 183 LayoutWidget* mainLayout_; |
184 LayoutWidget* thumbnailsLayout_; | |
273
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
185 LayerWidget* mainWidget_; |
235 | 186 std::vector<LayerWidget*> thumbnails_; |
279
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
187 std::map<std::string, std::vector<std::string>> instancesIdsPerSeriesId_; |
287 | 188 std::map<std::string, Json::Value> seriesTags_; |
270 | 189 |
235 | 190 unsigned int currentInstanceIndex_; |
270 | 191 OrthancStone::WidgetViewport* wasmViewport1_; |
192 OrthancStone::WidgetViewport* wasmViewport2_; | |
235 | 193 |
254 | 194 IStatusBar* statusBar_; |
258 | 195 std::unique_ptr<SmartLoader> smartLoader_; |
270 | 196 std::unique_ptr<OrthancApiClient> orthancApiClient_; |
251
192e6e349e69
first usage of new message system (in SDL only)
am@osimis.io
parents:
249
diff
changeset
|
197 |
235 | 198 public: |
251
192e6e349e69
first usage of new message system (in SDL only)
am@osimis.io
parents:
249
diff
changeset
|
199 SimpleViewerApplication(MessageBroker& broker) : |
258 | 200 IObserver(broker), |
285
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
201 currentTool_(Tools_LineMeasure), |
235 | 202 mainLayout_(NULL), |
203 currentInstanceIndex_(0), | |
242 | 204 wasmViewport1_(NULL), |
285
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
205 wasmViewport2_(NULL) |
235 | 206 { |
267 | 207 DeclareIgnoredMessage(MessageType_Widget_ContentChanged); |
208 DeclareHandledMessage(MessageType_Widget_GeometryChanged); | |
270 | 209 |
210 DeclareHandledMessage(MessageType_OrthancApi_GetStudyIds_Ready); | |
211 DeclareHandledMessage(MessageType_OrthancApi_GetStudy_Ready); | |
212 DeclareHandledMessage(MessageType_OrthancApi_GetSeries_Ready); | |
235 | 213 } |
251
192e6e349e69
first usage of new message system (in SDL only)
am@osimis.io
parents:
249
diff
changeset
|
214 |
237
b4642964c355
SimpleViewer demo running both with SDL and Wasm
am@osimis.io
parents:
235
diff
changeset
|
215 virtual void Finalize() {} |
b4642964c355
SimpleViewer demo running both with SDL and Wasm
am@osimis.io
parents:
235
diff
changeset
|
216 virtual IWidget* GetCentralWidget() {return mainLayout_;} |
b4642964c355
SimpleViewer demo running both with SDL and Wasm
am@osimis.io
parents:
235
diff
changeset
|
217 |
235 | 218 virtual void DeclareStartupOptions(boost::program_options::options_description& options) |
219 { | |
220 boost::program_options::options_description generic("Sample options"); | |
221 generic.add_options() | |
270 | 222 ("studyId", boost::program_options::value<std::string>(), |
223 "Orthanc ID of the study") | |
249 | 224 ; |
235 | 225 |
249 | 226 options.add(generic); |
235 | 227 } |
228 | |
288 | 229 virtual void Initialize(StoneApplicationContext* context, |
242 | 230 IStatusBar& statusBar, |
235 | 231 const boost::program_options::variables_map& parameters) |
232 { | |
233 using namespace OrthancStone; | |
234 | |
242 | 235 context_ = context; |
254 | 236 statusBar_ = &statusBar; |
270 | 237 |
238 {// initialize viewports and layout | |
273
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
239 mainLayout_ = new LayoutWidget("main-layout"); |
270 | 240 mainLayout_->SetPadding(10); |
241 mainLayout_->SetBackgroundCleared(true); | |
242 mainLayout_->SetBackgroundColor(0, 0, 0); | |
243 mainLayout_->SetHorizontal(); | |
244 | |
273
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
245 thumbnailsLayout_ = new LayoutWidget("thumbnail-layout"); |
270 | 246 thumbnailsLayout_->SetPadding(10); |
247 thumbnailsLayout_->SetBackgroundCleared(true); | |
248 thumbnailsLayout_->SetBackgroundColor(50, 50, 50); | |
249 thumbnailsLayout_->SetVertical(); | |
250 | |
273
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
251 mainWidget_ = new LayerWidget(broker_, "main-viewport"); |
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
252 mainWidget_->RegisterObserver(*this); |
270 | 253 |
254 // hierarchy | |
255 mainLayout_->AddWidget(thumbnailsLayout_); | |
273
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
256 mainLayout_->AddWidget(mainWidget_); |
270 | 257 |
258 // sources | |
259 smartLoader_.reset(new SmartLoader(broker_, context_->GetWebService())); | |
260 smartLoader_->SetImageQuality(SliceImageQuality_FullPam); | |
261 | |
262 mainLayout_->SetTransmitMouseOver(true); | |
281 | 263 mainWidgetInteractor_.reset(new MainWidgetInteractor(*this)); |
264 mainWidget_->SetInteractor(*mainWidgetInteractor_); | |
273
f21ba2468570
force all Widgets to have a name to ease debugging
am@osimis.io
parents:
271
diff
changeset
|
265 thumbnailInteractor_.reset(new ThumbnailInteractor(*this)); |
270 | 266 } |
267 | |
235 | 268 statusBar.SetMessage("Use the key \"s\" to reinitialize the layout"); |
254 | 269 statusBar.SetMessage("Use the key \"n\" to go to next image in the main viewport"); |
235 | 270 |
270 | 271 orthancApiClient_.reset(new OrthancApiClient(broker_, context_->GetWebService())); |
272 | |
273 if (parameters.count("studyId") < 1) | |
235 | 274 { |
270 | 275 LOG(WARNING) << "The study ID is missing, will take the first studyId found in Orthanc"; |
276 orthancApiClient_->ScheduleGetStudyIds(*this); | |
235 | 277 } |
270 | 278 else |
235 | 279 { |
270 | 280 SelectStudy(parameters["studyId"].as<std::string>()); |
235 | 281 } |
270 | 282 } |
235 | 283 |
270 | 284 void OnStudyListReceived(const Json::Value& response) |
285 { | |
286 if (response.isArray() && response.size() > 1) | |
287 { | |
288 SelectStudy(response[0].asString()); | |
289 } | |
290 } | |
291 void OnStudyReceived(const Json::Value& response) | |
292 { | |
293 if (response.isObject() && response["Series"].isArray()) | |
294 { | |
295 for (size_t i=0; i < response["Series"].size(); i++) | |
296 { | |
297 orthancApiClient_->ScheduleGetSeries(*this, response["Series"][(int)i].asString()); | |
298 } | |
299 } | |
300 } | |
235 | 301 |
270 | 302 void OnSeriesReceived(const Json::Value& response) |
303 { | |
304 if (response.isObject() && response["Instances"].isArray() && response["Instances"].size() > 0) | |
305 { | |
279
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
306 // keep track of all instances IDs |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
307 const std::string& seriesId = response["ID"].asString(); |
287 | 308 seriesTags_[seriesId] = response; |
279
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
309 instancesIdsPerSeriesId_[seriesId] = std::vector<std::string>(); |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
310 for (size_t i = 0; i < response["Instances"].size(); i++) |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
311 { |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
312 const std::string& instanceId = response["Instances"][static_cast<int>(i)].asString(); |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
313 instancesIdsPerSeriesId_[seriesId].push_back(instanceId); |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
314 } |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
315 |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
316 // load the first instance in the thumbnail |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
317 LoadThumbnailForSeries(seriesId, instancesIdsPerSeriesId_[seriesId][0]); |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
318 |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
319 // if this is the first thumbnail loaded, load the first instance in the mainWidget |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
320 if (mainWidget_->GetLayerCount() == 0) |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
321 { |
285
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
322 mainWidget_->AddLayer(smartLoader_->GetFrame(instancesIdsPerSeriesId_[seriesId][0], 0)); |
279
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
323 } |
270 | 324 } |
325 } | |
326 | |
327 void LoadThumbnailForSeries(const std::string& seriesId, const std::string& instanceId) | |
328 { | |
271
46c5296d867e
OracleWebService and BasicSdlApplicationContext using the same global mutex
am@osimis.io
parents:
270
diff
changeset
|
329 LOG(INFO) << "Loading thumbnail for series " << seriesId; |
46c5296d867e
OracleWebService and BasicSdlApplicationContext using the same global mutex
am@osimis.io
parents:
270
diff
changeset
|
330 LayerWidget* thumbnailWidget = new LayerWidget(broker_, "thumbnail-series-" + seriesId); |
46c5296d867e
OracleWebService and BasicSdlApplicationContext using the same global mutex
am@osimis.io
parents:
270
diff
changeset
|
331 thumbnails_.push_back(thumbnailWidget); |
46c5296d867e
OracleWebService and BasicSdlApplicationContext using the same global mutex
am@osimis.io
parents:
270
diff
changeset
|
332 thumbnailsLayout_->AddWidget(thumbnailWidget); |
270 | 333 thumbnailWidget->RegisterObserver(*this); |
334 thumbnailWidget->AddLayer(smartLoader_->GetFrame(instanceId, 0)); | |
279
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
335 thumbnailWidget->SetInteractor(*thumbnailInteractor_); |
270 | 336 } |
235 | 337 |
270 | 338 void SelectStudy(const std::string& studyId) |
339 { | |
340 orthancApiClient_->ScheduleGetStudy(*this, studyId); | |
341 } | |
342 | |
343 virtual void HandleMessage(IObservable& from, const IMessage& message) { | |
344 switch (message.GetType()) { | |
345 case MessageType_Widget_GeometryChanged: | |
271
46c5296d867e
OracleWebService and BasicSdlApplicationContext using the same global mutex
am@osimis.io
parents:
270
diff
changeset
|
346 LOG(INFO) << "Widget geometry ready: " << dynamic_cast<LayerWidget&>(from).GetName(); |
270 | 347 dynamic_cast<LayerWidget&>(from).SetDefaultView(); |
348 break; | |
349 case MessageType_OrthancApi_GetStudyIds_Ready: | |
350 OnStudyListReceived(dynamic_cast<const OrthancApiClient::GetJsonResponseReadyMessage&>(message).response_); | |
351 break; | |
352 case MessageType_OrthancApi_GetSeries_Ready: | |
353 OnSeriesReceived(dynamic_cast<const OrthancApiClient::GetJsonResponseReadyMessage&>(message).response_); | |
354 break; | |
355 case MessageType_OrthancApi_GetStudy_Ready: | |
356 OnStudyReceived(dynamic_cast<const OrthancApiClient::GetJsonResponseReadyMessage&>(message).response_); | |
357 break; | |
358 default: | |
359 VLOG("unhandled message type" << message.GetType()); | |
360 } | |
242 | 361 } |
237
b4642964c355
SimpleViewer demo running both with SDL and Wasm
am@osimis.io
parents:
235
diff
changeset
|
362 |
279
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
363 void SelectSeriesInMainViewport(const std::string& seriesId) |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
364 { |
8f5d7495076d
SimpleViewer sample working in SDL, Qt and WASM
am@osimis.io
parents:
274
diff
changeset
|
365 mainWidget_->ReplaceLayer(0, smartLoader_->GetFrame(instancesIdsPerSeriesId_[seriesId][0], 0)); |
287 | 366 #if ORTHANC_ENABLE_WASM==1 |
367 NotifyStatusUpdateFromCppToWeb("series-description=" + seriesTags_[seriesId]["MainDicomTags"]["SeriesDescription"].asString()); | |
368 #endif | |
249 | 369 } |
285
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
370 |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
371 virtual void OnPushButton1Clicked() {} |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
372 virtual void OnPushButton2Clicked() {} |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
373 virtual void OnTool1Clicked() { currentTool_ = Tools_LineMeasure;} |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
374 virtual void OnTool2Clicked() { currentTool_ = Tools_CircleMeasure;} |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
375 |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
376 virtual void GetButtonNames(std::string& pushButton1, |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
377 std::string& pushButton2, |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
378 std::string& tool1, |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
379 std::string& tool2 |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
380 ) { |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
381 tool1 = "line"; |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
382 tool2 = "circle"; |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
383 pushButton1 = "action1"; |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
384 pushButton2 = "action2"; |
3c190e2bb3af
refactoring: ApplicationRunner + app hierarchy
am@osimis.io
parents:
281
diff
changeset
|
385 } |
287 | 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 | |
235 | 413 }; |
249 | 414 |
415 | |
235 | 416 } |
417 } |