6
* Code adapted from vtkINRIA3D
7
=========================================================================
10
Module: $Id: GinkgoInteractorStyleImage2D.cpp 955 2009-11-24 12:54:49Z tovar $
12
Author: $Author: filus $
13
Date: $Date: 2008-03-11 17:32:52 +0100 (mar, 11 mar 2008) $
14
Version: $Revision: 752 $
16
Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved.
17
See Copyright.txt for details.
19
This software is distributed WITHOUT ANY WARRANTY; without even
20
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
21
PURPOSE. See the above copyright notices for more information.
23
=========================================================================*/
27
#include "ginkgointeractorstyleimage2d.h"
28
#include "../command/ginkgoimagecommand.h"
29
#include <vtkAbstractPropPicker.h>
30
#include <vtkAssemblyPath.h>
32
#include <vtkObjectFactory.h>
33
#include <vtkRenderWindowInteractor.h>
34
#include <vtkImageData.h>
35
#include <vtkRenderWindow.h>
37
vtkCxxRevisionMacro(GinkgoInteractorStyleImage2D, "$Revision: 752 $");
38
vtkStandardNewMacro(GinkgoInteractorStyleImage2D);
40
#include <vtkCamera.h>
41
#include <vtkRenderer.h>
43
//----------------------------------------------------------------------------
45
GinkgoInteractorStyleImage2D::GinkgoInteractorStyleImage2D()
46
: vtkInteractorStyleImage()
50
this->LevelStep = 0.0;
51
this->WindowStep = 0.0;
54
//----------------------------------------------------------------------------
56
GinkgoInteractorStyleImage2D::~GinkgoInteractorStyleImage2D()
60
//----------------------------------------------------------------------------
62
void GinkgoInteractorStyleImage2D::OnMouseMove()
64
int x = this->Interactor->GetEventPosition()[0];
65
int y = this->Interactor->GetEventPosition()[1];
67
switch (this->State) {
68
case VTKIS_WINDOW_LEVEL:
69
this->FindPokedRenderer(x, y);
71
this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
75
// No Drag is allowed for picking. Toggle to ZSliceMove state
76
// We force StartZSliceMove or StartPan or StartDolly without ending the picking.
77
// We don't want to pick at all
79
this->StartZSliceMove();
80
// There we don't break to let the hand to ZSliceMove
82
case VTKIS_ZSLICE_MOVE:
83
this->FindPokedRenderer(x, y);
85
this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
89
this->FindPokedRenderer(x, y);
91
//this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
92
this->InvokeEvent(GinkgoImageCommand::ZoomEvent, this);
96
this->FindPokedRenderer(x, y);
98
this->PropagateCameraFocalAndPosition();
99
this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
106
void GinkgoInteractorStyleImage2D::PropagateCameraFocalAndPosition()
108
if (!this->GetView()) {
112
double pos[3], focal[3];
114
if (!this->GetView()->GetRenderer()) {
118
vtkCamera* camera = this->GetView()->GetRenderer()->GetActiveCamera();
119
camera->GetFocalPoint(focal);
120
camera->GetPosition(pos);
122
bool LinkCamera = this->GetView()->GetLinkCameraFocalAndPosition();
123
this->GetView()->SetLinkCameraFocalAndPosition(false);
124
this->GetView()->SyncSetCameraFocalAndPosition(focal, pos);
125
this->GetView()->SetLinkCameraFocalAndPosition(LinkCamera);
127
//this->GetView()->Render();
133
//----------------------------------------------------------------------------
135
void GinkgoInteractorStyleImage2D::OnLeftButtonDown()
137
int x = this->Interactor->GetEventPosition()[0];
138
int y = this->Interactor->GetEventPosition()[1];
140
this->FindPokedRenderer(x, y);
141
if (!this->CurrentRenderer) {
145
//switch ( this->View->GetInteractionStyle() )
146
switch (this->View->GetLeftButtonInteractionStyle()) {
148
case vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION :
149
this->WindowLevelStartPosition[0] = x;
150
this->WindowLevelStartPosition[1] = y;
151
this->StartWindowLevel();
154
case vtkGinkgoImageViewer::SELECT_INTERACTION :
157
case vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION :
163
case vtkGinkgoImageViewer::FULL_PAGE_INTERACTION :
166
case vtkGinkgoImageViewer::MEASURE_INTERACTION :
167
this->StartMeasure();
170
case vtkGinkgoImageViewer::ZOOM_INTERACTION :
172
if (this->Interactor->GetShiftKey()) {
175
this->StartDolly(); // continuous zoom
183
//----------------------------------------------------------------------------
185
void GinkgoInteractorStyleImage2D::OnMiddleButtonDown()
187
int x = this->Interactor->GetEventPosition()[0];
188
int y = this->Interactor->GetEventPosition()[1];
190
this->FindPokedRenderer(x, y);
191
if (!this->CurrentRenderer) {
195
//switch ( this->View->GetInteractionStyle() )
196
switch (this->View->GetMiddleButtonInteractionStyle()) {
198
case vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION :
199
this->WindowLevelStartPosition[0] = x;
200
this->WindowLevelStartPosition[1] = y;
201
this->StartWindowLevel();
204
case vtkGinkgoImageViewer::SELECT_INTERACTION :
207
case vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION :
211
case vtkGinkgoImageViewer::FULL_PAGE_INTERACTION :
214
case vtkGinkgoImageViewer::MEASURE_INTERACTION :
215
this->StartMeasure();
218
case vtkGinkgoImageViewer::ZOOM_INTERACTION :
224
//----------------------------------------------------------------------------
226
void GinkgoInteractorStyleImage2D::OnMiddleButtonUp()
228
switch (this->State) {
229
case VTKIS_ZSLICE_MOVE:
230
this->EndZSliceMove();
232
case VTKIS_WINDOW_LEVEL:
233
this->EndWindowLevel();
245
this->EndDolly(); // continuous zoom
251
//----------------------------------------------------------------------------
253
void GinkgoInteractorStyleImage2D::OnLeftButtonUp()
255
switch (this->State) {
256
case VTKIS_ZSLICE_MOVE:
257
this->EndZSliceMove();
259
case VTKIS_WINDOW_LEVEL:
260
this->EndWindowLevel();
268
case VTKIS_DOLLY: // continuous zoom
271
case VTKIS_PAN: // continuous zoom
277
//----------------------------------------------------------------------------
279
void GinkgoInteractorStyleImage2D::OnRightButtonDown()
281
int x = this->Interactor->GetEventPosition()[0];
282
int y = this->Interactor->GetEventPosition()[1];
284
this->FindPokedRenderer(x, y);
285
if (!this->CurrentRenderer) {
289
//switch ( this->View->GetInteractionStyle() )
290
switch (this->View->GetRightButtonInteractionStyle()) {
292
case vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION :
293
this->WindowLevelStartPosition[0] = x;
294
this->WindowLevelStartPosition[1] = y;
295
this->StartWindowLevel();
298
case vtkGinkgoImageViewer::SELECT_INTERACTION :
301
case vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION :
305
case vtkGinkgoImageViewer::FULL_PAGE_INTERACTION :
308
case vtkGinkgoImageViewer::MEASURE_INTERACTION :
309
this->StartMeasure();
312
case vtkGinkgoImageViewer::ZOOM_INTERACTION :
318
//----------------------------------------------------------------------------
320
void GinkgoInteractorStyleImage2D::OnRightButtonUp()
322
switch (this->State) {
323
case VTKIS_ZSLICE_MOVE:
324
this->EndZSliceMove();
326
case VTKIS_WINDOW_LEVEL:
327
this->EndWindowLevel();
335
case VTKIS_DOLLY: // continuous zoom
344
//----------------------------------------------------------------------------
346
void GinkgoInteractorStyleImage2D::OnChar()
348
vtkRenderWindowInteractor *rwi = this->Interactor;
351
//int *size = this->View->GetRenderWindow()->GetSize();
353
std::string key_sym(rwi->GetKeySym());
355
if ((key_sym.compare("Up") == 0) || (key_sym.compare("KP_Up") == 0)) {
357
switch (this->View->GetInteractionStyle()) {
359
case vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION :
360
this->StartWindowLevel();
361
this->SetWindowStep(0.0);
362
this->SetLevelStep(4.0 / size[1]);
363
this->InvokeEvent(vtkCommand::WindowLevelEvent, this);
364
this->EndWindowLevel();
368
case vtkGinkgoImageViewer::SELECT_INTERACTION :
369
this->StartZSliceMove();
370
this->ZSliceStep = 1;
371
this->InvokeEvent(GinkgoImageCommand::ZSliceMoveEvent, this);
372
this->EndZSliceMove();
375
case vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION :
378
//this->Dolly(pow((double)1.1, factor));
379
this->View->SyncSetZoom(pow((double) 1.1, factor) * this->View->GetZoom());
383
case vtkGinkgoImageViewer::ZOOM_INTERACTION :
386
//this->Dolly(pow((double)1.1, factor));
387
this->View->SyncSetZoom(pow((double) 1.1, factor) * this->View->GetZoom());
394
} else if ((key_sym.compare("Right") == 0) || (key_sym.compare("KP_Right") == 0)) {
396
/* switch (this->View->GetInteractionStyle()) {
398
case vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION :
399
this->StartWindowLevel();
400
this->SetWindowStep(4.0 / size[1]);
401
this->SetLevelStep(0.0);
402
this->InvokeEvent(vtkCommand::WindowLevelEvent, this);
403
this->EndWindowLevel();
409
} else if ((key_sym.compare("Left") == 0) || (key_sym.compare("KP_Left") == 0)) {
411
/* switch (this->View->GetInteractionStyle()) {
413
case vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION :
414
this->StartWindowLevel();
415
this->SetWindowStep(-4.0 / size[1]);
416
this->SetLevelStep(0.0);
417
this->InvokeEvent(vtkCommand::WindowLevelEvent, this);
418
this->EndWindowLevel();
424
} else if ((key_sym.compare("Down") == 0) || (key_sym.compare("KP_Down") == 0)) {
426
switch (this->View->GetInteractionStyle()) {
428
case vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION :
429
this->StartWindowLevel();
430
this->SetWindowStep(0.0);
431
this->SetLevelStep(-4.0 / size[1]);
432
this->InvokeEvent(vtkCommand::WindowLevelEvent, this);
433
this->EndWindowLevel();
436
case vtkGinkgoImageViewer::SELECT_INTERACTION :
437
this->StartZSliceMove();
438
this->ZSliceStep = -1;
439
this->InvokeEvent(GinkgoImageCommand::ZSliceMoveEvent, this);
440
this->EndZSliceMove();
443
case vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION :
446
//this->Dolly(pow((double)1.1, factor));
447
this->View->SyncSetZoom(pow((double) 1.1, factor) * this->View->GetZoom());
451
case vtkGinkgoImageViewer::ZOOM_INTERACTION :
454
//this->Dolly(pow((double)1.1, factor));
455
this->View->SyncSetZoom(pow((double) 1.1, factor) * this->View->GetZoom());
462
} else if ((key_sym.compare("Page_Down") == 0) || (key_sym.compare("KP_Page_Down") == 0)) {
463
switch (this->View->GetInteractionStyle()) {
465
case vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION :
466
this->StartWindowLevel();
467
this->SetWindowStep(0.0);
468
this->SetLevelStep(-40.0 / size[1]);
469
this->InvokeEvent(vtkCommand::WindowLevelEvent, this);
470
this->EndWindowLevel();
473
case vtkGinkgoImageViewer::SELECT_INTERACTION :
474
this->StartZSliceMove();
475
this->ZSliceStep = -10;
476
this->InvokeEvent(GinkgoImageCommand::ZSliceMoveEvent, this);
477
this->EndZSliceMove();
480
case vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION :
483
//this->Dolly(pow((double)1.1, factor));
484
this->View->SyncSetZoom(pow((double) 1.1, factor) * this->View->GetZoom());
488
case vtkGinkgoImageViewer::ZOOM_INTERACTION :
491
//this->Dolly(pow((double)1.1, factor));
492
this->View->SyncSetZoom(pow((double) 1.1, factor) * this->View->GetZoom());
500
} else if ((key_sym.compare("Page_Up") == 0) || (key_sym.compare("KP_Page_Up") == 0)) {
501
switch (this->View->GetInteractionStyle()) {
503
case vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION :
504
this->StartWindowLevel();
505
this->SetWindowStep(0.0);
506
this->SetLevelStep(40.0 / size[1]);
507
this->InvokeEvent(vtkCommand::WindowLevelEvent, this);
508
this->EndWindowLevel();
511
case vtkGinkgoImageViewer::SELECT_INTERACTION :
512
this->StartZSliceMove();
513
this->ZSliceStep = 10;
514
this->InvokeEvent(GinkgoImageCommand::ZSliceMoveEvent, this);
515
this->EndZSliceMove();
518
case vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION :
521
//this->Dolly(pow((double)1.1, factor));
522
this->View->SyncSetZoom(pow((double) 1.1, factor) * this->View->GetZoom());
526
case vtkGinkgoImageViewer::ZOOM_INTERACTION :
529
//this->Dolly(pow((double)1.1, factor));
530
this->View->SyncSetZoom(pow((double) 1.1, factor) * this->View->GetZoom());
541
vtkAssemblyPath *path = 0;
542
vtkAbstractPropPicker *picker = 0;
544
switch (rwi->GetKeyCode()) {
549
this->AnimState = VTKIS_ANIM_ON;
550
this->FindPokedRenderer(rwi->GetEventPosition()[0],
551
rwi->GetEventPosition()[1]);
552
rwi->GetPicker()->Pick(rwi->GetEventPosition()[0],
553
rwi->GetEventPosition()[1], 0.0,
554
this->CurrentRenderer);
555
picker = vtkAbstractPropPicker::SafeDownCast(rwi->GetPicker());
557
path = picker->GetPath();
560
rwi->FlyToImage(this->CurrentRenderer, picker->GetPickPosition());
562
this->AnimState = VTKIS_ANIM_OFF;
569
if (this->View->GetLeftButtonInteractionStyle() == vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION ||
570
this->View->GetRightButtonInteractionStyle() == vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION ||
571
this->View->GetMiddleButtonInteractionStyle() == vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION ||
572
this->View->GetWheelInteractionStyle() == vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION) {
573
this->InvokeEvent(vtkCommand::ResetWindowLevelEvent, this);
576
if (this->View->GetLeftButtonInteractionStyle() == vtkGinkgoImageViewer::SELECT_INTERACTION ||
577
this->View->GetRightButtonInteractionStyle() == vtkGinkgoImageViewer::SELECT_INTERACTION ||
578
this->View->GetMiddleButtonInteractionStyle() == vtkGinkgoImageViewer::SELECT_INTERACTION ||
579
this->View->GetWheelInteractionStyle() == vtkGinkgoImageViewer::SELECT_INTERACTION) {
580
this->InvokeEvent(GinkgoImageCommand::ResetPositionEvent, this);
582
if (this->View->GetLeftButtonInteractionStyle() == vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION ||
583
this->View->GetRightButtonInteractionStyle() == vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION ||
584
this->View->GetMiddleButtonInteractionStyle() == vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION ||
585
this->View->GetWheelInteractionStyle() == vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION) {
586
this->InvokeEvent(GinkgoImageCommand::ResetPositionEvent, this);
587
this->InvokeEvent(GinkgoImageCommand::ResetZoomEvent, this);
589
if (this->View->GetLeftButtonInteractionStyle() == vtkGinkgoImageViewer::ZOOM_INTERACTION ||
590
this->View->GetRightButtonInteractionStyle() == vtkGinkgoImageViewer::ZOOM_INTERACTION ||
591
this->View->GetMiddleButtonInteractionStyle() == vtkGinkgoImageViewer::ZOOM_INTERACTION ||
592
this->View->GetWheelInteractionStyle() == vtkGinkgoImageViewer::ZOOM_INTERACTION) {
593
this->InvokeEvent(GinkgoImageCommand::ResetZoomEvent, this);
601
//----------------------------------------------------------------------------
604
GinkgoInteractorStyleImage2D::StartZSliceMove()
606
if ((this->State != VTKIS_NONE) && (this->State != VTKIS_PICK)) {
609
this->StartState(VTKIS_ZSLICE_MOVE);
610
this->InvokeEvent(GinkgoImageCommand::StartZSliceMoveEvent, this);
614
GinkgoInteractorStyleImage2D::ZSliceMove()
616
vtkRenderWindowInteractor *rwi = this->Interactor;
617
int dy = rwi->GetEventPosition()[1] - rwi->GetLastEventPosition()[1];
618
this->ZSliceStep = dy;
619
this->InvokeEvent(GinkgoImageCommand::ZSliceMoveEvent, this);
623
GinkgoInteractorStyleImage2D::ZSliceWheelForward()
625
int dy = (int) this->MouseWheelMotionFactor;
626
this->ZSliceStep = dy;
627
this->InvokeEvent(GinkgoImageCommand::ZSliceMoveEvent, this);
631
GinkgoInteractorStyleImage2D::ZSliceWheelBackward()
633
int dy = (int) (-1.0 * this->MouseWheelMotionFactor);
634
this->ZSliceStep = dy;
635
this->InvokeEvent(GinkgoImageCommand::ZSliceMoveEvent, this);
639
GinkgoInteractorStyleImage2D::EndZSliceMove()
641
if (this->State != VTKIS_ZSLICE_MOVE) {
644
this->InvokeEvent(GinkgoImageCommand::EndZSliceMoveEvent, this);
648
//----------------------------------------------------------------------------
651
GinkgoInteractorStyleImage2D::FullPage()
653
this->InvokeEvent(GinkgoImageCommand::FullPageEvent, this);
656
//----------------------------------------------------------------------------
659
GinkgoInteractorStyleImage2D::StartMeasure()
661
if (this->State != VTKIS_NONE) {
664
this->StartState(VTKIS_MEASURE);
665
this->InvokeEvent(GinkgoImageCommand::StartMeasureEvent, this);
669
GinkgoInteractorStyleImage2D::Measure()
671
this->InvokeEvent(GinkgoImageCommand::MeasureEvent, this);
675
GinkgoInteractorStyleImage2D::EndMeasure()
677
if (this->State != VTKIS_MEASURE) {
680
this->InvokeEvent(GinkgoImageCommand::EndMeasureEvent, this);
683
//----------------------------------------------------------------------------
686
GinkgoInteractorStyleImage2D::WindowLevel()
688
vtkRenderWindowInteractor *rwi = this->Interactor;
690
this->WindowLevelCurrentPosition[0] = rwi->GetEventPosition()[0];
691
this->WindowLevelCurrentPosition[1] = rwi->GetEventPosition()[1];
693
int *size = this->View->GetRenderWindow()->GetSize();
695
// Compute normalized delta
697
(this->GetWindowLevelCurrentPosition()[0] -
698
this->GetWindowLevelStartPosition()[0]) / size[0];
700
(this->GetWindowLevelStartPosition()[1] -
701
this->GetWindowLevelCurrentPosition()[1]) / size[1];
703
this->SetWindowStep(dx);
704
this->SetLevelStep(dy);
706
this->InvokeEvent(vtkCommand::WindowLevelEvent, this);
710
GinkgoInteractorStyleImage2D::WindowLevelWheelForward()
712
int *size = this->View->GetRenderWindow()->GetSize();
714
double dy = 4.0 * (double) (this->MouseWheelMotionFactor) / size[1];
716
this->SetWindowStep(0.0);
717
this->SetLevelStep(dy);
719
this->InvokeEvent(vtkCommand::WindowLevelEvent, this);
723
GinkgoInteractorStyleImage2D::WindowLevelWheelBackward()
725
int *size = this->View->GetRenderWindow()->GetSize();
727
double dy = 4.0 * (double) (-1.0 * this->MouseWheelMotionFactor) / size[1];
729
this->SetWindowStep(0.0);
730
this->SetLevelStep(dy);
732
this->InvokeEvent(vtkCommand::WindowLevelEvent, this);
734
//----------------------------------------------------------------------------
736
void GinkgoInteractorStyleImage2D::OnMouseWheelForward()
739
int x = this->Interactor->GetEventPosition()[0];
740
int y = this->Interactor->GetEventPosition()[1];
744
this->FindPokedRenderer(x, y);
746
if (this->CurrentRenderer == NULL) {
750
switch (this->View->GetWheelInteractionStyle()) {
752
case vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION :
753
this->StartWindowLevel();
754
this->WindowLevelWheelForward();
755
this->EndWindowLevel();
758
case vtkGinkgoImageViewer::SELECT_INTERACTION :
759
this->StartZSliceMove();
760
this->ZSliceWheelForward();
761
this->EndZSliceMove();
763
case vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION :
765
factor = 10.0 * 0.2 * this->MouseWheelMotionFactor;
766
//this->Dolly(pow((double)1.1, factor));
767
this->View->SyncSetZoom(pow((double) 1.1, factor) * this->View->GetZoom());
771
case vtkGinkgoImageViewer::FULL_PAGE_INTERACTION :
775
case vtkGinkgoImageViewer::ZOOM_INTERACTION :
777
factor = 10.0 * 0.2 * this->MouseWheelMotionFactor;
778
//this->Dolly(pow((double)1.1, factor));
779
this->View->SyncSetZoom(pow((double) 1.1, factor) * this->View->GetZoom());
789
void GinkgoInteractorStyleImage2D::OnMouseWheelBackward()
791
int x = this->Interactor->GetEventPosition()[0];
792
int y = this->Interactor->GetEventPosition()[1];
796
this->FindPokedRenderer(x, y);
798
if (this->CurrentRenderer == NULL) {
803
switch (this->View->GetWheelInteractionStyle()) {
805
case vtkGinkgoImageViewer::WINDOW_LEVEL_INTERACTION :
806
this->StartWindowLevel();
807
this->WindowLevelWheelBackward();
808
this->EndWindowLevel();
811
case vtkGinkgoImageViewer::SELECT_INTERACTION :
812
this->StartZSliceMove();
813
this->ZSliceWheelBackward();
814
this->EndZSliceMove();
817
case vtkGinkgoImageViewer::ZOOM_WITH_SELECT_INTERACTION :
819
factor = 10.0 * -0.2 * this->MouseWheelMotionFactor;
820
//this->Dolly(pow((double)1.1, factor));
821
this->View->SyncSetZoom(pow((double) 1.1, factor) * this->View->GetZoom());
825
case vtkGinkgoImageViewer::FULL_PAGE_INTERACTION :
829
case vtkGinkgoImageViewer::ZOOM_INTERACTION :
831
factor = 10.0 * -0.2 * this->MouseWheelMotionFactor;
832
//this->Dolly(pow((double)1.1, factor));
833
this->View->SyncSetZoom(pow((double) 1.1, factor) * this->View->GetZoom());