Mercurial > hg > orthanc-stone
annotate Framework/Widgets/LayoutWidget.cpp @ 416:88c79f1537de captain
compatibility of captain branch with framework 1.4.2
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 15 Nov 2018 10:44:32 +0100 |
parents | ce48c3b3b0e9 |
children |
rev | line source |
---|---|
0 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
134
4cff7b1ed31d
upgrade to year 2018
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium |
0 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
47 | 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. | |
0 | 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 | |
47 | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
0 | 18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 **/ | |
20 | |
21 | |
22 #include "LayoutWidget.h" | |
23 | |
212
5412adf19980
resort to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
201
diff
changeset
|
24 #include <Core/Logging.h> |
5412adf19980
resort to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
201
diff
changeset
|
25 #include <Core/OrthancException.h> |
0 | 26 |
27 #include <boost/math/special_functions/round.hpp> | |
28 | |
29 namespace OrthancStone | |
30 { | |
416
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
31 // This is a compatibility reimplementation of |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
32 // "ImageAcessor::GetRegion()" to use Orthanc <= 1.4.2 together with |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
33 // Stone. |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
34 static void GetRegionCompatibility(Orthanc::ImageAccessor& target, |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
35 const Orthanc::ImageAccessor& source, |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
36 unsigned int x, |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
37 unsigned int y, |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
38 unsigned int width, |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
39 unsigned int height) |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
40 { |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
41 if (x + width > source.GetWidth() || |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
42 y + height > source.GetHeight()) |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
43 { |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
44 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
45 } |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
46 |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
47 if (width == 0 || |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
48 height == 0) |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
49 { |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
50 target.AssignWritable(source.GetFormat(), 0, 0, 0, NULL); |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
51 } |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
52 else if (source.IsReadOnly()) |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
53 { |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
54 const uint8_t* p = (reinterpret_cast<const uint8_t*>(source.GetBuffer()) + |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
55 y * source.GetPitch() + |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
56 x * source.GetBytesPerPixel()); |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
57 |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
58 target.AssignReadOnly(source.GetFormat(), width, height, source.GetPitch(), p); |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
59 } |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
60 else |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
61 { |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
62 uint8_t* p = (reinterpret_cast<uint8_t*>(source.GetBuffer()) + |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
63 y * source.GetPitch() + |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
64 x * source.GetBytesPerPixel()); |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
65 |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
66 target.AssignWritable(source.GetFormat(), width, height, source.GetPitch(), p); |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
67 } |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
68 } |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
69 |
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
70 |
0 | 71 class LayoutWidget::LayoutMouseTracker : public IMouseTracker |
72 { | |
73 private: | |
74 std::auto_ptr<IMouseTracker> tracker_; | |
75 int left_; | |
76 int top_; | |
77 unsigned int width_; | |
78 unsigned int height_; | |
416
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
79 |
0 | 80 public: |
81 LayoutMouseTracker(IMouseTracker* tracker, | |
82 int left, | |
83 int top, | |
84 unsigned int width, | |
85 unsigned int height) : | |
86 tracker_(tracker), | |
87 left_(left), | |
88 top_(top), | |
89 width_(width), | |
90 height_(height) | |
91 { | |
92 if (tracker == NULL) | |
93 { | |
94 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
95 } | |
96 } | |
97 | |
98 virtual void Render(Orthanc::ImageAccessor& surface) | |
99 { | |
316
ce48c3b3b0e9
fix for new ImageAccessor API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
212
diff
changeset
|
100 Orthanc::ImageAccessor accessor; |
416
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
101 GetRegionCompatibility(accessor, surface, left_, top_, width_, height_); |
0 | 102 tracker_->Render(accessor); |
103 } | |
104 | |
105 virtual void MouseUp() | |
106 { | |
107 tracker_->MouseUp(); | |
108 } | |
109 | |
110 virtual void MouseMove(int x, | |
111 int y) | |
112 { | |
113 tracker_->MouseMove(x - left_, y - top_); | |
114 } | |
115 }; | |
116 | |
117 | |
118 class LayoutWidget::ChildWidget : public boost::noncopyable | |
119 { | |
120 private: | |
121 std::auto_ptr<IWidget> widget_; | |
122 int left_; | |
123 int top_; | |
124 unsigned int width_; | |
125 unsigned int height_; | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
126 bool hasUpdate_; |
0 | 127 |
128 public: | |
129 ChildWidget(IWidget* widget) : | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
130 widget_(widget), |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
131 hasUpdate_(widget->HasUpdateContent()) |
0 | 132 { |
133 assert(widget != NULL); | |
134 SetEmpty(); | |
135 } | |
136 | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
137 void UpdateContent() |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
138 { |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
139 if (hasUpdate_) |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
140 { |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
141 widget_->UpdateContent(); |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
142 } |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
143 } |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
144 |
0 | 145 IWidget& GetWidget() const |
146 { | |
147 return *widget_; | |
148 } | |
149 | |
150 void SetRectangle(unsigned int left, | |
151 unsigned int top, | |
152 unsigned int width, | |
153 unsigned int height) | |
154 { | |
155 left_ = left; | |
156 top_ = top; | |
157 width_ = width; | |
158 height_ = height; | |
159 | |
160 widget_->SetSize(width, height); | |
161 } | |
162 | |
163 void SetEmpty() | |
164 { | |
165 SetRectangle(0, 0, 0, 0); | |
166 } | |
167 | |
168 bool Contains(int x, | |
169 int y) const | |
170 { | |
171 return (x >= left_ && | |
172 y >= top_ && | |
173 x < left_ + static_cast<int>(width_) && | |
174 y < top_ + static_cast<int>(height_)); | |
175 } | |
176 | |
177 bool Render(Orthanc::ImageAccessor& target) | |
178 { | |
179 if (width_ == 0 || | |
180 height_ == 0) | |
181 { | |
182 return true; | |
183 } | |
184 else | |
185 { | |
316
ce48c3b3b0e9
fix for new ImageAccessor API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
212
diff
changeset
|
186 Orthanc::ImageAccessor accessor; |
416
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
187 GetRegionCompatibility(accessor, target, left_, top_, width_, height_); |
0 | 188 return widget_->Render(accessor); |
189 } | |
190 } | |
191 | |
192 IMouseTracker* CreateMouseTracker(MouseButton button, | |
193 int x, | |
194 int y, | |
195 KeyboardModifiers modifiers) | |
196 { | |
197 if (Contains(x, y)) | |
198 { | |
199 IMouseTracker* tracker = widget_->CreateMouseTracker(button, | |
200 x - left_, | |
201 y - top_, | |
202 modifiers); | |
203 if (tracker) | |
204 { | |
205 return new LayoutMouseTracker(tracker, left_, top_, width_, height_); | |
206 } | |
207 } | |
208 | |
209 return NULL; | |
210 } | |
211 | |
212 void RenderMouseOver(Orthanc::ImageAccessor& target, | |
213 int x, | |
214 int y) | |
215 { | |
216 if (Contains(x, y)) | |
217 { | |
316
ce48c3b3b0e9
fix for new ImageAccessor API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
212
diff
changeset
|
218 Orthanc::ImageAccessor accessor; |
416
88c79f1537de
compatibility of captain branch with framework 1.4.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
219 GetRegionCompatibility(accessor, target, left_, top_, width_, height_); |
0 | 220 |
221 widget_->RenderMouseOver(accessor, x - left_, y - top_); | |
222 } | |
223 } | |
224 | |
225 void MouseWheel(MouseWheelDirection direction, | |
226 int x, | |
227 int y, | |
228 KeyboardModifiers modifiers) | |
229 { | |
230 if (Contains(x, y)) | |
231 { | |
232 widget_->MouseWheel(direction, x - left_, y - top_, modifiers); | |
233 } | |
234 } | |
54
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
235 |
55 | 236 bool HasRenderMouseOver() |
54
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
237 { |
55 | 238 return widget_->HasRenderMouseOver(); |
54
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
239 } |
0 | 240 }; |
241 | |
242 | |
243 void LayoutWidget::ComputeChildrenExtents() | |
244 { | |
245 if (children_.size() == 0) | |
246 { | |
247 return; | |
248 } | |
249 | |
250 float internal = static_cast<float>(paddingInternal_); | |
251 | |
252 if (width_ <= paddingLeft_ + paddingRight_ || | |
253 height_ <= paddingTop_ + paddingBottom_) | |
254 { | |
255 for (size_t i = 0; i < children_.size(); i++) | |
256 { | |
257 children_[i]->SetEmpty(); | |
258 } | |
259 } | |
260 else if (isHorizontal_) | |
261 { | |
262 unsigned int padding = paddingLeft_ + paddingRight_ + (children_.size() - 1) * paddingInternal_; | |
263 float childWidth = ((static_cast<float>(width_) - static_cast<float>(padding)) / | |
264 static_cast<float>(children_.size())); | |
265 | |
266 for (size_t i = 0; i < children_.size(); i++) | |
267 { | |
268 float left = static_cast<float>(paddingLeft_) + static_cast<float>(i) * (childWidth + internal); | |
269 float right = left + childWidth; | |
270 | |
271 if (left >= right) | |
272 { | |
273 children_[i]->SetEmpty(); | |
274 } | |
275 else | |
276 { | |
277 children_[i]->SetRectangle(static_cast<unsigned int>(left), | |
278 paddingTop_, | |
279 boost::math::iround(right - left), | |
280 height_ - paddingTop_ - paddingBottom_); | |
281 } | |
282 } | |
283 } | |
284 else | |
285 { | |
286 unsigned int padding = paddingTop_ + paddingBottom_ + (children_.size() - 1) * paddingInternal_; | |
287 float childHeight = ((static_cast<float>(height_) - static_cast<float>(padding)) / | |
288 static_cast<float>(children_.size())); | |
289 | |
290 for (size_t i = 0; i < children_.size(); i++) | |
291 { | |
292 float top = static_cast<float>(paddingTop_) + static_cast<float>(i) * (childHeight + internal); | |
293 float bottom = top + childHeight; | |
294 | |
295 if (top >= bottom) | |
296 { | |
297 children_[i]->SetEmpty(); | |
298 } | |
299 else | |
300 { | |
301 children_[i]->SetRectangle(paddingTop_, | |
302 static_cast<unsigned int>(top), | |
303 width_ - paddingLeft_ - paddingRight_, | |
304 boost::math::iround(bottom - top)); | |
305 } | |
306 } | |
307 } | |
308 | |
309 NotifyChange(*this); | |
310 } | |
311 | |
312 | |
313 LayoutWidget::LayoutWidget() : | |
314 isHorizontal_(true), | |
315 width_(0), | |
316 height_(0), | |
317 paddingLeft_(0), | |
318 paddingTop_(0), | |
319 paddingRight_(0), | |
320 paddingBottom_(0), | |
321 paddingInternal_(0) | |
322 { | |
323 } | |
324 | |
325 | |
326 LayoutWidget::~LayoutWidget() | |
327 { | |
328 for (size_t i = 0; i < children_.size(); i++) | |
329 { | |
330 delete children_[i]; | |
331 } | |
332 } | |
333 | |
334 | |
61
ca644004d2ee
MAJOR - removal of Start/Stop and observers in IWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
55
diff
changeset
|
335 void LayoutWidget::SetDefaultView() |
ca644004d2ee
MAJOR - removal of Start/Stop and observers in IWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
55
diff
changeset
|
336 { |
ca644004d2ee
MAJOR - removal of Start/Stop and observers in IWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
55
diff
changeset
|
337 for (size_t i = 0; i < children_.size(); i++) |
ca644004d2ee
MAJOR - removal of Start/Stop and observers in IWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
55
diff
changeset
|
338 { |
ca644004d2ee
MAJOR - removal of Start/Stop and observers in IWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
55
diff
changeset
|
339 children_[i]->GetWidget().SetDefaultView(); |
ca644004d2ee
MAJOR - removal of Start/Stop and observers in IWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
55
diff
changeset
|
340 } |
ca644004d2ee
MAJOR - removal of Start/Stop and observers in IWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
55
diff
changeset
|
341 } |
ca644004d2ee
MAJOR - removal of Start/Stop and observers in IWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
55
diff
changeset
|
342 |
ca644004d2ee
MAJOR - removal of Start/Stop and observers in IWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
55
diff
changeset
|
343 |
0 | 344 void LayoutWidget::NotifyChange(const IWidget& widget) |
345 { | |
346 // One of the children has changed | |
347 WidgetBase::NotifyChange(); | |
348 } | |
349 | |
350 | |
351 void LayoutWidget::SetHorizontal() | |
352 { | |
353 isHorizontal_ = true; | |
354 ComputeChildrenExtents(); | |
355 } | |
356 | |
357 | |
358 void LayoutWidget::SetVertical() | |
359 { | |
360 isHorizontal_ = false; | |
361 ComputeChildrenExtents(); | |
362 } | |
363 | |
364 | |
365 void LayoutWidget::SetPadding(unsigned int left, | |
366 unsigned int top, | |
367 unsigned int right, | |
368 unsigned int bottom, | |
369 unsigned int spacing) | |
370 { | |
371 paddingLeft_ = left; | |
372 paddingTop_ = top; | |
373 paddingRight_ = right; | |
374 paddingBottom_ = bottom; | |
375 paddingInternal_ = spacing; | |
376 } | |
377 | |
378 | |
379 void LayoutWidget::SetPadding(unsigned int padding) | |
380 { | |
381 paddingLeft_ = padding; | |
382 paddingTop_ = padding; | |
383 paddingRight_ = padding; | |
384 paddingBottom_ = padding; | |
385 paddingInternal_ = padding; | |
386 } | |
387 | |
388 | |
389 IWidget& LayoutWidget::AddWidget(IWidget* widget) // Takes ownership | |
390 { | |
391 if (widget == NULL) | |
392 { | |
393 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
394 } | |
395 | |
396 if (GetStatusBar() != NULL) | |
397 { | |
398 widget->SetStatusBar(*GetStatusBar()); | |
399 } | |
400 | |
401 children_.push_back(new ChildWidget(widget)); | |
61
ca644004d2ee
MAJOR - removal of Start/Stop and observers in IWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
55
diff
changeset
|
402 widget->SetParent(*this); |
0 | 403 |
404 ComputeChildrenExtents(); | |
405 | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
406 if (widget->HasUpdateContent()) |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
407 { |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
408 hasUpdateContent_ = true; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
409 } |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
410 |
0 | 411 return *widget; |
412 } | |
413 | |
414 | |
415 void LayoutWidget::SetStatusBar(IStatusBar& statusBar) | |
416 { | |
417 WidgetBase::SetStatusBar(statusBar); | |
418 | |
419 for (size_t i = 0; i < children_.size(); i++) | |
420 { | |
421 children_[i]->GetWidget().SetStatusBar(statusBar); | |
422 } | |
423 } | |
424 | |
425 | |
426 void LayoutWidget::SetSize(unsigned int width, | |
427 unsigned int height) | |
428 { | |
429 width_ = width; | |
430 height_ = height; | |
431 ComputeChildrenExtents(); | |
432 } | |
433 | |
434 | |
435 bool LayoutWidget::Render(Orthanc::ImageAccessor& surface) | |
436 { | |
437 if (!WidgetBase::Render(surface)) | |
438 { | |
439 return false; | |
440 } | |
441 | |
442 for (size_t i = 0; i < children_.size(); i++) | |
443 { | |
444 if (!children_[i]->Render(surface)) | |
445 { | |
446 return false; | |
447 } | |
448 } | |
449 | |
450 return true; | |
451 } | |
452 | |
453 | |
454 IMouseTracker* LayoutWidget::CreateMouseTracker(MouseButton button, | |
455 int x, | |
456 int y, | |
457 KeyboardModifiers modifiers) | |
458 { | |
459 for (size_t i = 0; i < children_.size(); i++) | |
460 { | |
461 IMouseTracker* tracker = children_[i]->CreateMouseTracker(button, x, y, modifiers); | |
462 if (tracker != NULL) | |
463 { | |
464 return tracker; | |
465 } | |
466 } | |
467 | |
468 return NULL; | |
469 } | |
470 | |
471 | |
472 void LayoutWidget::RenderMouseOver(Orthanc::ImageAccessor& target, | |
473 int x, | |
474 int y) | |
475 { | |
476 for (size_t i = 0; i < children_.size(); i++) | |
477 { | |
478 children_[i]->RenderMouseOver(target, x, y); | |
479 } | |
480 } | |
481 | |
482 | |
483 void LayoutWidget::MouseWheel(MouseWheelDirection direction, | |
484 int x, | |
485 int y, | |
486 KeyboardModifiers modifiers) | |
487 { | |
488 for (size_t i = 0; i < children_.size(); i++) | |
489 { | |
490 children_[i]->MouseWheel(direction, x, y, modifiers); | |
491 } | |
492 } | |
493 | |
494 | |
495 void LayoutWidget::KeyPressed(char key, | |
496 KeyboardModifiers modifiers) | |
497 { | |
498 for (size_t i = 0; i < children_.size(); i++) | |
499 { | |
500 children_[i]->GetWidget().KeyPressed(key, modifiers); | |
501 } | |
502 } | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
503 |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
504 |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
505 void LayoutWidget::UpdateContent() |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
506 { |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
507 if (hasUpdateContent_) |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
508 { |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
509 for (size_t i = 0; i < children_.size(); i++) |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
510 { |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
511 children_[i]->UpdateContent(); |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
512 } |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
513 } |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
514 else |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
515 { |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
516 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
517 } |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
518 } |
54
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
519 |
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
520 |
55 | 521 bool LayoutWidget::HasRenderMouseOver() |
54
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
522 { |
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
523 for (size_t i = 0; i < children_.size(); i++) |
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
524 { |
55 | 525 if (children_[i]->HasRenderMouseOver()) |
54
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
526 { |
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
527 return true; |
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
528 } |
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
529 } |
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
530 |
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
531 return false; |
01aa453d4d5b
IWidget::HasRenderMouseOver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
532 } |
0 | 533 } |