OpenCPN Partial API docs
Loading...
Searching...
No Matches
ocpn_frame.h
Go to the documentation of this file.
1/**************************************************************************
2 * Copyright (C) 2010 by David S. Register *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, see <https://www.gnu.org/licenses/>. *
16 **************************************************************************/
17
24#ifndef _OFRAME_H
25#define _OFRAME_H
26
27#include <wx/print.h>
28#include <wx/power.h>
29#include <wx/artprov.h>
30#include <wx/socket.h>
31#include <wx/html/htmlwin.h>
32#include <wx/aui/aui.h>
33#include <wx/aui/dockart.h>
34
35#include <memory>
36#ifdef __WXMSW__
37#include <wx/msw/private.h>
38#endif
39
40#include "ocpn_plugin.h"
41
42#include "observable/evtvar.h"
43
45#include "model/gui.h"
46#include "model/idents.h"
47#include "model/ocpn_types.h"
48#include "model/track.h"
50#include "model/rest_server.h"
51
52#include "bbox.h"
53#include "canvas_menu.h"
54#include "chartbase.h"
55#include "chartdbs.h"
56#include "chcanv.h"
57#include "color_handler.h"
58#include "connections_dlg.h"
59#include "data_monitor.h"
60#include "displays.h"
61#include "gui_lib.h"
62#include "load_errors_dlg.h"
63#include "options.h"
64#include "pluginmanager.h"
65#include "s52_plib_utils.h"
66#include "s52s57.h"
67#include "s57registrar_mgr.h"
68#include "senc_manager.h"
69#include "toolbar.h"
70#include "top_frame.h"
71#include "undo_defs.h"
72
73//----------------------------------------------------------------------------
74// constants
75//----------------------------------------------------------------------------
76
77#define TIMER_GFRAME_1 999
78
79// Command identifiers for wxCommandEvents coming from the outside world.
80// Removed from enum to facilitate constant definition
81//
82// NOLINTBEGIN
83#define ID_CMD_APPLY_SETTINGS 300
84#define ID_CMD_NULL_REFRESH 301
85#define ID_CMD_TRIGGER_RESIZE 302
86#define ID_CMD_SETVP 303
87#define ID_CMD_POST_JSON_TO_PLUGINS 304
88#define ID_CMD_SOUND_FINISHED 306
89// NOLINTEND
90
91using OpenFileFunc = std::function<bool(const std::string& path)>;
92//----------------------------------------------------------------------------
93// fwd class declarations
94//----------------------------------------------------------------------------
95
96class MyFrame; // forward
97extern MyFrame* gFrame;
99// FIXME (leamas) to have utility functions in top window is a really bad idea.
100void ApplyLocale(void);
101
107class MyFrame : public AbstractTopFrame, public S52PlibUtils {
108public:
109 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size,
110 RestServer& rest_server, wxAuiDefaultDockArt* pauidockart,
111 OpenFileFunc open_gpx_file);
112
113 ~MyFrame();
114
115 void SetGPSCompassScale() override;
116 void FastClose() override;
117 void RefreshAllCanvas(bool bErase = true) override;
118 void UpdateStatusBar() override;
119 void ToggleFullScreen() override;
120 Track* TrackOff(bool do_add_point = false) override;
121 void TrackOn(void) override;
122 void ProcessOptionsDialog(int resultFlags) override {
123 ProcessOptionsDialog(resultFlags, nullptr);
124 }
125
126 void SetAlertString(wxString msg) override {
127 GetPrimaryCanvas()->SetAlertString(msg);
128 }
129
130 void JumpToPosition(double lat, double lon) override {
131 if (!GetFocusCanvas()) return;
132 JumpToPosition(GetFocusCanvas(), lat, lon, GetFocusCanvas()->GetVPScale());
133 }
134
135 void JumpToPosition(double lat, double lon, double scale) override {
136 if (!GetFocusCanvas()) return;
137 JumpToPosition(GetFocusCanvas(), lat, lon, scale);
138 }
139
140 void JumpToPosition(AbstractChartCanvas* acc, double lat, double lon,
141 double scale) override {
142 if (!acc) return;
143 auto cc = dynamic_cast<ChartCanvas*>(acc);
144 assert(cc);
145 JumpToPosition(cc, lat, lon, scale);
146 }
147 void JumpToPosition(AbstractChartCanvas* acc, double lat,
148 double lon) override {
149 if (!acc) return;
150 auto cc = dynamic_cast<ChartCanvas*>(acc);
151 assert(cc);
152 JumpToPosition(cc, lat, lon, GetFocusCanvas()->GetVPScale());
153 }
154
155 AbstractChartCanvas* GetAbstractPrimaryCanvas() override {
156 return GetPrimaryCanvas();
157 }
158
159 AbstractChartCanvas* GetAbstractFocusCanvas() override {
160 return GetFocusCanvas();
161 }
162
163 void SwitchKBFocus(AbstractChartCanvas* acc) override {
164 return SwitchKBFocusCanvas(dynamic_cast<ChartCanvas*>(acc));
165 }
166
167 double GetCanvasTrueScale() override {
168 return GetPrimaryCanvas()->GetCanvasTrueScale();
169 }
170
171 double GetPixPerMM() override { return GetPrimaryCanvas()->GetPixPerMM(); }
172
173 double GetContentScaleFactor() override {
174 if (GetPrimaryCanvas())
175 return GetPrimaryCanvas()->GetContentScaleFactor();
176 else
177 return 1.0;
178 }
179
180 void RequestNewToolbars(bool bforcenew = false) override;
181
182 bool GetCanvasPointPix(double rlat, double rlon, wxPoint* r) override {
183 return GetFocusCanvas()->GetCanvasPointPix(rlat, rlon, r);
184 }
185
186 virtual wxSize GetFocusCanvasSize() override {
187 return GetFocusCanvas() ? GetFocusCanvas()->GetSize() : wxSize(0, 0);
188 }
189
190 void CancelAllMouseRoute() override;
191 void InvalidateAllCanvasUndo() override;
192 void PositionConsole() override;
193 void InvalidateAllGL() override;
194 double GetBestVPScale(AbstractChart* arg) override {
195 auto chart = dynamic_cast<ChartBase*>(arg);
196 assert(chart);
197 return GetPrimaryCanvas()->GetBestVPScale(chart);
198 }
199
200 void DoStackUp(AbstractChartCanvas* cc) override;
201 void DoStackDown(AbstractChartCanvas* cc) override;
202 void LoadHarmonics() override;
203
204 bool DropMarker(bool atOwnShip = true) override;
205 double GetMag(double a, double lat, double lon) override;
206 void SetMasterToolbarItemState(int tool_id, bool state) override;
207 bool DoChartUpdate() override;
208 void ProcessCanvasResize() override;
209 bool SetGlobalToolbarViz(bool viz) override;
210 void ToggleQuiltMode(AbstractChartCanvas* acc) override {
211 auto cc = dynamic_cast<ChartCanvas*>(acc);
212 ToggleQuiltMode(cc);
213 }
214 void UpdateGlobalMenuItems(AbstractChartCanvas* acc) override {
215 UpdateGlobalMenuItems(dynamic_cast<ChartCanvas*>(acc));
216 }
217 void UpdateGlobalMenuItems() override;
218 void RefreshCanvasOther(AbstractChartCanvas* ccThis) override {
219 RefreshCanvasOther(dynamic_cast<ChartCanvas*>(ccThis));
220 }
221 virtual double* GetCOGTable() override { return COGTable; }
222 virtual void StartCogTimer() override {
223 FrameCOGTimer.Start(100, wxTIMER_CONTINUOUS);
224 }
225
226 wxWindow* GetPrimaryCanvasWindow() override { return GetPrimaryCanvas(); }
227 void ApplyGlobalSettings(bool bnewtoolbar) override;
228 void SetMenubarItemState(int item_id, bool state) override;
229 void ToggleColorScheme() override;
230 void ActivateMOB() override;
231 void ToggleTestPause() override;
232
233 void ToggleChartBar(AbstractChartCanvas* acc) override {
234 ToggleChartBar(dynamic_cast<ChartCanvas*>(acc));
235 }
236 void DoSettings() override;
237
238 void UpdateRotationState(double rotation) override;
239 void SetChartUpdatePeriod() override;
240 wxStatusBar* GetStatusBar() override { return wxFrame::GetStatusBar(); }
241 wxStatusBar* GetFrameStatusBar() const override { return m_pStatusBar; }
242 void SetENCDisplayCategory(AbstractChartCanvas* acc,
243 enum _DisCat nset) override {
244 SetENCDisplayCategory(dynamic_cast<ChartCanvas*>(acc), nset);
245 }
246 int GetCanvasIndexUnderMouse() override;
247
248 double GetCanvasRefScale() override {
249 return GetPrimaryCanvas()->GetVP().ref_scale;
250 ;
251 }
252
253#ifdef ocpnUSE_GL
254 void SendGlJsonConfigMsg() override {
255 if (GetPrimaryCanvas() && GetPrimaryCanvas()->GetglCanvas())
256 GetPrimaryCanvas()->GetglCanvas()->SendJSONConfigMessage();
257 }
258 bool CanAccelerateGlPanning() override {
259 return GetPrimaryCanvas()->GetglCanvas()->CanAcceleratePanning();
260 }
261 void SetupGlCompression() override {
262 GetPrimaryCanvas()->GetglCanvas()->SetupCompression();
263 }
264 wxString GetGlVersionString() override {
265 return GetPrimaryCanvas()->GetglCanvas()->GetVersionString();
266 }
267 wxGLCanvas* GetWxGlCanvas() override {
268 return GetPrimaryCanvas()->GetglCanvas();
269 }
270
271#else
272 void SendGlJsonConfigMsg() override {}
273 bool CanAccelerateGlPanning() override { return false; }
274 void SetupGlCompression() override {}
275 wxString GetGlVersionString() override { return ""; }
276 wxGLCanvas* GetWxGlCanvas() override { return nullptr; }
277#endif
278 void SwitchKBFocusCanvas(ChartCanvas* pCanvas);
279 int GetNextToolbarToolId() override {
280 return m_next_available_plugin_tool_id;
281 }
282 void SetToolbarItemBitmaps(int tool_id, wxBitmap* bitmap,
283 wxBitmap* bmpDisabled) override;
284 void SetToolbarItemSVG(int tool_id, wxString normalSVGfile,
285 wxString rolloverSVGfile,
286 wxString toggledSVGfile) override;
287 void UpdateAllFonts() override;
288 void ScheduleReconfigAndSettingsReload(bool reload, bool new_dialog) override;
289 void ScheduleReloadCharts() override;
290 void ChartsRefresh() override;
291 void FreezeCharts() override;
292 void ThawCharts() override;
293
294 void ScheduleDeleteSettingsDialog() override;
295
296 void BeforeUndoableAction(UndoType undo_type, RoutePoint* point,
297 UndoBeforePointerType pointer_type,
298 UndoItemPointer pointer) override {
299 if (!GetPrimaryCanvas()) return;
300 GetPrimaryCanvas()->undo->BeforeUndoableAction(undo_type, point,
301 pointer_type, pointer);
302 }
303
304 virtual void AfterUndoableAction(UndoItemPointer pointer) override {
305 GetPrimaryCanvas()->undo->AfterUndoableAction(pointer);
306 }
307 virtual void TouchAISActive() override;
308 virtual void UpdateAISMOBRoute(const AisTargetData* ptarget) override;
309 virtual void ActivateAISMOBRoute(const AisTargetData* ptarget) override;
310 void EnableSettingsTool(bool _enable) override {
311 if (m_pMenuBar) m_pMenuBar->Enable(wxID_PREFERENCES, _enable);
312 if (g_MainToolbar) {
313 g_MainToolbar->EnableTool(ID_SETTINGS, _enable);
314 g_MainToolbar->GetToolbar()->SetDirty(true);
315 g_MainToolbar->RefreshToolbar();
316 }
317 }
318 void OnToolLeftClick(wxCommandEvent& event) override;
319
320 bool DisableTbarTooltips();
321 void EnableTbarTooltips();
322 void HideTbarTooltip();
323
324 void SetENCDisplayCategory(ChartCanvas* cc, enum _DisCat nset);
325 void ToggleQuiltMode(ChartCanvas* cc);
326
327 wxFont* GetFont(wxFont* font, double scale) override;
328 wxFont* GetDefaultFont(wxString label, int Ptsize) override;
329 wxFont* GetScaledFont(int pointSize, wxFontFamily family, wxFontStyle style,
330 wxFontWeight weight, const wxString faceName,
331 double scale) override;
332
333 int GetApplicationMemoryUse(void);
334
335 void OnEraseBackground(wxEraseEvent& event);
336 void OnMaximize(wxMaximizeEvent& event);
337 void OnCloseWindow(wxCloseEvent& event);
338 void OnExit(wxCommandEvent& event);
339 void OnSize(wxSizeEvent& event);
340 void OnMove(wxMoveEvent& event);
341 void OnInitTimer(wxTimerEvent& event);
342
351 void OnFrameTimer1(wxTimerEvent& event);
352
353 void OnEvtPlugInMessage(OCPN_MsgEvent& event);
354 void OnMemFootTimer(wxTimerEvent& event);
355 void OnRecaptureTimer(wxTimerEvent& event);
356 void OnSENCEvtThread(OCPN_BUILDSENC_ThreadEvent& event);
357 void OnIconize(wxIconizeEvent& event);
358 void OnBellsFinished(wxCommandEvent& event);
359
371 void OnFrameTenHzTimer(wxTimerEvent& event);
372
373#ifdef wxHAS_POWER_EVENTS
374 void OnSuspending(wxPowerEvent& event);
375 void OnSuspended(wxPowerEvent& event);
376 void OnSuspendCancel(wxPowerEvent& event);
377 void OnResume(wxPowerEvent& event);
378#endif // wxHAS_POWER_EVENTS
379
380 void RefreshCanvasOther(ChartCanvas* ccThis);
381 void selectChartDisplay(int type, int family);
382 void applySettingsString(wxString settings);
383 void setStringVP(wxString VPS);
384 void InvalidateAllQuilts();
385
386 void SetUpMode(ChartCanvas* cc, int mode);
387
388 ChartCanvas* GetPrimaryCanvas();
389 ChartCanvas* GetFocusCanvas();
390 void DoStackUp(ChartCanvas* cc);
391 void DoStackDown(ChartCanvas* cc);
392 void NotifyChildrenResize();
393
394 void DoStackDelta(ChartCanvas* cc, int direction);
395 void DoSettingsNew(void);
396 ChartCanvas* GetCanvasUnderMouse();
397
398 void TriggerRecaptureTimer();
399
400 void MouseEvent(wxMouseEvent& event);
401 void CenterView(ChartCanvas* cc, const LLBBox& bbox);
402
403 void JumpToPosition(ChartCanvas* cc, double lat, double lon, double scale);
404
405 void BuildMenuBar(void);
406 void RegisterGlobalMenuItems();
407 void UpdateGlobalMenuItems(ChartCanvas* cc);
408 void DoOptionsDialog();
409 void ProcessOptionsDialog(int resultFlags, ArrayOfCDI* pNewDirArray);
410 void PrepareOptionsClose(options* settings, int settings_return_value);
411
412 void DoPrint(void);
413 void ToggleDataQuality(ChartCanvas* cc);
414 void TogglebFollow(ChartCanvas* cc);
415 void ToggleChartBar(ChartCanvas* cc);
416 void SetbFollow(ChartCanvas* cc);
417 void ClearbFollow(ChartCanvas* cc);
418 void ToggleChartOutlines(ChartCanvas* cc);
419 void ToggleENCText(ChartCanvas* cc);
420 void ToggleSoundings(ChartCanvas* cc);
421#if 0
422 void ToggleRocks(void);
423#endif
424 bool ToggleLights(ChartCanvas* cc);
425 void ToggleAnchor(ChartCanvas* cc);
426 void ToggleAISDisplay(ChartCanvas* cc);
427 void ToggleAISMinimizeTargets(ChartCanvas* cc);
428
429 void ToggleNavobjects(ChartCanvas* cc);
430
431 void TrackDailyRestart(void);
432 bool ShouldRestartTrack();
433 void InitializeTrackRestart();
434
435 void UpdateControlBar(ChartCanvas* cc);
436
437 void SubmergeAllCanvasToolbars(void);
438 void SurfaceAllCanvasToolbars(void);
439 void SetAllToolbarScale(void);
440
441 void RefreshGroupIndices(void);
442
443 double GetBestVPScale(ChartBase* pchart);
444
445 DataMonitor* GetDataMonitor() const { return m_data_monitor; }
446
447 void SetAndApplyColorScheme(ColorScheme cs);
448 void ValidateColorScheme();
449
450 void OnFrameTCTimer(wxTimerEvent& event);
451 void OnFrameCOGTimer(wxTimerEvent& event);
452
453 void HandleBasicNavMsg(std::shared_ptr<const BasicNavDataMsg> msg);
454 void HandleGPSWatchdogMsg(std::shared_ptr<const GPSWatchdogMsg> msg);
455
456 bool CheckGroup(int igroup);
457 bool SendJSON_WMM_Var_Request(double lat, double lon, wxDateTime date);
458
459 void DestroyPersistentDialogs();
460 void UpdateAISTool(void);
461 wxMenuBar* m_pMenuBar;
462 bool m_bTimeIsSet;
463
464 wxTimer InitTimer;
465 int m_iInitCount;
466 bool m_initializing;
467
468 wxTimer FrameTCTimer;
469 wxTimer FrameTimer1;
470 wxTimer FrameCOGTimer;
471 wxTimer MemFootTimer;
472 wxTimer m_resizeTimer;
473 wxTimer FrameTenHzTimer;
474
475 int m_BellsToPlay;
476 wxTimer BellsTimer;
477
478 wxGenericProgressDialog* Updateprog = nullptr;
479
480 // PlugIn support
481 void RequestNewToolbarArgEvent(wxCommandEvent& WXUNUSED(event)) {
482 return RequestNewMasterToolbar();
483 }
484
485 void UpdateGPSCompassStatusBoxes(bool b_force_new = false);
486
487 bool UpdateChartDatabaseInplace(ArrayOfCDI& DirArray, bool b_force,
488 bool b_prog,
489 const wxString& ChartListFileName);
490 void FinalizeChartDBUpdate();
491
492 bool m_bdefer_resize;
493 wxSize m_defer_size;
494 double COGTable[kMaxCogAverageSeconds];
495
496 void CreateCanvasLayout(bool b_useStoredSize = false);
497 void ReloadAllVP();
498 void SetCanvasSizes(wxSize frameSize);
499
500 ocpnToolBarSimple* CreateMasterToolbar();
501 void RequestNewMasterToolbar(bool bforcenew = true);
502 bool CheckAndAddPlugInTool();
503 bool AddDefaultPositionPlugInTools();
504
505 void UpdateCanvasConfigDescriptors();
506 void ScheduleSettingsDialog();
507 void ScheduleSettingsDialogNew();
508 static bool StartRebuildChartDatabase();
509 void PositionIENCToolbar();
510
511 void InitAppMsgBusListener();
512 void InitApiListeners();
513 void ReleaseApiListeners();
514 void ConfigureStatusBar();
515
516private:
517 void ProcessUnitTest();
518 bool ProcessQuitFlag();
519 void ProcessDeferredTrackOn();
520 void SendFixToPlugins();
521 void ProcessAnchorWatch();
522 void ProcessLogAndBells();
523 void CalculateCOGAverage();
524
525 void ODoSetSize(void);
526 void DoCOGSet(void);
527
528 void UpdateAllToolbars(ColorScheme cs);
529
530 void FilterCogSog(void);
531
532 void ApplyGlobalColorSchemetoStatusBar(void);
533
534 bool ScrubGroupArray();
535
536 void OnToolbarAnimateTimer(wxTimerEvent& event);
537 bool CollapseGlobalToolbar();
538
539 int m_StatusBarFieldCount;
540
541 wxDateTime m_MMEAeventTime;
542 unsigned long m_ulLastNMEATicktime;
543 int m_tick_idx;
544 wxDateTime m_fix_start_time;
545
546 wxString m_last_reported_chart_name;
547 wxString m_last_reported_chart_pubdate;
548
549 wxString m_lastAISiconName;
550
551 // Plugin Support
552 int m_next_available_plugin_tool_id;
553
554 double COGFilterTable[kMaxCogsogFilterSeconds];
555 double SOGFilterTable[kMaxCogsogFilterSeconds];
556
557 int m_ChartUpdatePeriod;
558 bool m_last_bGPSValid;
559 bool m_last_bVelocityValid;
560 double m_last_hdt;
561
562 wxString prev_locale;
563
571 time_t m_fixtime;
572 bool b_autofind;
573
574 wxDateTime m_target_rotate_time;
575
576 wxTimer ToolbarAnimateTimer;
577 int m_nMasterToolCountShown;
578 wxTimer m_recaptureTimer;
579
580 std::unique_ptr<LoadErrorsDlgCtrl> m_load_errors_dlg_ctrl;
581 wxString m_gshhg_chart_loc;
582
583private:
584 ObservableListener listener_basic_navdata;
585 ObservableListener listener_gps_watchdog;
586 obs::Listener m_on_raise_listener;
587 obs::Listener m_on_quit_listener;
588 obs::Listener m_routes_update_listener;
589 obs::Listener m_evt_drv_msg_listener;
590 obs::Listener m_update_statusbar_listener;
591 obs::Listener m_center_aistarget_listener;
592 obs::Listener m_reload_charts_listener;
593 ToolbarDlgCallbacks m_toolbar_callbacks;
594
595 wxStatusBar* m_pStatusBar;
596 ConnectionsDlg* m_connections_dlg;
597 bool m_need_new_options;
598 wxArrayString pathArray;
599 double restoreScale[4];
600 unsigned int last_canvasConfig;
601 DataMonitor* m_data_monitor;
602 wxAuiDefaultDockArt* m_pauidockart;
603 RestServer& m_rest_server;
604 OpenFileFunc m_open_gpx_file;
605
606 void CenterAisTarget(const std::shared_ptr<const AisTargetData>& ais_target);
607
608 DECLARE_EVENT_TABLE()
609};
610
611#endif // _OFRAME_H
AIS target definitions.
Canvas context (right click) menu handler.
General chart base definitions.
Basic chart info storage.
Generic Chart canvas base.
Minimal ChartCAnvas interface with very little dependencies.
Minimal Chart interface, for now just an anonymous pointer.
Base class for all chart types.
Definition chartbase.h:126
ChartCanvas - Main chart display and interaction component.
Definition chcanv.h:174
bool GetCanvasPointPix(double rlat, double rlon, wxPoint *r)
Convert latitude/longitude to canvas pixel coordinates (physical pixels) rounded to nearest integer.
Definition chcanv.cpp:4604
double GetPixPerMM()
Get the number of logical pixels per millimeter on the screen.
Definition chcanv.h:543
Options | Connections tab implementation, basically a UI for maintaining the list of connections.
Overall logging handler, outputs to screen and log file.
Main application frame.
Definition ocpn_frame.h:107
void OnFrameTimer1(wxTimerEvent &event)
Main application timer handler called approximately once per second.
void InitApiListeners()
Setup handling of events from the local ipc/dbus API.
void OnFrameTenHzTimer(wxTimerEvent &event)
High-frequency timer handler running at 10Hz for smooth navigation updates.
Manages listening to an Observable instance.
Definition observable.h:175
AbstractRestServer implementation and interface to underlying IO thread.
Represents a waypoint or mark within the navigation system.
Definition route_point.h:71
Represents a track, which is a series of connected track points.
Definition track.h:117
double ref_scale
The nominal scale of the "reference chart" for this view.
Definition viewport.h:221
Generic toolbar implementation in pure wxWidgets adapted from wxToolBarSimple (deprecated).
Definition toolbar.h:109
Global color handling by name.
Decoded messages send/receive support.
Options | Connections GUI tab managing connections
New NMEA Debugger successor main window.
Display utilities.
A common variable shared between producer and consumer which supports Listen() and Notify().
Hooks into gui available in model.
General purpose GUI support.
GUI constant definitions.
MyFrame * gFrame
Global instance.
PlugIn Object Definition/API.
Navigation data types.
Options dialog.
PlugInManager and helper classes – Mostly gui parts (dialogs) and plugin API stuff.
REST API server.
S57 Chart Object.
ocpnFloatingToolbarDialog * g_MainToolbar
Global instance.
Definition toolbar.cpp:66
OpenCPN Toolbar.
Abstract gFrame/MyFrame interface.
Recorded track abstraction.
Undo features argument definitions.