source: git/src/guicontrol.cc@ 1bbd9a8

RELEASE/1.1 RELEASE/1.2 debug-ci debug-ci-sanitisers faster-cavernlog log-select main stereo stereo-2025 walls-data walls-data-hanging-as-warning warn-only-for-hanging-survey
Last change on this file since 1bbd9a8 was 1bbd9a8, checked in by Olly Betts <olly@…>, 23 years ago

Improved FLYFREE mode. Now keys and mouse work for all sensible actions,
and the viewpoint is the same as the centre of rotation so you can click
on the side panel to "teleport".

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

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