source: git/src/guicontrol.cc @ d171c0c

RELEASE/1.2debug-cidebug-ci-sanitisersstereowalls-datawalls-data-hanging-as-warning
Last change on this file since d171c0c was d171c0c, checked in by Olly Betts <olly@…>, 10 years ago

lib/,src/: Add support for showing percentage gradient in the tilt
indicator in aven. Show the units (degrees, grads, or percent) for
the tilt and bearing indicators.

  • Property mode set to 100644
File size: 29.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
[e0f3ade]7//  Copyright (C) 2001,2003,2004,2005,2006,2011,2012,2014 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
[ecbc6c18]21//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
[56da40e]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
44void GUIControl::SetView(GfxCore* view)
45{
46    m_View = view;
47}
48
[e2c1671]49bool GUIControl::MouseDown() const
[56da40e]50{
[82c85aa]51    return (dragging != NO_DRAG);
[56da40e]52}
53
54void GUIControl::HandleTilt(wxPoint point)
55{
56    // Handle a mouse movement during tilt mode.
[e2c1671]57
58    // wxGTK (at least) fails to update the cursor while dragging.
59    m_View->SetCursor(GfxCore::CURSOR_ROTATE_VERTICALLY);
60
[56da40e]61    int dy = point.y - m_DragStart.y;
62
[d877aa2]63    if (m_ReverseControls != m_View->GetPerspective()) dy = -dy;
[56da40e]64
[7a57dc7]65    m_View->TiltCave(Double(dy) * 0.36);
[56da40e]66
67    m_DragStart = point;
68
69    m_View->ForceRefresh();
70}
71
72void GUIControl::HandleTranslate(wxPoint point)
73{
74    // Handle a mouse movement during translation mode.
[e2c1671]75
76    // wxGTK (at least) fails to update the cursor while dragging.
77    m_View->SetCursor(GfxCore::CURSOR_DRAGGING_HAND);
78
[56da40e]79    int dx = point.x - m_DragStart.x;
80    int dy = point.y - m_DragStart.y;
[096e56c]81
[56da40e]82    if (m_ReverseControls) {
83        dx = -dx;
84        dy = -dy;
85    }
86
[d877aa2]87    if (m_View->GetPerspective())
88        m_View->MoveViewer(0, -dy * .1, dx * .1);
89    else
90        m_View->TranslateCave(dx, dy);
91
[56da40e]92    m_DragStart = point;
93}
94
[ecf2d23]95void GUIControl::HandleScaleRotate(wxPoint point)
[dde4fe7]96{
[ecf2d23]97    // Handle a mouse movement during scale/rotate mode.
[dde4fe7]98
[e2c1671]99    // wxGTK (at least) fails to update the cursor while dragging.
[ecf2d23]100    m_View->SetCursor(GfxCore::CURSOR_ZOOM_ROTATE);
101
102    int dx, dy;
103    int threshold;
[f3ef5d8]104    if (m_ScaleRotateLock == lock_NONE) {
[ecf2d23]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;
108        threshold = 8 * 8;
109    } else {
110        dx = point.x - m_DragStart.x;
111        dy = point.y - m_DragStart.y;
112        threshold = 5;
113    }
114    int dx2 = dx * dx;
115    int dy2 = dy * dy;
116    if (dx2 + dy2 < threshold) return;
117
118    switch (m_ScaleRotateLock) {
[f3ef5d8]119        case lock_NONE:
[ecf2d23]120            if (dx2 > dy2) {
[f3ef5d8]121                m_ScaleRotateLock = lock_ROTATE;
[ecf2d23]122//              m_View->SetCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY);
123            } else {
[f3ef5d8]124                m_ScaleRotateLock = lock_SCALE;
[ecf2d23]125//              m_View->SetCursor(GfxCore::CURSOR_ZOOM);
126            }
127            break;
[f3ef5d8]128        case lock_SCALE:
[ecf2d23]129            if (dx2 >= 8 * dy2) {
[f3ef5d8]130                m_ScaleRotateLock = lock_ROTATE;
[ecf2d23]131//              m_View->SetCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY);
132            }
133            break;
[f3ef5d8]134        case lock_ROTATE:
[ecf2d23]135            if (dy2 >= 8 * dx2) {
[f3ef5d8]136                m_ScaleRotateLock = lock_SCALE;
[ecf2d23]137//              m_View->SetCursor(GfxCore::CURSOR_ZOOM);
138            }
139            break;
140    }
[e2c1671]141
[f3ef5d8]142    if (m_ScaleRotateLock == lock_ROTATE) {
[ecf2d23]143        dy = 0;
144    } else {
145        dx = 0;
146    }
[dde4fe7]147
148    if (m_ReverseControls) {
[ecf2d23]149        dx = -dx;
[dde4fe7]150        dy = -dy;
151    }
152
[d877aa2]153    if (m_View->GetPerspective()) {
[ecf2d23]154        if (dy) m_View->MoveViewer(-dy * .1, 0, 0);
[d877aa2]155    } else {
[ecf2d23]156        // up/down => scale.
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();
[d877aa2]161    }
[dde4fe7]162
163    m_DragStart = point;
164}
165
166void GUIControl::HandleTiltRotate(wxPoint point)
167{
168    // Handle a mouse movement during tilt/rotate mode.
[eef68f9]169    if (m_View->IsExtendedElevation()) return;
[dde4fe7]170
[e2c1671]171    // wxGTK (at least) fails to update the cursor while dragging.
172    m_View->SetCursor(GfxCore::CURSOR_ROTATE_EITHER_WAY);
173
[dde4fe7]174    int dx = point.x - m_DragStart.x;
175    int dy = point.y - m_DragStart.y;
176
[d877aa2]177    if (m_ReverseControls != m_View->GetPerspective()) {
[dde4fe7]178        dx = -dx;
179        dy = -dy;
180    }
181
[e577f89]182    // left/right => rotate, up/down => tilt.
183    // Make tilt less sensitive than rotate as that feels better.
[eef68f9]184    m_View->TurnCave(Double(dx) * -0.36);
[7a57dc7]185    m_View->TiltCave(Double(dy) * 0.18);
[dde4fe7]186
187    m_View->ForceRefresh();
188
189    m_DragStart = point;
190}
191
[e2c1671]192void GUIControl::HandleRotate(wxPoint point)
[56da40e]193{
[e2c1671]194    // Handle a mouse movement during rotate mode.
[eef68f9]195    if (m_View->IsExtendedElevation()) return;
[e2c1671]196
197    // wxGTK (at least) fails to update the cursor while dragging.
198    m_View->SetCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY);
199
[56da40e]200    int dx = point.x - m_DragStart.x;
201    int dy = point.y - m_DragStart.y;
202
[e2c1671]203    if (m_ReverseControls != m_View->GetPerspective()) {
[56da40e]204        dx = -dx;
205        dy = -dy;
206    }
207
[e2c1671]208    // left/right => rotate.
[eef68f9]209    m_View->TurnCave(Double(dx) * -0.36);
[56da40e]210
211    m_View->ForceRefresh();
212
213    m_DragStart = point;
214}
215
[203d2a7]216void GUIControl::RestoreCursor()
217{
[570d62c3]218    if (m_View->HereIsReal()) {
[e2c1671]219        m_View->SetCursor(GfxCore::CURSOR_POINTING_HAND);
[096e56c]220    } else {
[e2c1671]221        m_View->SetCursor(GfxCore::CURSOR_DEFAULT);
[203d2a7]222    }
223}
224
[2072157]225void GUIControl::HandleNonDrag(const wxPoint & point) {
226    if (m_View->CheckHitTestGrid(point, false)) {
227        m_View->SetCursor(GfxCore::CURSOR_POINTING_HAND);
228    } else if (m_View->PointWithinScaleBar(point)) {
229        m_View->SetCursor(GfxCore::CURSOR_HORIZONTAL_RESIZE);
230    } else if (m_View->PointWithinCompass(point)) {
231        m_View->SetCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY);
232    } else if (m_View->PointWithinClino(point)) {
233        m_View->SetCursor(GfxCore::CURSOR_ROTATE_VERTICALLY);
234    } else {
235        RestoreCursor();
236    }
237}
238
[56da40e]239//
240//  Mouse event handling methods
241//
242
243void GUIControl::OnMouseMove(wxMouseEvent& event)
244{
245    // Mouse motion event handler.
246    if (!m_View->HasData()) return;
247
[ecf2d23]248    // Ignore moves which don't change the position.
[2072157]249    if (event.GetPosition() == m_DragStart) {
[ecf2d23]250        return;
251    }
252
253    static long timestamp = LONG_MIN;
[f3ef5d8]254    if (dragging != NO_DRAG && m_ScaleRotateLock != lock_NONE &&
255        timestamp != LONG_MIN) {
[ecf2d23]256        // If no motion for a second, reset the direction lock.
257        if (event.GetTimestamp() - timestamp >= 1000) {
[f3ef5d8]258            m_ScaleRotateLock = lock_NONE;
[ecf2d23]259            m_DragRealStart = m_DragStart;
260            RestoreCursor();
261        }
262    }
263    timestamp = event.GetTimestamp();
264
[2072157]265    wxPoint point(event.GetPosition());
[56da40e]266
267    // Check hit-test grid (only if no buttons are pressed).
268    if (!event.LeftIsDown() && !event.MiddleIsDown() && !event.RightIsDown()) {
[2072157]269        HandleNonDrag(point);
[56da40e]270    }
271
[203d2a7]272    // Update coordinate display if in plan view,
273    // or altitude if in elevation view.
[56da40e]274    m_View->SetCoords(point);
275
[2a3d328]276    switch (dragging) {
277        case LEFT_DRAG:
[e2c1671]278            switch (m_LastDrag) {
279                case drag_COMPASS:
280                    // Drag in heading indicator.
281                    m_View->SetCompassFromPoint(point);
282                    break;
283                case drag_ELEV:
284                    // Drag in clinometer.
285                    m_View->SetClinoFromPoint(point);
286                    break;
287                case drag_SCALE:
288                    m_View->SetScaleBarFromOffset(point.x - m_DragLast.x);
289                    break;
290                case drag_MAIN:
291                    if (event.ControlDown()) {
292                        HandleTiltRotate(point);
293                    } else {
[ecf2d23]294                        HandleScaleRotate(point);
[e2c1671]295                    }
296                    break;
297                case drag_NONE:
298                    // Shouldn't happen?!  FIXME: assert or something.
299                    break;
[2a3d328]300            }
301            break;
302        case MIDDLE_DRAG:
[ecf2d23]303            HandleTilt(point);
[2a3d328]304            break;
305        case RIGHT_DRAG:
[e2c1671]306            HandleTranslate(point);
[2a3d328]307            break;
308        case NO_DRAG:
309            break;
[56da40e]310    }
311
312    m_DragLast = point;
313}
314
315void GUIControl::OnLButtonDown(wxMouseEvent& event)
316{
[eef68f9]317    if (m_View->HasData()) {
[2072157]318        m_DragStart = m_DragRealStart = event.GetPosition();
[096e56c]319
[e2c1671]320        if (m_View->PointWithinCompass(m_DragStart)) {
321            m_LastDrag = drag_COMPASS;
[e0f3ade]322            m_View->SetCursor(GfxCore::CURSOR_ROTATE_HORIZONTALLY);
[e2c1671]323        } else if (m_View->PointWithinClino(m_DragStart)) {
324            m_LastDrag = drag_ELEV;
[e0f3ade]325            m_View->SetCursor(GfxCore::CURSOR_ROTATE_VERTICALLY);
[e2c1671]326        } else if (m_View->PointWithinScaleBar(m_DragStart)) {
327            m_LastDrag = drag_SCALE;
[e0f3ade]328            m_View->SetCursor(GfxCore::CURSOR_HORIZONTAL_RESIZE);
[e2c1671]329        } else {
[e0f3ade]330            if (event.ControlDown() && !m_View->IsExtendedElevation()) {
[e2c1671]331                m_View->SetCursor(GfxCore::CURSOR_ROTATE_EITHER_WAY);
332            } else {
[ecf2d23]333                m_View->SetCursor(GfxCore::CURSOR_ZOOM_ROTATE);
[e2c1671]334            }
[7c29c976]335
336            m_LastDrag = drag_MAIN;
[f3ef5d8]337            m_ScaleRotateLock = lock_NONE;
[e2c1671]338        }
339
[a57af18]340        // We need to release and recapture for the cursor to update (noticed
341        // with wxGTK).
342        if (dragging != NO_DRAG) m_View->ReleaseMouse();
[56da40e]343        m_View->CaptureMouse();
[a57af18]344
345        dragging = LEFT_DRAG;
[56da40e]346    }
347}
348
349void GUIControl::OnLButtonUp(wxMouseEvent& event)
350{
[eef68f9]351    if (m_View->HasData()) {
[a57af18]352        if (dragging != LEFT_DRAG)
[76882cb]353            return;
354
[56da40e]355        if (event.GetPosition() == m_DragRealStart) {
[e2c1671]356            // Just a "click"...
[56da40e]357            m_View->CheckHitTestGrid(m_DragStart, true);
358        }
359
[e0f3ade]360        if (event.MiddleIsDown()) {
361            OnMButtonDown(event);
362            return;
363        }
364
365        if (event.RightIsDown()) {
366            OnRButtonDown(event);
367            return;
368        }
369
[56da40e]370        m_View->ReleaseMouse();
371
372        m_LastDrag = drag_NONE;
[82c85aa]373        dragging = NO_DRAG;
[56da40e]374
[a57af18]375        m_View->DragFinished();
[096e56c]376
[2072157]377        if (event.GetPosition() == m_DragRealStart) {
378            RestoreCursor();
379        } else {
380            HandleNonDrag(event.GetPosition());
381        }
[56da40e]382    }
383}
384
385void GUIControl::OnMButtonDown(wxMouseEvent& event)
386{
[eef68f9]387    if (m_View->HasData() && !m_View->IsExtendedElevation()) {
[2072157]388        m_DragStart = event.GetPosition();
[56da40e]389
[ecf2d23]390        m_View->SetCursor(GfxCore::CURSOR_ROTATE_VERTICALLY);
[e2c1671]391
[a57af18]392        // We need to release and recapture for the cursor to update (noticed
393        // with wxGTK).
394        if (dragging != NO_DRAG) m_View->ReleaseMouse();
[56da40e]395        m_View->CaptureMouse();
[a57af18]396        dragging = MIDDLE_DRAG;
[56da40e]397    }
398}
399
[e0f3ade]400void GUIControl::OnMButtonUp(wxMouseEvent& event)
[56da40e]401{
[eef68f9]402    if (m_View->HasData()) {
[a57af18]403        if (dragging != MIDDLE_DRAG)
404            return;
405
[e0f3ade]406        if (event.LeftIsDown()) {
407            OnLButtonDown(event);
408            return;
409        }
410
411        if (event.RightIsDown()) {
412            OnRButtonDown(event);
413            return;
414        }
415
[82c85aa]416        dragging = NO_DRAG;
[56da40e]417        m_View->ReleaseMouse();
[a57af18]418        m_View->DragFinished();
[203d2a7]419
[a57af18]420        RestoreCursor();
[56da40e]421    }
422}
423
424void GUIControl::OnRButtonDown(wxMouseEvent& event)
425{
426    if (m_View->HasData()) {
[acdb8aa]427        if (m_View->HandleRClick(event.GetPosition()))
428            return;
429
[2072157]430        m_DragStart = event.GetPosition();
[096e56c]431
[a57af18]432        m_View->SetCursor(GfxCore::CURSOR_DRAGGING_HAND);
[56da40e]433
[a57af18]434        // We need to release and recapture for the cursor to update (noticed
435        // with wxGTK).
436        if (dragging != NO_DRAG) m_View->ReleaseMouse();
[56da40e]437        m_View->CaptureMouse();
[a57af18]438        dragging = RIGHT_DRAG;
[56da40e]439    }
440}
441
[e0f3ade]442void GUIControl::OnRButtonUp(wxMouseEvent& event)
[56da40e]443{
[a57af18]444    if (dragging != RIGHT_DRAG)
445        return;
446
[e0f3ade]447    if (event.LeftIsDown()) {
448        OnLButtonDown(event);
449        return;
450    }
451
452    if (event.MiddleIsDown()) {
453        OnMButtonDown(event);
454        return;
455    }
456
[56da40e]457    m_LastDrag = drag_NONE;
458    m_View->ReleaseMouse();
459
[82c85aa]460    dragging = NO_DRAG;
[096e56c]461
[203d2a7]462    RestoreCursor();
[096e56c]463
[56da40e]464    m_View->DragFinished();
465}
466
[34d8d1a]467void GUIControl::OnMouseWheel(wxMouseEvent& event) {
[ecf2d23]468    int dy = event.GetWheelRotation();
469    if (m_View->GetPerspective()) {
470        m_View->MoveViewer(-dy, 0, 0);
471    } else {
472        m_View->SetScale(m_View->GetScale() * pow(1.06, -0.04 * dy));
[7c29c976]473        m_View->ForceRefresh();
474    }
[34d8d1a]475}
476
[56da40e]477void GUIControl::OnDisplayOverlappingNames()
478{
479    m_View->ToggleOverlappingNames();
480}
481
482void GUIControl::OnDisplayOverlappingNamesUpdate(wxUpdateUIEvent& cmd)
483{
484    cmd.Enable(m_View->HasData() && m_View->ShowingStationNames());
485    cmd.Check(m_View->ShowingOverlappingNames());
486}
487
[da6c802]488void GUIControl::OnColourByDepth()
489{
490    if (m_View->ColouringBy() == COLOUR_BY_DEPTH) {
491        m_View->SetColourBy(COLOUR_BY_NONE);
492    } else {
493        m_View->SetColourBy(COLOUR_BY_DEPTH);
494    }
495}
496
[d4650b3]497void GUIControl::OnColourByDate()
498{
499    if (m_View->ColouringBy() == COLOUR_BY_DATE) {
500        m_View->SetColourBy(COLOUR_BY_NONE);
501    } else {
502        m_View->SetColourBy(COLOUR_BY_DATE);
503    }
504}
505
[c61aa79]506void GUIControl::OnColourByError()
507{
508    if (m_View->ColouringBy() == COLOUR_BY_ERROR) {
509        m_View->SetColourBy(COLOUR_BY_NONE);
510    } else {
511        m_View->SetColourBy(COLOUR_BY_ERROR);
512    }
513}
514
[da6c802]515void GUIControl::OnColourByDepthUpdate(wxUpdateUIEvent& cmd)
516{
[ff5db1d5]517    cmd.Enable(m_View->HasData());
[da6c802]518    cmd.Check(m_View->ColouringBy() == COLOUR_BY_DEPTH);
519}
520
[d4650b3]521void GUIControl::OnColourByDateUpdate(wxUpdateUIEvent& cmd)
522{
[ff5db1d5]523    cmd.Enable(m_View->HasData());
[d4650b3]524    cmd.Check(m_View->ColouringBy() == COLOUR_BY_DATE);
525}
526
[c61aa79]527void GUIControl::OnColourByErrorUpdate(wxUpdateUIEvent& cmd)
528{
[ff5db1d5]529    cmd.Enable(m_View->HasData());
[c61aa79]530    cmd.Check(m_View->ColouringBy() == COLOUR_BY_ERROR);
531}
532
[56da40e]533void GUIControl::OnShowCrosses()
534{
535    m_View->ToggleCrosses();
536}
537
538void GUIControl::OnShowCrossesUpdate(wxUpdateUIEvent& cmd)
539{
540    cmd.Enable(m_View->HasData());
541    cmd.Check(m_View->ShowingCrosses());
542}
543
544void GUIControl::OnShowStationNames()
545{
546    m_View->ToggleStationNames();
547}
548
549void GUIControl::OnShowStationNamesUpdate(wxUpdateUIEvent& cmd)
550{
551    cmd.Enable(m_View->HasData());
552    cmd.Check(m_View->ShowingStationNames());
553}
554
555void GUIControl::OnShowSurveyLegs()
556{
557    m_View->ToggleUndergroundLegs();
558}
559
560void GUIControl::OnShowSurveyLegsUpdate(wxUpdateUIEvent& cmd)
561{
[eef68f9]562    cmd.Enable(m_View->HasData() && m_View->HasUndergroundLegs());
[56da40e]563    cmd.Check(m_View->ShowingUndergroundLegs());
564}
565
[8666fc7]566void GUIControl::OnHideSplays()
[5fe7292]567{
[8666fc7]568    m_View->SetSplaysMode(SPLAYS_HIDE);
569}
570
571void GUIControl::OnShowSplaysNormal()
572{
573    m_View->SetSplaysMode(SPLAYS_SHOW_NORMAL);
574}
575
576void GUIControl::OnShowSplaysFaded()
577{
578    m_View->SetSplaysMode(SPLAYS_SHOW_FADED);
[5fe7292]579}
580
[9cb97b7]581void GUIControl::OnSplaysUpdate(wxUpdateUIEvent& cmd)
[5fe7292]582{
583    cmd.Enable(m_View->HasData() && m_View->HasSplays());
[8666fc7]584}
585
586void GUIControl::OnHideSplaysUpdate(wxUpdateUIEvent& cmd)
587{
588    cmd.Enable(m_View->HasData() && m_View->HasSplays());
589    cmd.Check(m_View->ShowingSplaysMode() == SPLAYS_HIDE);
590}
591
592void GUIControl::OnShowSplaysNormalUpdate(wxUpdateUIEvent& cmd)
593{
594    cmd.Enable(m_View->HasData() && m_View->HasSplays());
595    cmd.Check(m_View->ShowingSplaysMode() == SPLAYS_SHOW_NORMAL);
596}
597
598void GUIControl::OnShowSplaysFadedUpdate(wxUpdateUIEvent& cmd)
599{
600    cmd.Enable(m_View->HasData() && m_View->HasSplays());
601    cmd.Check(m_View->ShowingSplaysMode() == SPLAYS_SHOW_FADED);
[5fe7292]602}
603
[56da40e]604void GUIControl::OnMoveEast()
605{
[e577f89]606    m_View->TurnCaveTo(90.0);
[56da40e]607    m_View->ForceRefresh();
608}
609
610void GUIControl::OnMoveEastUpdate(wxUpdateUIEvent& cmd)
611{
[11c594a]612    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation() && m_View->GetCompassValue() != 90.0);
[56da40e]613}
614
615void GUIControl::OnMoveNorth()
616{
617    m_View->TurnCaveTo(0.0);
618    m_View->ForceRefresh();
619}
620
621void GUIControl::OnMoveNorthUpdate(wxUpdateUIEvent& cmd)
622{
[11c594a]623    cmd.Enable(m_View->HasData() && m_View->GetCompassValue() != 0.0);
[56da40e]624}
625
626void GUIControl::OnMoveSouth()
627{
[e577f89]628    m_View->TurnCaveTo(180.0);
[56da40e]629    m_View->ForceRefresh();
630}
631
632void GUIControl::OnMoveSouthUpdate(wxUpdateUIEvent& cmd)
633{
[11c594a]634    cmd.Enable(m_View->HasData() && m_View->GetCompassValue() != 180.0);
[56da40e]635}
636
637void GUIControl::OnMoveWest()
638{
[e577f89]639    m_View->TurnCaveTo(270.0);
[56da40e]640    m_View->ForceRefresh();
641}
642
643void GUIControl::OnMoveWestUpdate(wxUpdateUIEvent& cmd)
644{
[11c594a]645    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation() && m_View->GetCompassValue() != 270.0);
[56da40e]646}
647
648void GUIControl::OnToggleRotation()
649{
650    m_View->ToggleRotation();
651}
652
653void GUIControl::OnToggleRotationUpdate(wxUpdateUIEvent& cmd)
654{
[eef68f9]655    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation());
[56da40e]656    cmd.Check(m_View->HasData() && m_View->IsRotating());
657}
658
659void GUIControl::OnReverseControls()
660{
661    m_ReverseControls = !m_ReverseControls;
662}
663
664void GUIControl::OnReverseControlsUpdate(wxUpdateUIEvent& cmd)
665{
666    cmd.Enable(m_View->HasData());
667    cmd.Check(m_ReverseControls);
668}
669
670void GUIControl::OnReverseDirectionOfRotation()
671{
672    m_View->ReverseRotation();
673}
674
675void GUIControl::OnReverseDirectionOfRotationUpdate(wxUpdateUIEvent& cmd)
676{
[eef68f9]677    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation());
[56da40e]678}
679
680void GUIControl::OnSlowDown(bool accel)
681{
682    m_View->RotateSlower(accel);
683}
684
685void GUIControl::OnSlowDownUpdate(wxUpdateUIEvent& cmd)
686{
[eef68f9]687    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation());
[56da40e]688}
689
690void GUIControl::OnSpeedUp(bool accel)
691{
692    m_View->RotateFaster(accel);
693}
694
695void GUIControl::OnSpeedUpUpdate(wxUpdateUIEvent& cmd)
696{
[eef68f9]697    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation());
[56da40e]698}
699
700void GUIControl::OnStepOnceAnticlockwise(bool accel)
701{
[d877aa2]702    if (m_View->GetPerspective()) {
703        m_View->TurnCave(accel ? -5.0 * ROTATE_STEP : -ROTATE_STEP);
704    } else {
705        m_View->TurnCave(accel ? 5.0 * ROTATE_STEP : ROTATE_STEP);
706    }
[56da40e]707    m_View->ForceRefresh();
708}
709
710void GUIControl::OnStepOnceAnticlockwiseUpdate(wxUpdateUIEvent& cmd)
711{
[eef68f9]712    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation() && !m_View->IsRotating());
[56da40e]713}
714
715void GUIControl::OnStepOnceClockwise(bool accel)
716{
[d877aa2]717    if (m_View->GetPerspective()) {
718        m_View->TurnCave(accel ? 5.0 * ROTATE_STEP : ROTATE_STEP);
719    } else {
720        m_View->TurnCave(accel ? -5.0 * ROTATE_STEP : -ROTATE_STEP);
721    }
[56da40e]722    m_View->ForceRefresh();
723}
724
725void GUIControl::OnStepOnceClockwiseUpdate(wxUpdateUIEvent& cmd)
726{
[eef68f9]727    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation() && !m_View->IsRotating());
[56da40e]728}
729
730void GUIControl::OnDefaults()
731{
732    m_View->Defaults();
733}
734
735void GUIControl::OnDefaultsUpdate(wxUpdateUIEvent& cmd)
736{
737    cmd.Enable(m_View->HasData());
738}
739
740void GUIControl::OnElevation()
741{
742    // Switch to elevation view.
743
744    m_View->SwitchToElevation();
745}
746
747void GUIControl::OnElevationUpdate(wxUpdateUIEvent& cmd)
748{
[eef68f9]749    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation() && !m_View->ShowingElevation());
[56da40e]750}
751
752void GUIControl::OnHigherViewpoint(bool accel)
753{
754    // Raise the viewpoint.
[d877aa2]755    if (m_View->GetPerspective()) {
756        m_View->TiltCave(accel ? 5.0 * ROTATE_STEP : ROTATE_STEP);
[7a57dc7]757    } else {
758        m_View->TiltCave(accel ? -5.0 * ROTATE_STEP : -ROTATE_STEP);
[d877aa2]759    }
[56da40e]760    m_View->ForceRefresh();
761}
762
763void GUIControl::OnHigherViewpointUpdate(wxUpdateUIEvent& cmd)
764{
[eef68f9]765    cmd.Enable(m_View->HasData() && m_View->CanRaiseViewpoint() && !m_View->IsExtendedElevation());
[56da40e]766}
767
768void GUIControl::OnLowerViewpoint(bool accel)
769{
770    // Lower the viewpoint.
[d877aa2]771    if (m_View->GetPerspective()) {
772        m_View->TiltCave(accel ? -5.0 * ROTATE_STEP : -ROTATE_STEP);
[7a57dc7]773    } else {
774        m_View->TiltCave(accel ? 5.0 * ROTATE_STEP : ROTATE_STEP);
[d877aa2]775    }
[d6a5001]776    m_View->ForceRefresh();
[56da40e]777}
778
779void GUIControl::OnLowerViewpointUpdate(wxUpdateUIEvent& cmd)
780{
[eef68f9]781    cmd.Enable(m_View->HasData() && m_View->CanLowerViewpoint() && !m_View->IsExtendedElevation());
[56da40e]782}
783
784void GUIControl::OnPlan()
785{
786    // Switch to plan view.
787    m_View->SwitchToPlan();
788}
789
790void GUIControl::OnPlanUpdate(wxUpdateUIEvent& cmd)
791{
[eef68f9]792    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation() && !m_View->ShowingPlan());
[56da40e]793}
794
795void GUIControl::OnShiftDisplayDown(bool accel)
796{
[096e56c]797    if (m_View->GetPerspective())
[867a1141]798        m_View->MoveViewer(0, accel ? 5 * FLYFREE_SHIFT : FLYFREE_SHIFT, 0);
[d877aa2]799    else
800        m_View->TranslateCave(0, accel ? 5 * DISPLAY_SHIFT : DISPLAY_SHIFT);
[56da40e]801}
802
803void GUIControl::OnShiftDisplayDownUpdate(wxUpdateUIEvent& cmd)
804{
805    cmd.Enable(m_View->HasData());
806}
807
808void GUIControl::OnShiftDisplayLeft(bool accel)
809{
[096e56c]810    if (m_View->GetPerspective())
[867a1141]811        m_View->MoveViewer(0, 0, accel ? 5 * FLYFREE_SHIFT : FLYFREE_SHIFT);
[d877aa2]812    else
813        m_View->TranslateCave(accel ? -5 * DISPLAY_SHIFT : -DISPLAY_SHIFT, 0);
[56da40e]814}
815
816void GUIControl::OnShiftDisplayLeftUpdate(wxUpdateUIEvent& cmd)
817{
818    cmd.Enable(m_View->HasData());
819}
820
821void GUIControl::OnShiftDisplayRight(bool accel)
822{
[096e56c]823    if (m_View->GetPerspective())
[867a1141]824        m_View->MoveViewer(0, 0, accel ? -5 * FLYFREE_SHIFT : -FLYFREE_SHIFT);
[d877aa2]825    else
826        m_View->TranslateCave(accel ? 5 * DISPLAY_SHIFT : DISPLAY_SHIFT, 0);
[56da40e]827}
828
829void GUIControl::OnShiftDisplayRightUpdate(wxUpdateUIEvent& cmd)
830{
831    cmd.Enable(m_View->HasData());
832}
833
834void GUIControl::OnShiftDisplayUp(bool accel)
835{
[096e56c]836    if (m_View->GetPerspective())
[867a1141]837        m_View->MoveViewer(0, accel ? -5 * FLYFREE_SHIFT : -FLYFREE_SHIFT, 0);
[d877aa2]838    else
839        m_View->TranslateCave(0, accel ? -5 * DISPLAY_SHIFT : -DISPLAY_SHIFT);
[56da40e]840}
841
842void GUIControl::OnShiftDisplayUpUpdate(wxUpdateUIEvent& cmd)
843{
844    cmd.Enable(m_View->HasData());
845}
846
847void GUIControl::OnZoomIn(bool accel)
848{
849    // Increase the scale.
850
[d877aa2]851    if (m_View->GetPerspective()) {
852        m_View->MoveViewer(accel ? 5 * FLYFREE_SHIFT : FLYFREE_SHIFT, 0, 0);
853    } else {
854        m_View->SetScale(m_View->GetScale() * (accel ? 1.1236 : 1.06));
855        m_View->ForceRefresh();
856    }
[56da40e]857}
858
859void GUIControl::OnZoomInUpdate(wxUpdateUIEvent& cmd)
860{
[eef68f9]861    cmd.Enable(m_View->HasData());
[56da40e]862}
863
864void GUIControl::OnZoomOut(bool accel)
865{
866    // Decrease the scale.
867
[d877aa2]868    if (m_View->GetPerspective()) {
869        m_View->MoveViewer(accel ? -5 * FLYFREE_SHIFT : -FLYFREE_SHIFT, 0, 0);
870    } else {
871        m_View->SetScale(m_View->GetScale() / (accel ? 1.1236 : 1.06));
872        m_View->ForceRefresh();
873    }
[56da40e]874}
875
876void GUIControl::OnZoomOutUpdate(wxUpdateUIEvent& cmd)
877{
[eef68f9]878    cmd.Enable(m_View->HasData());
[56da40e]879}
880
881void GUIControl::OnToggleScalebar()
882{
883    m_View->ToggleScaleBar();
884}
885
886void GUIControl::OnToggleScalebarUpdate(wxUpdateUIEvent& cmd)
887{
[eef68f9]888    cmd.Enable(m_View->HasData());
[56da40e]889    cmd.Check(m_View->ShowingScaleBar());
890}
891
[97ea48d]892void GUIControl::OnToggleColourKey()
[56da40e]893{
[97ea48d]894    m_View->ToggleColourKey();
[56da40e]895}
896
[97ea48d]897void GUIControl::OnToggleColourKeyUpdate(wxUpdateUIEvent& cmd)
[56da40e]898{
[97ea48d]899    cmd.Enable(m_View->HasData() && m_View->ColouringBy() != COLOUR_BY_NONE);
900    cmd.Check(m_View->ShowingColourKey());
[56da40e]901}
902
903void GUIControl::OnViewCompass()
904{
905    m_View->ToggleCompass();
906}
907
908void GUIControl::OnViewCompassUpdate(wxUpdateUIEvent& cmd)
909{
[eef68f9]910    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation());
[56da40e]911    cmd.Check(m_View->ShowingCompass());
912}
913
914void GUIControl::OnViewClino()
915{
916    m_View->ToggleClino();
917}
918
919void GUIControl::OnViewClinoUpdate(wxUpdateUIEvent& cmd)
920{
[eef68f9]921    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation());
[56da40e]922    cmd.Check(m_View->ShowingClino());
923}
924
925void GUIControl::OnShowSurface()
926{
927    m_View->ToggleSurfaceLegs();
928}
929
930void GUIControl::OnShowSurfaceUpdate(wxUpdateUIEvent& cmd)
931{
932    cmd.Enable(m_View->HasData() && m_View->HasSurfaceLegs());
933    cmd.Check(m_View->ShowingSurfaceLegs());
934}
935
936void GUIControl::OnShowEntrances()
937{
938    m_View->ToggleEntrances();
939}
940
941void GUIControl::OnShowEntrancesUpdate(wxUpdateUIEvent& cmd)
942{
943    cmd.Enable(m_View->HasData() && (m_View->GetNumEntrances() > 0));
944    cmd.Check(m_View->ShowingEntrances());
945}
946
947void GUIControl::OnShowFixedPts()
948{
949    m_View->ToggleFixedPts();
950}
951
952void GUIControl::OnShowFixedPtsUpdate(wxUpdateUIEvent& cmd)
953{
954    cmd.Enable(m_View->HasData() && (m_View->GetNumFixedPts() > 0));
955    cmd.Check(m_View->ShowingFixedPts());
956}
957
958void GUIControl::OnShowExportedPts()
959{
960    m_View->ToggleExportedPts();
961}
962
963void GUIControl::OnShowExportedPtsUpdate(wxUpdateUIEvent& cmd)
964{
[cd39f67]965    cmd.Enable(m_View->HasData() && (m_View->GetNumExportedPts() > 0));
[56da40e]966    cmd.Check(m_View->ShowingExportedPts());
967}
968
969void GUIControl::OnViewGrid()
970{
971    m_View->ToggleGrid();
972}
973
974void GUIControl::OnViewGridUpdate(wxUpdateUIEvent& cmd)
975{
976    cmd.Enable(m_View->HasData());
[0580c6a]977    cmd.Check(m_View->ShowingGrid());
[56da40e]978}
979
980void GUIControl::OnIndicatorsUpdate(wxUpdateUIEvent& cmd)
981{
982    cmd.Enable(m_View->HasData());
983}
984
[6abab84]985void GUIControl::OnViewPerspective()
986{
987    m_View->TogglePerspective();
[d877aa2]988    // Force update of coordinate display.
989    if (m_View->GetPerspective()) {
990        m_View->MoveViewer(0, 0, 0);
991    } else {
992        m_View->ClearCoords();
993    }
[6abab84]994}
995
996void GUIControl::OnViewPerspectiveUpdate(wxUpdateUIEvent& cmd)
997{
[114c8fd]998    cmd.Enable(m_View->HasData() && !m_View->IsExtendedElevation());
[6abab84]999    cmd.Check(m_View->GetPerspective());
1000}
1001
[d67450e]1002void GUIControl::OnViewSmoothShading()
1003{
1004    m_View->ToggleSmoothShading();
1005}
1006
1007void GUIControl::OnViewSmoothShadingUpdate(wxUpdateUIEvent& cmd)
1008{
1009    cmd.Enable(m_View->HasData());
1010    cmd.Check(m_View->GetSmoothShading());
1011}
1012
[a517825]1013void GUIControl::OnViewTextured()
1014{
1015    m_View->ToggleTextured();
1016}
1017
1018void GUIControl::OnViewTexturedUpdate(wxUpdateUIEvent& cmd)
1019{
1020    cmd.Enable(m_View->HasData());
1021    cmd.Check(m_View->GetTextured());
1022}
1023
[c60062d]1024void GUIControl::OnViewFog()
1025{
1026    m_View->ToggleFog();
1027}
1028
1029void GUIControl::OnViewFogUpdate(wxUpdateUIEvent& cmd)
1030{
1031    cmd.Enable(m_View->HasData());
1032    cmd.Check(m_View->GetFog());
1033}
1034
[db452ae]1035void GUIControl::OnViewSmoothLines()
1036{
1037    m_View->ToggleAntiAlias();
1038}
1039
1040void GUIControl::OnViewSmoothLinesUpdate(wxUpdateUIEvent& cmd)
1041{
1042    cmd.Enable(m_View->HasData());
1043    cmd.Check(m_View->GetAntiAlias());
1044}
1045
[56da40e]1046void GUIControl::OnToggleMetric()
1047{
1048    m_View->ToggleMetric();
1049
[5627cbb]1050    wxConfigBase::Get()->Write(wxT("metric"), m_View->GetMetric());
[56da40e]1051    wxConfigBase::Get()->Flush();
1052}
1053
1054void GUIControl::OnToggleMetricUpdate(wxUpdateUIEvent& cmd)
1055{
1056    cmd.Enable(m_View->HasData());
1057    cmd.Check(m_View->GetMetric());
1058}
1059
1060void GUIControl::OnToggleDegrees()
1061{
1062    m_View->ToggleDegrees();
[096e56c]1063
[5627cbb]1064    wxConfigBase::Get()->Write(wxT("degrees"), m_View->GetDegrees());
[56da40e]1065    wxConfigBase::Get()->Flush();
1066}
1067
1068void GUIControl::OnToggleDegreesUpdate(wxUpdateUIEvent& cmd)
1069{
1070    cmd.Enable(m_View->HasData());
1071    cmd.Check(m_View->GetDegrees());
1072}
1073
[d171c0c]1074void GUIControl::OnTogglePercent()
1075{
1076    m_View->TogglePercent();
1077
1078    wxConfigBase::Get()->Write(wxT("percent"), m_View->GetPercent());
1079    wxConfigBase::Get()->Flush();
1080}
1081
1082void GUIControl::OnTogglePercentUpdate(wxUpdateUIEvent& cmd)
1083{
1084    cmd.Enable(m_View->HasData());
1085    cmd.Check(m_View->GetPercent());
1086}
1087
[56da40e]1088void GUIControl::OnToggleTubes()
1089{
1090    m_View->ToggleTubes();
1091}
1092
1093void GUIControl::OnToggleTubesUpdate(wxUpdateUIEvent& cmd)
1094{
[50e8979]1095    cmd.Enable(m_View->HasData() && m_View->HasTubes());
[56da40e]1096    cmd.Check(m_View->GetTubes());
1097}
1098
1099void GUIControl::OnCancelDistLine()
1100{
1101    m_View->ClearTreeSelection();
1102}
1103
1104void GUIControl::OnCancelDistLineUpdate(wxUpdateUIEvent& cmd)
1105{
1106    cmd.Enable(m_View->ShowingMeasuringLine());
1107}
1108
1109void GUIControl::OnKeyPress(wxKeyEvent &e)
1110{
1111    if (!m_View->HasData()) {
1112        e.Skip();
1113        return;
1114    }
1115
[1690fa9]1116    // The changelog says this is meant to keep animation going while keys are
1117    // pressed, but that happens anyway (on linux at least - perhaps it helps
1118    // on windows?)  FIXME : check!
1119    //bool refresh = m_View->Animate();
[56da40e]1120
[a6e8d45]1121    switch (e.GetKeyCode()) {
[56da40e]1122        case '/': case '?':
[eef68f9]1123            if (m_View->CanLowerViewpoint() && !m_View->IsExtendedElevation())
[a6e8d45]1124                OnLowerViewpoint(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1125            break;
1126        case '\'': case '@': case '"': // both shifted forms - US and UK kbd
[eef68f9]1127            if (m_View->CanRaiseViewpoint() && !m_View->IsExtendedElevation())
[a6e8d45]1128                OnHigherViewpoint(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1129            break;
1130        case 'C': case 'c':
[eef68f9]1131            if (!m_View->IsExtendedElevation() && !m_View->IsRotating())
[a6e8d45]1132                OnStepOnceAnticlockwise(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1133            break;
1134        case 'V': case 'v':
[eef68f9]1135            if (!m_View->IsExtendedElevation() && !m_View->IsRotating())
[a6e8d45]1136                OnStepOnceClockwise(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1137            break;
1138        case ']': case '}':
[a6e8d45]1139            OnZoomIn(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1140            break;
1141        case '[': case '{':
[a6e8d45]1142            OnZoomOut(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1143            break;
1144        case 'N': case 'n':
[eef68f9]1145            OnMoveNorth();
[56da40e]1146            break;
1147        case 'S': case 's':
[eef68f9]1148            OnMoveSouth();
[56da40e]1149            break;
1150        case 'E': case 'e':
[eef68f9]1151            if (!m_View->IsExtendedElevation())
[56da40e]1152                OnMoveEast();
1153            break;
1154        case 'W': case 'w':
[eef68f9]1155            if (!m_View->IsExtendedElevation())
[56da40e]1156                OnMoveWest();
1157            break;
1158        case 'Z': case 'z':
[eef68f9]1159            if (!m_View->IsExtendedElevation())
[a6e8d45]1160                OnSpeedUp(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1161            break;
1162        case 'X': case 'x':
[eef68f9]1163            if (!m_View->IsExtendedElevation())
[a6e8d45]1164                OnSlowDown(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1165            break;
1166        case 'R': case 'r':
[eef68f9]1167            if (!m_View->IsExtendedElevation())
[56da40e]1168                OnReverseDirectionOfRotation();
1169            break;
1170        case 'P': case 'p':
[eef68f9]1171            if (!m_View->IsExtendedElevation() && !m_View->ShowingPlan())
[56da40e]1172                OnPlan();
1173            break;
1174        case 'L': case 'l':
[eef68f9]1175            if (!m_View->IsExtendedElevation() && !m_View->ShowingElevation())
[56da40e]1176                OnElevation();
1177            break;
1178        case 'O': case 'o':
1179            OnDisplayOverlappingNames();
1180            break;
1181        case WXK_DELETE:
1182            OnDefaults();
1183            break;
1184        case WXK_RETURN:
[2776c60]1185            // For compatibility with older versions.
[eef68f9]1186            if (!m_View->IsExtendedElevation() && !m_View->IsRotating())
[2776c60]1187                m_View->StartRotation();
[56da40e]1188            break;
1189        case WXK_SPACE:
[eef68f9]1190            if (!m_View->IsExtendedElevation())
[2776c60]1191                OnToggleRotation();
[56da40e]1192            break;
1193        case WXK_LEFT:
[a6e8d45]1194            if ((e.GetModifiers() &~ wxMOD_SHIFT) == wxMOD_CONTROL) {
[eef68f9]1195                if (!m_View->IsExtendedElevation() && !m_View->IsRotating())
[a6e8d45]1196                    OnStepOnceAnticlockwise(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1197            } else {
[a6e8d45]1198                OnShiftDisplayLeft(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1199            }
1200            break;
1201        case WXK_RIGHT:
[a6e8d45]1202            if ((e.GetModifiers() &~ wxMOD_SHIFT) == wxMOD_CONTROL) {
[eef68f9]1203                if (!m_View->IsExtendedElevation() && !m_View->IsRotating())
[a6e8d45]1204                    OnStepOnceClockwise(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1205            } else {
[a6e8d45]1206                OnShiftDisplayRight(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1207            }
1208            break;
1209        case WXK_UP:
[a6e8d45]1210            if ((e.GetModifiers() &~ wxMOD_SHIFT) == wxMOD_CONTROL) {
[eef68f9]1211                if (m_View->CanRaiseViewpoint() && !m_View->IsExtendedElevation())
[a6e8d45]1212                    OnHigherViewpoint(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1213            } else {
[a6e8d45]1214                OnShiftDisplayUp(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1215            }
1216            break;
1217        case WXK_DOWN:
[a6e8d45]1218            if ((e.GetModifiers() &~ wxMOD_SHIFT) == wxMOD_CONTROL) {
[eef68f9]1219                if (m_View->CanLowerViewpoint() && !m_View->IsExtendedElevation())
[a6e8d45]1220                    OnLowerViewpoint(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1221            } else {
[a6e8d45]1222                OnShiftDisplayDown(e.GetModifiers() == wxMOD_SHIFT);
[56da40e]1223            }
1224            break;
1225        case WXK_ESCAPE:
1226            if (m_View->ShowingMeasuringLine()) {
1227                OnCancelDistLine();
1228            }
1229            break;
[c6d5c1c]1230        case WXK_F5:
1231            m_View->InvalidateAllLists();
1232            m_View->ForceRefresh();
1233            break;
[56da40e]1234        default:
1235            e.Skip();
1236    }
[096e56c]1237
[1690fa9]1238    //if (refresh) m_View->ForceRefresh();
[56da40e]1239}
1240
[b13aee4]1241void GUIControl::OnViewFullScreenUpdate(wxUpdateUIEvent& cmd)
1242{
[fdfa926]1243    cmd.Check(m_View->IsFullScreen());
[b13aee4]1244}
1245
1246void GUIControl::OnViewFullScreen()
1247{
1248    m_View->FullScreenMode();
1249}
[f4c5932]1250
1251void GUIControl::OnViewBoundingBoxUpdate(wxUpdateUIEvent& cmd)
1252{
1253    cmd.Enable(m_View->HasData());
1254    cmd.Check(m_View->DisplayingBoundingBox());
1255}
1256
1257void GUIControl::OnViewBoundingBox()
1258{
1259    m_View->ToggleBoundingBox();
1260}
Note: See TracBrowser for help on using the repository browser.