4 // Main frame handling for Aven.
6 // Copyright (C) 2000-2003,2005 Mark R. Shinwell
7 // Copyright (C) 2001-2024 Olly Betts
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.
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.
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
28 #include <wx/docview.h> // for m_FileHistory
29 #include <wx/listctrl.h>
30 #include <wx/notebook.h>
32 #include <wx/printdlg.h>
34 #include "aventreectrl.h"
36 #include "guicontrol.h"
37 #include "img_hosted.h"
38 #include "labelinfo.h"
43 //#include "prefsdlg.h"
54 // Currently on macOS, we force use of a generic toolbar, which needs to be put
56 # define USING_GENERIC_TOOLBAR
65 menu_FILE_OPEN_TERRAIN
,
66 menu_FILE_OVERLAY_GEODATA
,
76 menu_PRES_EXPORT_MOVIE
,
87 menu_ROTATION_REVERSE
,
88 menu_ORIENT_MOVE_NORTH
,
89 menu_ORIENT_MOVE_EAST
,
90 menu_ORIENT_MOVE_SOUTH
,
91 menu_ORIENT_MOVE_WEST
,
93 menu_ORIENT_ELEVATION
,
98 menu_SPLAYS_SHOW_DASHED
,
99 menu_SPLAYS_SHOW_FADED
,
100 menu_SPLAYS_SHOW_NORMAL
,
103 menu_DUPES_SHOW_DASHED
,
104 menu_DUPES_SHOW_FADED
,
105 menu_DUPES_SHOW_NORMAL
,
106 menu_VIEW_SHOW_CROSSES
,
107 menu_VIEW_SHOW_NAMES
,
108 menu_VIEW_SHOW_SURFACE
,
109 menu_VIEW_SHOW_OVERLAPPING_NAMES
,
110 menu_VIEW_SHOW_ENTRANCES
,
111 menu_VIEW_SHOW_FIXED_PTS
,
112 menu_VIEW_SHOW_EXPORTED_PTS
,
113 menu_VIEW_STATUS_BAR
,
115 menu_VIEW_BOUNDING_BOX
,
117 menu_VIEW_SHOW_TUBES
,
118 menu_VIEW_PERSPECTIVE
,
119 menu_VIEW_SMOOTH_SHADING
,
122 menu_VIEW_SMOOTH_LINES
,
123 menu_VIEW_FULLSCREEN
,
125 menu_COLOUR_BY_DEPTH
,
127 menu_COLOUR_BY_ERROR
,
128 menu_COLOUR_BY_H_ERROR
,
129 menu_COLOUR_BY_V_ERROR
,
130 menu_COLOUR_BY_GRADIENT
,
131 menu_COLOUR_BY_LENGTH
,
132 menu_COLOUR_BY_SURVEY
,
133 menu_COLOUR_BY_STYLE
,
144 menu_CTL_CANCEL_DIST_LINE
,
145 menu_SURVEY_RESTRICT
,
146 menu_SURVEY_SHOW_ALL
,
149 menu_SURVEY_HIDE_SIBLINGS
,
157 class MainFrm
: public wxFrame
, public Model
{
158 wxFileHistory m_history
;
159 int m_SashPosition
= -1;
160 bool was_showing_sidepanel_before_fullscreen
;
161 GfxCore
* m_Gfx
= nullptr;
162 wxWindow
* m_Log
= nullptr;
163 GUIControl
* m_Control
;
164 wxSplitterWindow
* m_Splitter
;
165 AvenTreeCtrl
* m_Tree
;
166 wxTextCtrl
* m_FindBox
;
167 // wxCheckBox* m_RegexpCheckBox;
168 wxNotebook
* m_Notebook
;
169 AvenPresList
* m_PresList
;
171 // Processed version of data - same as m_File if m_File is processed data.
172 wxString m_FileProcessed
;
175 // Strings for status bar reporting of distances.
176 wxString here_text
, coords_text
, dist_text
, distfree_text
;
178 int m_NumHighlighted
= 0;
179 bool pending_find
= false;
181 bool fullscreen_showing_menus
= false;
184 bool using_macos_full_screen_view
= false;
188 PrefsDlg
* m_PrefsDlg
= nullptr;
191 bool ProcessSVXFile(const wxString
& file
);
192 // void FixLRUD(traverse & centreline);
194 void CreateMenuBar();
196 void CreateSidePanel();
198 void UpdateStatusBar();
200 #ifdef USING_GENERIC_TOOLBAR
201 wxToolBar
* GetToolBar() const {
202 wxSizer
* sizer
= GetSizer();
203 if (!sizer
) return NULL
;
204 return (wxToolBar
*)sizer
->GetItem(size_t(0))->GetWindow();
209 MainFrm(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
);
211 // public for CavernLog.
212 bool LoadData(const wxString
& file
, const wxString
& prefix
);
213 void AddToFileHistory(const wxString
& file
);
215 void InitialiseAfterLoad(const wxString
& file
, const wxString
& prefix
);
216 void OnShowLog(wxCommandEvent
& event
);
218 void OnMRUFile(wxCommandEvent
& event
);
219 void OpenFile(const wxString
& file
, const wxString
& survey
= wxString());
221 void OnPresNewUpdate(wxUpdateUIEvent
& event
);
222 void OnPresOpenUpdate(wxUpdateUIEvent
& event
);
223 void OnPresSaveUpdate(wxUpdateUIEvent
& event
);
224 void OnPresSaveAsUpdate(wxUpdateUIEvent
& event
);
225 void OnPresMarkUpdate(wxUpdateUIEvent
& event
);
226 void OnPresFRewindUpdate(wxUpdateUIEvent
& event
);
227 void OnPresRewindUpdate(wxUpdateUIEvent
& event
);
228 void OnPresReverseUpdate(wxUpdateUIEvent
& event
);
229 void OnPresPlayUpdate(wxUpdateUIEvent
& event
);
230 void OnPresFFUpdate(wxUpdateUIEvent
& event
);
231 void OnPresFFFUpdate(wxUpdateUIEvent
& event
);
232 void OnPresPauseUpdate(wxUpdateUIEvent
& event
);
233 void OnPresStopUpdate(wxUpdateUIEvent
& event
);
234 void OnPresExportMovieUpdate(wxUpdateUIEvent
& event
);
235 void OnOpenTerrainUpdate(wxUpdateUIEvent
& event
);
236 void OnOverlayGeodataUpdate(wxUpdateUIEvent
& event
);
239 void OnFind(wxCommandEvent
& event
);
240 void OnIdle(wxIdleEvent
& event
);
241 void OnGotoFound(wxCommandEvent
& event
);
242 void OnHide(wxCommandEvent
& event
);
243 void OnHideUpdate(wxUpdateUIEvent
& ui
);
245 void OnOpen(wxCommandEvent
& event
);
246 void OnOpenTerrain(wxCommandEvent
&);
247 void OnOverlayGeodata(wxCommandEvent
&);
248 void HideLog(wxWindow
* log_window
);
249 void OnScreenshot(wxCommandEvent
& event
);
250 void OnScreenshotUpdate(wxUpdateUIEvent
& event
);
251 void OnFilePreferences(wxCommandEvent
& event
);
252 void OnPrint(wxCommandEvent
& event
);
254 void OnPageSetup(wxCommandEvent
& event
);
255 void OnPresNew(wxCommandEvent
& event
);
256 void OnPresOpen(wxCommandEvent
& event
);
257 void OnPresSave(wxCommandEvent
& event
);
258 void OnPresSaveAs(wxCommandEvent
& event
);
259 void OnPresMark(wxCommandEvent
& event
);
260 void OnPresFRewind(wxCommandEvent
& event
);
261 void OnPresRewind(wxCommandEvent
& event
);
262 void OnPresReverse(wxCommandEvent
& event
);
263 void OnPresPlay(wxCommandEvent
& event
);
264 void OnPresFF(wxCommandEvent
& event
);
265 void OnPresFFF(wxCommandEvent
& event
);
266 void OnPresPause(wxCommandEvent
& event
);
267 void OnPresStop(wxCommandEvent
& event
);
268 void OnPresExportMovie(wxCommandEvent
& event
);
269 void OnExport(wxCommandEvent
& event
);
270 void OnExtend(wxCommandEvent
& event
);
271 void OnQuit(wxCommandEvent
& event
);
273 void OnAbout(wxCommandEvent
& event
);
274 void OnClose(wxCloseEvent
&);
276 void OnSetFocus(wxFocusEvent
&) { if (m_Gfx
) m_Gfx
->SetFocus(); }
278 void OnKeyPress(wxKeyEvent
&e
) {
281 m_Gfx
->OnKeyPress(e
);
285 void OnShowLogUpdate(wxUpdateUIEvent
&ui
) {
286 ui
.Enable(m_Log
!= NULL
|| (m_Splitter
->GetWindow1() != m_Gfx
&& m_Splitter
->GetWindow2() != m_Gfx
));
287 ui
.Check(m_Log
== NULL
);
289 void OnPrintUpdate(wxUpdateUIEvent
&ui
) { ui
.Enable(!m_File
.empty()); }
290 void OnExportUpdate(wxUpdateUIEvent
&ui
) { ui
.Enable(!m_File
.empty()); }
291 void OnExtendUpdate(wxUpdateUIEvent
&ui
) {
292 ui
.Enable(!IsExtendedElevation());
295 // temporary bodges until event handling problem is sorted out:
296 void OnDefaultsUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnDefaultsUpdate(event
); }
297 void OnPlanUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnPlanUpdate(event
); }
298 void OnElevationUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnElevationUpdate(event
); }
299 void OnDisplayOverlappingNamesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnDisplayOverlappingNamesUpdate(event
); }
300 void OnColourByUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByUpdate(event
); }
301 void OnColourByDepthUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByDepthUpdate(event
); }
302 void OnColourByDateUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByDateUpdate(event
); }
303 void OnColourByErrorUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByErrorUpdate(event
); }
304 void OnColourByHErrorUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByHErrorUpdate(event
); }
305 void OnColourByVErrorUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByVErrorUpdate(event
); }
306 void OnColourByGradientUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByGradientUpdate(event
); }
307 void OnColourByLengthUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByLengthUpdate(event
); }
308 void OnColourBySurveyUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourBySurveyUpdate(event
); }
309 void OnColourByStyleUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByStyleUpdate(event
); }
310 void OnShowCrossesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowCrossesUpdate(event
); }
311 void OnShowEntrancesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowEntrancesUpdate(event
); }
312 void OnShowFixedPtsUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowFixedPtsUpdate(event
); }
313 void OnShowExportedPtsUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowExportedPtsUpdate(event
); }
314 void OnShowStationNamesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowStationNamesUpdate(event
); }
315 void OnShowSurveyLegsUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowSurveyLegsUpdate(event
); }
316 void OnSplaysUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnSplaysUpdate(event
); }
317 void OnHideSplaysUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnHideSplaysUpdate(event
); }
318 void OnShowSplaysDashedUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowSplaysDashedUpdate(event
); }
319 void OnShowSplaysFadedUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowSplaysFadedUpdate(event
); }
320 void OnShowSplaysNormalUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowSplaysNormalUpdate(event
); }
321 void OnDupesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnDupesUpdate(event
); }
322 void OnHideDupesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnHideDupesUpdate(event
); }
323 void OnShowDupesDashedUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowDupesDashedUpdate(event
); }
324 void OnShowDupesFadedUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowDupesFadedUpdate(event
); }
325 void OnShowDupesNormalUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowDupesNormalUpdate(event
); }
326 void OnShowSurfaceUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowSurfaceUpdate(event
); }
327 void OnMoveEastUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnMoveEastUpdate(event
); }
328 void OnMoveNorthUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnMoveNorthUpdate(event
); }
329 void OnMoveSouthUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnMoveSouthUpdate(event
); }
330 void OnMoveWestUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnMoveWestUpdate(event
); }
331 void OnToggleRotationUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnToggleRotationUpdate(event
); }
332 void OnReverseControlsUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnReverseControlsUpdate(event
); }
333 void OnToggleScalebarUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnToggleScalebarUpdate(event
); }
334 void OnToggleColourKeyUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnToggleColourKeyUpdate(event
); }
335 void OnViewCompassUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewCompassUpdate(event
); }
336 void OnViewGridUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewGridUpdate(event
); }
337 void OnViewBoundingBoxUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewBoundingBoxUpdate(event
); }
338 void OnViewTerrainUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewTerrainUpdate(event
); }
339 void OnViewClinoUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewClinoUpdate(event
); }
340 void OnViewPerspectiveUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewPerspectiveUpdate(event
); }
341 void OnViewSmoothShadingUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewSmoothShadingUpdate(event
); }
342 void OnViewTexturedUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewTexturedUpdate(event
); }
343 void OnViewFogUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewFogUpdate(event
); }
344 void OnViewSmoothLinesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewSmoothLinesUpdate(event
); }
345 void OnViewFullScreenUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewFullScreenUpdate(event
); }
346 void OnReverseDirectionOfRotationUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnReverseDirectionOfRotationUpdate(event
); }
347 void OnCancelDistLineUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnCancelDistLineUpdate(event
); }
348 void OnIndicatorsUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnIndicatorsUpdate(event
); }
350 void OnDefaults(wxCommandEvent
&) { if (m_Control
) m_Control
->OnDefaults(); }
351 void OnPlan(wxCommandEvent
&) { if (m_Control
) m_Control
->OnPlan(); }
352 void OnElevation(wxCommandEvent
&) { if (m_Control
) m_Control
->OnElevation(); }
353 void OnDisplayOverlappingNames(wxCommandEvent
&) { if (m_Control
) m_Control
->OnDisplayOverlappingNames(); }
354 void OnColourByDepth(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByDepth(); }
355 void OnColourByDate(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByDate(); }
356 void OnColourByError(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByError(); }
357 void OnColourByHError(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByHError(); }
358 void OnColourByVError(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByVError(); }
359 void OnColourByGradient(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByGradient(); }
360 void OnColourByLength(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByLength(); }
361 void OnColourBySurvey(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourBySurvey(); }
362 void OnColourByStyle(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByStyle(); }
363 void OnShowCrosses(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowCrosses(); }
364 void OnShowEntrances(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowEntrances(); }
365 void OnShowFixedPts(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowFixedPts(); }
366 void OnShowExportedPts(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowExportedPts(); }
367 void OnShowStationNames(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowStationNames(); }
368 void OnShowSurveyLegs(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowSurveyLegs(); }
369 void OnHideSplays(wxCommandEvent
&) { if (m_Control
) m_Control
->OnHideSplays(); }
370 void OnShowSplaysDashed(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowSplaysDashed(); }
371 void OnShowSplaysFaded(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowSplaysFaded(); }
372 void OnShowSplaysNormal(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowSplaysNormal(); }
373 void OnHideDupes(wxCommandEvent
&) { if (m_Control
) m_Control
->OnHideDupes(); }
374 void OnShowDupesDashed(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowDupesDashed(); }
375 void OnShowDupesFaded(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowDupesFaded(); }
376 void OnShowDupesNormal(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowDupesNormal(); }
377 void OnShowSurface(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowSurface(); }
378 void OnMoveEast(wxCommandEvent
&) { if (m_Control
) m_Control
->OnMoveEast(); }
379 void OnMoveNorth(wxCommandEvent
&) { if (m_Control
) m_Control
->OnMoveNorth(); }
380 void OnMoveSouth(wxCommandEvent
&) { if (m_Control
) m_Control
->OnMoveSouth(); }
381 void OnMoveWest(wxCommandEvent
&) { if (m_Control
) m_Control
->OnMoveWest(); }
382 void OnToggleRotation(wxCommandEvent
&) { if (m_Control
) m_Control
->OnToggleRotation(); }
383 void OnReverseControls(wxCommandEvent
&) { if (m_Control
) m_Control
->OnReverseControls(); }
384 void OnToggleScalebar(wxCommandEvent
&) { if (m_Control
) m_Control
->OnToggleScalebar(); }
385 void OnToggleColourKey(wxCommandEvent
&) { if (m_Control
) m_Control
->OnToggleColourKey(); }
386 void OnViewCompass(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewCompass(); }
387 void OnViewClino(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewClino(); }
388 void OnViewGrid(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewGrid(); }
389 void OnViewBoundingBox(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewBoundingBox(); }
390 void OnViewTerrain(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewTerrain(); }
391 void OnViewPerspective(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewPerspective(); }
392 void OnViewSmoothShading(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewSmoothShading(); }
393 void OnViewTextured(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewTextured(); }
394 void OnViewFog(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewFog(); }
395 void OnViewSmoothLines(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewSmoothLines(); }
396 void OnViewFullScreen(wxCommandEvent
&) { ViewFullScreen(); }
397 void ViewFullScreen();
398 bool FullScreenModeShowingMenus() const;
399 void FullScreenModeShowMenus(bool show
);
400 void OnReverseDirectionOfRotation(wxCommandEvent
&) { if (m_Control
) m_Control
->OnReverseDirectionOfRotation(); }
401 void OnCancelDistLine(wxCommandEvent
&) { if (m_Control
) m_Control
->OnCancelDistLine(); }
403 void OnToggleMetric(wxCommandEvent
&) { if (m_Control
) m_Control
->OnToggleMetric(); }
404 void OnToggleDegrees(wxCommandEvent
&) { if (m_Control
) m_Control
->OnToggleDegrees(); }
405 void OnTogglePercent(wxCommandEvent
&) { if (m_Control
) m_Control
->OnTogglePercent(); }
406 void OnToggleTubes(wxCommandEvent
&) { if (m_Control
) m_Control
->OnToggleTubes(); }
408 void OnToggleMetricUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnToggleMetricUpdate(event
); }
409 void OnToggleDegreesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnToggleDegreesUpdate(event
); }
410 void OnTogglePercentUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnTogglePercentUpdate(event
); }
411 void OnToggleTubesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnToggleTubesUpdate(event
); }
413 // end of horrible bodges
415 void OnViewSidePanelUpdate(wxUpdateUIEvent
& event
);
416 void OnViewSidePanel(wxCommandEvent
& event
);
417 void ToggleSidePanel();
418 bool ShowingSidePanel();
420 void SelectTreeItem(const LabelInfo
* label
) {
421 if (label
->tree_id
.IsOk())
422 m_Tree
->SelectItem(label
->tree_id
);
424 m_Tree
->UnselectAll();
427 void ClearTreeSelection();
430 void SetCoords(const Vector3
&v
);
431 const LabelInfo
* GetTreeSelection() const;
432 void SetCoords(double x
, double y
, const LabelInfo
* there
);
433 void SetAltitude(double z
, const LabelInfo
* there
);
435 void ShowInfo(const LabelInfo
*here
= NULL
, const LabelInfo
*there
= NULL
);
436 void DisplayTreeInfo(const wxTreeItemData
* data
= NULL
);
437 void TreeItemSelected(const wxTreeItemData
* data
);
438 PresentationMark
GetPresMark(int which
);
439 bool Animating() const { return m_Gfx
&& m_Gfx
->Animating(); }
441 // Restrict to subsurvey `survey` (or show all if `survey` empty).
442 void RestrictTo(const wxString
& survey
);
444 wxString
GetSurvey() const { return m_Survey
; }
446 int GetNumHighlightedPts() const { return m_NumHighlighted
; }
448 const SurveyFilter
* GetTreeFilter() const { return m_Tree
->GetFilter(); }
450 // Used when the tree filters change. FIXME: Overkill?
451 void ForceFullRedraw() {
452 m_Gfx
->InvalidateAllLists();
453 m_Gfx
->ForceRefresh();
456 void InvalidateOverlays() {
457 m_Gfx
->InvalidateOverlays();
460 wxTreeItemId
FirstOverlay() { return m_Tree
->FirstOverlay(); }
461 wxTreeItemId
NextOverlay(wxTreeItemId id
) { return m_Tree
->NextOverlay(id
); }
462 wxTreeItemId
RemoveOverlay(wxTreeItemId id
) { return m_Tree
->RemoveOverlay(id
); }
463 const wxString
& GetOverlayFilename(wxTreeItemId id
) { return m_Tree
->GetOverlayFilename(id
); }
466 DECLARE_EVENT_TABLE()