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.
100bool ShowNavWarning();
101
102void ApplyLocale(void);
103
109class MyFrame : public AbstractTopFrame, public S52PlibUtils {
110public:
111 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size,
112 RestServer& rest_server, wxAuiDefaultDockArt* pauidockart,
113 OpenFileFunc open_gpx_file);
114
115 ~MyFrame();
116
117 void SetGPSCompassScale() override;
118 void FastClose() override;
119 void RefreshAllCanvas(bool bErase = true) override;
120 void UpdateStatusBar() override;
121 void ToggleFullScreen() override;
122 Track* TrackOff(bool do_add_point = false) override;
123 void TrackOn(void) override;
124 void ProcessOptionsDialog(int resultFlags) override {
125 ProcessOptionsDialog(resultFlags, nullptr);
126 }
127
128 void SetAlertString(wxString msg) override {
129 GetPrimaryCanvas()->SetAlertString(msg);
130 }
131
132 void JumpToPosition(double lat, double lon) override {
133 if (!GetFocusCanvas()) return;
134 JumpToPosition(GetFocusCanvas(), lat, lon, GetFocusCanvas()->GetVPScale());
135 }
136
137 void JumpToPosition(double lat, double lon, double scale) override {
138 if (!GetFocusCanvas()) return;
139 JumpToPosition(GetFocusCanvas(), lat, lon, scale);
140 }
141
142 void JumpToPosition(AbstractChartCanvas* acc, double lat, double lon,
143 double scale) override {
144 if (!acc) return;
145 auto cc = dynamic_cast<ChartCanvas*>(acc);
146 assert(cc);
147 JumpToPosition(cc, lat, lon, scale);
148 }
149 void JumpToPosition(AbstractChartCanvas* acc, double lat,
150 double lon) override {
151 if (!acc) return;
152 auto cc = dynamic_cast<ChartCanvas*>(acc);
153 assert(cc);
154 JumpToPosition(cc, lat, lon, GetFocusCanvas()->GetVPScale());
155 }
156
157 AbstractChartCanvas* GetAbstractPrimaryCanvas() override {
158 return GetPrimaryCanvas();
159 }
160
161 AbstractChartCanvas* GetAbstractFocusCanvas() override {
162 return GetFocusCanvas();
163 }
164
165 void SwitchKBFocus(AbstractChartCanvas* acc) override {
166 return SwitchKBFocusCanvas(dynamic_cast<ChartCanvas*>(acc));
167 }
168
169 double GetCanvasTrueScale() override {
170 return GetPrimaryCanvas()->GetCanvasTrueScale();
171 }
172
173 double GetPixPerMM() override { return GetPrimaryCanvas()->GetPixPerMM(); }
174
175 double GetContentScaleFactor() override {
176 if (GetPrimaryCanvas())
177 return GetPrimaryCanvas()->GetContentScaleFactor();
178 else
179 return 1.0;
180 }
181
182 void RequestNewToolbars(bool bforcenew = false) override;
183
184 bool GetCanvasPointPix(double rlat, double rlon, wxPoint* r) override {
185 return GetFocusCanvas()->GetCanvasPointPix(rlat, rlon, r);
186 }
187
188 virtual wxSize GetFocusCanvasSize() override {
189 return GetFocusCanvas() ? GetFocusCanvas()->GetSize() : wxSize(0, 0);
190 }
191
192 void CancelAllMouseRoute() override;
193 void InvalidateAllCanvasUndo() override;
194 void PositionConsole() override;
195 void InvalidateAllGL() override;
196 double GetBestVPScale(AbstractChart* arg) override {
197 auto chart = dynamic_cast<ChartBase*>(arg);
198 assert(chart);
199 return GetPrimaryCanvas()->GetBestVPScale(chart);
200 }
201
202 void DoStackUp(AbstractChartCanvas* cc) override;
203 void DoStackDown(AbstractChartCanvas* cc) override;
204 void LoadHarmonics() override;
205
206 bool DropMarker(bool atOwnShip = true) override;
207 double GetMag(double a, double lat, double lon) override;
208 void SetMasterToolbarItemState(int tool_id, bool state) override;
209 bool DoChartUpdate() override;
210 void ProcessCanvasResize() override;
211 bool SetGlobalToolbarViz(bool viz) override;
212 void ToggleQuiltMode(AbstractChartCanvas* acc) override {
213 auto cc = dynamic_cast<ChartCanvas*>(acc);
214 ToggleQuiltMode(cc);
215 }
216 void UpdateGlobalMenuItems(AbstractChartCanvas* acc) override {
217 UpdateGlobalMenuItems(dynamic_cast<ChartCanvas*>(acc));
218 }
219 void UpdateGlobalMenuItems() override;
220 void RefreshCanvasOther(AbstractChartCanvas* ccThis) override {
221 RefreshCanvasOther(dynamic_cast<ChartCanvas*>(ccThis));
222 }
223 virtual double* GetCOGTable() override { return COGTable; }
224 virtual void StartCogTimer() override {
225 FrameCOGTimer.Start(100, wxTIMER_CONTINUOUS);
226 }
227
228 wxWindow* GetPrimaryCanvasWindow() override { return GetPrimaryCanvas(); }
229 void ApplyGlobalSettings(bool bnewtoolbar) override;
230 void SetMenubarItemState(int item_id, bool state) override;
231 void ToggleColorScheme() override;
232 void ActivateMOB() override;
233 void ToggleTestPause() override;
234
235 void ToggleChartBar(AbstractChartCanvas* acc) override {
236 ToggleChartBar(dynamic_cast<ChartCanvas*>(acc));
237 }
238 void DoSettings() override;
239
240 void UpdateRotationState(double rotation) override;
241 void SetChartUpdatePeriod() override;
242 wxStatusBar* GetStatusBar() override { return wxFrame::GetStatusBar(); }
243 wxStatusBar* GetFrameStatusBar() const override { return m_pStatusBar; }
244 void SetENCDisplayCategory(AbstractChartCanvas* acc,
245 enum _DisCat nset) override {
246 SetENCDisplayCategory(dynamic_cast<ChartCanvas*>(acc), nset);
247 }
248 int GetCanvasIndexUnderMouse() override;
249
250 double GetCanvasRefScale() override {
251 return GetPrimaryCanvas()->GetVP().ref_scale;
252 ;
253 }
254
255#ifdef ocpnUSE_GL
256 void SendGlJsonConfigMsg() override {
257 if (GetPrimaryCanvas() && GetPrimaryCanvas()->GetglCanvas())
258 GetPrimaryCanvas()->GetglCanvas()->SendJSONConfigMessage();
259 }
260 bool CanAccelerateGlPanning() override {
261 return GetPrimaryCanvas()->GetglCanvas()->CanAcceleratePanning();
262 }
263 void SetupGlCompression() override {
264 GetPrimaryCanvas()->GetglCanvas()->SetupCompression();
265 }
266 wxString GetGlVersionString() override {
267 return GetPrimaryCanvas()->GetglCanvas()->GetVersionString();
268 }
269 wxGLCanvas* GetWxGlCanvas() override {
270 return GetPrimaryCanvas()->GetglCanvas();
271 }
272
273#else
274 void SendGlJsonConfigMsg() override {}
275 bool CanAccelerateGlPanning() override { return false; }
276 void SetupGlCompression() override {}
277 wxString GetGlVersionString() override { return ""; }
278 wxGLCanvas* GetWxGlCanvas() override { return nullptr; }
279#endif
280 void SwitchKBFocusCanvas(ChartCanvas* pCanvas);
281 int GetNextToolbarToolId() override {
282 return m_next_available_plugin_tool_id;
283 }
284 void SetToolbarItemBitmaps(int tool_id, wxBitmap* bitmap,
285 wxBitmap* bmpDisabled) override;
286 void SetToolbarItemSVG(int tool_id, wxString normalSVGfile,
287 wxString rolloverSVGfile,
288 wxString toggledSVGfile) override;
289 void UpdateAllFonts() override;
290 void ScheduleReconfigAndSettingsReload(bool reload, bool new_dialog) override;
291 void ScheduleReloadCharts() override;
292 void ChartsRefresh() override;
293 void FreezeCharts() override;
294 void ThawCharts() override;
295
296 void ScheduleDeleteSettingsDialog() override;
297
298 void BeforeUndoableAction(UndoType undo_type, RoutePoint* point,
299 UndoBeforePointerType pointer_type,
300 UndoItemPointer pointer) override {
301 if (!GetPrimaryCanvas()) return;
302 GetPrimaryCanvas()->undo->BeforeUndoableAction(undo_type, point,
303 pointer_type, pointer);
304 }
305
306 virtual void AfterUndoableAction(UndoItemPointer pointer) override {
307 GetPrimaryCanvas()->undo->AfterUndoableAction(pointer);
308 }
309 virtual void TouchAISActive() override;
310 virtual void UpdateAISMOBRoute(const AisTargetData* ptarget) override;
311 virtual void ActivateAISMOBRoute(const AisTargetData* ptarget) override;
312 void EnableSettingsTool(bool _enable) override {
313 if (m_pMenuBar) m_pMenuBar->Enable(wxID_PREFERENCES, _enable);
314 if (g_MainToolbar) {
315 g_MainToolbar->EnableTool(ID_SETTINGS, _enable);
316 g_MainToolbar->GetToolbar()->SetDirty(true);
317 g_MainToolbar->RefreshToolbar();
318 }
319 }
320 void OnToolLeftClick(wxCommandEvent& event) override;
321
322 bool DisableTbarTooltips();
323 void EnableTbarTooltips();
324 void HideTbarTooltip();
325
326 void SetENCDisplayCategory(ChartCanvas* cc, enum _DisCat nset);
327 void ToggleQuiltMode(ChartCanvas* cc);
328
329 wxFont* GetFont(wxFont* font, double scale) override;
330 wxFont* GetDefaultFont(wxString label, int Ptsize) override;
331 wxFont* GetScaledFont(int pointSize, wxFontFamily family, wxFontStyle style,
332 wxFontWeight weight, const wxString faceName,
333 double scale) override;
334
335 int GetApplicationMemoryUse(void);
336
337 void OnEraseBackground(wxEraseEvent& event);
338 void OnMaximize(wxMaximizeEvent& event);
339 void OnCloseWindow(wxCloseEvent& event);
340 void OnExit(wxCommandEvent& event);
341 void OnSize(wxSizeEvent& event);
342 void OnMove(wxMoveEvent& event);
343 void OnInitTimer(wxTimerEvent& event);
344
353 void OnFrameTimer1(wxTimerEvent& event);
354
355 void OnEvtPlugInMessage(OCPN_MsgEvent& event);
356 void OnMemFootTimer(wxTimerEvent& event);
357 void OnRecaptureTimer(wxTimerEvent& event);
358 void OnSENCEvtThread(OCPN_BUILDSENC_ThreadEvent& event);
359 void OnIconize(wxIconizeEvent& event);
360 void OnBellsFinished(wxCommandEvent& event);
361
373 void OnFrameTenHzTimer(wxTimerEvent& event);
374
375#ifdef wxHAS_POWER_EVENTS
376 void OnSuspending(wxPowerEvent& event);
377 void OnSuspended(wxPowerEvent& event);
378 void OnSuspendCancel(wxPowerEvent& event);
379 void OnResume(wxPowerEvent& event);
380#endif // wxHAS_POWER_EVENTS
381
382 void RefreshCanvasOther(ChartCanvas* ccThis);
383 void selectChartDisplay(int type, int family);
384 void applySettingsString(wxString settings);
385 void setStringVP(wxString VPS);
386 void InvalidateAllQuilts();
387
388 void SetUpMode(ChartCanvas* cc, int mode);
389
390 ChartCanvas* GetPrimaryCanvas();
391 ChartCanvas* GetFocusCanvas();
392 void DoStackUp(ChartCanvas* cc);
393 void DoStackDown(ChartCanvas* cc);
394 void NotifyChildrenResize();
395
396 void DoStackDelta(ChartCanvas* cc, int direction);
397 void DoSettingsNew(void);
398 ChartCanvas* GetCanvasUnderMouse();
399
400 void TriggerRecaptureTimer();
401
402 void MouseEvent(wxMouseEvent& event);
403 void CenterView(ChartCanvas* cc, const LLBBox& bbox);
404
405 void JumpToPosition(ChartCanvas* cc, double lat, double lon, double scale);
406
407 void BuildMenuBar(void);
408 void RegisterGlobalMenuItems();
409 void UpdateGlobalMenuItems(ChartCanvas* cc);
410 void DoOptionsDialog();
411 void ProcessOptionsDialog(int resultFlags, ArrayOfCDI* pNewDirArray);
412 void PrepareOptionsClose(options* settings, int settings_return_value);
413
414 void DoPrint(void);
415 void ToggleDataQuality(ChartCanvas* cc);
416 void TogglebFollow(ChartCanvas* cc);
417 void ToggleChartBar(ChartCanvas* cc);
418 void SetbFollow(ChartCanvas* cc);
419 void ClearbFollow(ChartCanvas* cc);
420 void ToggleChartOutlines(ChartCanvas* cc);
421 void ToggleENCText(ChartCanvas* cc);
422 void ToggleSoundings(ChartCanvas* cc);
423#if 0
424 void ToggleRocks(void);
425#endif
426 bool ToggleLights(ChartCanvas* cc);
427 void ToggleAnchor(ChartCanvas* cc);
428 void ToggleAISDisplay(ChartCanvas* cc);
429 void ToggleAISMinimizeTargets(ChartCanvas* cc);
430
431 void ToggleNavobjects(ChartCanvas* cc);
432
433 void TrackDailyRestart(void);
434 bool ShouldRestartTrack();
435 void InitializeTrackRestart();
436
437 void UpdateControlBar(ChartCanvas* cc);
438
439 void SubmergeAllCanvasToolbars(void);
440 void SurfaceAllCanvasToolbars(void);
441 void SetAllToolbarScale(void);
442
443 void RefreshGroupIndices(void);
444
445 double GetBestVPScale(ChartBase* pchart);
446
447 DataMonitor* GetDataMonitor() const { return m_data_monitor; }
448
449 void SetAndApplyColorScheme(ColorScheme cs);
450
451 void OnFrameTCTimer(wxTimerEvent& event);
452 void OnFrameCOGTimer(wxTimerEvent& event);
453
454 void HandleBasicNavMsg(std::shared_ptr<const BasicNavDataMsg> msg);
455 void HandleGPSWatchdogMsg(std::shared_ptr<const GPSWatchdogMsg> msg);
456
457 bool CheckGroup(int igroup);
458 bool SendJSON_WMM_Var_Request(double lat, double lon, wxDateTime date);
459
460 void DestroyPersistentDialogs();
461 void UpdateAISTool(void);
462 wxMenuBar* m_pMenuBar;
463 bool m_bTimeIsSet;
464
465 wxTimer InitTimer;
466 int m_iInitCount;
467 bool m_initializing;
468
469 wxTimer FrameTCTimer;
470 wxTimer FrameTimer1;
471 wxTimer FrameCOGTimer;
472 wxTimer MemFootTimer;
473 wxTimer m_resizeTimer;
474 wxTimer FrameTenHzTimer;
475
476 int m_BellsToPlay;
477 wxTimer BellsTimer;
478
479 wxGenericProgressDialog* Updateprog = nullptr;
480
481 // PlugIn support
482 void RequestNewToolbarArgEvent(wxCommandEvent& WXUNUSED(event)) {
483 return RequestNewMasterToolbar();
484 }
485
486 void UpdateGPSCompassStatusBoxes(bool b_force_new = false);
487
488 bool UpdateChartDatabaseInplace(ArrayOfCDI& DirArray, bool b_force,
489 bool b_prog,
490 const wxString& ChartListFileName);
491 void FinalizeChartDBUpdate();
492
493 bool m_bdefer_resize;
494 wxSize m_defer_size;
495 double COGTable[kMaxCogAverageSeconds];
496
497 void CreateCanvasLayout(bool b_useStoredSize = false);
498 void ReloadAllVP();
499 void SetCanvasSizes(wxSize frameSize);
500
501 ocpnToolBarSimple* CreateMasterToolbar();
502 void RequestNewMasterToolbar(bool bforcenew = true);
503 bool CheckAndAddPlugInTool();
504 bool AddDefaultPositionPlugInTools();
505
506 void UpdateCanvasConfigDescriptors();
507 void ScheduleSettingsDialog();
508 void ScheduleSettingsDialogNew();
509 static bool StartRebuildChartDatabase();
510 void PositionIENCToolbar();
511
512 void InitAppMsgBusListener();
513 void InitApiListeners();
514 void ReleaseApiListeners();
515 void ConfigureStatusBar();
516
517private:
518 void ProcessUnitTest();
519 bool ProcessQuitFlag();
520 void ProcessDeferredTrackOn();
521 void SendFixToPlugins();
522 void ProcessAnchorWatch();
523 void ProcessLogAndBells();
524 void CalculateCOGAverage();
525 void CheckToolbarPosition();
526
527 void ODoSetSize(void);
528 void DoCOGSet(void);
529
530 void UpdateAllToolbars(ColorScheme cs);
531
532 void FilterCogSog(void);
533
534 void ApplyGlobalColorSchemetoStatusBar(void);
535
536 bool ScrubGroupArray();
537
538 void OnToolbarAnimateTimer(wxTimerEvent& event);
539 bool CollapseGlobalToolbar();
540
541 int m_StatusBarFieldCount;
542
543 wxDateTime m_MMEAeventTime;
544 unsigned long m_ulLastNMEATicktime;
545 int m_tick_idx;
546 wxDateTime m_fix_start_time;
547
548 wxString m_last_reported_chart_name;
549 wxString m_last_reported_chart_pubdate;
550
551 wxString m_lastAISiconName;
552
553 // Plugin Support
554 int m_next_available_plugin_tool_id;
555
556 double COGFilterTable[kMaxCogsogFilterSeconds];
557 double SOGFilterTable[kMaxCogsogFilterSeconds];
558
559 int m_ChartUpdatePeriod;
560 bool m_last_bGPSValid;
561 bool m_last_bVelocityValid;
562 double m_last_hdt;
563
564 wxString prev_locale;
565
573 time_t m_fixtime;
574 bool b_autofind;
575
576 wxDateTime m_target_rotate_time;
577
578 wxTimer ToolbarAnimateTimer;
579 int m_nMasterToolCountShown;
580 wxTimer m_recaptureTimer;
581
582 std::unique_ptr<LoadErrorsDlgCtrl> m_load_errors_dlg_ctrl;
583 wxString m_gshhg_chart_loc;
584
585private:
586 ObservableListener listener_basic_navdata;
587 ObservableListener listener_gps_watchdog;
588 obs::Listener m_on_raise_listener;
589 obs::Listener m_on_quit_listener;
590 obs::Listener m_routes_update_listener;
591 obs::Listener m_evt_drv_msg_listener;
592 obs::Listener m_update_statusbar_listener;
593 obs::Listener m_center_aistarget_listener;
594 obs::Listener m_reload_charts_listener;
595 ToolbarDlgCallbacks m_toolbar_callbacks;
596
597 wxStatusBar* m_pStatusBar;
598 ConnectionsDlg* m_connections_dlg;
599 bool m_need_new_options;
600 wxArrayString pathArray;
601 double restoreScale[4];
602 unsigned int last_canvasConfig;
603 DataMonitor* m_data_monitor;
604 wxAuiDefaultDockArt* m_pauidockart;
605 RestServer& m_rest_server;
606 OpenFileFunc m_open_gpx_file;
607
608 void CenterAisTarget(const std::shared_ptr<const AisTargetData>& ais_target);
609
610 DECLARE_EVENT_TABLE()
611};
612
613#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:109
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.
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.
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.