source: git/src/guicontrol.cc @ 9cb97b7

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

src/: Rename internal references to "show splays" to just "splays"
to reflect the change in the menu item name.

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