source: git/src/guicontrol.cc @ e633bb1

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 e633bb1 was 0c7bb77, checked in by Olly Betts <olly@…>, 21 years ago

Made keyboard zoom and translate a little less responsive, and fixed the
reversed mouse y axis for translate up/down in FLYFREE mode.

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

  • Property mode set to 100644
File size: 22.9 KB
RevLine 
[56da40e]1//
2//  guicontrol.cc
3//
4//  Handlers for events relating to the display of a survey.
5//
6//  Copyright (C) 2000-2002 Mark R. Shinwell
[cc2a5fc]7//  Copyright (C) 2001-2003 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;
33const double FLYFREE_SHIFT = 0.5;
[56da40e]34
35GUIControl::GUIControl()
36{
37    m_View = NULL;
38    m_DraggingLeft = false;
39    m_DraggingMiddle = false;
40    m_DraggingRight = false;
41    m_ReverseControls = false;
42    m_LastDrag = drag_NONE;
43}
44
45GUIControl::~GUIControl()
46{
47    // no action
48}
49
50void GUIControl::SetView(GfxCore* view)
51{
52    m_View = view;
53}
54
55bool GUIControl::MouseDown()
56{
57    return m_DraggingLeft || m_DraggingMiddle || m_DraggingRight;
58}
59
60void GUIControl::HandleTilt(wxPoint point)
61{
62    // Handle a mouse movement during tilt mode.
63    int dy = point.y - m_DragStart.y;
64
65    if (m_ReverseControls) dy = -dy;
66
67    m_View->TiltCave(Double(-dy) * M_PI / 500.0);
68
69    m_DragStart = point;
70
71    m_View->ForceRefresh();
72}
73
74void GUIControl::HandleTranslate(wxPoint point)
75{
76    // Handle a mouse movement during translation mode.
77    int dx = point.x - m_DragStart.x;
78    int dy = point.y - m_DragStart.y;
79   
80    if (m_ReverseControls) {
81        dx = -dx;
82        dy = -dy;
83    }
84
[1bbd9a8]85#ifndef FLYFREE
[56da40e]86    m_View->TranslateCave(dx, dy);
[1bbd9a8]87#else
[0c7bb77]88    m_View->MoveViewer(0, -dy, dx);
[1bbd9a8]89#endif
[56da40e]90    m_DragStart = point;
91}
92
[dde4fe7]93void GUIControl::HandleScale(wxPoint point)
94{
95    // Handle a mouse movement during scale mode.
96
97    int dx = point.x - m_DragStart.x;
98    int dy = point.y - m_DragStart.y;
99
100    if (m_ReverseControls) {
101        dx = -dx;
102        dy = -dy;
103    }
104
[1bbd9a8]105#ifndef FLYFREE
[dde4fe7]106    m_View->SetScale(m_View->GetScale() * pow(1.06, 0.08 * dy));
107    m_View->ForceRefresh();
[1bbd9a8]108#else
109    m_View->MoveViewer(dy, 0, 0);
110#endif
[dde4fe7]111
112    m_DragStart = point;
113}
114
115void GUIControl::HandleTiltRotate(wxPoint point)
116{
117    // Handle a mouse movement during tilt/rotate mode.
118
119    int dx = point.x - m_DragStart.x;
120    int dy = point.y - m_DragStart.y;
121
122    if (m_ReverseControls) {
123        dx = -dx;
124        dy = -dy;
125    }
126
127    // left/right => rotate, up/down => tilt
128    m_View->TurnCave(m_View->CanRotate() ?
129                     (Double(dx) * (M_PI / -500.0)) : 0.0);
130    m_View->TiltCave(Double(-dy) * M_PI / 1000.0);
131
132    m_View->ForceRefresh();
133
134    m_DragStart = point;
135}
136
137void GUIControl::HandleScaleRotate(wxPoint point)
[56da40e]138{
139    // Handle a mouse movement during scale/rotate mode.
140    int dx = point.x - m_DragStart.x;
141    int dy = point.y - m_DragStart.y;
142
143    if (m_ReverseControls) {
144        dx = -dx;
145        dy = -dy;
146    }
147
148    Double pan_angle = m_View->CanRotate() ? (Double(dx) * (-M_PI / 500.0)) : 0.0;
149
150    // left/right => rotate, up/down => scale
151    m_View->TurnCave(pan_angle);
152
[dde4fe7]153    m_View->SetScale(m_View->GetScale() * pow(1.06, 0.08 * dy));
[56da40e]154
155#ifdef AVENGL
156    //glDeleteLists(m_Lists.grid, 1);
157    //    DrawGrid();
158#endif
159    m_View->ForceRefresh();
160
161    m_DragStart = point;
162}
163
[203d2a7]164void GUIControl::HandCursor()
165{
166    const wxCursor HAND_CURSOR(wxCURSOR_HAND);
167    m_View->SetCursor(HAND_CURSOR);
168}
169
170void GUIControl::RestoreCursor()
171{
172    if (m_View->ShowingMeasuringLine()) {
173        HandCursor();
174    }
175    else {
176        m_View->SetCursor(wxNullCursor);
177    }
178}
179
[56da40e]180//
181//  Mouse event handling methods
182//
183
184void GUIControl::OnMouseMove(wxMouseEvent& event)
185{
186    // Mouse motion event handler.
187    if (!m_View->HasData()) return;
188
189    wxPoint point = wxPoint(event.GetX(), event.GetY());
190
191    // Check hit-test grid (only if no buttons are pressed).
192    if (!event.LeftIsDown() && !event.MiddleIsDown() && !event.RightIsDown()) {
[203d2a7]193        if (m_View->CheckHitTestGrid(point, false)) {
194            HandCursor();
195        }
196        else {           
197            if (m_View->ShowingScaleBar() &&
198                m_View->PointWithinScaleBar(point)) {
199
200                const wxCursor CURSOR(wxCURSOR_SIZEWE);
201                m_View->SetCursor(CURSOR);
202            }
203            else {
204                m_View->SetCursor(wxNullCursor);
205            }
206        }
[56da40e]207    }
208
[203d2a7]209    // Update coordinate display if in plan view,
210    // or altitude if in elevation view.
[56da40e]211    m_View->SetCoords(point);
212
213    if (!m_View->ChangingOrientation()) {
214        if (m_DraggingLeft) {
215            if (m_LastDrag == drag_NONE) {
[203d2a7]216                if (m_View->ShowingCompass() &&
217                    m_View->PointWithinCompass(point)) {
[56da40e]218                    m_LastDrag = drag_COMPASS;
219                }
[203d2a7]220                else if (m_View->ShowingClino() &&
221                         m_View->PointWithinClino(point)) {
[56da40e]222                    m_LastDrag = drag_ELEV;
223                }
[203d2a7]224                else if (m_View->ShowingScaleBar() &&
225                         m_View->PointWithinScaleBar(point)) {
[56da40e]226                    m_LastDrag = drag_SCALE;
227                }
228            }
229
230            if (m_LastDrag == drag_COMPASS) {
231                // drag in heading indicator
232                m_View->SetCompassFromPoint(point);
233            }
234            else if (m_LastDrag == drag_ELEV) {
235                // drag in clinometer
236                m_View->SetClinoFromPoint(point);
237            }
238            else if (m_LastDrag == drag_SCALE) {
[dde4fe7]239                // FIXME: check why there was a check here for x being inside
240                // the window
[56da40e]241                m_View->SetScaleBarFromOffset(point.x - m_DragLast.x);
242            }
243            else if (m_LastDrag == drag_NONE || m_LastDrag == drag_MAIN) {
244                m_LastDrag = drag_MAIN;
[dde4fe7]245                if (event.ShiftDown()) {
246                    HandleScaleRotate(point);
247                }
248                else {
249                    HandleTiltRotate(point);
250                }
[56da40e]251            }
252        }
253        else if (m_DraggingMiddle) {
[dde4fe7]254            if (event.ShiftDown()) {
255                HandleTilt(point);
256            }
257            else {
258                HandleScale(point);
259            }
[56da40e]260        }
261        else if (m_DraggingRight) {
262            if ((m_LastDrag == drag_NONE && m_View->PointWithinScaleBar(point)) || m_LastDrag == drag_SCALE) {
263            /* FIXME
264                  if (point.x < 0) point.x = 0;
265                  if (point.y < 0) point.y = 0;
266                  if (point.x > m_XSize) point.x = m_XSize;
267                  if (point.y > m_YSize) point.y = m_YSize;
268                  m_LastDrag = drag_SCALE;
269                  int x_inside_bar = m_DragStart.x - m_ScaleBar.drag_start_offset_x;
270                  int y_inside_bar = m_YSize - m_ScaleBar.drag_start_offset_y - m_DragStart.y;
271                  m_ScaleBar.offset_x = point.x - x_inside_bar;
272                  m_ScaleBar.offset_y = (m_YSize - point.y) - y_inside_bar;
273                  m_View->ForceRefresh(); */
274            }
275            else {
276                m_LastDrag = drag_MAIN;
277                HandleTranslate(point);
278            }
279        }
280    }
281
282    m_DragLast = point;
283}
284
285void GUIControl::OnLButtonDown(wxMouseEvent& event)
286{
287    if (m_View->HasData() && m_View->GetLock() != lock_POINT) {
288        m_DraggingLeft = true;
289       
290        /* FIXME
291        m_ScaleBar.drag_start_offset_x = m_ScaleBar.offset_x;
292        m_ScaleBar.drag_start_offset_y = m_ScaleBar.offset_y; */
293
294        m_DragStart = m_DragRealStart = wxPoint(event.GetX(), event.GetY());
[203d2a7]295       
296//        const wxCursor CURSOR(wxCURSOR_MAGNIFIER);
297//        m_View->SetCursor(CURSOR);
[56da40e]298        m_View->CaptureMouse();
299    }
300}
301
302void GUIControl::OnLButtonUp(wxMouseEvent& event)
303{
304    if (m_View->HasData() && m_View->GetLock() != lock_POINT) {
305        if (event.GetPosition() == m_DragRealStart) {
306            // just a "click"...
307            m_View->CheckHitTestGrid(m_DragStart, true);
308        }
309
[dde4fe7]310//      m_View->RedrawIndicators();
[56da40e]311        m_View->ReleaseMouse();
312
313        m_LastDrag = drag_NONE;
314        m_DraggingLeft = false;
315
316        m_View->DragFinished();
[203d2a7]317       
318        RestoreCursor();
[56da40e]319    }
320}
321
322void GUIControl::OnMButtonDown(wxMouseEvent& event)
323{
324    if (m_View->HasData() && m_View->GetLock() == lock_NONE) {
325        m_DraggingMiddle = true;
326        m_DragStart = wxPoint(event.GetX(), event.GetY());
327
[dde4fe7]328        const wxCursor CURSOR(wxCURSOR_MAGNIFIER);
[203d2a7]329        m_View->SetCursor(CURSOR);
[56da40e]330        m_View->CaptureMouse();
331    }
332}
333
[cc2a5fc]334void GUIControl::OnMButtonUp(wxMouseEvent&)
[56da40e]335{
336    if (m_View->HasData() && m_View->GetLock() == lock_NONE) {
337        m_DraggingMiddle = false;
338        m_View->ReleaseMouse();
339        m_View->DragFinished();
[203d2a7]340
341        RestoreCursor();
[56da40e]342    }
343}
344
345void GUIControl::OnRButtonDown(wxMouseEvent& event)
346{
347    if (m_View->HasData()) {
348        m_DragStart = wxPoint(event.GetX(), event.GetY());
349       
350/* FIXME        m_ScaleBar.drag_start_offset_x = m_ScaleBar.offset_x;
351        m_ScaleBar.drag_start_offset_y = m_ScaleBar.offset_y; */
352
353        m_DraggingRight = true;
354
[203d2a7]355      //  const wxCursor CURSOR(wxCURSOR_HAND);
356      //  m_View->SetCursor(CURSOR);
[56da40e]357        m_View->CaptureMouse();
358    }
359}
360
[cc2a5fc]361void GUIControl::OnRButtonUp(wxMouseEvent&)
[56da40e]362{
363    m_LastDrag = drag_NONE;
364    m_View->ReleaseMouse();
365
366    m_DraggingRight = false;
[203d2a7]367   
368    RestoreCursor();
369   
[56da40e]370    m_View->DragFinished();
371}
372
373void GUIControl::OnDisplayOverlappingNames()
374{
375    m_View->ToggleOverlappingNames();
376}
377
378void GUIControl::OnDisplayOverlappingNamesUpdate(wxUpdateUIEvent& cmd)
379{
380    cmd.Enable(m_View->HasData() && m_View->ShowingStationNames());
381    cmd.Check(m_View->ShowingOverlappingNames());
382}
383
384void GUIControl::OnShowCrosses()
385{
386    m_View->ToggleCrosses();
387}
388
389void GUIControl::OnShowCrossesUpdate(wxUpdateUIEvent& cmd)
390{
391    cmd.Enable(m_View->HasData());
392    cmd.Check(m_View->ShowingCrosses());
393}
394
395void GUIControl::OnShowStationNames()
396{
397    m_View->ToggleStationNames();
398}
399
400void GUIControl::OnShowStationNamesUpdate(wxUpdateUIEvent& cmd)
401{
402    cmd.Enable(m_View->HasData());
403    cmd.Check(m_View->ShowingStationNames());
404}
405
406void GUIControl::OnShowSurveyLegs()
407{
408    m_View->ToggleUndergroundLegs();
409}
410
411void GUIControl::OnShowSurveyLegsUpdate(wxUpdateUIEvent& cmd)
412{
413    cmd.Enable(m_View->HasData() && m_View->GetLock() != lock_POINT && m_View->HasUndergroundLegs());
414    cmd.Check(m_View->ShowingUndergroundLegs());
415}
416
417void GUIControl::OnMoveEast()
418{
419    m_View->TurnCaveTo(M_PI_2);
420    m_View->ForceRefresh();
421}
422
423void GUIControl::OnMoveEastUpdate(wxUpdateUIEvent& cmd)
424{
425    cmd.Enable(m_View->HasData() && !(m_View->GetLock() & lock_Y));
426}
427
428void GUIControl::OnMoveNorth()
429{
430    m_View->TurnCaveTo(0.0);
431    m_View->ForceRefresh();
432}
433
434void GUIControl::OnMoveNorthUpdate(wxUpdateUIEvent& cmd)
435{
436    cmd.Enable(m_View->HasData() && !(m_View->GetLock() & lock_X));
437}
438
439void GUIControl::OnMoveSouth()
440{
441    m_View->TurnCaveTo(M_PI);
442    m_View->ForceRefresh();
443}
444
445void GUIControl::OnMoveSouthUpdate(wxUpdateUIEvent& cmd)
446{
447    cmd.Enable(m_View->HasData() && !(m_View->GetLock() & lock_X));
448}
449
450void GUIControl::OnMoveWest()
451{
452    m_View->TurnCaveTo(M_PI * 1.5);
453    m_View->ForceRefresh();
454}
455
456void GUIControl::OnMoveWestUpdate(wxUpdateUIEvent& cmd)
457{
458    cmd.Enable(m_View->HasData() && !(m_View->GetLock() & lock_Y));
459}
460
461void GUIControl::OnStartRotation()
462{
463    m_View->StartRotation();
464}
465
466void GUIControl::OnStartRotationUpdate(wxUpdateUIEvent& cmd)
467{
468    cmd.Enable(m_View->HasData() && !m_View->IsRotating() && m_View->CanRotate());
469}
470
471void GUIControl::OnToggleRotation()
472{
473    m_View->ToggleRotation();
474}
475
476void GUIControl::OnToggleRotationUpdate(wxUpdateUIEvent& cmd)
477{
478    cmd.Enable(m_View->HasData() && m_View->CanRotate());
479    cmd.Check(m_View->HasData() && m_View->IsRotating());
480}
481
482void GUIControl::OnStopRotation()
483{
484    m_View->StopRotation();
485}
486
487void GUIControl::OnStopRotationUpdate(wxUpdateUIEvent& cmd)
488{
489    cmd.Enable(m_View->HasData() && m_View->IsRotating());
490}
491
492void GUIControl::OnReverseControls()
493{
494    m_ReverseControls = !m_ReverseControls;
495}
496
497void GUIControl::OnReverseControlsUpdate(wxUpdateUIEvent& cmd)
498{
499    cmd.Enable(m_View->HasData());
500    cmd.Check(m_ReverseControls);
501}
502
503void GUIControl::OnReverseDirectionOfRotation()
504{
505    m_View->ReverseRotation();
506}
507
508void GUIControl::OnReverseDirectionOfRotationUpdate(wxUpdateUIEvent& cmd)
509{
510    cmd.Enable(m_View->HasData() && m_View->CanRotate());
511}
512
513void GUIControl::OnSlowDown(bool accel)
514{
515    m_View->RotateSlower(accel);
516}
517
518void GUIControl::OnSlowDownUpdate(wxUpdateUIEvent& cmd)
519{
520    cmd.Enable(m_View->HasData() && m_View->CanRotate());
521}
522
523void GUIControl::OnSpeedUp(bool accel)
524{
525    m_View->RotateFaster(accel);
526}
527
528void GUIControl::OnSpeedUpUpdate(wxUpdateUIEvent& cmd)
529{
530    cmd.Enable(m_View->HasData() && m_View->CanRotate());
531}
532
533void GUIControl::OnStepOnceAnticlockwise(bool accel)
534{
535    m_View->TurnCave(accel ? 5.0 * M_PI / 18.0 : M_PI / 18.0);
536    m_View->ForceRefresh();
537}
538
539void GUIControl::OnStepOnceAnticlockwiseUpdate(wxUpdateUIEvent& cmd)
540{
541    cmd.Enable(m_View->HasData() && m_View->CanRotate() && !m_View->IsRotating());
542}
543
544void GUIControl::OnStepOnceClockwise(bool accel)
545{
546    m_View->TurnCave(accel ? 5.0 * -M_PI / 18.0 : -M_PI / 18.0);
547    m_View->ForceRefresh();
548}
549
550void GUIControl::OnStepOnceClockwiseUpdate(wxUpdateUIEvent& cmd)
551{
552    cmd.Enable(m_View->HasData() && m_View->CanRotate() && !m_View->IsRotating());
553}
554
555void GUIControl::OnDefaults()
556{
557    m_View->Defaults();
558}
559
560void GUIControl::OnDefaultsUpdate(wxUpdateUIEvent& cmd)
561{
562    cmd.Enable(m_View->HasData());
563}
564
565void GUIControl::OnElevation()
566{
567    // Switch to elevation view.
568
569    m_View->SwitchToElevation();
570}
571
572void GUIControl::OnElevationUpdate(wxUpdateUIEvent& cmd)
573{
574    cmd.Enable(m_View->HasData() && m_View->GetLock() == lock_NONE && !m_View->ShowingElevation());
575}
576
577void GUIControl::OnHigherViewpoint(bool accel)
578{
579    // Raise the viewpoint.
580    m_View->TiltCave(accel ? 5.0 * M_PI / 18.0 : M_PI / 18.0);
581    m_View->ForceRefresh();
582}
583
584void GUIControl::OnHigherViewpointUpdate(wxUpdateUIEvent& cmd)
585{
586    cmd.Enable(m_View->HasData() && m_View->CanRaiseViewpoint() && m_View->GetLock() == lock_NONE);
587}
588
589void GUIControl::OnLowerViewpoint(bool accel)
590{
591    // Lower the viewpoint.
592    m_View->TiltCave(accel ? 5.0 * -M_PI / 18.0 : -M_PI / 18.0);
593    m_View->ForceRefresh(); /* FIXME check if necessary */
594}
595
596void GUIControl::OnLowerViewpointUpdate(wxUpdateUIEvent& cmd)
597{
598    cmd.Enable(m_View->HasData() && m_View->CanLowerViewpoint() && m_View->GetLock() == lock_NONE);
599}
600
601void GUIControl::OnPlan()
602{
603    // Switch to plan view.
604    m_View->SwitchToPlan();
605}
606
607void GUIControl::OnPlanUpdate(wxUpdateUIEvent& cmd)
608{
609    cmd.Enable(m_View->HasData() && m_View->GetLock() == lock_NONE && !m_View->ShowingPlan());
610}
611
612void GUIControl::OnShiftDisplayDown(bool accel)
613{
[1bbd9a8]614#ifndef FLYFREE
[56da40e]615    m_View->TranslateCave(0, accel ? 5 * DISPLAY_SHIFT : DISPLAY_SHIFT);
[1bbd9a8]616#else
[0c7bb77]617    m_View->MoveViewer(0, accel ? -5 * FLYFREE_SHIFT : -FLYFREE_SHIFT, 0);
[1bbd9a8]618#endif
[56da40e]619}
620
621void GUIControl::OnShiftDisplayDownUpdate(wxUpdateUIEvent& cmd)
622{
623    cmd.Enable(m_View->HasData());
624}
625
626void GUIControl::OnShiftDisplayLeft(bool accel)
627{
[1bbd9a8]628#ifndef FLYFREE
[56da40e]629    m_View->TranslateCave(accel ? -5 * DISPLAY_SHIFT : -DISPLAY_SHIFT, 0);
[1bbd9a8]630#else
[0c7bb77]631    m_View->MoveViewer(0, 0, accel ? -5 * FLYFREE_SHIFT : -FLYFREE_SHIFT);
[1bbd9a8]632#endif
[56da40e]633}
634
635void GUIControl::OnShiftDisplayLeftUpdate(wxUpdateUIEvent& cmd)
636{
637    cmd.Enable(m_View->HasData());
638}
639
640void GUIControl::OnShiftDisplayRight(bool accel)
641{
[1bbd9a8]642#ifndef FLYFREE
[56da40e]643    m_View->TranslateCave(accel ? 5 * DISPLAY_SHIFT : DISPLAY_SHIFT, 0);
[1bbd9a8]644#else
[0c7bb77]645    m_View->MoveViewer(0, 0, accel ? 5 * FLYFREE_SHIFT : FLYFREE_SHIFT);
[1bbd9a8]646#endif
[56da40e]647}
648
649void GUIControl::OnShiftDisplayRightUpdate(wxUpdateUIEvent& cmd)
650{
651    cmd.Enable(m_View->HasData());
652}
653
654void GUIControl::OnShiftDisplayUp(bool accel)
655{
[1bbd9a8]656#ifndef FLYFREE
[56da40e]657    m_View->TranslateCave(0, accel ? -5 * DISPLAY_SHIFT : -DISPLAY_SHIFT);
[1bbd9a8]658#else
[0c7bb77]659    m_View->MoveViewer(0, accel ? 5 * FLYFREE_SHIFT : FLYFREE_SHIFT, 0);
[1bbd9a8]660#endif
[56da40e]661}
662
663void GUIControl::OnShiftDisplayUpUpdate(wxUpdateUIEvent& cmd)
664{
665    cmd.Enable(m_View->HasData());
666}
667
668void GUIControl::OnZoomIn(bool accel)
669{
670    // Increase the scale.
671
[2491b8c]672#ifndef FLYFREE
[56da40e]673    m_View->SetScale(m_View->GetScale() * (accel ? 1.1236 : 1.06));
[1bbd9a8]674    m_View->ForceRefresh();
[2491b8c]675#else
[0c7bb77]676    m_View->MoveViewer(accel ? 5 * FLYFREE_SHIFT : FLYFREE_SHIFT, 0, 0);
[2491b8c]677#endif
[56da40e]678}
679
680void GUIControl::OnZoomInUpdate(wxUpdateUIEvent& cmd)
681{
682    cmd.Enable(m_View->HasData() && m_View->GetLock() != lock_POINT);
683}
684
685void GUIControl::OnZoomOut(bool accel)
686{
687    // Decrease the scale.
688
[2491b8c]689#ifndef FLYFREE
[56da40e]690    m_View->SetScale(m_View->GetScale() / (accel ? 1.1236 : 1.06));
[1bbd9a8]691    m_View->ForceRefresh();
[2491b8c]692#else
[0c7bb77]693    m_View->MoveViewer(accel ? -5 * FLYFREE_SHIFT : -FLYFREE_SHIFT, 0, 0);
[2491b8c]694#endif
[56da40e]695}
696
697void GUIControl::OnZoomOutUpdate(wxUpdateUIEvent& cmd)
698{
699    cmd.Enable(m_View->HasData() && m_View->GetLock() != lock_POINT);
700}
701
702void GUIControl::OnToggleScalebar()
703{
704    m_View->ToggleScaleBar();
705}
706
707void GUIControl::OnToggleScalebarUpdate(wxUpdateUIEvent& cmd)
708{
709    cmd.Enable(m_View->HasData() && m_View->GetLock() != lock_POINT);
710    cmd.Check(m_View->ShowingScaleBar());
711}
712
713void GUIControl::OnToggleDepthbar() /* FIXME naming */
714{
715    m_View->ToggleDepthBar();
716}
717
718void GUIControl::OnToggleDepthbarUpdate(wxUpdateUIEvent& cmd)
719{
720    cmd.Enable(m_View->HasData() && !(m_View->GetLock() && lock_Z));
721    cmd.Check(m_View->ShowingDepthBar());
722}
723
724void GUIControl::OnViewCompass()
725{
726    m_View->ToggleCompass();
727}
728
729void GUIControl::OnViewCompassUpdate(wxUpdateUIEvent& cmd)
730{
731    cmd.Enable(m_View->HasData() && m_View->CanRotate());
732    cmd.Check(m_View->ShowingCompass());
733}
734
735void GUIControl::OnViewClino()
736{
737    m_View->ToggleClino();
738}
739
740void GUIControl::OnViewClinoUpdate(wxUpdateUIEvent& cmd)
741{
742    cmd.Enable(m_View->HasData() && m_View->GetLock() == lock_NONE);
743    cmd.Check(m_View->ShowingClino());
744}
745
746void GUIControl::OnShowSurface()
747{
748    m_View->ToggleSurfaceLegs();
749}
750
751void GUIControl::OnShowSurfaceUpdate(wxUpdateUIEvent& cmd)
752{
753    cmd.Enable(m_View->HasData() && m_View->HasSurfaceLegs());
754    cmd.Check(m_View->ShowingSurfaceLegs());
755}
756
757void GUIControl::OnShowEntrances()
758{
759    m_View->ToggleEntrances();
760}
761
762void GUIControl::OnShowEntrancesUpdate(wxUpdateUIEvent& cmd)
763{
764    cmd.Enable(m_View->HasData() && (m_View->GetNumEntrances() > 0));
765    cmd.Check(m_View->ShowingEntrances());
766}
767
768void GUIControl::OnShowFixedPts()
769{
770    m_View->ToggleFixedPts();
771}
772
773void GUIControl::OnShowFixedPtsUpdate(wxUpdateUIEvent& cmd)
774{
775    cmd.Enable(m_View->HasData() && (m_View->GetNumFixedPts() > 0));
776    cmd.Check(m_View->ShowingFixedPts());
777}
778
779void GUIControl::OnShowExportedPts()
780{
781    m_View->ToggleExportedPts();
782}
783
784void GUIControl::OnShowExportedPtsUpdate(wxUpdateUIEvent& cmd)
785{
786    cmd.Enable(m_View->HasData() && (m_View->GetNumExportedPts() > 0));
787    cmd.Check(m_View->ShowingExportedPts());
788}
789
790void GUIControl::OnViewGrid()
791{
792    m_View->ToggleGrid();
793}
794
795void GUIControl::OnViewGridUpdate(wxUpdateUIEvent& cmd)
796{
797    cmd.Enable(m_View->HasData());
798}
799
800void GUIControl::OnIndicatorsUpdate(wxUpdateUIEvent& cmd)
801{
802    cmd.Enable(m_View->HasData());
803}
804
[6abab84]805void GUIControl::OnViewPerspective()
806{
807    m_View->TogglePerspective();
808}
809
810void GUIControl::OnViewPerspectiveUpdate(wxUpdateUIEvent& cmd)
811{
812    cmd.Enable(m_View->HasData());
813    cmd.Check(m_View->GetPerspective());
814}
815
[56da40e]816void GUIControl::OnToggleMetric()
817{
818    m_View->ToggleMetric();
819
820    wxConfigBase::Get()->Write("metric", m_View->GetMetric());
821    wxConfigBase::Get()->Flush();
822}
823
824void GUIControl::OnToggleMetricUpdate(wxUpdateUIEvent& cmd)
825{
826    cmd.Enable(m_View->HasData());
827    cmd.Check(m_View->GetMetric());
828}
829
830void GUIControl::OnToggleDegrees()
831{
832    m_View->ToggleDegrees();
833   
834    wxConfigBase::Get()->Write("degrees", m_View->GetDegrees());
835    wxConfigBase::Get()->Flush();
836}
837
838void GUIControl::OnToggleDegreesUpdate(wxUpdateUIEvent& cmd)
839{
840    cmd.Enable(m_View->HasData());
841    cmd.Check(m_View->GetDegrees());
842}
843
844void GUIControl::OnToggleTubes()
845{
846    m_View->ToggleTubes();
847}
848
849void GUIControl::OnToggleTubesUpdate(wxUpdateUIEvent& cmd)
850{
851    cmd.Enable(m_View->HasData());
852    cmd.Check(m_View->GetTubes());
853}
854
855void GUIControl::OnCancelDistLine()
856{
857    m_View->ClearTreeSelection();
858}
859
860void GUIControl::OnCancelDistLineUpdate(wxUpdateUIEvent& cmd)
861{
862    cmd.Enable(m_View->ShowingMeasuringLine());
863}
864
865void GUIControl::OnKeyPress(wxKeyEvent &e)
866{
867    if (!m_View->HasData()) {
868        e.Skip();
869        return;
870    }
871
872/*     m_RedrawOffscreen = Animate();  FIXME */
873
874    switch (e.m_keyCode) {
875        case '/': case '?':
876            if (m_View->CanLowerViewpoint() && m_View->GetLock() == lock_NONE)
877                OnLowerViewpoint(e.m_shiftDown);
878            break;
879        case '\'': case '@': case '"': // both shifted forms - US and UK kbd
880            if (m_View->CanRaiseViewpoint() && m_View->GetLock() == lock_NONE)
881                OnHigherViewpoint(e.m_shiftDown);
882            break;
883        case 'C': case 'c':
884            if (m_View->CanRotate() && !m_View->IsRotating())
885                OnStepOnceAnticlockwise(e.m_shiftDown);
886            break;
887        case 'V': case 'v':
888            if (m_View->CanRotate() && !m_View->IsRotating())
889                OnStepOnceClockwise(e.m_shiftDown);
890            break;
891        case ']': case '}':
892            if (m_View->GetLock() != lock_POINT)
893                OnZoomIn(e.m_shiftDown);
894            break;
895        case '[': case '{':
896            if (m_View->GetLock() != lock_POINT)
897                OnZoomOut(e.m_shiftDown);
898            break;
899        case 'N': case 'n':
900            if (!(m_View->GetLock() & lock_X))
901                OnMoveNorth();
902            break;
903        case 'S': case 's':
904            if (!(m_View->GetLock() & lock_X))
905                OnMoveSouth();
906            break;
907        case 'E': case 'e':
908            if (!(m_View->GetLock() & lock_Y))
909                OnMoveEast();
910            break;
911        case 'W': case 'w':
912            if (!(m_View->GetLock() & lock_Y))
913                OnMoveWest();
914            break;
915        case 'Z': case 'z':
916            if (m_View->CanRotate())
917                OnSpeedUp(e.m_shiftDown);
918            break;
919        case 'X': case 'x':
920            if (m_View->CanRotate())
921                OnSlowDown(e.m_shiftDown);
922            break;
923        case 'R': case 'r':
924            if (m_View->CanRotate())
925                OnReverseDirectionOfRotation();
926            break;
927        case 'P': case 'p':
928            if (m_View->GetLock() == lock_NONE && !m_View->ShowingPlan())
929                OnPlan();
930            break;
931        case 'L': case 'l':
932            if (m_View->GetLock() == lock_NONE && !m_View->ShowingElevation())
933                OnElevation();
934            break;
935        case 'O': case 'o':
936            OnDisplayOverlappingNames();
937            break;
938        case WXK_DELETE:
939            OnDefaults();
940            break;
941        case WXK_RETURN:
942            if (m_View->CanRotate() && !m_View->IsRotating())
943                OnStartRotation();
944            break;
945        case WXK_SPACE:
946            if (m_View->IsRotating())
947                OnStopRotation();
948            break;
949        case WXK_LEFT:
950            if (e.m_controlDown) {
951                if (m_View->CanRotate() && !m_View->IsRotating())
952                    OnStepOnceAnticlockwise(e.m_shiftDown);
953            } else {
954                OnShiftDisplayLeft(e.m_shiftDown);
955            }
956            break;
957        case WXK_RIGHT:
958            if (e.m_controlDown) {
959                if (m_View->CanRotate() && !m_View->IsRotating())
960                    OnStepOnceClockwise(e.m_shiftDown);
961            } else {
962                OnShiftDisplayRight(e.m_shiftDown);
963            }
964            break;
965        case WXK_UP:
966            if (e.m_controlDown) {
967                if (m_View->CanRaiseViewpoint() && m_View->GetLock() == lock_NONE)
968                    OnHigherViewpoint(e.m_shiftDown);
969            } else {
970                OnShiftDisplayUp(e.m_shiftDown);
971            }
972            break;
973        case WXK_DOWN:
974            if (e.m_controlDown) {
975                if (m_View->CanLowerViewpoint() && m_View->GetLock() == lock_NONE)
976                    OnLowerViewpoint(e.m_shiftDown);
977            } else {
978                OnShiftDisplayDown(e.m_shiftDown);
979            }
980            break;
981        case WXK_ESCAPE:
982            if (m_View->ShowingMeasuringLine()) {
983                OnCancelDistLine();
984            }
985            break;
986        default:
987            e.Skip();
988    }
989 
990    // OnPaint clears m_RedrawOffscreen so it'll only still be set if we need
991    // to redraw
992/* FIXME    if (m_RedrawOffscreen) */ m_View->ForceRefresh();
993}
994
[b13aee4]995void GUIControl::OnViewFullScreenUpdate(wxUpdateUIEvent& cmd)
996{
997    cmd.Enable(m_View->HasData());
[fdfa926]998    cmd.Check(m_View->IsFullScreen());
[b13aee4]999}
1000
1001void GUIControl::OnViewFullScreen()
1002{
1003    m_View->FullScreenMode();
1004}
Note: See TracBrowser for help on using the repository browser.