Mercurial > hg > orthanc-stone
annotate Framework/Scene2D/ZoomSceneTracker.cpp @ 1213:86a8266b8888 broker
moving the scene from IViewport to ViewportController
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 04 Dec 2019 17:54:10 +0100 |
parents | 769249e1f3b4 |
children | 2d8ab34c8c91 |
rev | line source |
---|---|
596 | 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-2019 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. | |
16 * | |
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 #include "ZoomSceneTracker.h" | |
736
c0fcb2757b0a
enforce relative includes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
700
diff
changeset
|
23 #include "../Scene2DViewport/ViewportController.h" |
596 | 24 |
818
e42b491f1fb2
Removed typedefs to shared_ptr by making them explicit. Removed using namespace
Benjamin Golinvaux <bgo@osimis.io>
parents:
736
diff
changeset
|
25 using boost::weak_ptr; |
e42b491f1fb2
Removed typedefs to shared_ptr by making them explicit. Removed using namespace
Benjamin Golinvaux <bgo@osimis.io>
parents:
736
diff
changeset
|
26 using boost::shared_ptr; |
e42b491f1fb2
Removed typedefs to shared_ptr by making them explicit. Removed using namespace
Benjamin Golinvaux <bgo@osimis.io>
parents:
736
diff
changeset
|
27 |
596 | 28 namespace OrthancStone |
29 { | |
818
e42b491f1fb2
Removed typedefs to shared_ptr by making them explicit. Removed using namespace
Benjamin Golinvaux <bgo@osimis.io>
parents:
736
diff
changeset
|
30 ZoomSceneTracker::ZoomSceneTracker(weak_ptr<ViewportController> controllerW, |
596 | 31 const PointerEvent& event, |
700
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
32 unsigned int canvasHeight) |
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
33 : OneGesturePointerTracker(controllerW) |
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
34 , clickY_(event.GetMainPosition().GetY()) |
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
35 , aligner_(controllerW, event.GetMainPosition()) |
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
36 , originalSceneToCanvas_(GetController()->GetSceneToCanvasTransform()) |
596 | 37 { |
38 if (canvasHeight <= 3) | |
39 { | |
40 active_ = false; | |
41 } | |
42 else | |
43 { | |
44 normalization_ = 1.0 / static_cast<double>(canvasHeight - 1); | |
45 active_ = true; | |
46 } | |
47 } | |
48 | |
700
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
49 void ZoomSceneTracker::PointerMove(const PointerEvent& event) |
596 | 50 { |
51 static const double MIN_ZOOM = -4; | |
52 static const double MAX_ZOOM = 4; | |
53 | |
54 if (active_) | |
55 { | |
56 double y = event.GetMainPosition().GetY(); | |
700
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
57 |
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
58 // In the range [-1,1] |
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
59 double dy = static_cast<double>(y - clickY_) * normalization_; |
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
60 |
596 | 61 double z; |
62 | |
63 // Linear interpolation from [-1, 1] to [MIN_ZOOM, MAX_ZOOM] | |
64 if (dy < -1.0) | |
65 { | |
66 z = MIN_ZOOM; | |
67 } | |
68 else if (dy > 1.0) | |
69 { | |
70 z = MAX_ZOOM; | |
71 } | |
72 else | |
73 { | |
74 z = MIN_ZOOM + (MAX_ZOOM - MIN_ZOOM) * (dy + 1.0) / 2.0; | |
75 } | |
76 | |
77 double zoom = pow(2.0, z); | |
78 | |
958
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
79 // The controller is a weak pointer. It could be deleted when the |
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
80 // tracker is still alive (for instance, because of a lost WebGL |
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
81 // context) |
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
82 if(GetController().get() != NULL) |
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
83 { |
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
84 GetController()->SetSceneToCanvasTransform( |
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
85 AffineTransform2D::Combine( |
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
86 AffineTransform2D::CreateScaling(zoom, zoom), |
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
87 originalSceneToCanvas_)); |
596 | 88 |
958
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
89 aligner_.Apply(); |
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
90 } |
596 | 91 } |
92 } | |
700
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
93 |
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
94 void ZoomSceneTracker::Cancel() |
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
95 { |
958
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
96 if(GetController().get() != NULL) |
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
97 { |
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
98 GetController()->SetSceneToCanvasTransform(originalSceneToCanvas_); |
769249e1f3b4
added guards to prevent calling methods on a dead controller (see comment in diff for expl.) + build fix
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
99 } |
700
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
100 } |
596 | 101 } |