source: git/src/guicontrol.cc @ c07cf95

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 c07cf95 was cd39f67, checked in by Olly Betts <olly@…>, 19 years ago

aven: Disable "Highlight exported points" if there aren't any.

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

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