source: git/src/guicontrol.cc @ c3b20c5

RELEASE/1.2debug-cidebug-ci-sanitisersstereowalls-data
Last change on this file since c3b20c5 was c3b20c5, checked in by Olly Betts <olly@…>, 9 years ago

src/: Merge OnStepOnceAnticlockwiseUpdate?() and
OnStepOnceClockwiseUpdate?().

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