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
43#include "model/gui.h"
44#include "model/idents.h"
45#include "model/ocpn_types.h"
46#include "model/track.h"
48#include "model/rest_server.h"
49
50#include "bbox.h"
51#include "canvas_menu.h"
52#include "chartbase.h"
53#include "chartdbs.h"
54#include "chcanv.h"
55#include "color_handler.h"
56#include "connections_dlg.h"
57#include "data_monitor.h"
58#include "displays.h"
59#include "gui_lib.h"
60#include "load_errors_dlg.h"
61#include "observable_evtvar.h"
62#include "options.h"
63#include "pluginmanager.h"
64#include "s52_plib_utils.h"
65#include "s52s57.h"
66#include "s57registrar_mgr.h"
67#include "senc_manager.h"
68#include "toolbar.h"
69#include "top_frame.h"
70#include "undo_defs.h"
71
72//----------------------------------------------------------------------------
73// constants
74//----------------------------------------------------------------------------
75
76#define TIMER_GFRAME_1 999
77
78// Command identifiers for wxCommandEvents coming from the outside world.
79// Removed from enum to facilitate constant definition
80//
81// NOLINTBEGIN
82#define ID_CMD_APPLY_SETTINGS 300
83#define ID_CMD_NULL_REFRESH 301
84#define ID_CMD_TRIGGER_RESIZE 302
85#define ID_CMD_SETVP 303
86#define ID_CMD_POST_JSON_TO_PLUGINS 304
87#define ID_CMD_SOUND_FINISHED 306
88// NOLINTEND
89
90using OpenFileFunc = std::function<bool(const std::string& path)>;
91//----------------------------------------------------------------------------
92// fwd class declarations
93//----------------------------------------------------------------------------
94
95class MyFrame; // forward
96extern MyFrame* gFrame;
98// FIXME (leamas) to have utility functions in top window is a really bad idea.
99bool ShowNavWarning();
100
101void ApplyLocale(void);
102
108class MyFrame : public AbstractTopFrame, public S52PlibUtils {
109public:
110 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size,
111 RestServer& rest_server, wxAuiDefaultDockArt* pauidockart,
112 OpenFileFunc open_gpx_file);
113
114 ~MyFrame();
115
116 void SetGPSCompassScale() override;
117 void FastClose() override;
118 void RefreshAllCanvas(bool bErase = true) override;
119 void UpdateStatusBar() override;
120 void ToggleFullScreen() override;
121 Track* TrackOff(bool do_add_point = false) override;
122 void TrackOn(void) override;
123 void ProcessOptionsDialog(int resultFlags) override {
124 ProcessOptionsDialog(resultFlags, nullptr);
125 }
126
127 void SetAlertString(wxString msg) override {
128 GetPrimaryCanvas()->SetAlertString(msg);
129 }
130
131 void JumpToPosition(double lat, double lon) override {
132 if (!GetFocusCanvas()) return;
133 JumpToPosition(GetFocusCanvas(), lat, lon, GetFocusCanvas()->GetVPScale());
134 }
135
136 void JumpToPosition(double lat, double lon, double scale) override {
137 if (!GetFocusCanvas()) return;
138 JumpToPosition(GetFocusCanvas(), lat, lon, scale);
139 }
140
141 void JumpToPosition(AbstractChartCanvas* acc, double lat, double lon,
142 double scale) override {
143 if (!acc) return;
144 auto cc = dynamic_cast<ChartCanvas*>(acc);
145 assert(cc);
146 JumpToPosition(cc, lat, lon, scale);
147 }
148 void JumpToPosition(AbstractChartCanvas* acc, double lat,
149 double lon) override {
150 if (!acc) return;
151 auto cc = dynamic_cast<ChartCanvas*>(acc);
152 assert(cc);
153 JumpToPosition(cc, lat, lon, GetFocusCanvas()->GetVPScale());
154 }
155
156 AbstractChartCanvas* GetAbstractPrimaryCanvas() override {
157 return GetPrimaryCanvas();
158 }
159
160 AbstractChartCanvas* GetAbstractFocusCanvas() override {
161 return GetFocusCanvas();
162 }
163
164 void SwitchKBFocus(AbstractChartCanvas* acc) override {
165 return SwitchKBFocusCanvas(dynamic_cast<ChartCanvas*>(acc));
166 }
167
168 double GetCanvasTrueScale() override {
169 return GetPrimaryCanvas()->GetCanvasTrueScale();
170 }
171
172 double GetPixPerMM() override { return GetPrimaryCanvas()->GetPixPerMM(); }
173
174 double GetContentScaleFactor() override {
175 if (GetPrimaryCanvas())
176 return GetPrimaryCanvas()->GetContentScaleFactor();
177 else
178 return 1.0;
179 }
180
181 void RequestNewToolbars(bool bforcenew = false) override;
182
183 bool GetCanvasPointPix(double rlat, double rlon, wxPoint* r) override {
184 return GetFocusCanvas()->GetCanvasPointPix(rlat, rlon, r);
185 }
186
187 virtual wxSize GetFocusCanvasSize() override {
188 return GetFocusCanvas() ? GetFocusCanvas()->GetSize() : wxSize(0, 0);
189 }
190
191 void CancelAllMouseRoute() override;
192 void InvalidateAllCanvasUndo() override;
193 void PositionConsole() override;
194 void InvalidateAllGL() override;
195 double GetBestVPScale(AbstractChart* arg) override {
196 auto chart = dynamic_cast<ChartBase*>(arg);
197 assert(chart);
198 return GetPrimaryCanvas()->GetBestVPScale(chart);
199 }
200
201 void DoStackUp(AbstractChartCanvas* cc) override;
202 void DoStackDown(AbstractChartCanvas* cc) override;
203 void LoadHarmonics() override;
204
205 bool DropMarker(bool atOwnShip = true) override;
206 double GetMag(double a, double lat, double lon) override;
207 void SetMasterToolbarItemState(int tool_id, bool state) override;
208 bool DoChartUpdate() override;
209 void ProcessCanvasResize() override;
210 bool SetGlobalToolbarViz(bool viz) override;
211 void ToggleQuiltMode(AbstractChartCanvas* acc) override {
212 auto cc = dynamic_cast<ChartCanvas*>(acc);
213 ToggleQuiltMode(cc);
214 }
215 void UpdateGlobalMenuItems(AbstractChartCanvas* acc) override {
216 UpdateGlobalMenuItems(dynamic_cast<ChartCanvas*>(acc));
217 }
218 void UpdateGlobalMenuItems() override;
219 void RefreshCanvasOther(AbstractChartCanvas* ccThis) override {
220 RefreshCanvasOther(dynamic_cast<ChartCanvas*>(ccThis));
221 }
222 virtual double* GetCOGTable() override { return COGTable; }
223 virtual void StartCogTimer() override {
224 FrameCOGTimer.Start(100, wxTIMER_CONTINUOUS);
225 }
226
227 wxWindow* GetPrimaryCanvasWindow() override { return GetPrimaryCanvas(); }
228 void ApplyGlobalSettings(bool bnewtoolbar) override;
229 void SetMenubarItemState(int item_id, bool state) override;
230 void ToggleColorScheme() override;
231 void ActivateMOB() override;
232 void ToggleTestPause() override;
233
234 void ToggleChartBar(AbstractChartCanvas* acc) override {
235 ToggleChartBar(dynamic_cast<ChartCanvas*>(acc));
236 }
237 void DoSettings() override;
238
239 void UpdateRotationState(double rotation) override;
240 void SetChartUpdatePeriod() override;
241 wxStatusBar* GetStatusBar() override { return wxFrame::GetStatusBar(); }
242 wxStatusBar* GetFrameStatusBar() const override { return m_pStatusBar; }
243 void SetENCDisplayCategory(AbstractChartCanvas* acc,
244 enum _DisCat nset) override {
245 SetENCDisplayCategory(dynamic_cast<ChartCanvas*>(acc), nset);
246 }
247 int GetCanvasIndexUnderMouse() override;
248
249 double GetCanvasRefScale() override {
250 return GetPrimaryCanvas()->GetVP().ref_scale;
251 ;
252 }
253
254#ifdef ocpnUSE_GL
255 void SendGlJsonConfigMsg() override {
256 if (GetPrimaryCanvas() && GetPrimaryCanvas()->GetglCanvas())
257 GetPrimaryCanvas()->GetglCanvas()->SendJSONConfigMessage();
258 }
259 bool CanAccelerateGlPanning() override {
260 return GetPrimaryCanvas()->GetglCanvas()->CanAcceleratePanning();
261 }
262 void SetupGlCompression() override {
263 GetPrimaryCanvas()->GetglCanvas()->SetupCompression();
264 }
265 wxString GetGlVersionString() override {
266 return GetPrimaryCanvas()->GetglCanvas()->GetVersionString();
267 }
268 wxGLCanvas* GetWxGlCanvas() override {
269 return GetPrimaryCanvas()->GetglCanvas();
270 }
271
272#else
273 void SendGlJsonConfigMsg() override {}
274 bool CanAccelerateGlPanning() override { return false; }
275 void SetupGlCompression() override {}
276 wxString GetGlVersionString() override { return ""; }
277 wxGLCanvas* GetWxGlCanvas() override { return nullptr; }
278#endif
279 void SwitchKBFocusCanvas(ChartCanvas* pCanvas);
280 int GetNextToolbarToolId() override {
281 return m_next_available_plugin_tool_id;
282 }
283 void SetToolbarItemBitmaps(int tool_id, wxBitmap* bitmap,
284 wxBitmap* bmpDisabled) override;
285 void SetToolbarItemSVG(int tool_id, wxString normalSVGfile,
286 wxString rolloverSVGfile,
287 wxString toggledSVGfile) override;
288 void UpdateAllFonts() override;
289 void ScheduleReconfigAndSettingsReload(bool reload, bool new_dialog) override;
290 void ScheduleReloadCharts() override;
291 void ChartsRefresh() override;
292 void FreezeCharts() override;
293 void ThawCharts() override;
294
295 void ScheduleDeleteSettingsDialog() override;
296
297 void BeforeUndoableAction(UndoType undo_type, RoutePoint* point,
298 UndoBeforePointerType pointer_type,
299 UndoItemPointer pointer) override {
300 if (!GetPrimaryCanvas()) return;
301 GetPrimaryCanvas()->undo->BeforeUndoableAction(undo_type, point,
302 pointer_type, pointer);
303 }
304
305 virtual void AfterUndoableAction(UndoItemPointer pointer) override {
306 GetPrimaryCanvas()->undo->AfterUndoableAction(pointer);
307 }
308 virtual void TouchAISActive() override;
309 virtual void UpdateAISMOBRoute(const AisTargetData* ptarget) override;
310 virtual void ActivateAISMOBRoute(const AisTargetData* ptarget) override;
311 void EnableSettingsTool(bool _enable) override {
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
449 void OnFrameTCTimer(wxTimerEvent& event);
450 void OnFrameCOGTimer(wxTimerEvent& event);
451
452 void HandleBasicNavMsg(std::shared_ptr<const BasicNavDataMsg> msg);
453 void HandleGPSWatchdogMsg(std::shared_ptr<const GPSWatchdogMsg> msg);
454
455 bool CheckGroup(int igroup);
456 bool SendJSON_WMM_Var_Request(double lat, double lon, wxDateTime date);
457
458 void DestroyPersistentDialogs();
459 void UpdateAISTool(void);
460 wxMenuBar* m_pMenuBar;
461 bool m_bTimeIsSet;
462
463 wxTimer InitTimer;
464 int m_iInitCount;
465 bool m_initializing;
466
467 wxTimer FrameTCTimer;
468 wxTimer FrameTimer1;
469 wxTimer FrameCOGTimer;
470 wxTimer MemFootTimer;
471 wxTimer m_resizeTimer;
472 wxTimer FrameTenHzTimer;
473
474 int m_BellsToPlay;
475 wxTimer BellsTimer;
476
477 wxGenericProgressDialog* Updateprog = nullptr;
478
479 // PlugIn support
480 void RequestNewToolbarArgEvent(wxCommandEvent& WXUNUSED(event)) {
481 return RequestNewMasterToolbar();
482 }
483
484 void UpdateGPSCompassStatusBoxes(bool b_force_new = false);
485
486 bool UpdateChartDatabaseInplace(ArrayOfCDI& DirArray, bool b_force,
487 bool b_prog,
488 const wxString& ChartListFileName);
489 void FinalizeChartDBUpdate();
490
491 bool m_bdefer_resize;
492 wxSize m_defer_size;
493 double COGTable[kMaxCogAverageSeconds];
494
495 void CreateCanvasLayout(bool b_useStoredSize = false);
496 void ReloadAllVP();
497 void SetCanvasSizes(wxSize frameSize);
498
499 ocpnToolBarSimple* CreateMasterToolbar();
500 void RequestNewMasterToolbar(bool bforcenew = true);
501 bool CheckAndAddPlugInTool();
502 bool AddDefaultPositionPlugInTools();
503
504 void UpdateCanvasConfigDescriptors();
505 void ScheduleSettingsDialog();
506 void ScheduleSettingsDialogNew();
507 static void StartRebuildChartDatabase();
508 void PositionIENCToolbar();
509
510 void InitAppMsgBusListener();
511 void InitApiListeners();
512 void ReleaseApiListeners();
513 void ConfigureStatusBar();
514
515private:
516 void ProcessUnitTest();
517 bool ProcessQuitFlag();
518 void ProcessDeferredTrackOn();
519 void SendFixToPlugins();
520 void ProcessAnchorWatch();
521 void ProcessLogAndBells();
522 void CalculateCOGAverage();
523 void CheckToolbarPosition();
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 ObsListener m_on_raise_listener;
587 ObsListener m_on_quit_listener;
588 ObsListener m_routes_update_listener;
589 ObsListener m_evt_drv_msg_listener;
590 ObsListener m_update_statusbar_listener;
591 ObsListener m_center_aistarget_listener;
592 ObsListener 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:173
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:542
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:108
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.
Define an action to be performed when a KeyProvider is notified.
Definition observable.h:257
Keeps listening over its lifespan, removes itself on destruction.
Definition observable.h:155
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.
Hooks into gui available in model.
General purpose GUI support.
GUI constant definitions.
A common variable shared between producer and consumer which supports Listen() and Notify().
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.