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::OnColourByUpdate(wxUpdateUIEvent
& cmd
)
564 cmd
.Enable(m_View
->HasData());
567 void GUIControl::OnColourByDepthUpdate(wxUpdateUIEvent
& cmd
)
569 cmd
.Enable(m_View
->HasData());
570 cmd
.Check(m_View
->ColouringBy() == COLOUR_BY_DEPTH
);
573 void GUIControl::OnColourByDateUpdate(wxUpdateUIEvent
& cmd
)
575 cmd
.Enable(m_View
->HasData());
576 cmd
.Check(m_View
->ColouringBy() == COLOUR_BY_DATE
);
579 void GUIControl::OnColourByErrorUpdate(wxUpdateUIEvent
& cmd
)
581 cmd
.Enable(m_View
->HasData());
582 cmd
.Check(m_View
->ColouringBy() == COLOUR_BY_ERROR
);
585 void GUIControl::OnColourByGradientUpdate(wxUpdateUIEvent
& cmd
)
587 cmd
.Enable(m_View
->HasData());
588 cmd
.Check(m_View
->ColouringBy() == COLOUR_BY_GRADIENT
);
591 void GUIControl::OnColourByLengthUpdate(wxUpdateUIEvent
& cmd
)
593 cmd
.Enable(m_View
->HasData());
594 cmd
.Check(m_View
->ColouringBy() == COLOUR_BY_LENGTH
);
597 void GUIControl::OnShowCrosses()
599 m_View
->ToggleCrosses();
602 void GUIControl::OnShowCrossesUpdate(wxUpdateUIEvent
& cmd
)
604 cmd
.Enable(m_View
->HasData());
605 cmd
.Check(m_View
->ShowingCrosses());
608 void GUIControl::OnShowStationNames()
610 m_View
->ToggleStationNames();
613 void GUIControl::OnShowStationNamesUpdate(wxUpdateUIEvent
& cmd
)
615 cmd
.Enable(m_View
->HasData());
616 cmd
.Check(m_View
->ShowingStationNames());
619 void GUIControl::OnShowSurveyLegs()
621 m_View
->ToggleUndergroundLegs();
624 void GUIControl::OnShowSurveyLegsUpdate(wxUpdateUIEvent
& cmd
)
626 cmd
.Enable(m_View
->HasData() && m_View
->HasUndergroundLegs());
627 cmd
.Check(m_View
->ShowingUndergroundLegs());
630 void GUIControl::OnHideSplays()
632 m_View
->SetSplaysMode(SPLAYS_HIDE
);
635 void GUIControl::OnShowSplaysNormal()
637 m_View
->SetSplaysMode(SPLAYS_SHOW_NORMAL
);
640 void GUIControl::OnShowSplaysFaded()
642 m_View
->SetSplaysMode(SPLAYS_SHOW_FADED
);
645 void GUIControl::OnSplaysUpdate(wxUpdateUIEvent
& cmd
)
647 cmd
.Enable(m_View
->HasData() && m_View
->HasSplays());
650 void GUIControl::OnHideSplaysUpdate(wxUpdateUIEvent
& cmd
)
652 cmd
.Enable(m_View
->HasData() && m_View
->HasSplays());
653 cmd
.Check(m_View
->ShowingSplaysMode() == SPLAYS_HIDE
);
656 void GUIControl::OnShowSplaysNormalUpdate(wxUpdateUIEvent
& cmd
)
658 cmd
.Enable(m_View
->HasData() && m_View
->HasSplays());
659 cmd
.Check(m_View
->ShowingSplaysMode() == SPLAYS_SHOW_NORMAL
);
662 void GUIControl::OnShowSplaysFadedUpdate(wxUpdateUIEvent
& cmd
)
664 cmd
.Enable(m_View
->HasData() && m_View
->HasSplays());
665 cmd
.Check(m_View
->ShowingSplaysMode() == SPLAYS_SHOW_FADED
);
668 void GUIControl::OnHideDupes() {
669 m_View
->SetDupesMode(DUPES_HIDE
);
672 void GUIControl::OnShowDupesNormal() {
673 m_View
->SetDupesMode(DUPES_SHOW_NORMAL
);
676 void GUIControl::OnShowDupesDashed() {
677 m_View
->SetDupesMode(DUPES_SHOW_DASHED
);
680 void GUIControl::OnDupesUpdate(wxUpdateUIEvent
& cmd
) {
681 cmd
.Enable(m_View
->HasData() && m_View
->HasDupes());
684 void GUIControl::OnHideDupesUpdate(wxUpdateUIEvent
& cmd
) {
685 cmd
.Enable(m_View
->HasData() && m_View
->HasDupes());
686 cmd
.Check(m_View
->ShowingDupesMode() == DUPES_HIDE
);
689 void GUIControl::OnShowDupesNormalUpdate(wxUpdateUIEvent
& cmd
) {
690 cmd
.Enable(m_View
->HasData() && m_View
->HasDupes());
691 cmd
.Check(m_View
->ShowingDupesMode() == DUPES_SHOW_NORMAL
);
694 void GUIControl::OnShowDupesDashedUpdate(wxUpdateUIEvent
& cmd
) {
695 cmd
.Enable(m_View
->HasData() && m_View
->HasDupes());
696 cmd
.Check(m_View
->ShowingDupesMode() == DUPES_SHOW_DASHED
);
699 void GUIControl::OnMoveEast()
701 m_View
->TurnCaveTo(90.0);
702 m_View
->ForceRefresh();
705 void GUIControl::OnMoveEastUpdate(wxUpdateUIEvent
& cmd
)
707 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation() && m_View
->GetCompassValue() != 90.0);
710 void GUIControl::OnMoveNorth()
712 m_View
->TurnCaveTo(0.0);
713 m_View
->ForceRefresh();
716 void GUIControl::OnMoveNorthUpdate(wxUpdateUIEvent
& cmd
)
718 cmd
.Enable(m_View
->HasData() && m_View
->GetCompassValue() != 0.0);
721 void GUIControl::OnMoveSouth()
723 m_View
->TurnCaveTo(180.0);
724 m_View
->ForceRefresh();
727 void GUIControl::OnMoveSouthUpdate(wxUpdateUIEvent
& cmd
)
729 cmd
.Enable(m_View
->HasData() && m_View
->GetCompassValue() != 180.0);
732 void GUIControl::OnMoveWest()
734 m_View
->TurnCaveTo(270.0);
735 m_View
->ForceRefresh();
738 void GUIControl::OnMoveWestUpdate(wxUpdateUIEvent
& cmd
)
740 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation() && m_View
->GetCompassValue() != 270.0);
743 void GUIControl::OnToggleRotation()
745 m_View
->ToggleRotation();
748 void GUIControl::OnToggleRotationUpdate(wxUpdateUIEvent
& cmd
)
750 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation());
751 cmd
.Check(m_View
->HasData() && m_View
->IsRotating());
754 void GUIControl::OnReverseControls()
756 m_ReverseControls
= !m_ReverseControls
;
759 void GUIControl::OnReverseControlsUpdate(wxUpdateUIEvent
& cmd
)
761 cmd
.Enable(m_View
->HasData());
762 cmd
.Check(m_ReverseControls
);
765 void GUIControl::OnReverseDirectionOfRotation()
767 m_View
->ReverseRotation();
770 void GUIControl::OnReverseDirectionOfRotationUpdate(wxUpdateUIEvent
& cmd
)
772 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation());
775 void GUIControl::OnStepOnceAnticlockwise(bool accel
)
777 if (m_View
->GetPerspective()) {
778 m_View
->TurnCave(accel
? -5.0 * ROTATE_STEP
: -ROTATE_STEP
);
780 m_View
->TurnCave(accel
? 5.0 * ROTATE_STEP
: ROTATE_STEP
);
782 m_View
->ForceRefresh();
785 void GUIControl::OnStepOnceClockwise(bool accel
)
787 if (m_View
->GetPerspective()) {
788 m_View
->TurnCave(accel
? 5.0 * ROTATE_STEP
: ROTATE_STEP
);
790 m_View
->TurnCave(accel
? -5.0 * ROTATE_STEP
: -ROTATE_STEP
);
792 m_View
->ForceRefresh();
795 void GUIControl::OnDefaults()
800 void GUIControl::OnDefaultsUpdate(wxUpdateUIEvent
& cmd
)
802 cmd
.Enable(m_View
->HasData());
805 void GUIControl::OnElevation()
807 // Switch to elevation view.
809 m_View
->SwitchToElevation();
812 void GUIControl::OnElevationUpdate(wxUpdateUIEvent
& cmd
)
814 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation() && !m_View
->ShowingElevation());
817 void GUIControl::OnHigherViewpoint(bool accel
)
819 // Raise the viewpoint.
820 if (m_View
->GetPerspective()) {
821 m_View
->TiltCave(accel
? 5.0 * ROTATE_STEP
: ROTATE_STEP
);
823 m_View
->TiltCave(accel
? -5.0 * ROTATE_STEP
: -ROTATE_STEP
);
825 m_View
->ForceRefresh();
828 void GUIControl::OnLowerViewpoint(bool accel
)
830 // Lower the viewpoint.
831 if (m_View
->GetPerspective()) {
832 m_View
->TiltCave(accel
? -5.0 * ROTATE_STEP
: -ROTATE_STEP
);
834 m_View
->TiltCave(accel
? 5.0 * ROTATE_STEP
: ROTATE_STEP
);
836 m_View
->ForceRefresh();
839 void GUIControl::OnPlan()
841 // Switch to plan view.
842 m_View
->SwitchToPlan();
845 void GUIControl::OnPlanUpdate(wxUpdateUIEvent
& cmd
)
847 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation() && !m_View
->ShowingPlan());
850 void GUIControl::OnShiftDisplayDown(bool accel
)
852 if (m_View
->GetPerspective())
853 m_View
->MoveViewer(0, accel
? 5 * FLYFREE_SHIFT
: FLYFREE_SHIFT
, 0);
855 m_View
->TranslateCave(0, accel
? 5 * DISPLAY_SHIFT
: DISPLAY_SHIFT
);
858 void GUIControl::OnShiftDisplayLeft(bool accel
)
860 if (m_View
->GetPerspective())
861 m_View
->MoveViewer(0, 0, accel
? 5 * FLYFREE_SHIFT
: FLYFREE_SHIFT
);
863 m_View
->TranslateCave(accel
? -5 * DISPLAY_SHIFT
: -DISPLAY_SHIFT
, 0);
866 void GUIControl::OnShiftDisplayRight(bool accel
)
868 if (m_View
->GetPerspective())
869 m_View
->MoveViewer(0, 0, accel
? -5 * FLYFREE_SHIFT
: -FLYFREE_SHIFT
);
871 m_View
->TranslateCave(accel
? 5 * DISPLAY_SHIFT
: DISPLAY_SHIFT
, 0);
874 void GUIControl::OnShiftDisplayUp(bool accel
)
876 if (m_View
->GetPerspective())
877 m_View
->MoveViewer(0, accel
? -5 * FLYFREE_SHIFT
: -FLYFREE_SHIFT
, 0);
879 m_View
->TranslateCave(0, accel
? -5 * DISPLAY_SHIFT
: -DISPLAY_SHIFT
);
882 void GUIControl::OnZoomIn(bool accel
)
884 // Increase the scale.
886 if (m_View
->GetPerspective()) {
887 m_View
->MoveViewer(accel
? 5 * FLYFREE_SHIFT
: FLYFREE_SHIFT
, 0, 0);
889 m_View
->SetScale(m_View
->GetScale() * (accel
? 1.1236 : 1.06));
890 m_View
->ForceRefresh();
894 void GUIControl::OnZoomOut(bool accel
)
896 // Decrease the scale.
898 if (m_View
->GetPerspective()) {
899 m_View
->MoveViewer(accel
? -5 * FLYFREE_SHIFT
: -FLYFREE_SHIFT
, 0, 0);
901 m_View
->SetScale(m_View
->GetScale() / (accel
? 1.1236 : 1.06));
902 m_View
->ForceRefresh();
906 void GUIControl::OnToggleScalebar()
908 m_View
->ToggleScaleBar();
911 void GUIControl::OnToggleScalebarUpdate(wxUpdateUIEvent
& cmd
)
913 cmd
.Enable(m_View
->HasData());
914 cmd
.Check(m_View
->ShowingScaleBar());
917 void GUIControl::OnToggleColourKey()
919 m_View
->ToggleColourKey();
922 void GUIControl::OnToggleColourKeyUpdate(wxUpdateUIEvent
& cmd
)
924 cmd
.Enable(m_View
->HasData() && m_View
->ColouringBy() != COLOUR_BY_NONE
);
925 cmd
.Check(m_View
->ShowingColourKey());
928 void GUIControl::OnViewCompass()
930 m_View
->ToggleCompass();
933 void GUIControl::OnViewCompassUpdate(wxUpdateUIEvent
& cmd
)
935 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation());
936 cmd
.Check(m_View
->ShowingCompass());
939 void GUIControl::OnViewClino()
941 m_View
->ToggleClino();
944 void GUIControl::OnViewClinoUpdate(wxUpdateUIEvent
& cmd
)
946 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation());
947 cmd
.Check(m_View
->ShowingClino());
950 void GUIControl::OnShowSurface()
952 m_View
->ToggleSurfaceLegs();
955 void GUIControl::OnShowSurfaceUpdate(wxUpdateUIEvent
& cmd
)
957 cmd
.Enable(m_View
->HasData() && m_View
->HasSurfaceLegs());
958 cmd
.Check(m_View
->ShowingSurfaceLegs());
961 void GUIControl::OnShowEntrances()
963 m_View
->ToggleEntrances();
966 void GUIControl::OnShowEntrancesUpdate(wxUpdateUIEvent
& cmd
)
968 cmd
.Enable(m_View
->HasData() && (m_View
->GetNumEntrances() > 0));
969 cmd
.Check(m_View
->ShowingEntrances());
972 void GUIControl::OnShowFixedPts()
974 m_View
->ToggleFixedPts();
977 void GUIControl::OnShowFixedPtsUpdate(wxUpdateUIEvent
& cmd
)
979 cmd
.Enable(m_View
->HasData() && (m_View
->GetNumFixedPts() > 0));
980 cmd
.Check(m_View
->ShowingFixedPts());
983 void GUIControl::OnShowExportedPts()
985 m_View
->ToggleExportedPts();
988 void GUIControl::OnShowExportedPtsUpdate(wxUpdateUIEvent
& cmd
)
990 cmd
.Enable(m_View
->HasData() && (m_View
->GetNumExportedPts() > 0));
991 cmd
.Check(m_View
->ShowingExportedPts());
994 void GUIControl::OnViewGrid()
996 m_View
->ToggleGrid();
999 void GUIControl::OnViewGridUpdate(wxUpdateUIEvent
& cmd
)
1001 cmd
.Enable(m_View
->HasData());
1002 cmd
.Check(m_View
->ShowingGrid());
1005 void GUIControl::OnIndicatorsUpdate(wxUpdateUIEvent
& cmd
)
1007 cmd
.Enable(m_View
->HasData());
1010 void GUIControl::OnViewPerspective()
1012 m_View
->TogglePerspective();
1013 // Force update of coordinate display.
1014 if (m_View
->GetPerspective()) {
1015 m_View
->MoveViewer(0, 0, 0);
1017 m_View
->ClearCoords();
1021 void GUIControl::OnViewPerspectiveUpdate(wxUpdateUIEvent
& cmd
)
1023 cmd
.Enable(m_View
->HasData() && !m_View
->IsExtendedElevation());
1024 cmd
.Check(m_View
->GetPerspective());
1027 void GUIControl::OnViewSmoothShading()
1029 m_View
->ToggleSmoothShading();
1032 void GUIControl::OnViewSmoothShadingUpdate(wxUpdateUIEvent
& cmd
)
1034 cmd
.Enable(m_View
->HasData());
1035 cmd
.Check(m_View
->GetSmoothShading());
1038 void GUIControl::OnViewTextured()
1040 m_View
->ToggleTextured();
1043 void GUIControl::OnViewTexturedUpdate(wxUpdateUIEvent
& cmd
)
1045 cmd
.Enable(m_View
->HasData());
1046 cmd
.Check(m_View
->GetTextured());
1049 void GUIControl::OnViewFog()
1051 m_View
->ToggleFog();
1054 void GUIControl::OnViewFogUpdate(wxUpdateUIEvent
& cmd
)
1056 cmd
.Enable(m_View
->HasData());
1057 cmd
.Check(m_View
->GetFog());
1060 void GUIControl::OnViewSmoothLines()
1062 m_View
->ToggleAntiAlias();
1065 void GUIControl::OnViewSmoothLinesUpdate(wxUpdateUIEvent
& cmd
)
1067 cmd
.Enable(m_View
->HasData());
1068 cmd
.Check(m_View
->GetAntiAlias());
1071 void GUIControl::OnToggleMetric()
1073 m_View
->ToggleMetric();
1075 wxConfigBase::Get()->Write(wxT("metric"), m_View
->GetMetric());
1076 wxConfigBase::Get()->Flush();
1079 void GUIControl::OnToggleMetricUpdate(wxUpdateUIEvent
& cmd
)
1081 cmd
.Enable(m_View
->HasData());
1082 cmd
.Check(m_View
->GetMetric());
1085 void GUIControl::OnToggleDegrees()
1087 m_View
->ToggleDegrees();
1089 wxConfigBase::Get()->Write(wxT("degrees"), m_View
->GetDegrees());
1090 wxConfigBase::Get()->Flush();
1093 void GUIControl::OnToggleDegreesUpdate(wxUpdateUIEvent
& cmd
)
1095 cmd
.Enable(m_View
->HasData());
1096 cmd
.Check(m_View
->GetDegrees());
1099 void GUIControl::OnTogglePercent()
1101 m_View
->TogglePercent();
1103 wxConfigBase::Get()->Write(wxT("percent"), m_View
->GetPercent());
1104 wxConfigBase::Get()->Flush();
1107 void GUIControl::OnTogglePercentUpdate(wxUpdateUIEvent
& cmd
)
1109 cmd
.Enable(m_View
->HasData());
1110 cmd
.Check(m_View
->GetPercent());
1113 void GUIControl::OnToggleTubes()
1115 m_View
->ToggleTubes();
1118 void GUIControl::OnToggleTubesUpdate(wxUpdateUIEvent
& cmd
)
1120 cmd
.Enable(m_View
->HasData() && m_View
->HasTubes());
1121 cmd
.Check(m_View
->GetTubes());
1124 void GUIControl::OnCancelDistLine()
1126 m_View
->ClearTreeSelection();
1129 void GUIControl::OnCancelDistLineUpdate(wxUpdateUIEvent
& cmd
)
1131 cmd
.Enable(m_View
->ShowingMeasuringLine());
1134 void GUIControl::OnKeyPress(wxKeyEvent
&e
)
1136 if (!m_View
->HasData() ||
1137 (e
.GetModifiers() &~ (wxMOD_CONTROL
|wxMOD_SHIFT
))) {
1138 // Pass on the event if there's no survey data, or if any modifier keys
1139 // other than Ctrl and Shift are pressed.
1144 // The changelog says this is meant to keep animation going while keys are
1145 // pressed, but that happens anyway (on linux at least - perhaps it helps
1146 // on windows?) FIXME : check!
1147 //bool refresh = m_View->Animate();
1149 switch (e
.GetKeyCode()) {
1151 if (m_View
->CanLowerViewpoint() && !m_View
->IsExtendedElevation())
1152 OnLowerViewpoint(e
.GetModifiers() == wxMOD_SHIFT
);
1154 case '\'': case '@': case '"': // both shifted forms - US and UK kbd
1155 if (m_View
->CanRaiseViewpoint() && !m_View
->IsExtendedElevation())
1156 OnHigherViewpoint(e
.GetModifiers() == wxMOD_SHIFT
);
1159 if (!m_View
->IsExtendedElevation() && !m_View
->IsRotating())
1160 OnStepOnceAnticlockwise(e
.GetModifiers() == wxMOD_SHIFT
);
1163 if (!m_View
->IsExtendedElevation() && !m_View
->IsRotating())
1164 OnStepOnceClockwise(e
.GetModifiers() == wxMOD_SHIFT
);
1167 OnZoomIn(e
.GetModifiers() == wxMOD_SHIFT
);
1170 OnZoomOut(e
.GetModifiers() == wxMOD_SHIFT
);
1179 if (!m_View
->IsExtendedElevation())
1183 if (!m_View
->IsExtendedElevation())
1187 if (!m_View
->IsExtendedElevation())
1188 m_View
->RotateFaster(e
.GetModifiers() == wxMOD_SHIFT
);
1191 if (!m_View
->IsExtendedElevation())
1192 m_View
->RotateSlower(e
.GetModifiers() == wxMOD_SHIFT
);
1195 if (!m_View
->IsExtendedElevation())
1196 OnReverseDirectionOfRotation();
1199 if (!m_View
->IsExtendedElevation() && !m_View
->ShowingPlan())
1203 if (!m_View
->IsExtendedElevation() && !m_View
->ShowingElevation())
1207 OnDisplayOverlappingNames();
1210 if (e
.GetModifiers() == 0)
1214 if (e
.GetModifiers() == 0) {
1215 // For compatibility with older versions.
1216 if (!m_View
->IsExtendedElevation() && !m_View
->IsRotating())
1217 m_View
->StartRotation();
1221 if (e
.GetModifiers() == 0) {
1222 if (!m_View
->IsExtendedElevation())
1227 if ((e
.GetModifiers() &~ wxMOD_SHIFT
) == wxMOD_CONTROL
) {
1228 if (!m_View
->IsExtendedElevation() && !m_View
->IsRotating())
1229 OnStepOnceAnticlockwise(e
.GetModifiers() == wxMOD_SHIFT
);
1231 OnShiftDisplayLeft(e
.GetModifiers() == wxMOD_SHIFT
);
1235 if ((e
.GetModifiers() &~ wxMOD_SHIFT
) == wxMOD_CONTROL
) {
1236 if (!m_View
->IsExtendedElevation() && !m_View
->IsRotating())
1237 OnStepOnceClockwise(e
.GetModifiers() == wxMOD_SHIFT
);
1239 OnShiftDisplayRight(e
.GetModifiers() == wxMOD_SHIFT
);
1243 if ((e
.GetModifiers() &~ wxMOD_SHIFT
) == wxMOD_CONTROL
) {
1244 if (m_View
->CanRaiseViewpoint() && !m_View
->IsExtendedElevation())
1245 OnHigherViewpoint(e
.GetModifiers() == wxMOD_SHIFT
);
1247 OnShiftDisplayUp(e
.GetModifiers() == wxMOD_SHIFT
);
1251 if ((e
.GetModifiers() &~ wxMOD_SHIFT
) == wxMOD_CONTROL
) {
1252 if (m_View
->CanLowerViewpoint() && !m_View
->IsExtendedElevation())
1253 OnLowerViewpoint(e
.GetModifiers() == wxMOD_SHIFT
);
1255 OnShiftDisplayDown(e
.GetModifiers() == wxMOD_SHIFT
);
1259 if (e
.GetModifiers() == 0) {
1260 if (m_View
->ShowingMeasuringLine()) {
1262 } else if (m_View
->IsFullScreen()) {
1263 // Cancel full-screen mode on "Escape" if it isn't cancelling
1264 // the measuring line.
1265 m_View
->FullScreenMode();
1270 if (e
.GetModifiers() == 0)
1271 m_View
->ToggleFatFinger();
1274 if (e
.GetModifiers() == 0)
1275 m_View
->ToggleHitTestDebug();
1278 if (e
.GetModifiers() == 0) {
1281 if (wxTheAssertHandler
)
1282 wxTheAssertHandler
= NULL
;
1284 wxSetDefaultAssertHandler();
1285 if (wxTheAssertHandler
)
1286 msg
= wxT("Assertions enabled");
1288 msg
= wxT("Assertions disabled");
1290 msg
= wxT("wxWidgets was built without assertions");
1292 wxMessageBox(msg
, wxT("Aven Debug"), wxOK
| wxICON_INFORMATION
);
1297 if (e
.GetModifiers() == 0) {
1298 m_View
->InvalidateAllLists();
1299 m_View
->ForceRefresh();
1303 if (e
.GetModifiers() == 0)
1304 m_View
->ToggleRenderStats();
1310 //if (refresh) m_View->ForceRefresh();
1313 void GUIControl::OnViewFullScreenUpdate(wxUpdateUIEvent
& cmd
)
1315 cmd
.Check(m_View
->IsFullScreen());
1318 void GUIControl::OnViewFullScreen()
1320 m_View
->FullScreenMode();
1323 void GUIControl::OnViewBoundingBoxUpdate(wxUpdateUIEvent
& cmd
)
1325 cmd
.Enable(m_View
->HasData());
1326 cmd
.Check(m_View
->DisplayingBoundingBox());
1329 void GUIControl::OnViewBoundingBox()
1331 m_View
->ToggleBoundingBox();
1334 void GUIControl::OnViewTerrainUpdate(wxUpdateUIEvent
& cmd
)
1336 cmd
.Enable(m_View
->HasTerrain());
1337 cmd
.Check(m_View
->DisplayingTerrain());
1340 void GUIControl::OnViewTerrain()
1342 m_View
->ToggleTerrain();