source: git/src/guicontrol.cc @ 4e98397

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 4e98397 was d67450e, checked in by Olly Betts <olly@…>, 18 years ago

Add Point::Invalidate() and Point::IsValid?() rather than directly setting
the x coordinate to DBL_MAX and testing that.

Add the mechanics to the OpenGL layer to allow a "wireframe" view of the tunnel
walls (not yet hooked up to the UI).

Add the mechanics to allow smooth shading (but we need to set normals before
we can useful turn this on).

Pass/return Vector3 instead of x,y,z triples in many places.

Factor out GfxCore::DrawArrow?() from DrawCompass?()/DrawClino?().

Point class now uses Vector3 as a base class, so the vec() method is no longer
required.

Fix presentation playing to actually work (it wasn't storing the speed so it
never played...)

Inline GLACanvas::SetTranslation?() and AddTranslation?().

Vector3::set() renamed to Vector3::assign() for consistency with C++ STL.

Display altitude to 2 decimal places rather than the nearest metre/foot.

LabelInfo::GetText?() now returns const ref to wxString rather than wxString.

Factor apart WIN32 and non-WIN32 versions of AvenAllowOnTop? class as the
code is much clearer that way.

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

  • Property mode set to 100644
File size: 24.7 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
[d67450e]7//  Copyright (C) 2001,2003,2004,2005,2006 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
[d67450e]840void GUIControl::OnViewSmoothShading()
841{
842    m_View->ToggleSmoothShading();
843}
844
845void GUIControl::OnViewSmoothShadingUpdate(wxUpdateUIEvent& cmd)
846{
847    cmd.Enable(m_View->HasData());
848    cmd.Check(m_View->GetSmoothShading());
849}
850
[a517825]851void GUIControl::OnViewTextured()
852{
853    m_View->ToggleTextured();
854}
855
856void GUIControl::OnViewTexturedUpdate(wxUpdateUIEvent& cmd)
857{
858    cmd.Enable(m_View->HasData());
859    cmd.Check(m_View->GetTextured());
860}
861
[c60062d]862void GUIControl::OnViewFog()
863{
864    m_View->ToggleFog();
865}
866
867void GUIControl::OnViewFogUpdate(wxUpdateUIEvent& cmd)
868{
869    cmd.Enable(m_View->HasData());
870    cmd.Check(m_View->GetFog());
871}
872
[db452ae]873void GUIControl::OnViewSmoothLines()
874{
875    m_View->ToggleAntiAlias();
876}
877
878void GUIControl::OnViewSmoothLinesUpdate(wxUpdateUIEvent& cmd)
879{
880    cmd.Enable(m_View->HasData());
881    cmd.Check(m_View->GetAntiAlias());
882}
883
[56da40e]884void GUIControl::OnToggleMetric()
885{
886    m_View->ToggleMetric();
887
888    wxConfigBase::Get()->Write("metric", m_View->GetMetric());
889    wxConfigBase::Get()->Flush();
890}
891
892void GUIControl::OnToggleMetricUpdate(wxUpdateUIEvent& cmd)
893{
894    cmd.Enable(m_View->HasData());
895    cmd.Check(m_View->GetMetric());
896}
897
898void GUIControl::OnToggleDegrees()
899{
900    m_View->ToggleDegrees();
[096e56c]901
[56da40e]902    wxConfigBase::Get()->Write("degrees", m_View->GetDegrees());
903    wxConfigBase::Get()->Flush();
904}
905
906void GUIControl::OnToggleDegreesUpdate(wxUpdateUIEvent& cmd)
907{
908    cmd.Enable(m_View->HasData());
909    cmd.Check(m_View->GetDegrees());
910}
911
912void GUIControl::OnToggleTubes()
913{
914    m_View->ToggleTubes();
915}
916
917void GUIControl::OnToggleTubesUpdate(wxUpdateUIEvent& cmd)
918{
[50e8979]919    cmd.Enable(m_View->HasData() && m_View->HasTubes());
[56da40e]920    cmd.Check(m_View->GetTubes());
921}
922
923void GUIControl::OnCancelDistLine()
924{
925    m_View->ClearTreeSelection();
926}
927
928void GUIControl::OnCancelDistLineUpdate(wxUpdateUIEvent& cmd)
929{
930    cmd.Enable(m_View->ShowingMeasuringLine());
931}
932
933void GUIControl::OnKeyPress(wxKeyEvent &e)
934{
935    if (!m_View->HasData()) {
936        e.Skip();
937        return;
938    }
939
[1690fa9]940    // The changelog says this is meant to keep animation going while keys are
941    // pressed, but that happens anyway (on linux at least - perhaps it helps
942    // on windows?)  FIXME : check!
943    //bool refresh = m_View->Animate();
[56da40e]944
945    switch (e.m_keyCode) {
946        case '/': case '?':
[eef68f9]947            if (m_View->CanLowerViewpoint() && !m_View->IsExtendedElevation())
[56da40e]948                OnLowerViewpoint(e.m_shiftDown);
949            break;
950        case '\'': case '@': case '"': // both shifted forms - US and UK kbd
[eef68f9]951            if (m_View->CanRaiseViewpoint() && !m_View->IsExtendedElevation())
[56da40e]952                OnHigherViewpoint(e.m_shiftDown);
953            break;
954        case 'C': case 'c':
[eef68f9]955            if (!m_View->IsExtendedElevation() && !m_View->IsRotating())
[56da40e]956                OnStepOnceAnticlockwise(e.m_shiftDown);
957            break;
958        case 'V': case 'v':
[eef68f9]959            if (!m_View->IsExtendedElevation() && !m_View->IsRotating())
[56da40e]960                OnStepOnceClockwise(e.m_shiftDown);
961            break;
962        case ']': case '}':
[eef68f9]963            OnZoomIn(e.m_shiftDown);
[56da40e]964            break;
965        case '[': case '{':
[eef68f9]966            OnZoomOut(e.m_shiftDown);
[56da40e]967            break;
968        case 'N': case 'n':
[eef68f9]969            OnMoveNorth();
[56da40e]970            break;
971        case 'S': case 's':
[eef68f9]972            OnMoveSouth();
[56da40e]973            break;
974        case 'E': case 'e':
[eef68f9]975            if (!m_View->IsExtendedElevation())
[56da40e]976                OnMoveEast();
977            break;
978        case 'W': case 'w':
[eef68f9]979            if (!m_View->IsExtendedElevation())
[56da40e]980                OnMoveWest();
981            break;
982        case 'Z': case 'z':
[eef68f9]983            if (!m_View->IsExtendedElevation())
[56da40e]984                OnSpeedUp(e.m_shiftDown);
985            break;
986        case 'X': case 'x':
[eef68f9]987            if (!m_View->IsExtendedElevation())
[56da40e]988                OnSlowDown(e.m_shiftDown);
989            break;
990        case 'R': case 'r':
[eef68f9]991            if (!m_View->IsExtendedElevation())
[56da40e]992                OnReverseDirectionOfRotation();
993            break;
994        case 'P': case 'p':
[eef68f9]995            if (!m_View->IsExtendedElevation() && !m_View->ShowingPlan())
[56da40e]996                OnPlan();
997            break;
998        case 'L': case 'l':
[eef68f9]999            if (!m_View->IsExtendedElevation() && !m_View->ShowingElevation())
[56da40e]1000                OnElevation();
1001            break;
1002        case 'O': case 'o':
1003            OnDisplayOverlappingNames();
1004            break;
1005        case WXK_DELETE:
1006            OnDefaults();
1007            break;
1008        case WXK_RETURN:
[2776c60]1009            // For compatibility with older versions.
[eef68f9]1010            if (!m_View->IsExtendedElevation() && !m_View->IsRotating())
[2776c60]1011                m_View->StartRotation();
[56da40e]1012            break;
1013        case WXK_SPACE:
[eef68f9]1014            if (!m_View->IsExtendedElevation())
[2776c60]1015                OnToggleRotation();
[56da40e]1016            break;
1017        case WXK_LEFT:
1018            if (e.m_controlDown) {
[eef68f9]1019                if (!m_View->IsExtendedElevation() && !m_View->IsRotating())
[56da40e]1020                    OnStepOnceAnticlockwise(e.m_shiftDown);
1021            } else {
1022                OnShiftDisplayLeft(e.m_shiftDown);
1023            }
1024            break;
1025        case WXK_RIGHT:
1026            if (e.m_controlDown) {
[eef68f9]1027                if (!m_View->IsExtendedElevation() && !m_View->IsRotating())
[56da40e]1028                    OnStepOnceClockwise(e.m_shiftDown);
1029            } else {
1030                OnShiftDisplayRight(e.m_shiftDown);
1031            }
1032            break;
1033        case WXK_UP:
1034            if (e.m_controlDown) {
[eef68f9]1035                if (m_View->CanRaiseViewpoint() && !m_View->IsExtendedElevation())
[56da40e]1036                    OnHigherViewpoint(e.m_shiftDown);
1037            } else {
1038                OnShiftDisplayUp(e.m_shiftDown);
1039            }
1040            break;
1041        case WXK_DOWN:
1042            if (e.m_controlDown) {
[eef68f9]1043                if (m_View->CanLowerViewpoint() && !m_View->IsExtendedElevation())
[56da40e]1044                    OnLowerViewpoint(e.m_shiftDown);
1045            } else {
1046                OnShiftDisplayDown(e.m_shiftDown);
1047            }
1048            break;
1049        case WXK_ESCAPE:
1050            if (m_View->ShowingMeasuringLine()) {
1051                OnCancelDistLine();
1052            }
1053            break;
1054        default:
1055            e.Skip();
1056    }
[096e56c]1057
[1690fa9]1058    //if (refresh) m_View->ForceRefresh();
[56da40e]1059}
1060
[b13aee4]1061void GUIControl::OnViewFullScreenUpdate(wxUpdateUIEvent& cmd)
1062{
1063    cmd.Enable(m_View->HasData());
[fdfa926]1064    cmd.Check(m_View->IsFullScreen());
[b13aee4]1065}
1066
1067void GUIControl::OnViewFullScreen()
1068{
1069    m_View->FullScreenMode();
1070}
[f4c5932]1071
1072void GUIControl::OnViewBoundingBoxUpdate(wxUpdateUIEvent& cmd)
1073{
1074    cmd.Enable(m_View->HasData());
1075    cmd.Check(m_View->DisplayingBoundingBox());
1076}
1077
1078void GUIControl::OnViewBoundingBox()
1079{
1080    m_View->ToggleBoundingBox();
1081}
Note: See TracBrowser for help on using the repository browser.