source: git/src/guicontrol.cc @ f2e1315

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

aven: Change mouse actions to be compatible with those in Survex 1.0.
The mousewheel now zooms in/out (it doesn't do anything in 1.0) and
left drag is now smart about not rotating and zooming at the same
time.

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

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