source: git/src/guicontrol.cc @ 2c22bf8

RELEASE/1.1RELEASE/1.2debug-cidebug-ci-sanitisersfaster-cavernloglog-selectstereowalls-datawalls-data-hanging-as-warningwarn-only-for-hanging-survey
Last change on this file since 2c22bf8 was 2776c60, checked in by Olly Betts <olly@…>, 19 years ago

Merge "Start Rotation" and "Stop Rotation" into "Toggle Rotation" and make
"Space" the key for this. Keep Return working "Stop Rotation" so existing
users are happy.

git-svn-id: file:///home/survex-svn/survex/branches/survex-1_1@2908 4b37db11-9a0c-4f06-9ece-9ab7cdaee568

  • Property mode set to 100644
File size: 23.9 KB
RevLine 
[56da40e]1//
2//  guicontrol.cc
3//
4//  Handlers for events relating to the display of a survey.
5//
6//  Copyright (C) 2000-2002 Mark R. Shinwell
[2a3d328]7//  Copyright (C) 2001,2003,2004,2005 Olly Betts
[56da40e]8//
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.
13//
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.
18//
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22//
23
[cbfa50d]24#ifdef HAVE_CONFIG_H
25#include <config.h>
26#endif
27
[56da40e]28#include "guicontrol.h"
29#include "gfxcore.h"
30#include <wx/confbase.h>
31
[0c7bb77]32const int DISPLAY_SHIFT = 10;
[d6a5001]33const double FLYFREE_SHIFT = 0.2;
[e577f89]34const double ROTATE_STEP = 2.0;
[56da40e]35
36GUIControl::GUIControl()
[82c85aa]37    : dragging(NO_DRAG)
[56da40e]38{
39    m_View = NULL;
40    m_ReverseControls = false;
41    m_LastDrag = drag_NONE;
42}
43
44GUIControl::~GUIControl()
45{
46    // no action
47}
48
49void GUIControl::SetView(GfxCore* view)
50{
51    m_View = view;
52}
53
[e2c1671]54bool GUIControl::MouseDown() const
[56da40e]55{
[82c85aa]56    return (dragging != NO_DRAG);
[56da40e]57}
58
59void GUIControl::HandleTilt(wxPoint point)
60{
61    // Handle a mouse movement during tilt mode.
[e2c1671]62
63    // wxGTK (at least) fails to update the cursor while dragging.
64    m_View->SetCursor(GfxCore::CURSOR_ROTATE_VERTICALLY);
65
[56da40e]66    int dy = point.y - m_DragStart.y;
67
[d877aa2]68    if (m_ReverseControls != m_View->GetPerspective()) dy = -dy;
[56da40e]69
[e577f89]70    m_View->TiltCave(Double(-dy) * 0.36);
[56da40e]71
72    m_DragStart = point;
73
74    m_View->ForceRefresh();
75}
76
77void GUIControl::HandleTranslate(wxPoint point)
78{
79    // Handle a mouse movement during translation mode.
[e2c1671]80
81    // wxGTK (at least) fails to update the cursor while dragging.
82    m_View->SetCursor(GfxCore::CURSOR_DRAGGING_HAND);
83
[56da40e]84    int dx = point.x - m_DragStart.x;
85    int dy = point.y - m_DragStart.y;
[096e56c]86
[56da40e]87    if (m_ReverseControls) {
88        dx = -dx;
89        dy = -dy;
90    }
91
[d877aa2]92    if (m_View->GetPerspective())
93        m_View->MoveViewer(0, -dy * .1, dx * .1);
94    else
95        m_View->TranslateCave(dx, dy);
96
[56da40e]97    m_DragStart = point;
98}
99
[dde4fe7]100void GUIControl::HandleScale(wxPoint point)
101{
102    // Handle a mouse movement during scale mode.
103
[e2c1671]104    // wxGTK (at least) fails to update the cursor while dragging.
105    m_View->SetCursor(GfxCore::CURSOR_ZOOM);
106
[dde4fe7]107    int dx = point.x - m_DragStart.x;
108    int dy = point.y - m_DragStart.y;
109
110    if (m_ReverseControls) {
111        dx = -dx;
112        dy = -dy;
113    }
114
[d877aa2]115    if (m_View->GetPerspective()) {
116        m_View->MoveViewer(-dy * .1, 0, 0);
117    } else {
118        m_View->SetScale(m_View->GetScale() * pow(1.06, 0.08 * dy));
119        m_View->ForceRefresh();
120    }
[dde4fe7]121
122    m_DragStart = point;
123}
124
125void GUIControl::HandleTiltRotate(wxPoint point)
126{
127    // Handle a mouse movement during tilt/rotate mode.
128
[e2c1671]129    // wxGTK (at least) fails to update the cursor while dragging.
130    m_View->SetCursor(GfxCore::CURSOR_ROTATE_EITHER_WAY);
131
[dde4fe7]132    int dx = point.x - m_DragStart.x;
133    int dy = point.y - m_DragStart.y;
134
[d877aa2]135    if (m_ReverseControls != m_View->GetPerspective()) {
[dde4fe7]136        dx = -dx;
137        dy = -dy;
138    }
139
[e577f89]140    // left/right => rotate, up/down => tilt.
141    // Make tilt less sensitive than rotate as that feels better.
142    m_View->TurnCave(m_View->CanRotate() ? (Double(dx) * -0.36) : 0.0);
143    m_View->TiltCave(Double(-dy) * 0.18);
[dde4fe7]144
145    m_View->ForceRefresh();
146
147    m_DragStart = point;
148}
149
[e2c1671]150void GUIControl::HandleRotate(wxPoint point)
[56da40e]151{
[e2c1671]152    // Handle a mouse movement during rotate mode.
153
154    // wxGTK (at least) fails to update the cursor while dragging.
155    m_View->SetCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY);
156
[56da40e]157    int dx = point.x - m_DragStart.x;
158    int dy = point.y - m_DragStart.y;
159
[e2c1671]160    if (m_ReverseControls != m_View->GetPerspective()) {
[56da40e]161        dx = -dx;
162        dy = -dy;
163    }
164
[e2c1671]165    // left/right => rotate.
166    m_View->TurnCave(m_View->CanRotate() ? (Double(dx) * -0.36) : 0.0);
[56da40e]167
168    m_View->ForceRefresh();
169
170    m_DragStart = point;
171}
172
[203d2a7]173void GUIControl::RestoreCursor()
174{
175    if (m_View->ShowingMeasuringLine()) {
[e2c1671]176        m_View->SetCursor(GfxCore::CURSOR_POINTING_HAND);
[096e56c]177    } else {
[e2c1671]178        m_View->SetCursor(GfxCore::CURSOR_DEFAULT);
[203d2a7]179    }
180}
181
[56da40e]182//
183//  Mouse event handling methods
184//
185
186void GUIControl::OnMouseMove(wxMouseEvent& event)
187{
188    // Mouse motion event handler.
189    if (!m_View->HasData()) return;
190
[e2c1671]191    wxPoint point(event.GetX(), event.GetY());
[56da40e]192
193    // Check hit-test grid (only if no buttons are pressed).
194    if (!event.LeftIsDown() && !event.MiddleIsDown() && !event.RightIsDown()) {
[203d2a7]195        if (m_View->CheckHitTestGrid(point, false)) {
[e2c1671]196            m_View->SetCursor(GfxCore::CURSOR_POINTING_HAND);
197        } else if (m_View->PointWithinScaleBar(point)) {
198            m_View->SetCursor(GfxCore::CURSOR_HORIZONTAL_RESIZE);
199        } else if (m_View->PointWithinCompass(point)) {
200            m_View->SetCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY);
201        } else if (m_View->PointWithinClino(point)) {
202            m_View->SetCursor(GfxCore::CURSOR_ROTATE_VERTICALLY);
203        } else {
204            RestoreCursor();
205        }
[56da40e]206    }
207
[203d2a7]208    // Update coordinate display if in plan view,
209    // or altitude if in elevation view.
[56da40e]210    m_View->SetCoords(point);
211
[2a3d328]212    switch (dragging) {
213        case LEFT_DRAG:
[e2c1671]214            switch (m_LastDrag) {
215                case drag_COMPASS:
216                    // Drag in heading indicator.
217                    m_View->SetCompassFromPoint(point);
218                    break;
219                case drag_ELEV:
220                    // Drag in clinometer.
221                    m_View->SetClinoFromPoint(point);
222                    break;
223                case drag_SCALE:
224                    m_View->SetScaleBarFromOffset(point.x - m_DragLast.x);
225                    break;
226                case drag_MAIN:
227                    if (event.ControlDown()) {
228                        HandleTiltRotate(point);
229                    } else {
230                        HandleScale(point);
231                    }
232                    break;
233                case drag_NONE:
234                    // Shouldn't happen?!  FIXME: assert or something.
235                    break;
[2a3d328]236            }
237            break;
238        case MIDDLE_DRAG:
[e2c1671]239            if (event.ControlDown()) {
[2a3d328]240                HandleTilt(point);
241            } else {
[e2c1671]242                HandleRotate(point);
[2a3d328]243            }
244            break;
245        case RIGHT_DRAG:
[e2c1671]246            HandleTranslate(point);
[2a3d328]247            break;
248        case NO_DRAG:
249            break;
[56da40e]250    }
251
252    m_DragLast = point;
253}
254
255void GUIControl::OnLButtonDown(wxMouseEvent& event)
256{
257    if (m_View->HasData() && m_View->GetLock() != lock_POINT) {
[82c85aa]258        dragging = LEFT_DRAG;
[096e56c]259
[56da40e]260        m_DragStart = m_DragRealStart = wxPoint(event.GetX(), event.GetY());
[096e56c]261
[e2c1671]262        if (m_View->PointWithinCompass(m_DragStart)) {
263            m_LastDrag = drag_COMPASS;
264        } else if (m_View->PointWithinClino(m_DragStart)) {
265            m_LastDrag = drag_ELEV;
266        } else if (m_View->PointWithinScaleBar(m_DragStart)) {
267            m_LastDrag = drag_SCALE;
268        } else {
269            m_LastDrag = drag_MAIN;
270
271            if (event.ControlDown()) {
272                m_View->SetCursor(GfxCore::CURSOR_ROTATE_EITHER_WAY);
273            } else {
274                m_View->SetCursor(GfxCore::CURSOR_ZOOM);
275            }
276        }
277
[56da40e]278        m_View->CaptureMouse();
279    }
280}
281
282void GUIControl::OnLButtonUp(wxMouseEvent& event)
283{
284    if (m_View->HasData() && m_View->GetLock() != lock_POINT) {
285        if (event.GetPosition() == m_DragRealStart) {
[e2c1671]286            // Just a "click"...
[56da40e]287            m_View->CheckHitTestGrid(m_DragStart, true);
288        }
289
[dde4fe7]290//      m_View->RedrawIndicators();
[56da40e]291        m_View->ReleaseMouse();
292
293        m_LastDrag = drag_NONE;
[82c85aa]294        dragging = NO_DRAG;
[56da40e]295
296        m_View->DragFinished();
[096e56c]297
[203d2a7]298        RestoreCursor();
[56da40e]299    }
300}
301
302void GUIControl::OnMButtonDown(wxMouseEvent& event)
303{
304    if (m_View->HasData() && m_View->GetLock() == lock_NONE) {
[82c85aa]305        dragging = MIDDLE_DRAG;
[56da40e]306        m_DragStart = wxPoint(event.GetX(), event.GetY());
307
[e2c1671]308        if (event.ControlDown()) {
309            m_View->SetCursor(GfxCore::CURSOR_ROTATE_VERTICALLY);
310        } else {
311            m_View->SetCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY);
312        }
313
[56da40e]314        m_View->CaptureMouse();
315    }
316}
317
[cc2a5fc]318void GUIControl::OnMButtonUp(wxMouseEvent&)
[56da40e]319{
320    if (m_View->HasData() && m_View->GetLock() == lock_NONE) {
[82c85aa]321        dragging = NO_DRAG;
[56da40e]322        m_View->ReleaseMouse();
323        m_View->DragFinished();
[203d2a7]324
325        RestoreCursor();
[56da40e]326    }
327}
328
329void GUIControl::OnRButtonDown(wxMouseEvent& event)
330{
331    if (m_View->HasData()) {
332        m_DragStart = wxPoint(event.GetX(), event.GetY());
[096e56c]333
[82c85aa]334        dragging = RIGHT_DRAG;
[56da40e]335
[e2c1671]336        m_View->SetCursor(GfxCore::CURSOR_DRAGGING_HAND);
[56da40e]337        m_View->CaptureMouse();
338    }
339}
340
[cc2a5fc]341void GUIControl::OnRButtonUp(wxMouseEvent&)
[56da40e]342{
343    m_LastDrag = drag_NONE;
344    m_View->ReleaseMouse();
345
[82c85aa]346    dragging = NO_DRAG;
[096e56c]347
[203d2a7]348    RestoreCursor();
[096e56c]349
[56da40e]350    m_View->DragFinished();
351}
352
[34d8d1a]353void GUIControl::OnMouseWheel(wxMouseEvent& event) {
[e2c1671]354    m_View->TiltCave(event.GetWheelRotation() / 12.0);
[34d8d1a]355    m_View->ForceRefresh();
356}
357
[56da40e]358void GUIControl::OnDisplayOverlappingNames()
359{
360    m_View->ToggleOverlappingNames();
361}
362
363void GUIControl::OnDisplayOverlappingNamesUpdate(wxUpdateUIEvent& cmd)
364{
365    cmd.Enable(m_View->HasData() && m_View->ShowingStationNames());
366    cmd.Check(m_View->ShowingOverlappingNames());
367}
368
[da6c802]369void GUIControl::OnColourByDepth()
370{
371    if (m_View->ColouringBy() == COLOUR_BY_DEPTH) {
372        m_View->SetColourBy(COLOUR_BY_NONE);
373    } else {
374        m_View->SetColourBy(COLOUR_BY_DEPTH);
375    }
376}
377
378void GUIControl::OnColourByDepthUpdate(wxUpdateUIEvent& cmd)
379{
380    cmd.Enable(m_View->HasData() && m_View->HasUndergroundLegs());
381    cmd.Check(m_View->ColouringBy() == COLOUR_BY_DEPTH);
382}
383
[56da40e]384void GUIControl::OnShowCrosses()
385{
386    m_View->ToggleCrosses();
387}
388
389void GUIControl::OnShowCrossesUpdate(wxUpdateUIEvent& cmd)
390{
391    cmd.Enable(m_View->HasData());
392    cmd.Check(m_View->ShowingCrosses());
393}
394
395void GUIControl::OnShowStationNames()
396{
397    m_View->ToggleStationNames();
398}
399
400void GUIControl::OnShowStationNamesUpdate(wxUpdateUIEvent& cmd)
401{
402    cmd.Enable(m_View->HasData());
403    cmd.Check(m_View->ShowingStationNames());
404}
405
406void GUIControl::OnShowSurveyLegs()
407{
408    m_View->ToggleUndergroundLegs();
409}
410
411void GUIControl::OnShowSurveyLegsUpdate(wxUpdateUIEvent& cmd)
412{
413    cmd.Enable(m_View->HasData() && m_View->GetLock() != lock_POINT && m_View->HasUndergroundLegs());
414    cmd.Check(m_View->ShowingUndergroundLegs());
415}
416
417void GUIControl::OnMoveEast()
418{
[e577f89]419    m_View->TurnCaveTo(90.0);
[56da40e]420    m_View->ForceRefresh();
421}
422
423void GUIControl::OnMoveEastUpdate(wxUpdateUIEvent& cmd)
424{
425    cmd.Enable(m_View->HasData() && !(m_View->GetLock() & lock_Y));
426}
427
428void GUIControl::OnMoveNorth()
429{
430    m_View->TurnCaveTo(0.0);
431    m_View->ForceRefresh();
432}
433
434void GUIControl::OnMoveNorthUpdate(wxUpdateUIEvent& cmd)
435{
436    cmd.Enable(m_View->HasData() && !(m_View->GetLock() & lock_X));
437}
438
439void GUIControl::OnMoveSouth()
440{
[e577f89]441    m_View->TurnCaveTo(180.0);
[56da40e]442    m_View->ForceRefresh();
443}
444
445void GUIControl::OnMoveSouthUpdate(wxUpdateUIEvent& cmd)
446{
447    cmd.Enable(m_View->HasData() && !(m_View->GetLock() & lock_X));
448}
449
450void GUIControl::OnMoveWest()
451{
[e577f89]452    m_View->TurnCaveTo(270.0);
[56da40e]453    m_View->ForceRefresh();
454}
455
456void GUIControl::OnMoveWestUpdate(wxUpdateUIEvent& cmd)
457{
458    cmd.Enable(m_View->HasData() && !(m_View->GetLock() & lock_Y));
459}
460
461void GUIControl::OnToggleRotation()
462{
463    m_View->ToggleRotation();
464}
465
466void GUIControl::OnToggleRotationUpdate(wxUpdateUIEvent& cmd)
467{
468    cmd.Enable(m_View->HasData() && m_View->CanRotate());
469    cmd.Check(m_View->HasData() && m_View->IsRotating());
470}
471
472void GUIControl::OnReverseControls()
473{
474    m_ReverseControls = !m_ReverseControls;
475}
476
477void GUIControl::OnReverseControlsUpdate(wxUpdateUIEvent& cmd)
478{
479    cmd.Enable(m_View->HasData());
480    cmd.Check(m_ReverseControls);
481}
482
483void GUIControl::OnReverseDirectionOfRotation()
484{
485    m_View->ReverseRotation();
486}
487
488void GUIControl::OnReverseDirectionOfRotationUpdate(wxUpdateUIEvent& cmd)
489{
490    cmd.Enable(m_View->HasData() && m_View->CanRotate());
491}
492
493void GUIControl::OnSlowDown(bool accel)
494{
495    m_View->RotateSlower(accel);
496}
497
498void GUIControl::OnSlowDownUpdate(wxUpdateUIEvent& cmd)
499{
500    cmd.Enable(m_View->HasData() && m_View->CanRotate());
501}
502
503void GUIControl::OnSpeedUp(bool accel)
504{
505    m_View->RotateFaster(accel);
506}
507
508void GUIControl::OnSpeedUpUpdate(wxUpdateUIEvent& cmd)
509{
510    cmd.Enable(m_View->HasData() && m_View->CanRotate());
511}
512
513void GUIControl::OnStepOnceAnticlockwise(bool accel)
514{
[d877aa2]515    if (m_View->GetPerspective()) {
516        m_View->TurnCave(accel ? -5.0 * ROTATE_STEP : -ROTATE_STEP);
517    } else {
518        m_View->TurnCave(accel ? 5.0 * ROTATE_STEP : ROTATE_STEP);
519    }
[56da40e]520    m_View->ForceRefresh();
521}
522
523void GUIControl::OnStepOnceAnticlockwiseUpdate(wxUpdateUIEvent& cmd)
524{
525    cmd.Enable(m_View->HasData() && m_View->CanRotate() && !m_View->IsRotating());
526}
527
528void GUIControl::OnStepOnceClockwise(bool accel)
529{
[d877aa2]530    if (m_View->GetPerspective()) {
531        m_View->TurnCave(accel ? 5.0 * ROTATE_STEP : ROTATE_STEP);
532    } else {
533        m_View->TurnCave(accel ? -5.0 * ROTATE_STEP : -ROTATE_STEP);
534    }
[56da40e]535    m_View->ForceRefresh();
536}
537
538void GUIControl::OnStepOnceClockwiseUpdate(wxUpdateUIEvent& cmd)
539{
540    cmd.Enable(m_View->HasData() && m_View->CanRotate() && !m_View->IsRotating());
541}
542
543void GUIControl::OnDefaults()
544{
545    m_View->Defaults();
546}
547
548void GUIControl::OnDefaultsUpdate(wxUpdateUIEvent& cmd)
549{
550    cmd.Enable(m_View->HasData());
551}
552
553void GUIControl::OnElevation()
554{
555    // Switch to elevation view.
556
557    m_View->SwitchToElevation();
558}
559
560void GUIControl::OnElevationUpdate(wxUpdateUIEvent& cmd)
561{
562    cmd.Enable(m_View->HasData() && m_View->GetLock() == lock_NONE && !m_View->ShowingElevation());
563}
564
565void GUIControl::OnHigherViewpoint(bool accel)
566{
567    // Raise the viewpoint.
[d877aa2]568    if (m_View->GetPerspective()) {
569        m_View->TiltCave(accel ? -5.0 * ROTATE_STEP : -ROTATE_STEP);
570    } else {
571        m_View->TiltCave(accel ? 5.0 * ROTATE_STEP : ROTATE_STEP);
572    }
[56da40e]573    m_View->ForceRefresh();
574}
575
576void GUIControl::OnHigherViewpointUpdate(wxUpdateUIEvent& cmd)
577{
[0662b0b]578    cmd.Enable(m_View->HasData() && m_View->CanRaiseViewpoint() && m_View->GetLock() == lock_NONE);
[56da40e]579}
580
581void GUIControl::OnLowerViewpoint(bool accel)
582{
583    // Lower the viewpoint.
[d877aa2]584    if (m_View->GetPerspective()) {
585        m_View->TiltCave(accel ? 5.0 * ROTATE_STEP : ROTATE_STEP);
586    } else {
587        m_View->TiltCave(accel ? -5.0 * ROTATE_STEP : -ROTATE_STEP);
588    }
[d6a5001]589    m_View->ForceRefresh();
[56da40e]590}
591
592void GUIControl::OnLowerViewpointUpdate(wxUpdateUIEvent& cmd)
593{
[0662b0b]594    cmd.Enable(m_View->HasData() && m_View->CanLowerViewpoint() && m_View->GetLock() == lock_NONE);
[56da40e]595}
596
597void GUIControl::OnPlan()
598{
599    // Switch to plan view.
600    m_View->SwitchToPlan();
601}
602
603void GUIControl::OnPlanUpdate(wxUpdateUIEvent& cmd)
604{
605    cmd.Enable(m_View->HasData() && m_View->GetLock() == lock_NONE && !m_View->ShowingPlan());
606}
607
608void GUIControl::OnShiftDisplayDown(bool accel)
609{
[096e56c]610    if (m_View->GetPerspective())
[867a1141]611        m_View->MoveViewer(0, accel ? 5 * FLYFREE_SHIFT : FLYFREE_SHIFT, 0);
[d877aa2]612    else
613        m_View->TranslateCave(0, accel ? 5 * DISPLAY_SHIFT : DISPLAY_SHIFT);
[56da40e]614}
615
616void GUIControl::OnShiftDisplayDownUpdate(wxUpdateUIEvent& cmd)
617{
618    cmd.Enable(m_View->HasData());
619}
620
621void GUIControl::OnShiftDisplayLeft(bool accel)
622{
[096e56c]623    if (m_View->GetPerspective())
[867a1141]624        m_View->MoveViewer(0, 0, accel ? 5 * FLYFREE_SHIFT : FLYFREE_SHIFT);
[d877aa2]625    else
626        m_View->TranslateCave(accel ? -5 * DISPLAY_SHIFT : -DISPLAY_SHIFT, 0);
[56da40e]627}
628
629void GUIControl::OnShiftDisplayLeftUpdate(wxUpdateUIEvent& cmd)
630{
631    cmd.Enable(m_View->HasData());
632}
633
634void GUIControl::OnShiftDisplayRight(bool accel)
635{
[096e56c]636    if (m_View->GetPerspective())
[867a1141]637        m_View->MoveViewer(0, 0, accel ? -5 * FLYFREE_SHIFT : -FLYFREE_SHIFT);
[d877aa2]638    else
639        m_View->TranslateCave(accel ? 5 * DISPLAY_SHIFT : DISPLAY_SHIFT, 0);
[56da40e]640}
641
642void GUIControl::OnShiftDisplayRightUpdate(wxUpdateUIEvent& cmd)
643{
644    cmd.Enable(m_View->HasData());
645}
646
647void GUIControl::OnShiftDisplayUp(bool accel)
648{
[096e56c]649    if (m_View->GetPerspective())
[867a1141]650        m_View->MoveViewer(0, accel ? -5 * FLYFREE_SHIFT : -FLYFREE_SHIFT, 0);
[d877aa2]651    else
652        m_View->TranslateCave(0, accel ? -5 * DISPLAY_SHIFT : -DISPLAY_SHIFT);
[56da40e]653}
654
655void GUIControl::OnShiftDisplayUpUpdate(wxUpdateUIEvent& cmd)
656{
657    cmd.Enable(m_View->HasData());
658}
659
660void GUIControl::OnZoomIn(bool accel)
661{
662    // Increase the scale.
663
[d877aa2]664    if (m_View->GetPerspective()) {
665        m_View->MoveViewer(accel ? 5 * FLYFREE_SHIFT : FLYFREE_SHIFT, 0, 0);
666    } else {
667        m_View->SetScale(m_View->GetScale() * (accel ? 1.1236 : 1.06));
668        m_View->ForceRefresh();
669    }
[56da40e]670}
671
672void GUIControl::OnZoomInUpdate(wxUpdateUIEvent& cmd)
673{
674    cmd.Enable(m_View->HasData() && m_View->GetLock() != lock_POINT);
675}
676
677void GUIControl::OnZoomOut(bool accel)
678{
679    // Decrease the scale.
680
[d877aa2]681    if (m_View->GetPerspective()) {
682        m_View->MoveViewer(accel ? -5 * FLYFREE_SHIFT : -FLYFREE_SHIFT, 0, 0);
683    } else {
684        m_View->SetScale(m_View->GetScale() / (accel ? 1.1236 : 1.06));
685        m_View->ForceRefresh();
686    }
[56da40e]687}
688
689void GUIControl::OnZoomOutUpdate(wxUpdateUIEvent& cmd)
690{
691    cmd.Enable(m_View->HasData() && m_View->GetLock() != lock_POINT);
692}
693
694void GUIControl::OnToggleScalebar()
695{
696    m_View->ToggleScaleBar();
697}
698
699void GUIControl::OnToggleScalebarUpdate(wxUpdateUIEvent& cmd)
700{
701    cmd.Enable(m_View->HasData() && m_View->GetLock() != lock_POINT);
702    cmd.Check(m_View->ShowingScaleBar());
703}
704
705void GUIControl::OnToggleDepthbar() /* FIXME naming */
706{
707    m_View->ToggleDepthBar();
708}
709
710void GUIControl::OnToggleDepthbarUpdate(wxUpdateUIEvent& cmd)
711{
[da6c802]712    cmd.Enable(m_View->HasData() && !(m_View->GetLock() && lock_Z) &&
713               m_View->ColouringBy() == COLOUR_BY_DEPTH);
[56da40e]714    cmd.Check(m_View->ShowingDepthBar());
715}
716
717void GUIControl::OnViewCompass()
718{
719    m_View->ToggleCompass();
720}
721
722void GUIControl::OnViewCompassUpdate(wxUpdateUIEvent& cmd)
723{
724    cmd.Enable(m_View->HasData() && m_View->CanRotate());
725    cmd.Check(m_View->ShowingCompass());
726}
727
728void GUIControl::OnViewClino()
729{
730    m_View->ToggleClino();
731}
732
733void GUIControl::OnViewClinoUpdate(wxUpdateUIEvent& cmd)
734{
735    cmd.Enable(m_View->HasData() && m_View->GetLock() == lock_NONE);
736    cmd.Check(m_View->ShowingClino());
737}
738
739void GUIControl::OnShowSurface()
740{
741    m_View->ToggleSurfaceLegs();
742}
743
744void GUIControl::OnShowSurfaceUpdate(wxUpdateUIEvent& cmd)
745{
746    cmd.Enable(m_View->HasData() && m_View->HasSurfaceLegs());
747    cmd.Check(m_View->ShowingSurfaceLegs());
748}
749
750void GUIControl::OnShowEntrances()
751{
752    m_View->ToggleEntrances();
753}
754
755void GUIControl::OnShowEntrancesUpdate(wxUpdateUIEvent& cmd)
756{
757    cmd.Enable(m_View->HasData() && (m_View->GetNumEntrances() > 0));
758    cmd.Check(m_View->ShowingEntrances());
759}
760
761void GUIControl::OnShowFixedPts()
762{
763    m_View->ToggleFixedPts();
764}
765
766void GUIControl::OnShowFixedPtsUpdate(wxUpdateUIEvent& cmd)
767{
768    cmd.Enable(m_View->HasData() && (m_View->GetNumFixedPts() > 0));
769    cmd.Check(m_View->ShowingFixedPts());
770}
771
772void GUIControl::OnShowExportedPts()
773{
774    m_View->ToggleExportedPts();
775}
776
777void GUIControl::OnShowExportedPtsUpdate(wxUpdateUIEvent& cmd)
778{
[d877aa2]779    // FIXME enable only if we have timestamps...
780    cmd.Enable(m_View->HasData() /*&& (m_View->GetNumExportedPts() > 0)*/);
[56da40e]781    cmd.Check(m_View->ShowingExportedPts());
782}
783
784void GUIControl::OnViewGrid()
785{
786    m_View->ToggleGrid();
787}
788
789void GUIControl::OnViewGridUpdate(wxUpdateUIEvent& cmd)
790{
791    cmd.Enable(m_View->HasData());
[0580c6a]792    cmd.Check(m_View->ShowingGrid());
[56da40e]793}
794
795void GUIControl::OnIndicatorsUpdate(wxUpdateUIEvent& cmd)
796{
797    cmd.Enable(m_View->HasData());
798}
799
[6abab84]800void GUIControl::OnViewPerspective()
801{
802    m_View->TogglePerspective();
[d877aa2]803    // Force update of coordinate display.
804    if (m_View->GetPerspective()) {
805        m_View->MoveViewer(0, 0, 0);
806    } else {
807        m_View->ClearCoords();
808    }
[6abab84]809}
810
811void GUIControl::OnViewPerspectiveUpdate(wxUpdateUIEvent& cmd)
812{
813    cmd.Enable(m_View->HasData());
814    cmd.Check(m_View->GetPerspective());
815}
816
[a517825]817void GUIControl::OnViewTextured()
818{
819    m_View->ToggleTextured();
820}
821
822void GUIControl::OnViewTexturedUpdate(wxUpdateUIEvent& cmd)
823{
824    cmd.Enable(m_View->HasData());
825    cmd.Check(m_View->GetTextured());
826}
827
[c60062d]828void GUIControl::OnViewFog()
829{
830    m_View->ToggleFog();
831}
832
833void GUIControl::OnViewFogUpdate(wxUpdateUIEvent& cmd)
834{
835    cmd.Enable(m_View->HasData());
836    cmd.Check(m_View->GetFog());
837}
838
[db452ae]839void GUIControl::OnViewSmoothLines()
840{
841    m_View->ToggleAntiAlias();
842}
843
844void GUIControl::OnViewSmoothLinesUpdate(wxUpdateUIEvent& cmd)
845{
846    cmd.Enable(m_View->HasData());
847    cmd.Check(m_View->GetAntiAlias());
848}
849
[56da40e]850void GUIControl::OnToggleMetric()
851{
852    m_View->ToggleMetric();
853
854    wxConfigBase::Get()->Write("metric", m_View->GetMetric());
855    wxConfigBase::Get()->Flush();
856}
857
858void GUIControl::OnToggleMetricUpdate(wxUpdateUIEvent& cmd)
859{
860    cmd.Enable(m_View->HasData());
861    cmd.Check(m_View->GetMetric());
862}
863
864void GUIControl::OnToggleDegrees()
865{
866    m_View->ToggleDegrees();
[096e56c]867
[56da40e]868    wxConfigBase::Get()->Write("degrees", m_View->GetDegrees());
869    wxConfigBase::Get()->Flush();
870}
871
872void GUIControl::OnToggleDegreesUpdate(wxUpdateUIEvent& cmd)
873{
874    cmd.Enable(m_View->HasData());
875    cmd.Check(m_View->GetDegrees());
876}
877
878void GUIControl::OnToggleTubes()
879{
880    m_View->ToggleTubes();
881}
882
883void GUIControl::OnToggleTubesUpdate(wxUpdateUIEvent& cmd)
884{
885    cmd.Enable(m_View->HasData());
886    cmd.Check(m_View->GetTubes());
887}
888
889void GUIControl::OnCancelDistLine()
890{
891    m_View->ClearTreeSelection();
892}
893
894void GUIControl::OnCancelDistLineUpdate(wxUpdateUIEvent& cmd)
895{
896    cmd.Enable(m_View->ShowingMeasuringLine());
897}
898
899void GUIControl::OnKeyPress(wxKeyEvent &e)
900{
901    if (!m_View->HasData()) {
902        e.Skip();
903        return;
904    }
905
[1690fa9]906    // The changelog says this is meant to keep animation going while keys are
907    // pressed, but that happens anyway (on linux at least - perhaps it helps
908    // on windows?)  FIXME : check!
909    //bool refresh = m_View->Animate();
[56da40e]910
911    switch (e.m_keyCode) {
912        case '/': case '?':
913            if (m_View->CanLowerViewpoint() && m_View->GetLock() == lock_NONE)
914                OnLowerViewpoint(e.m_shiftDown);
915            break;
916        case '\'': case '@': case '"': // both shifted forms - US and UK kbd
917            if (m_View->CanRaiseViewpoint() && m_View->GetLock() == lock_NONE)
918                OnHigherViewpoint(e.m_shiftDown);
919            break;
920        case 'C': case 'c':
921            if (m_View->CanRotate() && !m_View->IsRotating())
922                OnStepOnceAnticlockwise(e.m_shiftDown);
923            break;
924        case 'V': case 'v':
925            if (m_View->CanRotate() && !m_View->IsRotating())
926                OnStepOnceClockwise(e.m_shiftDown);
927            break;
928        case ']': case '}':
929            if (m_View->GetLock() != lock_POINT)
930                OnZoomIn(e.m_shiftDown);
931            break;
932        case '[': case '{':
933            if (m_View->GetLock() != lock_POINT)
934                OnZoomOut(e.m_shiftDown);
935            break;
936        case 'N': case 'n':
937            if (!(m_View->GetLock() & lock_X))
938                OnMoveNorth();
939            break;
940        case 'S': case 's':
941            if (!(m_View->GetLock() & lock_X))
942                OnMoveSouth();
943            break;
944        case 'E': case 'e':
945            if (!(m_View->GetLock() & lock_Y))
946                OnMoveEast();
947            break;
948        case 'W': case 'w':
949            if (!(m_View->GetLock() & lock_Y))
950                OnMoveWest();
951            break;
952        case 'Z': case 'z':
953            if (m_View->CanRotate())
954                OnSpeedUp(e.m_shiftDown);
955            break;
956        case 'X': case 'x':
957            if (m_View->CanRotate())
958                OnSlowDown(e.m_shiftDown);
959            break;
960        case 'R': case 'r':
961            if (m_View->CanRotate())
962                OnReverseDirectionOfRotation();
963            break;
964        case 'P': case 'p':
965            if (m_View->GetLock() == lock_NONE && !m_View->ShowingPlan())
966                OnPlan();
967            break;
968        case 'L': case 'l':
969            if (m_View->GetLock() == lock_NONE && !m_View->ShowingElevation())
970                OnElevation();
971            break;
972        case 'O': case 'o':
973            OnDisplayOverlappingNames();
974            break;
975        case WXK_DELETE:
976            OnDefaults();
977            break;
978        case WXK_RETURN:
[2776c60]979            // For compatibility with older versions.
[56da40e]980            if (m_View->CanRotate() && !m_View->IsRotating())
[2776c60]981                m_View->StartRotation();
[56da40e]982            break;
983        case WXK_SPACE:
[2776c60]984            if (m_View->CanRotate())
985                OnToggleRotation();
[56da40e]986            break;
987        case WXK_LEFT:
988            if (e.m_controlDown) {
989                if (m_View->CanRotate() && !m_View->IsRotating())
990                    OnStepOnceAnticlockwise(e.m_shiftDown);
991            } else {
992                OnShiftDisplayLeft(e.m_shiftDown);
993            }
994            break;
995        case WXK_RIGHT:
996            if (e.m_controlDown) {
997                if (m_View->CanRotate() && !m_View->IsRotating())
998                    OnStepOnceClockwise(e.m_shiftDown);
999            } else {
1000                OnShiftDisplayRight(e.m_shiftDown);
1001            }
1002            break;
1003        case WXK_UP:
1004            if (e.m_controlDown) {
1005                if (m_View->CanRaiseViewpoint() && m_View->GetLock() == lock_NONE)
1006                    OnHigherViewpoint(e.m_shiftDown);
1007            } else {
1008                OnShiftDisplayUp(e.m_shiftDown);
1009            }
1010            break;
1011        case WXK_DOWN:
1012            if (e.m_controlDown) {
1013                if (m_View->CanLowerViewpoint() && m_View->GetLock() == lock_NONE)
1014                    OnLowerViewpoint(e.m_shiftDown);
1015            } else {
1016                OnShiftDisplayDown(e.m_shiftDown);
1017            }
1018            break;
1019        case WXK_ESCAPE:
1020            if (m_View->ShowingMeasuringLine()) {
1021                OnCancelDistLine();
1022            }
1023            break;
1024        default:
1025            e.Skip();
1026    }
[096e56c]1027
[1690fa9]1028    //if (refresh) m_View->ForceRefresh();
[56da40e]1029}
1030
[b13aee4]1031void GUIControl::OnViewFullScreenUpdate(wxUpdateUIEvent& cmd)
1032{
1033    cmd.Enable(m_View->HasData());
[fdfa926]1034    cmd.Check(m_View->IsFullScreen());
[b13aee4]1035}
1036
1037void GUIControl::OnViewFullScreen()
1038{
1039    m_View->FullScreenMode();
1040}
Note: See TracBrowser for help on using the repository browser.