4 // Handlers for events relating to the display of a survey.
6 // Copyright (C) 2000-2002,2005 Mark R. Shinwell
7 // Copyright (C) 2001,2003,2004,2005,2006,2011,2012,2014,2015,2016 Olly Betts
9 // This program is free software; you can redistribute it and/or modify
10 // it under the terms of the GNU General Public License as published by
11 // the Free Software Foundation; either version 2 of the License, or
12 // (at your option) any later version.
14 // This program is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
19 // You should have received a copy of the GNU General Public License
20 // along with this program; if not, write to the Free Software
21 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
28 #include "guicontrol.h"
30 #include <wx/confbase.h>
32 const int DISPLAY_SHIFT
= 10;
33 const double FLYFREE_SHIFT
= 0.2;
34 const double ROTATE_STEP
= 2.0;
36 GUIControl::GUIControl()
40 m_ReverseControls
= false;
41 m_LastDrag
= drag_NONE
;
44 void GUIControl::SetView(GfxCore
* view
)
49 bool GUIControl::MouseDown() const
51 return (dragging
!= NO_DRAG
);
54 void GUIControl::HandleTilt(wxPoint point
)
56 // Handle a mouse movement during tilt mode.
58 // wxGTK (at least) fails to update the cursor while dragging.
59 m_View
->UpdateCursor(GfxCore::CURSOR_ROTATE_VERTICALLY
);
61 int dy
= point
.y
- m_DragStart
.y
;
63 if (m_ReverseControls
!= m_View
->GetPerspective()) dy
= -dy
;
65 m_View
->TiltCave(Double(dy
) * 0.36);
69 m_View
->ForceRefresh();
72 void GUIControl::HandleTranslate(wxPoint point
)
74 // Handle a mouse movement during translation mode.
76 // wxGTK (at least) fails to update the cursor while dragging.
77 m_View
->UpdateCursor(GfxCore::CURSOR_DRAGGING_HAND
);
79 int dx
= point
.x
- m_DragStart
.x
;
80 int dy
= point
.y
- m_DragStart
.y
;
82 if (m_ReverseControls
) {
87 if (m_View
->GetPerspective())
88 m_View
->MoveViewer(0, -dy
* .1, dx
* .1);
90 m_View
->TranslateCave(dx
, dy
);
95 void GUIControl::HandleScaleRotate(wxPoint point
)
97 // Handle a mouse movement during scale/rotate mode.
99 // wxGTK (at least) fails to update the cursor while dragging.
100 m_View
->UpdateCursor(GfxCore::CURSOR_ZOOM_ROTATE
);
104 if (m_ScaleRotateLock
== lock_NONE
) {
105 // Dragging to scale or rotate but we've not decided which yet.
106 dx
= point
.x
- m_DragRealStart
.x
;
107 dy
= point
.y
- m_DragRealStart
.y
;
110 dx
= point
.x
- m_DragStart
.x
;
111 dy
= point
.y
- m_DragStart
.y
;
116 if (dx2
+ dy2
< threshold
) return;
118 switch (m_ScaleRotateLock
) {
121 m_ScaleRotateLock
= lock_ROTATE
;
122 // m_View->UpdateCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY);
124 m_ScaleRotateLock
= lock_SCALE
;
125 // m_View->UpdateCursor(GfxCore::CURSOR_ZOOM);
129 if (dx2
>= 8 * dy2
) {
130 m_ScaleRotateLock
= lock_ROTATE
;
131 // m_View->UpdateCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY);
135 if (dy2
>= 8 * dx2
) {
136 m_ScaleRotateLock
= lock_SCALE
;
137 // m_View->UpdateCursor(GfxCore::CURSOR_ZOOM);
142 if (m_ScaleRotateLock
== lock_ROTATE
) {
148 if (m_ReverseControls
) {
153 if (m_View
->GetPerspective()) {
154 if (dy
) m_View
->MoveViewer(-dy
* .1, 0, 0);
157 if (dy
) m_View
->SetScale(m_View
->GetScale() * pow(1.06, 0.08 * dy
));
158 // left/right => rotate.
159 if (dx
) m_View
->TurnCave(Double(dx
) * -0.36);
160 if (dx
|| dy
) m_View
->ForceRefresh();
166 void GUIControl::HandleTiltRotate(wxPoint point
)
168 // Handle a mouse movement during tilt/rotate mode.
169 if (m_View
->IsExtendedElevation()) return;
171 // wxGTK (at least) fails to update the cursor while dragging.
172 m_View
->UpdateCursor(GfxCore::CURSOR_ROTATE_EITHER_WAY
);
174 int dx
= point
.x
- m_DragStart
.x
;
175 int dy
= point
.y
- m_DragStart
.y
;
177 if (m_ReverseControls
!= m_View
->GetPerspective()) {
182 // left/right => rotate, up/down => tilt.
183 // Make tilt less sensitive than rotate as that feels better.
184 m_View
->TurnCave(Double(dx
) * -0.36);
185 m_View
->TiltCave(Double(dy
) * 0.18);
187 m_View
->ForceRefresh();
192 void GUIControl::HandleRotate(wxPoint point
)
194 // Handle a mouse movement during rotate mode.
195 if (m_View
->IsExtendedElevation()) return;
197 // wxGTK (at least) fails to update the cursor while dragging.
198 m_View
->UpdateCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY
);
200 int dx
= point
.x
- m_DragStart
.x
;
201 int dy
= point
.y
- m_DragStart
.y
;
203 if (m_ReverseControls
!= m_View
->GetPerspective()) {
208 // left/right => rotate.
209 m_View
->TurnCave(Double(dx
) * -0.36);
211 m_View
->ForceRefresh();
216 void GUIControl::RestoreCursor()
218 if (m_View
->HereIsReal()) {
219 m_View
->UpdateCursor(GfxCore::CURSOR_POINTING_HAND
);
221 m_View
->UpdateCursor(GfxCore::CURSOR_DEFAULT
);
225 void GUIControl::HandleNonDrag(const wxPoint
& point
) {
226 if (m_View
->IsFullScreen()) {
227 if (m_View
->FullScreenModeShowingMenus()) {
229 m_View
->FullScreenModeShowMenus(false);
232 m_View
->FullScreenModeShowMenus(true);
236 if (m_View
->CheckHitTestGrid(point
, false)) {
237 m_View
->UpdateCursor(GfxCore::CURSOR_POINTING_HAND
);
238 } else if (m_View
->PointWithinScaleBar(point
)) {
239 m_View
->UpdateCursor(GfxCore::CURSOR_HORIZONTAL_RESIZE
);
240 } else if (m_View
->PointWithinCompass(point
)) {
241 m_View
->UpdateCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY
);
242 } else if (m_View
->PointWithinClino(point
)) {
243 m_View
->UpdateCursor(GfxCore::CURSOR_ROTATE_VERTICALLY
);
250 // Mouse event handling methods
253 void GUIControl::OnMouseMove(wxMouseEvent
& event
)
255 // Mouse motion event handler.
256 if (!m_View
->HasData()) return;
258 // Ignore moves which don't change the position.
259 if (event
.GetPosition() == m_DragStart
) {
263 static long timestamp
= LONG_MIN
;
264 if (dragging
!= NO_DRAG
&& m_ScaleRotateLock
!= lock_NONE
&&
265 timestamp
!= LONG_MIN
) {
266 // If no motion for a second, reset the direction lock.
267 if (event
.GetTimestamp() - timestamp
>= 1000) {
268 m_ScaleRotateLock
= lock_NONE
;
269 m_DragRealStart
= m_DragStart
;
273 timestamp
= event
.GetTimestamp();
275 wxPoint
point(event
.GetPosition());
277 // Check hit-test grid (only if no buttons are pressed).
278 if (!event
.LeftIsDown() && !event
.MiddleIsDown() && !event
.RightIsDown()) {
279 HandleNonDrag(point
);
282 // Update coordinate display if in plan view,
283 // or altitude if in elevation view.
284 m_View
->SetCoords(point
);
288 switch (m_LastDrag
) {
290 // Drag in heading indicator.
291 m_View
->SetCompassFromPoint(point
);
294 // Drag in clinometer.
295 m_View
->SetClinoFromPoint(point
);
298 m_View
->SetScaleBarFromOffset(point
.x
- m_DragLast
.x
);
301 if (event
.ControlDown()) {
302 HandleTiltRotate(point
);
304 HandleScaleRotate(point
);
308 m_View
->SetZoomBox(m_DragStart
, point
, !event
.ShiftDown(), event
.ControlDown());
311 // Shouldn't happen?! FIXME: assert or something.
319 HandleTranslate(point
);
328 void GUIControl::OnLButtonDown(wxMouseEvent
& event
)
330 if (m_View
->HasData()) {
331 m_DragStart
= m_DragRealStart
= event
.GetPosition();
333 if (m_View
->PointWithinCompass(m_DragStart
)) {
334 m_LastDrag
= drag_COMPASS
;
335 m_View
->UpdateCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY
);
336 } else if (m_View
->PointWithinClino(m_DragStart
)) {
337 m_LastDrag
= drag_ELEV
;
338 m_View
->UpdateCursor(GfxCore::CURSOR_ROTATE_VERTICALLY
);
339 } else if (m_View
->PointWithinScaleBar(m_DragStart
)) {
340 m_LastDrag
= drag_SCALE
;
341 m_View
->UpdateCursor(GfxCore::CURSOR_HORIZONTAL_RESIZE
);
342 } else if (event
.ShiftDown()) {
343 m_LastDrag
= drag_ZOOM
;
344 m_View
->UpdateCursor(GfxCore::CURSOR_ZOOM
);
346 if (event
.ControlDown() && !m_View
->IsExtendedElevation()) {
347 m_View
->UpdateCursor(GfxCore::CURSOR_ROTATE_EITHER_WAY
);
349 m_View
->UpdateCursor(GfxCore::CURSOR_ZOOM_ROTATE
);
352 m_LastDrag
= drag_MAIN
;
353 m_ScaleRotateLock
= lock_NONE
;
356 // We need to release and recapture for the cursor to update (noticed
358 if (dragging
!= NO_DRAG
) m_View
->ReleaseMouse();
359 m_View
->CaptureMouse();
361 dragging
= LEFT_DRAG
;
365 void GUIControl::OnLButtonUp(wxMouseEvent
& event
)
367 if (m_View
->HasData()) {
368 if (dragging
!= LEFT_DRAG
)
371 if (event
.MiddleIsDown()) {
372 if (m_LastDrag
== drag_ZOOM
)
373 m_View
->UnsetZoomBox();
374 OnMButtonDown(event
);
378 if (event
.RightIsDown()) {
379 if (m_LastDrag
== drag_ZOOM
)
380 m_View
->UnsetZoomBox();
381 OnRButtonDown(event
);
385 if (m_LastDrag
== drag_ZOOM
) {
389 m_View
->ReleaseMouse();
391 m_LastDrag
= drag_NONE
;
394 m_View
->DragFinished();
396 if (event
.GetPosition() == m_DragRealStart
) {
398 m_View
->CheckHitTestGrid(m_DragStart
, true);
401 HandleNonDrag(event
.GetPosition());
406 void GUIControl::OnMButtonDown(wxMouseEvent
& event
)
408 if (m_View
->HasData() && !m_View
->IsExtendedElevation()) {
409 m_DragStart
= event
.GetPosition();
411 m_View
->UpdateCursor(GfxCore::CURSOR_ROTATE_VERTICALLY
);
413 if (dragging
!= NO_DRAG
) {
414 if (m_LastDrag
== drag_ZOOM
)
415 m_View
->UnsetZoomBox();
416 // We need to release and recapture for the cursor to update
417 // (noticed with wxGTK).
418 m_View
->ReleaseMouse();
420 m_View
->CaptureMouse();
421 dragging
= MIDDLE_DRAG
;
425 void GUIControl::OnMButtonUp(wxMouseEvent
& event
)
427 if (m_View
->HasData()) {
428 if (dragging
!= MIDDLE_DRAG
)
431 if (event
.LeftIsDown()) {
432 OnLButtonDown(event
);
436 if (event
.RightIsDown()) {
437 OnRButtonDown(event
);
442 m_View
->ReleaseMouse();
443 m_View
->DragFinished();
449 void GUIControl::OnRButtonDown(wxMouseEvent
& event
)
451 if (m_View
->HasData()) {
452 if (m_View
->HandleRClick(event
.GetPosition()))
455 m_DragStart
= event
.GetPosition();
457 m_View
->UpdateCursor(GfxCore::CURSOR_DRAGGING_HAND
);
459 if (dragging
!= NO_DRAG
) {
460 if (m_LastDrag
== drag_ZOOM
)
461 m_View
->UnsetZoomBox();
462 // We need to release and recapture for the cursor to update
463 // (noticed with wxGTK).
464 m_View
->ReleaseMouse();
466 m_View
->CaptureMouse();
467 dragging
= RIGHT_DRAG
;
471 void GUIControl::OnRButtonUp(wxMouseEvent
& event
)
473 if (dragging
!= RIGHT_DRAG
)
476 if (event
.LeftIsDown()) {
477 OnLButtonDown(event
);
481 if (event
.MiddleIsDown()) {
482 OnMButtonDown(event
);
486 m_LastDrag
= drag_NONE
;
487 m_View
->ReleaseMouse();
493 m_View
->DragFinished();
496 void GUIControl::OnMouseWheel(wxMouseEvent
& event
) {
497 int dy
= event
.GetWheelRotation();
498 if (m_View
->GetPerspective()) {
499 m_View
->MoveViewer(-dy
, 0, 0);
501 m_View
->SetScale(m_View
->GetScale() * pow(1.06, -0.04 * dy
));
502 m_View
->ForceRefresh();
506 void GUIControl::OnDisplayOverlappingNames()
508 m_View
->ToggleOverlappingNames();
511 void GUIControl::OnDisplayOverlappingNamesUpdate(wxUpdateUIEvent
& cmd
)
513 cmd
.Enable(m_View
->HasData() && m_View
->ShowingStationNames());
514 cmd
.Check(m_View
->ShowingOverlappingNames());
517 void GUIControl::OnColourByDepth()
519 if (m_View
->ColouringBy() == COLOUR_BY_DEPTH
) {
520 m_View
->SetColourBy(COLOUR_BY_NONE
);
522 m_View
->SetColourBy(COLOUR_BY_DEPTH
);
526 void GUIControl::OnColourByDate()
528 if (m_View
->ColouringBy() == COLOUR_BY_DATE
) {
529 m_View
->SetColourBy(COLOUR_BY_NONE
);
531 m_View
->SetColourBy(COLOUR_BY_DATE
);
535 void GUIControl::OnColourByError()
537 if (m_View
->ColouringBy() == COLOUR_BY_ERROR
) {
538 m_View
->SetColourBy(COLOUR_BY_NONE
);
540 m_View
->SetColourBy(COLOUR_BY_ERROR
);
544 void GUIControl::OnColourByGradient()
546 if (m_View
->ColouringBy() == COLOUR_BY_GRADIENT
) {
547 m_View
->SetColourBy(COLOUR_BY_NONE
);
549 m_View
->SetColourBy(COLOUR_BY_GRADIENT
);
553 void GUIControl::OnColourByLength()
555 if (m_View
->ColouringBy() == COLOUR_BY_LENGTH
) {
556 m_View
->SetColourBy(COLOUR_BY_NONE
);
558 m_View
->SetColourBy(COLOUR_BY_LENGTH
);
562 void GUIControl::OnColourBySurvey()
564 if (m_View
->ColouringBy() == COLOUR_BY_SURVEY
) {
565 m_View
->SetColourBy(COLOUR_BY_NONE
);
567 m_View
->SetColourBy(COLOUR_BY_SURVEY
);
571 void GUIControl::OnColourByUpdate(wxUpdateUIEvent
& cmd
)
573 cmd
.Enable(m_View
->HasData());
576 void GUIControl::OnColourByDepthUpdate(wxUpdateUIEvent
& cmd
)
578 cmd
.Enable(m_View
->HasData());
579 cmd
.Check(m_View
->ColouringBy() == COLOUR_BY_DEPTH
);
582 void GUIControl::OnColourByDateUpdate(wxUpdateUIEvent
& cmd
)
584 cmd
.Enable(m_View
->HasData());
585 cmd
.Check(m_View
->ColouringBy() == COLOUR_BY_DATE
);
588 void GUIControl::OnColourByErrorUpdate(wxUpdateUIEvent
& cmd
)
590 cmd
.Enable(m_View
->HasData());
591 cmd
.Check(m_View
->ColouringBy() == COLOUR_BY_ERROR
);
594 void GUIControl::OnColourByGradientUpdate(wxUpdateUIEvent
& cmd
)
596 cmd
.Enable(m_View
->HasData());
597 cmd
.Check(m_View
->ColouringBy() == COLOUR_BY_GRADIENT
);
600 void GUIControl::OnColourByLengthUpdate(wxUpdateUIEvent
& cmd
)
602 cmd
.Enable(m_View
->HasData());
603 cmd
.Check(m_View
->ColouringBy() == COLOUR_BY_LENGTH
);
606 void GUIControl::OnColourBySurveyUpdate(wxUpdateUIEvent
& cmd
)
608 cmd
.Enable(m_View
->HasData());
609 cmd
.Check(m_View
->ColouringBy() == COLOUR_BY_SURVEY
);
612 void GUIControl::OnShowCrosses()
614 m_View
->ToggleCrosses();
617 void GUIControl::OnShowCrossesUpdate(wxUpdateUIEvent
& cmd
)
619 cmd
.Enable(m_View
->HasData());
620 cmd
.Check(m_View
->ShowingCrosses());
623 void GUIControl::OnShowStationNames()
625 m_View
->ToggleStationNames();
628 void GUIControl::OnShowStationNamesUpdate(wxUpdateUIEvent
& cmd
)
630 cmd
.Enable(m_View
->HasData());
631 cmd
.Check(m_View
->ShowingStationNames());
634 void GUIControl::OnShowSurveyLegs()
636 m_View
->ToggleUndergroundLegs();
639 void GUIControl::OnShowSurveyLegsUpdate(wxUpdateUIEvent
& cmd
)
641 cmd
.Enable(m_View
->HasData() && m_View
->HasUndergroundLegs());
642 cmd
.Check(m_View
->ShowingUndergroundLegs());
645 void GUIControl::OnHideSplays()
647 m_View
->SetSplaysMode(SHOW_HIDE
);
650 void GUIControl::OnShowSplaysDashed()
652 m_View
->SetSplaysMode(SHOW_DASHED
);
655 void GUIControl::OnShowSplaysFaded()
657 m_View
->SetSplaysMode(SHOW_FADED
);
660 void GUIControl::OnShowSplaysNormal()
662 m_View
->SetSplaysMode(SHOW_NORMAL
);
665 void GUIControl::OnSplaysUpdate(wxUpdateUIEvent
& cmd
)
667 cmd
.Enable(m_View
->HasData() && m_View
->HasSplays());
670 void GUIControl::OnHideSplaysUpdate(wxUpdateUIEvent
& cmd
)
672 cmd
.Enable(m_View
->HasData() && m_View
->HasSplays());
673 cmd
.Check(m_View
->ShowingSplaysMode() == SHOW_HIDE
);
676 void GUIControl::OnShowSplaysDashedUpdate(wxUpdateUIEvent
& cmd
)
678 cmd
.Enable(m_View
->HasData() && m_View
->HasSplays());
679 cmd
.Check(m_View
->ShowingSplaysMode() == SHOW_DASHED
);
682 void GUIControl::OnShowSplaysFadedUpdate(wxUpdateUIEvent
& cmd
)
684 cmd
.Enable(m_View
->HasData() && m_View
->HasSplays());
685 cmd
.Check(m_View
->ShowingSplaysMode() == SHOW_FADED
);
688 void GUIControl::OnShowSplaysNormalUpdate(wxUpdateUIEvent
& cmd
)
690 cmd
.Enable(m_View
->HasData() && m_View
->HasSplays());
691 cmd
.Check(m_View
->ShowingSplaysMode() == SHOW_NORMAL
);
694 void GUIControl::OnHideDupes() {
695 m_View
->SetDupesMode(SHOW_HIDE
);
698 void GUIControl::OnShowDupesDashed() {
699 m_View
->SetDupesMode(SHOW_DASHED
);
702 void GUIControl::OnShowDupesFaded() {
703 m_View
->SetDupesMode(SHOW_FADED
);
706 void GUIControl::OnShowDupesNormal() {
707 m_View
->SetDupesMode(SHOW_NORMAL
);
710 void GUIControl::OnDupesUpdate(wxUpdateUIEvent
& cmd
) {
711 cmd
.Enable(m_View
->HasData() && m_View
->HasDupes());
714 void GUIControl::OnHideDupesUpdate(wxUpdateUIEvent
& cmd
) {
715 cmd
.Enable(m_View
->HasData() && m_View
->HasDupes());
716 cmd
.Check(m_View
->ShowingDupesMode() == SHOW_HIDE
);
719 void GUIControl::OnShowDupesDashedUpdate(wxUpdateUIEvent
& cmd
) {
720 cmd
.Enable(m_View
->HasData() && m_View
->HasDupes());
721 cmd
.Check(m_View
->ShowingDupesMode() == SHOW_DASHED
);
724 void GUIControl::OnShowDupesFadedUpdate(wxUpdateUIEvent
& cmd
) {
725 cmd
.Enable(m_View
->HasData() && m_View
->HasDupes());
726 cmd
.Check(m_View
->ShowingDupesMode() == SHOW_FADED
);
729 void GUIControl::OnShowDupesNormalUpdate(wxUpdateUIEvent
& cmd
) {
730 cmd
.Enable(m_View
->HasData() && m_View
->HasDupes());
731 cmd
.Check(m_View
->ShowingDupesMode() == SHOW_NORMAL
);
734 void GUIControl::OnMoveEast()
736 m_View
->TurnCaveTo(90.0);
737 m_View
->ForceRefresh();
740 void GUIControl::OnMoveEastUpdate(wxUpdateUIEvent
& cmd
)
742 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation() && m_View
->GetCompassValue() != 90.0);
745 void GUIControl::OnMoveNorth()
747 m_View
->TurnCaveTo(0.0);
748 m_View
->ForceRefresh();
751 void GUIControl::OnMoveNorthUpdate(wxUpdateUIEvent
& cmd
)
753 cmd
.Enable(m_View
->HasData() && m_View
->GetCompassValue() != 0.0);
756 void GUIControl::OnMoveSouth()
758 m_View
->TurnCaveTo(180.0);
759 m_View
->ForceRefresh();
762 void GUIControl::OnMoveSouthUpdate(wxUpdateUIEvent
& cmd
)
764 cmd
.Enable(m_View
->HasData() && m_View
->GetCompassValue() != 180.0);
767 void GUIControl::OnMoveWest()
769 m_View
->TurnCaveTo(270.0);
770 m_View
->ForceRefresh();
773 void GUIControl::OnMoveWestUpdate(wxUpdateUIEvent
& cmd
)
775 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation() && m_View
->GetCompassValue() != 270.0);
778 void GUIControl::OnToggleRotation()
780 m_View
->ToggleRotation();
783 void GUIControl::OnToggleRotationUpdate(wxUpdateUIEvent
& cmd
)
785 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation());
786 cmd
.Check(m_View
->HasData() && m_View
->IsRotating());
789 void GUIControl::OnReverseControls()
791 m_ReverseControls
= !m_ReverseControls
;
794 void GUIControl::OnReverseControlsUpdate(wxUpdateUIEvent
& cmd
)
796 cmd
.Enable(m_View
->HasData());
797 cmd
.Check(m_ReverseControls
);
800 void GUIControl::OnReverseDirectionOfRotation()
802 m_View
->ReverseRotation();
805 void GUIControl::OnReverseDirectionOfRotationUpdate(wxUpdateUIEvent
& cmd
)
807 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation());
810 void GUIControl::OnStepOnceAnticlockwise(bool accel
)
812 if (m_View
->GetPerspective()) {
813 m_View
->TurnCave(accel
? -5.0 * ROTATE_STEP
: -ROTATE_STEP
);
815 m_View
->TurnCave(accel
? 5.0 * ROTATE_STEP
: ROTATE_STEP
);
817 m_View
->ForceRefresh();
820 void GUIControl::OnStepOnceClockwise(bool accel
)
822 if (m_View
->GetPerspective()) {
823 m_View
->TurnCave(accel
? 5.0 * ROTATE_STEP
: ROTATE_STEP
);
825 m_View
->TurnCave(accel
? -5.0 * ROTATE_STEP
: -ROTATE_STEP
);
827 m_View
->ForceRefresh();
830 void GUIControl::OnDefaults()
835 void GUIControl::OnDefaultsUpdate(wxUpdateUIEvent
& cmd
)
837 cmd
.Enable(m_View
->HasData());
840 void GUIControl::OnElevation()
842 // Switch to elevation view.
844 m_View
->SwitchToElevation();
847 void GUIControl::OnElevationUpdate(wxUpdateUIEvent
& cmd
)
849 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation() && !m_View
->ShowingElevation());
852 void GUIControl::OnHigherViewpoint(bool accel
)
854 // Raise the viewpoint.
855 if (m_View
->GetPerspective()) {
856 m_View
->TiltCave(accel
? 5.0 * ROTATE_STEP
: ROTATE_STEP
);
858 m_View
->TiltCave(accel
? -5.0 * ROTATE_STEP
: -ROTATE_STEP
);
860 m_View
->ForceRefresh();
863 void GUIControl::OnLowerViewpoint(bool accel
)
865 // Lower the viewpoint.
866 if (m_View
->GetPerspective()) {
867 m_View
->TiltCave(accel
? -5.0 * ROTATE_STEP
: -ROTATE_STEP
);
869 m_View
->TiltCave(accel
? 5.0 * ROTATE_STEP
: ROTATE_STEP
);
871 m_View
->ForceRefresh();
874 void GUIControl::OnPlan()
876 // Switch to plan view.
877 m_View
->SwitchToPlan();
880 void GUIControl::OnPlanUpdate(wxUpdateUIEvent
& cmd
)
882 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation() && !m_View
->ShowingPlan());
885 void GUIControl::OnShiftDisplayDown(bool accel
)
887 if (m_View
->GetPerspective())
888 m_View
->MoveViewer(0, accel
? 5 * FLYFREE_SHIFT
: FLYFREE_SHIFT
, 0);
890 m_View
->TranslateCave(0, accel
? 5 * DISPLAY_SHIFT
: DISPLAY_SHIFT
);
893 void GUIControl::OnShiftDisplayLeft(bool accel
)
895 if (m_View
->GetPerspective())
896 m_View
->MoveViewer(0, 0, accel
? 5 * FLYFREE_SHIFT
: FLYFREE_SHIFT
);
898 m_View
->TranslateCave(accel
? -5 * DISPLAY_SHIFT
: -DISPLAY_SHIFT
, 0);
901 void GUIControl::OnShiftDisplayRight(bool accel
)
903 if (m_View
->GetPerspective())
904 m_View
->MoveViewer(0, 0, accel
? -5 * FLYFREE_SHIFT
: -FLYFREE_SHIFT
);
906 m_View
->TranslateCave(accel
? 5 * DISPLAY_SHIFT
: DISPLAY_SHIFT
, 0);
909 void GUIControl::OnShiftDisplayUp(bool accel
)
911 if (m_View
->GetPerspective())
912 m_View
->MoveViewer(0, accel
? -5 * FLYFREE_SHIFT
: -FLYFREE_SHIFT
, 0);
914 m_View
->TranslateCave(0, accel
? -5 * DISPLAY_SHIFT
: -DISPLAY_SHIFT
);
917 void GUIControl::OnZoomIn(bool accel
)
919 // Increase the scale.
921 if (m_View
->GetPerspective()) {
922 m_View
->MoveViewer(accel
? 5 * FLYFREE_SHIFT
: FLYFREE_SHIFT
, 0, 0);
924 m_View
->SetScale(m_View
->GetScale() * (accel
? 1.1236 : 1.06));
925 m_View
->ForceRefresh();
929 void GUIControl::OnZoomOut(bool accel
)
931 // Decrease the scale.
933 if (m_View
->GetPerspective()) {
934 m_View
->MoveViewer(accel
? -5 * FLYFREE_SHIFT
: -FLYFREE_SHIFT
, 0, 0);
936 m_View
->SetScale(m_View
->GetScale() / (accel
? 1.1236 : 1.06));
937 m_View
->ForceRefresh();
941 void GUIControl::OnToggleScalebar()
943 m_View
->ToggleScaleBar();
946 void GUIControl::OnToggleScalebarUpdate(wxUpdateUIEvent
& cmd
)
948 cmd
.Enable(m_View
->HasData());
949 cmd
.Check(m_View
->ShowingScaleBar());
952 void GUIControl::OnToggleColourKey()
954 m_View
->ToggleColourKey();
957 void GUIControl::OnToggleColourKeyUpdate(wxUpdateUIEvent
& cmd
)
959 cmd
.Enable(m_View
->HasData() && m_View
->ColouringBy() != COLOUR_BY_NONE
);
960 cmd
.Check(m_View
->ShowingColourKey());
963 void GUIControl::OnViewCompass()
965 m_View
->ToggleCompass();
968 void GUIControl::OnViewCompassUpdate(wxUpdateUIEvent
& cmd
)
970 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation());
971 cmd
.Check(m_View
->ShowingCompass());
974 void GUIControl::OnViewClino()
976 m_View
->ToggleClino();
979 void GUIControl::OnViewClinoUpdate(wxUpdateUIEvent
& cmd
)
981 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation());
982 cmd
.Check(m_View
->ShowingClino());
985 void GUIControl::OnShowSurface()
987 m_View
->ToggleSurfaceLegs();
990 void GUIControl::OnShowSurfaceUpdate(wxUpdateUIEvent
& cmd
)
992 cmd
.Enable(m_View
->HasData() && m_View
->HasSurfaceLegs());
993 cmd
.Check(m_View
->ShowingSurfaceLegs());
996 void GUIControl::OnShowEntrances()
998 m_View
->ToggleEntrances();
1001 void GUIControl::OnShowEntrancesUpdate(wxUpdateUIEvent
& cmd
)
1003 cmd
.Enable(m_View
->HasData() && (m_View
->GetNumEntrances() > 0));
1004 cmd
.Check(m_View
->ShowingEntrances());
1007 void GUIControl::OnShowFixedPts()
1009 m_View
->ToggleFixedPts();
1012 void GUIControl::OnShowFixedPtsUpdate(wxUpdateUIEvent
& cmd
)
1014 cmd
.Enable(m_View
->HasData() && (m_View
->GetNumFixedPts() > 0));
1015 cmd
.Check(m_View
->ShowingFixedPts());
1018 void GUIControl::OnShowExportedPts()
1020 m_View
->ToggleExportedPts();
1023 void GUIControl::OnShowExportedPtsUpdate(wxUpdateUIEvent
& cmd
)
1025 cmd
.Enable(m_View
->HasData() && (m_View
->GetNumExportedPts() > 0));
1026 cmd
.Check(m_View
->ShowingExportedPts());
1029 void GUIControl::OnViewGrid()
1031 m_View
->ToggleGrid();
1034 void GUIControl::OnViewGridUpdate(wxUpdateUIEvent
& cmd
)
1036 cmd
.Enable(m_View
->HasData());
1037 cmd
.Check(m_View
->ShowingGrid());
1040 void GUIControl::OnIndicatorsUpdate(wxUpdateUIEvent
& cmd
)
1042 cmd
.Enable(m_View
->HasData());
1045 void GUIControl::OnViewPerspective()
1047 m_View
->TogglePerspective();
1048 // Force update of coordinate display.
1049 if (m_View
->GetPerspective()) {
1050 m_View
->MoveViewer(0, 0, 0);
1052 m_View
->ClearCoords();
1056 void GUIControl::OnViewPerspectiveUpdate(wxUpdateUIEvent
& cmd
)
1058 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation());
1059 cmd
.Check(m_View
->GetPerspective());
1062 void GUIControl::OnViewSmoothShading()
1064 m_View
->ToggleSmoothShading();
1067 void GUIControl::OnViewSmoothShadingUpdate(wxUpdateUIEvent
& cmd
)
1069 cmd
.Enable(m_View
->HasData());
1070 cmd
.Check(m_View
->GetSmoothShading());
1073 void GUIControl::OnViewTextured()
1075 m_View
->ToggleTextured();
1078 void GUIControl::OnViewTexturedUpdate(wxUpdateUIEvent
& cmd
)
1080 cmd
.Enable(m_View
->HasData());
1081 cmd
.Check(m_View
->GetTextured());
1084 void GUIControl::OnViewFog()
1086 m_View
->ToggleFog();
1089 void GUIControl::OnViewFogUpdate(wxUpdateUIEvent
& cmd
)
1091 cmd
.Enable(m_View
->HasData());
1092 cmd
.Check(m_View
->GetFog());
1095 void GUIControl::OnViewSmoothLines()
1097 m_View
->ToggleAntiAlias();
1100 void GUIControl::OnViewSmoothLinesUpdate(wxUpdateUIEvent
& cmd
)
1102 cmd
.Enable(m_View
->HasData());
1103 cmd
.Check(m_View
->GetAntiAlias());
1106 void GUIControl::OnToggleMetric()
1108 m_View
->ToggleMetric();
1110 wxConfigBase::Get()->Write(wxT("metric"), m_View
->GetMetric());
1111 wxConfigBase::Get()->Flush();
1114 void GUIControl::OnToggleMetricUpdate(wxUpdateUIEvent
& cmd
)
1116 cmd
.Enable(m_View
->HasData());
1117 cmd
.Check(m_View
->GetMetric());
1120 void GUIControl::OnToggleDegrees()
1122 m_View
->ToggleDegrees();
1124 wxConfigBase::Get()->Write(wxT("degrees"), m_View
->GetDegrees());
1125 wxConfigBase::Get()->Flush();
1128 void GUIControl::OnToggleDegreesUpdate(wxUpdateUIEvent
& cmd
)
1130 cmd
.Enable(m_View
->HasData());
1131 cmd
.Check(m_View
->GetDegrees());
1134 void GUIControl::OnTogglePercent()
1136 m_View
->TogglePercent();
1138 wxConfigBase::Get()->Write(wxT("percent"), m_View
->GetPercent());
1139 wxConfigBase::Get()->Flush();
1142 void GUIControl::OnTogglePercentUpdate(wxUpdateUIEvent
& cmd
)
1144 cmd
.Enable(m_View
->HasData());
1145 cmd
.Check(m_View
->GetPercent());
1148 void GUIControl::OnToggleTubes()
1150 m_View
->ToggleTubes();
1153 void GUIControl::OnToggleTubesUpdate(wxUpdateUIEvent
& cmd
)
1155 cmd
.Enable(m_View
->HasData() && m_View
->HasTubes());
1156 cmd
.Check(m_View
->GetTubes());
1159 void GUIControl::OnCancelDistLine()
1161 m_View
->ClearTreeSelection();
1164 void GUIControl::OnCancelDistLineUpdate(wxUpdateUIEvent
& cmd
)
1166 cmd
.Enable(m_View
->ShowingMeasuringLine());
1169 void GUIControl::OnKeyPress(wxKeyEvent
&e
)
1171 if (!m_View
->HasData() ||
1172 (e
.GetModifiers() &~ (wxMOD_CONTROL
|wxMOD_SHIFT
))) {
1173 // Pass on the event if there's no survey data, or if any modifier keys
1174 // other than Ctrl and Shift are pressed.
1179 // The changelog says this is meant to keep animation going while keys are
1180 // pressed, but that happens anyway (on linux at least - perhaps it helps
1181 // on windows?) FIXME : check!
1182 //bool refresh = m_View->Animate();
1184 switch (e
.GetKeyCode()) {
1186 if (m_View
->CanLowerViewpoint() && !m_View
->IsExtendedElevation())
1187 OnLowerViewpoint(e
.GetModifiers() == wxMOD_SHIFT
);
1189 case '\'': case '@': case '"': // both shifted forms - US and UK kbd
1190 if (m_View
->CanRaiseViewpoint() && !m_View
->IsExtendedElevation())
1191 OnHigherViewpoint(e
.GetModifiers() == wxMOD_SHIFT
);
1194 if (!m_View
->IsExtendedElevation() && !m_View
->IsRotating())
1195 OnStepOnceAnticlockwise(e
.GetModifiers() == wxMOD_SHIFT
);
1198 if (!m_View
->IsExtendedElevation() && !m_View
->IsRotating())
1199 OnStepOnceClockwise(e
.GetModifiers() == wxMOD_SHIFT
);
1202 OnZoomIn(e
.GetModifiers() == wxMOD_SHIFT
);
1205 OnZoomOut(e
.GetModifiers() == wxMOD_SHIFT
);
1214 if (!m_View
->IsExtendedElevation())
1218 if (!m_View
->IsExtendedElevation())
1222 if (!m_View
->IsExtendedElevation())
1223 m_View
->RotateFaster(e
.GetModifiers() == wxMOD_SHIFT
);
1226 if (!m_View
->IsExtendedElevation())
1227 m_View
->RotateSlower(e
.GetModifiers() == wxMOD_SHIFT
);
1230 if (!m_View
->IsExtendedElevation())
1231 OnReverseDirectionOfRotation();
1234 if (!m_View
->IsExtendedElevation() && !m_View
->ShowingPlan())
1238 if (!m_View
->IsExtendedElevation() && !m_View
->ShowingElevation())
1242 OnDisplayOverlappingNames();
1245 if (e
.GetModifiers() == 0)
1249 if (e
.GetModifiers() == 0) {
1250 // For compatibility with older versions.
1251 if (!m_View
->IsExtendedElevation() && !m_View
->IsRotating())
1252 m_View
->StartRotation();
1256 if (e
.GetModifiers() == 0) {
1257 if (!m_View
->IsExtendedElevation())
1262 if ((e
.GetModifiers() &~ wxMOD_SHIFT
) == wxMOD_CONTROL
) {
1263 if (!m_View
->IsExtendedElevation() && !m_View
->IsRotating())
1264 OnStepOnceAnticlockwise(e
.GetModifiers() == wxMOD_SHIFT
);
1266 OnShiftDisplayLeft(e
.GetModifiers() == wxMOD_SHIFT
);
1270 if ((e
.GetModifiers() &~ wxMOD_SHIFT
) == wxMOD_CONTROL
) {
1271 if (!m_View
->IsExtendedElevation() && !m_View
->IsRotating())
1272 OnStepOnceClockwise(e
.GetModifiers() == wxMOD_SHIFT
);
1274 OnShiftDisplayRight(e
.GetModifiers() == wxMOD_SHIFT
);
1278 if ((e
.GetModifiers() &~ wxMOD_SHIFT
) == wxMOD_CONTROL
) {
1279 if (m_View
->CanRaiseViewpoint() && !m_View
->IsExtendedElevation())
1280 OnHigherViewpoint(e
.GetModifiers() == wxMOD_SHIFT
);
1282 OnShiftDisplayUp(e
.GetModifiers() == wxMOD_SHIFT
);
1286 if ((e
.GetModifiers() &~ wxMOD_SHIFT
) == wxMOD_CONTROL
) {
1287 if (m_View
->CanLowerViewpoint() && !m_View
->IsExtendedElevation())
1288 OnLowerViewpoint(e
.GetModifiers() == wxMOD_SHIFT
);
1290 OnShiftDisplayDown(e
.GetModifiers() == wxMOD_SHIFT
);
1294 if (e
.GetModifiers() == 0) {
1295 if (m_View
->ShowingMeasuringLine()) {
1297 } else if (m_View
->IsFullScreen()) {
1298 // Cancel full-screen mode on "Escape" if it isn't cancelling
1299 // the measuring line.
1300 m_View
->FullScreenMode();
1305 if (e
.GetModifiers() == 0)
1306 m_View
->ToggleFatFinger();
1309 if (e
.GetModifiers() == 0)
1310 m_View
->ToggleHitTestDebug();
1313 if (e
.GetModifiers() == 0) {
1316 if (wxTheAssertHandler
)
1317 wxTheAssertHandler
= NULL
;
1319 wxSetDefaultAssertHandler();
1320 if (wxTheAssertHandler
)
1321 msg
= wxT("Assertions enabled");
1323 msg
= wxT("Assertions disabled");
1325 msg
= wxT("wxWidgets was built without assertions");
1327 wxMessageBox(msg
, wxT("Aven Debug"), wxOK
| wxICON_INFORMATION
);
1332 if (e
.GetModifiers() == 0) {
1333 m_View
->InvalidateAllLists();
1334 m_View
->ForceRefresh();
1338 if (e
.GetModifiers() == 0)
1339 m_View
->ToggleRenderStats();
1345 //if (refresh) m_View->ForceRefresh();
1348 void GUIControl::OnViewFullScreenUpdate(wxUpdateUIEvent
& cmd
)
1350 cmd
.Check(m_View
->IsFullScreen());
1353 void GUIControl::OnViewFullScreen()
1355 m_View
->FullScreenMode();
1358 void GUIControl::OnViewBoundingBoxUpdate(wxUpdateUIEvent
& cmd
)
1360 cmd
.Enable(m_View
->HasData());
1361 cmd
.Check(m_View
->DisplayingBoundingBox());
1364 void GUIControl::OnViewBoundingBox()
1366 m_View
->ToggleBoundingBox();
1369 void GUIControl::OnViewTerrainUpdate(wxUpdateUIEvent
& cmd
)
1371 cmd
.Enable(m_View
->HasTerrain());
1372 cmd
.Check(m_View
->DisplayingTerrain());
1375 void GUIControl::OnViewTerrain()
1377 m_View
->ToggleTerrain();