30#include <wx/dcmemory.h>
32#include <wx/glcanvas.h>
33#include <wx/notebook.h>
37#include "model/ais_decoder.h"
39#include "model/idents.h"
40#include "model/multiplexer.h"
41#include "model/own_ship.h"
43#include "model/route.h"
44#include "model/track.h"
51#include "glChartCanvas.h"
55#include "OCPN_AUIManager.h"
56#include "ocpn_frame.h"
57#include "OCPNPlatform.h"
61#include "pluginmanager.h"
62#include "routemanagerdialog.h"
63#include "routeman_gui.h"
65#include "SoundFactory.h"
67#include "SystemCmdSound.h"
69#include "waypointman_gui.h"
75#if wxUSE_XLOCALE || !wxCHECK_VERSION(3, 0, 0)
76extern wxLocale* plocale_def_lang;
85extern bool g_bShowChartBar;
89extern RouteList* pRouteList;
90extern std::vector<Track*> g_TrackList;
92extern s52plib* ps52plib;
93extern wxString ChartListFileName;
95extern ColorScheme global_color_scheme;
96extern wxArrayString g_locale_catalog_array;
97extern int g_GUIScaleFactor;
98extern int g_ChartScaleFactor;
102extern int g_chart_zoom_modifier_raster;
103extern int g_chart_zoom_modifier_vector;
105extern bool g_bopengl;
107extern ChartGroupArray* g_pGroupArray;
110extern unsigned int g_canvasConfig;
112extern wxString g_CmdSoundString;
114unsigned int gs_plib_flags;
117extern bool g_bquiting;
118extern bool g_disable_main_toolbar;
119extern bool g_btenhertz;
121WX_DEFINE_ARRAY_PTR(
ChartCanvas*, arrayofCanvasPtr);
122extern arrayofCanvasPtr g_canvasArray;
124void NotifySetupOptionsPlugin(
const PlugInData* pic);
138int InsertPlugInTool(wxString label, wxBitmap* bitmap, wxBitmap* bmpRollover,
139 wxItemKind kind, wxString shortHelp, wxString longHelp,
140 wxObject* clientData,
int position,
int tool_sel,
143 return s_ppim->AddToolbarTool(label, bitmap, bmpRollover, kind, shortHelp,
144 longHelp, clientData, position, tool_sel,
150void RemovePlugInTool(
int tool_id) {
151 if (s_ppim) s_ppim->RemoveToolbarTool(tool_id);
154void SetToolbarToolViz(
int item,
bool viz) {
155 if (s_ppim) s_ppim->SetToolbarToolViz(item, viz);
158void SetToolbarItemState(
int item,
bool toggle) {
159 if (s_ppim) s_ppim->SetToolbarItemState(item, toggle);
162void SetToolbarToolBitmaps(
int item, wxBitmap* bitmap, wxBitmap* bmpRollover) {
163 if (s_ppim) s_ppim->SetToolbarItemBitmaps(item, bitmap, bmpRollover);
166int InsertPlugInToolSVG(wxString label, wxString SVGfile,
167 wxString SVGfileRollover, wxString SVGfileToggled,
168 wxItemKind kind, wxString shortHelp, wxString longHelp,
169 wxObject* clientData,
int position,
int tool_sel,
172 return s_ppim->AddToolbarTool(label, SVGfile, SVGfileRollover,
173 SVGfileToggled, kind, shortHelp, longHelp,
174 clientData, position, tool_sel, pplugin);
179void SetToolbarToolBitmapsSVG(
int item, wxString SVGfile,
180 wxString SVGfileRollover,
181 wxString SVGfileToggled) {
183 s_ppim->SetToolbarItemBitmaps(item, SVGfile, SVGfileRollover,
191 return s_ppim->AddCanvasContextMenuItem(pitem, pplugin, name);
196void SetCanvasMenuItemViz(
int item,
bool viz,
const char* name) {
197 if (s_ppim) s_ppim->SetCanvasContextMenuItemViz(item, viz, name);
200void SetCanvasMenuItemGrey(
int item,
bool grey,
const char* name) {
201 if (s_ppim) s_ppim->SetCanvasContextMenuItemGrey(item, grey, name);
204void RemoveCanvasMenuItem(
int item,
const char* name) {
205 if (s_ppim) s_ppim->RemoveCanvasContextMenuItem(item, name);
208int AddCanvasContextMenuItem(wxMenuItem* pitem,
opencpn_plugin* pplugin) {
210 return AddCanvasMenuItem(pitem, pplugin,
"");
213void SetCanvasContextMenuItemViz(
int item,
bool viz) {
214 SetCanvasMenuItemViz(item, viz);
217void SetCanvasContextMenuItemGrey(
int item,
bool grey) {
218 SetCanvasMenuItemGrey(item, grey);
221void RemoveCanvasContextMenuItem(
int item) { RemoveCanvasMenuItem(item); }
224wxFileConfig* GetOCPNConfigObject(
void) {
226 return reinterpret_cast<wxFileConfig*
>(
232wxWindow* GetOCPNCanvasWindow() {
233 wxWindow* pret = NULL;
235 MyFrame* pFrame = s_ppim->GetParentFrame();
236 pret = (wxWindow*)pFrame->GetPrimaryCanvas();
241void RequestRefresh(wxWindow* win) {
242 if (win) win->Refresh(
true);
245void GetCanvasPixLL(
PlugIn_ViewPort* vp, wxPoint* pp,
double lat,
double lon) {
248 ocpn_vp.
clat = vp->clat;
249 ocpn_vp.
clon = vp->clon;
250 ocpn_vp.m_projection_type = vp->m_projection_type;
252 ocpn_vp.
skew = vp->skew;
262void GetDoubleCanvasPixLL(
PlugIn_ViewPort* vp, wxPoint2DDouble* pp,
double lat,
266 ocpn_vp.
clat = vp->clat;
267 ocpn_vp.
clon = vp->clon;
268 ocpn_vp.m_projection_type = vp->m_projection_type;
270 ocpn_vp.
skew = vp->skew;
282 ocpn_vp.
clat = vp->clat;
283 ocpn_vp.
clon = vp->clon;
284 ocpn_vp.m_projection_type = vp->m_projection_type;
286 ocpn_vp.
skew = vp->skew;
294bool GetGlobalColor(wxString colorName, wxColour* pcolour) {
295 wxColour c = GetGlobalColor(colorName);
302 return FontMgr::Get().
GetFont(TextElement, default_size);
305wxFont* GetOCPNScaledFont_PlugIn(wxString TextElement,
int default_size) {
309double GetOCPNGUIToolScaleFactor_PlugIn(
int GUIScaleFactor) {
310 return g_Platform->GetToolbarScaleFactor(GUIScaleFactor);
313double GetOCPNGUIToolScaleFactor_PlugIn() {
314 return g_Platform->GetToolbarScaleFactor(g_GUIScaleFactor);
317float GetOCPNChartScaleFactor_Plugin() {
318 return g_Platform->GetChartScaleFactorExp(g_ChartScaleFactor);
326 return FontMgr::Get().
AddAuxKey(TextElement);
329wxString GetActiveStyleName() {
331 return g_StyleManager->GetCurrentStyle()->name;
336wxBitmap GetBitmapFromSVGFile(wxString filename,
unsigned int width,
337 unsigned int height) {
338 wxBitmap bmp = LoadSVG(filename, width, height);
346 SVGDocumentPixelSize(filename, w, h);
347 if (w == 0 || h == 0) {
354 return LoadSVG(filename, w, h);
358bool IsTouchInterface_PlugIn(
void) {
return g_btouch; }
364wxString* GetpSharedDataLocation(
void) {
365 return g_Platform->GetSharedDataDirPtr();
368ArrayOfPlugIn_AIS_Targets* GetAISTargetArray(
void) {
369 if (!g_pAIS)
return NULL;
371 ArrayOfPlugIn_AIS_Targets* pret =
new ArrayOfPlugIn_AIS_Targets;
374 for (
const auto& it : g_pAIS->GetTargetList()) {
383 td.n_alarm_state = AIS_ALARM_SET;
390wxAuiManager* GetFrameAuiManager(
void) {
return g_pauimgr; }
392void SendPluginMessage(wxString message_id, wxString message_body) {
393 SendMessageToAllPlugins(message_id, message_body);
401 Nevent.SetID(message_id);
402 Nevent.SetJSONText(message_body);
403 gFrame->GetEventHandler()->AddPendingEvent(Nevent);
406void DimeWindow(wxWindow* win) { DimeControl(win); }
408void JumpToPosition(
double lat,
double lon,
double scale) {
409 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), lat, lon,
scale);
413bool AddLocaleCatalog(wxString catalog) {
414#if wxUSE_XLOCALE || !wxCHECK_VERSION(3, 0, 0)
416 if (plocale_def_lang) {
418 g_locale_catalog_array.Add(catalog);
420 return plocale_def_lang->AddCatalog(catalog);
426wxString GetLocaleCanonicalName() {
return g_locale; }
429void PushNMEABuffer(wxString buf) {
430 std::string full_sentence = buf.ToStdString();
432 if ((full_sentence[0] ==
'$') || (full_sentence[0] ==
'!')) {
433 std::string identifier;
435 identifier = full_sentence.substr(1, 5);
439 auto address = std::make_shared<NavAddr0183>(
"virtual");
441 std::make_shared<const Nmea0183Msg>(identifier, full_sentence, address);
442 auto msg_all = std::make_shared<const Nmea0183Msg>(*msg,
"ALL");
444 auto& msgbus = NavMsgBus::GetInstance();
446 msgbus.Notify(std::move(msg));
447 msgbus.Notify(std::move(msg_all));
452wxXmlDocument GetChartDatabaseEntryXML(
int dbIndex,
bool b_getGeom) {
453 wxXmlDocument doc = ChartData->GetXMLDescription(dbIndex, b_getGeom);
458bool UpdateChartDBInplace(wxArrayString dir_array,
bool b_force_update,
459 bool b_ProgressDialog) {
461 ArrayOfCDI ChartDirArray;
462 for (
unsigned int i = 0; i < dir_array.GetCount(); i++) {
463 wxString dirname = dir_array[i];
465 cdi.fullpath = dirname;
466 cdi.magic_number = _T(
"");
467 ChartDirArray.Add(cdi);
469 bool b_ret = gFrame->UpdateChartDatabaseInplace(ChartDirArray, b_force_update,
471 ChartData->GetDBFileName());
472 gFrame->ChartsRefresh();
476wxArrayString GetChartDBDirArrayString() {
477 return ChartData->GetChartDirArrayString();
480int AddChartToDBInPlace(wxString& full_path,
bool b_RefreshCanvas) {
482 wxFileName fn(full_path);
483 wxString fdir = fn.GetPath();
487 bret = ChartData->AddSingleChart(full_path);
491 pConfig->UpdateChartDirs(ChartData->GetChartDirArray());
492 ChartData->SaveBinary(ChartListFileName);
495 ArrayOfCDI XnewChartDirArray;
496 pConfig->LoadChartDirArray(XnewChartDirArray);
499 ChartData->
LoadBinary(ChartListFileName, XnewChartDirArray);
502 if (g_pGroupArray) ChartData->ApplyGroupArray(g_pGroupArray);
504 if (g_options && g_options->IsShown())
505 g_options->UpdateDisplayedChartDirList(ChartData->GetChartDirArray());
507 if (b_RefreshCanvas || !gFrame->GetPrimaryCanvas()->GetQuiltMode()) {
508 gFrame->ChartsRefresh();
515int RemoveChartFromDBInPlace(wxString& full_path) {
518 bret = ChartData->RemoveSingleChart(full_path);
521 pConfig->UpdateChartDirs(ChartData->GetChartDirArray());
522 ChartData->SaveBinary(ChartListFileName);
525 ArrayOfCDI XnewChartDirArray;
526 pConfig->LoadChartDirArray(XnewChartDirArray);
529 ChartData->
LoadBinary(ChartListFileName, XnewChartDirArray);
532 if (g_pGroupArray) ChartData->ApplyGroupArray(g_pGroupArray);
534 if (g_options && g_options->IsShown())
535 g_options->UpdateDisplayedChartDirList(ChartData->GetChartDirArray());
537 gFrame->ChartsRefresh();
546wxScrolledWindow* AddOptionsPage(OptionsParentPI parent, wxString title) {
547 if (!g_pOptions)
return NULL;
551 case PI_OPTIONS_PARENT_DISPLAY:
552 parentid = g_pOptions->m_pageDisplay;
554 case PI_OPTIONS_PARENT_CONNECTIONS:
555 parentid = g_pOptions->m_pageConnections;
557 case PI_OPTIONS_PARENT_CHARTS:
558 parentid = g_pOptions->m_pageCharts;
560 case PI_OPTIONS_PARENT_SHIPS:
561 parentid = g_pOptions->m_pageShips;
563 case PI_OPTIONS_PARENT_UI:
564 parentid = g_pOptions->m_pageUI;
566 case PI_OPTIONS_PARENT_PLUGINS:
567 parentid = g_pOptions->m_pagePlugins;
571 _T(
"Error in PluginManager::AddOptionsPage: Unknown parent"));
576 return g_pOptions->AddPage(parentid, title);
579bool DeleteOptionsPage(wxScrolledWindow* page) {
580 if (!g_pOptions)
return false;
581 return g_pOptions->DeletePluginPage(page);
585 wxString* accumulator) {
586 if (!pos)
return false;
589 AisError nerr = AIS_GENERIC_ERROR;
590 if (g_pAIS) nerr = g_pAIS->DecodeSingleVDO(str, &gpd, accumulator);
591 if (nerr == AIS_NoError) {
610int GetChartbarHeight(
void) {
612 if (g_bShowChartBar) {
614 if (cc && cc->GetPiano()) {
615 val = cc->GetPiano()->GetHeight();
621bool GetRoutepointGPX(
RoutePoint* pRoutePoint,
char* buffer,
622 unsigned int buffer_length) {
626 pgpx->AddGPXWaypoint(pRoutePoint);
627 wxString gpxfilename = wxFileName::CreateTempFileName(wxT(
"gpx"));
628 pgpx->SaveFile(gpxfilename);
631 wxFFile gpxfile(gpxfilename);
633 if (gpxfile.ReadAll(&s)) {
634 if (s.Length() < buffer_length) {
635 strncpy(buffer, (
const char*)s.mb_str(wxConvUTF8), buffer_length - 1);
641 ::wxRemoveFile(gpxfilename);
646bool GetActiveRoutepointGPX(
char* buffer,
unsigned int buffer_length) {
647 if (g_pRouteMan->IsAnyRouteActive())
648 return GetRoutepointGPX(g_pRouteMan->GetpActivePoint(), buffer,
654void PositionBearingDistanceMercator_Plugin(
double lat,
double lon,
double brg,
655 double dist,
double* dlat,
657 PositionBearingDistanceMercator(lat, lon, brg, dist, dlat, dlon);
660void DistanceBearingMercator_Plugin(
double lat0,
double lon0,
double lat1,
661 double lon1,
double* brg,
double* dist) {
662 DistanceBearingMercator(lat0, lon0, lat1, lon1, brg, dist);
665double DistGreatCircle_Plugin(
double slat,
double slon,
double dlat,
667 return DistGreatCircle(slat, slon, dlat, dlon);
670void toTM_Plugin(
float lat,
float lon,
float lat0,
float lon0,
double* x,
672 toTM(lat, lon, lat0, lon0, x, y);
675void fromTM_Plugin(
double x,
double y,
double lat0,
double lon0,
double* lat,
677 fromTM(x, y, lat0, lon0, lat, lon);
680void toSM_Plugin(
double lat,
double lon,
double lat0,
double lon0,
double* x,
682 toSM(lat, lon, lat0, lon0, x, y);
685void fromSM_Plugin(
double x,
double y,
double lat0,
double lon0,
double* lat,
687 fromSM(x, y, lat0, lon0, lat, lon);
690void toSM_ECC_Plugin(
double lat,
double lon,
double lat0,
double lon0,
691 double* x,
double* y) {
692 toSM_ECC(lat, lon, lat0, lon0, x, y);
695void fromSM_ECC_Plugin(
double x,
double y,
double lat0,
double lon0,
696 double* lat,
double* lon) {
697 fromSM_ECC(x, y, lat0, lon0, lat, lon);
700double toUsrDistance_Plugin(
double nm_distance,
int unit) {
701 return toUsrDistance(nm_distance,
unit);
704double fromUsrDistance_Plugin(
double usr_distance,
int unit) {
705 return fromUsrDistance(usr_distance,
unit);
708double toUsrSpeed_Plugin(
double kts_speed,
int unit) {
709 return toUsrSpeed(kts_speed,
unit);
712double toUsrWindSpeed_Plugin(
double kts_speed,
int unit) {
713 return toUsrWindSpeed(kts_speed,
unit);
716double fromUsrSpeed_Plugin(
double usr_speed,
int unit) {
717 return fromUsrSpeed(usr_speed,
unit);
720double fromUsrWindSpeed_Plugin(
double usr_wspeed,
int unit) {
721 return fromUsrWindSpeed(usr_wspeed,
unit);
724double toUsrTemp_Plugin(
double cel_temp,
int unit) {
725 return toUsrTemp(cel_temp,
unit);
728double fromUsrTemp_Plugin(
double usr_temp,
int unit) {
729 return fromUsrTemp(usr_temp,
unit);
732wxString getUsrDistanceUnit_Plugin(
int unit) {
733 return getUsrDistanceUnit(
unit);
736wxString getUsrSpeedUnit_Plugin(
int unit) {
return getUsrSpeedUnit(
unit); }
738wxString getUsrWindSpeedUnit_Plugin(
int unit) {
739 return getUsrWindSpeedUnit(
unit);
742wxString getUsrTempUnit_Plugin(
int unit) {
return getUsrTempUnit(
unit); }
744bool PlugIn_GSHHS_CrossesLand(
double lat1,
double lon1,
double lat2,
746 static bool loaded =
false;
748 gshhsCrossesLandInit();
752 return gshhsCrossesLand(lat1, lon1, lat2, lon2);
764PlugIn_Waypoint::PlugIn_Waypoint() { m_HyperlinkList = NULL; }
766PlugIn_Waypoint::PlugIn_Waypoint(
double lat,
double lon,
767 const wxString& icon_ident,
768 const wxString& wp_name,
769 const wxString& GUID) {
770 wxDateTime now = wxDateTime::Now();
771 m_CreateTime = now.ToUTC();
772 m_HyperlinkList = NULL;
776 m_IconName = icon_ident;
777 m_MarkName = wp_name;
781PlugIn_Waypoint::~PlugIn_Waypoint() {}
784PlugIn_Route::PlugIn_Route(
void) { pWaypointList =
new Plugin_WaypointList; }
786PlugIn_Route::~PlugIn_Route(
void) {
787 pWaypointList->DeleteContents(
false);
788 pWaypointList->Clear();
790 delete pWaypointList;
794PlugIn_Track::PlugIn_Track(
void) { pWaypointList =
new Plugin_WaypointList; }
796PlugIn_Track::~PlugIn_Track(
void) {
797 pWaypointList->DeleteContents(
false);
798 pWaypointList->Clear();
800 delete pWaypointList;
803wxString GetNewGUID(
void) {
return GpxDocument::GetUUID(); }
805bool AddCustomWaypointIcon(wxBitmap* pimage, wxString key,
806 wxString description) {
807 wxImage image = pimage->ConvertToImage();
808 WayPointmanGui(*pWayPointMan).ProcessIcon(image, key, description);
814 if (src->m_HyperlinkList ==
nullptr)
return;
816 if (src->m_HyperlinkList->GetCount() > 0) {
817 wxPlugin_HyperlinkListNode* linknode = src->m_HyperlinkList->GetFirst();
822 h->DescrText = link->DescrText;
823 h->Link = link->Link;
824 h->LType = link->Type;
826 dst->m_HyperlinkList->Append(h);
828 linknode = linknode->GetNext();
838 bool b_unique =
true;
839 wxRoutePointListNode* prpnode = pWayPointMan->GetWaypointList()->GetFirst();
843 if (prp->m_GUID == pwaypoint->m_GUID) {
847 prpnode = prpnode->GetNext();
850 if (!b_unique)
return false;
853 new RoutePoint(pwaypoint->m_lat, pwaypoint->m_lon, pwaypoint->m_IconName,
854 pwaypoint->m_MarkName, pwaypoint->m_GUID);
856 pWP->m_bIsolatedMark =
true;
858 cloneHyperlinkList(pWP, pwaypoint);
860 pWP->m_MarkDescription = pwaypoint->m_MarkDescription;
862 if (pwaypoint->m_CreateTime.IsValid())
863 pWP->SetCreateTime(pwaypoint->m_CreateTime);
865 wxDateTime dtnow(wxDateTime::Now());
866 pWP->SetCreateTime(dtnow);
869 pWP->m_btemp = (b_permanent ==
false);
871 pSelect->AddSelectableRoutePoint(pwaypoint->m_lat, pwaypoint->m_lon, pWP);
872 if (b_permanent) pConfig->AddNewWayPoint(pWP, -1);
874 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
875 pRouteManagerDialog->UpdateWptListCtrl();
880bool DeleteSingleWaypoint(wxString& GUID) {
882 bool b_found =
false;
883 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(GUID);
885 if (prp) b_found =
true;
888 pWayPointMan->DestroyWaypoint(prp);
889 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
890 pRouteManagerDialog->UpdateWptListCtrl();
898 bool b_found =
false;
899 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(pwaypoint->m_GUID);
901 if (prp) b_found =
true;
904 double lat_save = prp->m_lat;
905 double lon_save = prp->m_lon;
907 prp->m_lat = pwaypoint->m_lat;
908 prp->m_lon = pwaypoint->m_lon;
909 prp->SetIconName(pwaypoint->m_IconName);
910 prp->SetName(pwaypoint->m_MarkName);
911 prp->m_MarkDescription = pwaypoint->m_MarkDescription;
912 prp->SetVisible(pwaypoint->m_IsVisible);
913 if (pwaypoint->m_CreateTime.IsValid())
914 prp->SetCreateTime(pwaypoint->m_CreateTime);
918 if (pwaypoint->m_HyperlinkList) {
919 prp->m_HyperlinkList->Clear();
920 if (pwaypoint->m_HyperlinkList->GetCount() > 0) {
921 wxPlugin_HyperlinkListNode* linknode =
922 pwaypoint->m_HyperlinkList->GetFirst();
927 h->DescrText = link->DescrText;
928 h->Link = link->Link;
929 h->LType = link->Type;
931 prp->m_HyperlinkList->Append(h);
933 linknode = linknode->GetNext();
938 if (prp) prp->ReLoadIcon();
940 auto canvas = gFrame->GetPrimaryCanvas();
941 SelectCtx ctx(canvas->m_bShowNavobjects, canvas->GetCanvasTrueScale(),
942 canvas->GetScaleValue());
944 pSelect->FindSelection(ctx, lat_save, lon_save, SELTYPE_ROUTEPOINT);
946 pFind->m_slat = pwaypoint->m_lat;
947 pFind->m_slon = pwaypoint->m_lon;
950 if (!prp->m_btemp) pConfig->UpdateWayPoint(prp);
952 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
953 pRouteManagerDialog->UpdateWptListCtrl();
962 dst->m_lat = src->m_lat;
963 dst->m_lon = src->m_lon;
964 dst->m_IconName = src->GetIconName();
965 dst->m_MarkName = src->GetName();
966 dst->m_MarkDescription = src->m_MarkDescription;
967 dst->m_IsVisible = src->IsVisible();
968 dst->m_CreateTime = src->GetCreateTime();
969 dst->m_GUID = src->m_GUID;
972 if (src->m_HyperlinkList ==
nullptr)
return;
974 delete dst->m_HyperlinkList;
975 dst->m_HyperlinkList =
nullptr;
977 if (src->m_HyperlinkList->GetCount() > 0) {
978 dst->m_HyperlinkList =
new Plugin_HyperlinkList;
980 wxHyperlinkListNode* linknode = src->m_HyperlinkList->GetFirst();
985 h->DescrText = link->DescrText;
986 h->Link = link->Link;
987 h->Type = link->LType;
989 dst->m_HyperlinkList->Append(h);
991 linknode = linknode->GetNext();
998 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(GUID);
1000 if (!prp)
return false;
1002 PlugInFromRoutePoint(pwaypoint, prp);
1007wxArrayString GetWaypointGUIDArray(
void) {
1008 wxArrayString result;
1009 const RoutePointList* list = pWayPointMan->GetWaypointList();
1011 wxRoutePointListNode* prpnode = list->GetFirst();
1014 result.Add(prp->m_GUID);
1016 prpnode = prpnode->GetNext();
1022wxArrayString GetRouteGUIDArray(
void) {
1023 wxArrayString result;
1024 RouteList* list = pRouteList;
1026 wxRouteListNode* prpnode = list->GetFirst();
1028 Route* proute = prpnode->GetData();
1029 result.Add(proute->m_GUID);
1031 prpnode = prpnode->GetNext();
1037wxArrayString GetTrackGUIDArray(
void) {
1038 wxArrayString result;
1039 for (
Track* ptrack : g_TrackList) {
1040 result.Add(ptrack->m_GUID);
1046wxArrayString GetWaypointGUIDArray(OBJECT_LAYER_REQ req) {
1047 wxArrayString result;
1048 const RoutePointList* list = pWayPointMan->GetWaypointList();
1050 wxRoutePointListNode* prpnode = list->GetFirst();
1055 result.Add(prp->m_GUID);
1057 case OBJECTS_NO_LAYERS:
1058 if (!prp->m_bIsInLayer) result.Add(prp->m_GUID);
1060 case OBJECTS_ONLY_LAYERS:
1061 if (prp->m_bIsInLayer) result.Add(prp->m_GUID);
1065 prpnode = prpnode->GetNext();
1071wxArrayString GetRouteGUIDArray(OBJECT_LAYER_REQ req) {
1072 wxArrayString result;
1073 RouteList* list = pRouteList;
1075 wxRouteListNode* prpnode = list->GetFirst();
1077 Route* proute = prpnode->GetData();
1080 result.Add(proute->m_GUID);
1082 case OBJECTS_NO_LAYERS:
1083 if (!proute->m_bIsInLayer) result.Add(proute->m_GUID);
1085 case OBJECTS_ONLY_LAYERS:
1086 if (proute->m_bIsInLayer) result.Add(proute->m_GUID);
1090 prpnode = prpnode->GetNext();
1096wxArrayString GetTrackGUIDArray(OBJECT_LAYER_REQ req) {
1097 wxArrayString result;
1098 for (
Track* ptrack : g_TrackList) {
1101 result.Add(ptrack->m_GUID);
1103 case OBJECTS_NO_LAYERS:
1104 if (!ptrack->m_bIsInLayer) result.Add(ptrack->m_GUID);
1106 case OBJECTS_ONLY_LAYERS:
1107 if (ptrack->m_bIsInLayer) result.Add(ptrack->m_GUID);
1115wxArrayString GetIconNameArray(
void) {
1116 wxArrayString result;
1118 for (
int i = 0; i < pWayPointMan->GetNumIcons(); i++) {
1119 wxString* ps = pWayPointMan->GetIconKey(i);
1125bool AddPlugInRoute(
PlugIn_Route* proute,
bool b_permanent) {
1131 wxDateTime plannedDeparture;
1133 wxPlugin_WaypointListNode* pwpnode = proute->pWaypointList->GetFirst();
1135 pwp = pwpnode->GetData();
1138 pwp->m_MarkName, pwp->m_GUID);
1141 cloneHyperlinkList(pWP, pwp);
1142 pWP->m_MarkDescription = pwp->m_MarkDescription;
1143 pWP->m_bShowName =
false;
1144 pWP->SetCreateTime(pwp->m_CreateTime);
1146 route->AddPoint(pWP);
1148 pSelect->AddSelectableRoutePoint(pWP->m_lat, pWP->m_lon, pWP);
1151 pSelect->AddSelectableRouteSegment(pWP_src->m_lat, pWP_src->m_lon,
1152 pWP->m_lat, pWP->m_lon, pWP_src, pWP,
1155 plannedDeparture = pwp->m_CreateTime;
1159 pwpnode = pwpnode->GetNext();
1162 route->m_PlannedDeparture = plannedDeparture;
1164 route->m_RouteNameString = proute->m_NameString;
1165 route->m_RouteStartString = proute->m_StartString;
1166 route->m_RouteEndString = proute->m_EndString;
1167 if (!proute->m_GUID.IsEmpty()) {
1168 route->m_GUID = proute->m_GUID;
1170 route->m_btemp = (b_permanent ==
false);
1172 pRouteList->Append(route);
1174 if (b_permanent) pConfig->AddNewRoute(route);
1176 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
1177 pRouteManagerDialog->UpdateRouteListCtrl();
1182bool DeletePlugInRoute(wxString& GUID) {
1183 bool b_found =
false;
1186 Route* pRoute = g_pRouteMan->FindRouteByGUID(GUID);
1188 g_pRouteMan->
DeleteRoute(pRoute, NavObjectChanges::getInstance());
1195 bool b_found =
false;
1198 Route* pRoute = g_pRouteMan->FindRouteByGUID(proute->m_GUID);
1199 if (pRoute) b_found =
true;
1202 bool b_permanent = (pRoute->m_btemp ==
false);
1203 g_pRouteMan->
DeleteRoute(pRoute, NavObjectChanges::getInstance());
1205 b_found = AddPlugInRoute(proute, b_permanent);
1211bool AddPlugInTrack(
PlugIn_Track* ptrack,
bool b_permanent) {
1218 wxPlugin_WaypointListNode* pwpnode = ptrack->pWaypointList->GetFirst();
1220 pwp = pwpnode->GetData();
1223 pWP->SetCreateTime(pwp->m_CreateTime);
1225 track->AddPoint(pWP);
1228 pSelect->AddSelectableTrackSegment(pWP_src->m_lat, pWP_src->m_lon,
1229 pWP->m_lat, pWP->m_lon, pWP_src, pWP,
1234 pwpnode = pwpnode->GetNext();
1237 track->SetName(ptrack->m_NameString);
1238 track->m_TrackStartString = ptrack->m_StartString;
1239 track->m_TrackEndString = ptrack->m_EndString;
1240 track->m_GUID = ptrack->m_GUID;
1241 track->m_btemp = (b_permanent ==
false);
1243 g_TrackList.push_back(track);
1245 if (b_permanent) pConfig->AddNewTrack(track);
1247 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
1248 pRouteManagerDialog->UpdateTrkListCtrl();
1253bool DeletePlugInTrack(wxString& GUID) {
1254 bool b_found =
false;
1257 Track* pTrack = g_pRouteMan->FindTrackByGUID(GUID);
1263 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
1264 pRouteManagerDialog->UpdateTrkListCtrl();
1270 bool b_found =
false;
1273 Track* pTrack = g_pRouteMan->FindTrackByGUID(ptrack->m_GUID);
1274 if (pTrack) b_found =
true;
1277 bool b_permanent = (pTrack->m_btemp ==
false);
1280 b_found = AddPlugInTrack(ptrack, b_permanent);
1289 ocpn_vp.m_projection_type = vp->m_projection_type;
1291 return glChartCanvas::HasNormalizedViewPort(ocpn_vp);
1297void PlugInMultMatrixViewport(
PlugIn_ViewPort* vp,
float lat,
float lon) {
1300 ocpn_vp.
clat = vp->clat;
1301 ocpn_vp.
clon = vp->clon;
1302 ocpn_vp.m_projection_type = vp->m_projection_type;
1304 ocpn_vp.
skew = vp->skew;
1314void PlugInNormalizeViewport(
PlugIn_ViewPort* vp,
float lat,
float lon) {
1317 glChartCanvas::NormalizedViewPort(ocpn_vp, lat, lon);
1319 vp->clat = ocpn_vp.
clat;
1320 vp->clon = ocpn_vp.
clon;
1323 vp->skew = ocpn_vp.
skew;
1336 pret->MMSI = ptarget->MMSI;
1337 pret->Class = ptarget->Class;
1338 pret->NavStatus = ptarget->NavStatus;
1339 pret->SOG = ptarget->SOG;
1340 pret->COG = ptarget->COG;
1341 pret->HDG = ptarget->HDG;
1342 pret->Lon = ptarget->Lon;
1343 pret->Lat = ptarget->Lat;
1344 pret->ROTAIS = ptarget->ROTAIS;
1345 pret->ShipType = ptarget->ShipType;
1346 pret->IMO = ptarget->IMO;
1348 pret->Range_NM = ptarget->Range_NM;
1349 pret->Brg = ptarget->Brg;
1352 pret->bCPA_Valid = ptarget->bCPA_Valid;
1353 pret->TCPA = ptarget->TCPA;
1354 pret->CPA = ptarget->CPA;
1356 pret->alarm_state = (plugin_ais_alarm_type)ptarget->n_alert_state;
1358 memcpy(pret->CallSign, ptarget->CallSign,
sizeof(ptarget->CallSign) - 1);
1359 memcpy(pret->ShipName, ptarget->ShipName,
sizeof(ptarget->ShipName) - 1);
1375double fromDMM_Plugin(wxString sdms) {
return fromDMM(sdms); }
1377void SetCanvasRotation(
double rotation) {
1378 gFrame->GetPrimaryCanvas()->DoRotateCanvas(rotation);
1381double GetCanvasTilt() {
return gFrame->GetPrimaryCanvas()->GetVPTilt(); }
1383void SetCanvasTilt(
double tilt) {
1384 gFrame->GetPrimaryCanvas()->DoTiltCanvas(tilt);
1387void SetCanvasProjection(
int projection) {
1388 gFrame->GetPrimaryCanvas()->SetVPProjection(projection);
1391OcpnSound* g_PluginSound = SoundFactory();
1392static void onPlugInPlaySoundExFinished(
void* ptr) {}
1396 bool ok = g_PluginSound->Load(sound_file, deviceIndex);
1398 wxLogWarning(
"Cannot load sound file: %s", sound_file);
1401 auto cmd_sound =
dynamic_cast<SystemCmdSound*
>(g_PluginSound);
1402 if (cmd_sound) cmd_sound->SetCmd(g_CmdSoundString.mb_str(wxConvUTF8));
1404 g_PluginSound->SetFinishedCallback(onPlugInPlaySoundExFinished, NULL);
1405 ok = g_PluginSound->Play();
1407 wxLogWarning(
"Cannot play sound file: %s", sound_file);
1412bool CheckEdgePan_PlugIn(
int x,
int y,
bool dragging,
int margin,
int delta) {
1413 return gFrame->GetPrimaryCanvas()->CheckEdgePan(x, y, dragging, margin,
1417wxBitmap GetIcon_PlugIn(
const wxString& name) {
1419 return style->GetIcon(name);
1422void SetCursor_PlugIn(wxCursor* pCursor) {
1423 gFrame->GetPrimaryCanvas()->pPlugIn_Cursor = pCursor;
1426void AddChartDirectory(wxString& path) {
1428 g_options->AddChartDir(path);
1432void ForceChartDBUpdate() {
1434 g_options->pScanCheckBox->SetValue(
true);
1435 g_options->pUpdateCheckBox->SetValue(
true);
1439void ForceChartDBRebuild() {
1441 g_options->pUpdateCheckBox->SetValue(
true);
1445wxDialog* GetActiveOptionsDialog() {
return g_options; }
1447int PlatformDirSelectorDialog(wxWindow* parent, wxString* file_spec,
1448 wxString Title, wxString initDir) {
1449 return g_Platform->DoDirSelectorDialog(parent, file_spec, Title, initDir);
1452int PlatformFileSelectorDialog(wxWindow* parent, wxString* file_spec,
1453 wxString Title, wxString initDir,
1454 wxString suggestedName, wxString wildcard) {
1455 return g_Platform->DoFileSelectorDialog(parent, file_spec, Title, initDir,
1456 suggestedName, wildcard);
1467 vp.
clat = pivp.clat;
1468 vp.
clon = pivp.clon;
1470 vp.
skew = pivp.skew;
1475 vp.rv_rect = pivp.rv_rect;
1476 vp.b_quilt = pivp.b_quilt;
1477 vp.m_projection_type = pivp.m_projection_type;
1479 if (gFrame->GetPrimaryCanvas())
1480 vp.
ref_scale = gFrame->GetPrimaryCanvas()->GetVP().ref_scale;
1490void PlugInAISDrawGL(wxGLCanvas* glcanvas,
const PlugIn_ViewPort& vp) {
1491 ViewPort ocpn_vp = CreateCompatibleViewportEx(vp);
1496 AISDraw(dc, ocpn_vp, NULL);
1500 return FontMgr::Get().
SetFontColor(TextElement, color);
1510 wxFontStyle style, wxFontWeight weight,
1511 bool underline,
const wxString& facename,
1512 wxFontEncoding encoding) {
1514 underline, facename, encoding);
1517int PluginGetMinAvailableGshhgQuality() {
1518 return gFrame->GetPrimaryCanvas()->GetMinAvailableGshhgQuality();
1520int PluginGetMaxAvailableGshhgQuality() {
1521 return gFrame->GetPrimaryCanvas()->GetMaxAvailableGshhgQuality();
1525void PlugInHandleAutopilotRoute(
bool enable) {
1526 g_bPluginHandleAutopilotRoute = enable;
1529bool LaunchDefaultBrowser_Plugin(wxString url) {
1530 if (g_Platform) g_Platform->platformLaunchDefaultBrowser(url);
1538wxString GetSelectedWaypointGUID_Plugin() {
1540 if (cc && cc->GetSelectedRoutePoint()) {
1541 return cc->GetSelectedRoutePoint()->m_GUID;
1543 return wxEmptyString;
1546wxString GetSelectedRouteGUID_Plugin() {
1548 if (cc && cc->GetSelectedRoute()) {
1549 return cc->GetSelectedRoute()->m_GUID;
1551 return wxEmptyString;
1554wxString GetSelectedTrackGUID_Plugin() {
1556 if (cc && cc->GetSelectedTrack()) {
1557 return cc->GetSelectedTrack()->m_GUID;
1559 return wxEmptyString;
1562std::unique_ptr<PlugIn_Waypoint> GetWaypoint_Plugin(
const wxString& GUID) {
1564 GetSingleWaypoint(GUID, w.get());
1568std::unique_ptr<PlugIn_Route> GetRoute_Plugin(
const wxString& GUID) {
1569 std::unique_ptr<PlugIn_Route> r;
1570 Route* route = g_pRouteMan->FindRouteByGUID(GUID);
1571 if (route ==
nullptr)
return r;
1578 wxRoutePointListNode* node = route->pRoutePointList->GetFirst();
1581 src_wp = node->GetData();
1584 PlugInFromRoutePoint(dst_wp, src_wp);
1586 dst_route->pWaypointList->Append(dst_wp);
1588 node = node->GetNext();
1590 dst_route->m_NameString = route->m_RouteNameString;
1591 dst_route->m_StartString = route->m_RouteStartString;
1592 dst_route->m_EndString = route->m_RouteEndString;
1593 dst_route->m_GUID = route->m_GUID;
1598std::unique_ptr<PlugIn_Track> GetTrack_Plugin(
const wxString& GUID) {
1599 std::unique_ptr<PlugIn_Track> t;
1601 Track* pTrack = g_pRouteMan->FindTrackByGUID(GUID);
1602 if (!pTrack)
return t;
1604 std::unique_ptr<PlugIn_Track> tk =
1607 dst_track->m_NameString = pTrack->GetName();
1608 dst_track->m_StartString = pTrack->m_TrackStartString;
1609 dst_track->m_EndString = pTrack->m_TrackEndString;
1610 dst_track->m_GUID = pTrack->m_GUID;
1612 for (
int i = 0; i < pTrack->GetnPoints(); i++) {
1617 dst_wp->m_lat = ptp->m_lat;
1618 dst_wp->m_lon = ptp->m_lon;
1619 dst_wp->m_CreateTime = ptp->GetCreateTime();
1621 dst_track->pWaypointList->Append(dst_wp);
1627wxWindow* PluginGetFocusCanvas() {
return g_focusCanvas; }
1629wxWindow* PluginGetOverlayRenderCanvas() {
1631 return g_overlayCanvas;
1635void CanvasJumpToPosition(wxWindow* canvas,
double lat,
double lon,
1637 auto oCanvas =
dynamic_cast<ChartCanvas*
>(canvas);
1638 if (oCanvas) gFrame->JumpToPosition(oCanvas, lat, lon,
scale);
1641bool ShuttingDown(
void) {
return g_bquiting; }
1643wxWindow* GetCanvasUnderMouse(
void) {
return gFrame->GetCanvasUnderMouse(); }
1645int GetCanvasIndexUnderMouse(
void) {
1646 ChartCanvas* l_canvas = gFrame->GetCanvasUnderMouse();
1648 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); ++i) {
1649 if (l_canvas == g_canvasArray[i])
return i;
1666wxWindow* GetCanvasByIndex(
int canvasIndex) {
1667 if (g_canvasConfig == 0)
1668 return gFrame->GetPrimaryCanvas();
1670 if ((canvasIndex >= 0) && g_canvasArray[canvasIndex]) {
1671 return g_canvasArray[canvasIndex];
1677bool CheckMUIEdgePan_PlugIn(
int x,
int y,
bool dragging,
int margin,
int delta,
1679 if (g_canvasConfig == 0)
1680 return gFrame->GetPrimaryCanvas()->CheckEdgePan(x, y, dragging, margin,
1683 if ((canvasIndex >= 0) && g_canvasArray[canvasIndex]) {
1684 return g_canvasArray[canvasIndex]->CheckEdgePan(x, y, dragging, margin,
1692void SetMUICursor_PlugIn(wxCursor* pCursor,
int canvasIndex) {
1693 if (g_canvasConfig == 0)
1694 gFrame->GetPrimaryCanvas()->pPlugIn_Cursor = pCursor;
1696 if ((canvasIndex >= 0) && g_canvasArray[canvasIndex]) {
1697 g_canvasArray[canvasIndex]->pPlugIn_Cursor = pCursor;
1702int GetCanvasCount() {
1703 if (g_canvasConfig == 1)
return 2;
1708int GetLatLonFormat() {
return g_iSDMMFormat; }
1710wxRect GetMasterToolbarRect() {
1712 return g_MainToolbar->GetToolbarRect();
1714 return wxRect(0, 0, 1, 1);
1723 g_pRouteMan->ZeroCurrentXTEToActivePoint();
1732 pivp.clat = tvp.
clat;
1733 pivp.clon = tvp.
clon;
1735 pivp.skew = tvp.
skew;
1740 pivp.rv_rect = tvp.rv_rect;
1741 pivp.b_quilt = tvp.b_quilt;
1742 pivp.m_projection_type = tvp.m_projection_type;
1744 pivp.lat_min = tvp.GetBBox().GetMinLat();
1745 pivp.lat_max = tvp.GetBBox().GetMaxLat();
1746 pivp.lon_min = tvp.GetBBox().GetMinLon();
1747 pivp.lon_max = tvp.GetBBox().GetMaxLon();
1749 pivp.bValid = tvp.IsValid();
1754ListOfPI_S57Obj* PlugInManager::GetLightsObjRuleListVisibleAtLatLon(
1756 ListOfPI_S57Obj* list = NULL;
1762 list = picbgl->GetLightsObjRuleListVisibleAtLatLon(zlat, zlon, &pi_vp);
1770 list = picbx->GetLightsObjRuleListVisibleAtLatLon(zlat, zlon, &pi_vp);
1781#include <wx/listimpl.cpp>
1782WX_DEFINE_LIST(Plugin_WaypointExList)
1785PlugIn_Waypoint_Ex::PlugIn_Waypoint_Ex() { InitDefaults(); }
1787PlugIn_Waypoint_Ex::PlugIn_Waypoint_Ex(
1788 double lat,
double lon,
const wxString& icon_ident,
const wxString& wp_name,
1789 const wxString& GUID,
const double ScaMin,
const bool bNameVisible,
1790 const int nRangeRings,
const double RangeDistance,
1791 const wxColor RangeColor) {
1794 wxDateTime now = wxDateTime::Now();
1795 m_CreateTime = now.ToUTC();
1796 m_HyperlinkList = NULL;
1800 IconName = icon_ident;
1801 m_MarkName = wp_name;
1804 IsNameVisible = bNameVisible;
1805 nrange_rings = nRangeRings;
1806 RangeRingSpace = RangeDistance;
1807 RangeRingColor = RangeColor;
1810void PlugIn_Waypoint_Ex::InitDefaults() {
1811 m_HyperlinkList = NULL;
1813 b_useScamin =
false;
1816 IsNameVisible =
false;
1818 RangeRingColor = *wxBLACK;
1819 m_CreateTime = wxDateTime::Now();
1825bool PlugIn_Waypoint_Ex::GetFSStatus() {
1826 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(m_GUID);
1827 if (!prp)
return false;
1829 if (prp->m_bIsInRoute && !prp->IsShared())
return false;
1834int PlugIn_Waypoint_Ex::GetRouteMembershipCount() {
1836 RoutePoint* pWP = pWayPointMan->FindRoutePointByGUID(m_GUID);
1840 wxRouteListNode* node = pRouteList->GetFirst();
1842 Route* proute = node->GetData();
1843 wxRoutePointListNode* pnode = (proute->pRoutePointList)->GetFirst();
1846 if (prp == pWP) nCount++;
1847 pnode = pnode->GetNext();
1850 node = node->GetNext();
1856PlugIn_Waypoint_Ex::~PlugIn_Waypoint_Ex() {}
1859PlugIn_Route_Ex::PlugIn_Route_Ex(
void) {
1860 pWaypointList =
new Plugin_WaypointExList;
1863PlugIn_Route_Ex::~PlugIn_Route_Ex(
void) {
1864 pWaypointList->DeleteContents(
false);
1865 pWaypointList->Clear();
1867 delete pWaypointList;
1875 dst->m_lat = src->m_lat;
1876 dst->m_lon = src->m_lon;
1877 dst->IconName = src->GetIconName();
1878 dst->m_MarkName = src->GetName();
1879 dst->m_MarkDescription = src->GetDescription();
1880 dst->IconDescription = pWayPointMan->GetIconDescription(src->GetIconName());
1881 dst->IsVisible = src->IsVisible();
1882 dst->m_CreateTime = src->GetCreateTime();
1883 dst->m_GUID = src->m_GUID;
1886 if (src->m_HyperlinkList ==
nullptr)
return;
1888 delete dst->m_HyperlinkList;
1889 dst->m_HyperlinkList =
nullptr;
1891 if (src->m_HyperlinkList->GetCount() > 0) {
1892 dst->m_HyperlinkList =
new Plugin_HyperlinkList;
1894 wxHyperlinkListNode* linknode = src->m_HyperlinkList->GetFirst();
1899 h->DescrText = link->DescrText;
1900 h->Link = link->Link;
1901 h->Type = link->LType;
1903 dst->m_HyperlinkList->Append(h);
1905 linknode = linknode->GetNext();
1910 dst->nrange_rings = src->m_iWaypointRangeRingsNumber;
1911 dst->RangeRingSpace = src->m_fWaypointRangeRingsStep;
1912 dst->RangeRingColor = src->m_wxcWaypointRangeRingsColour;
1915 dst->IsNameVisible = src->m_bShowName;
1916 dst->scamin = src->GetScaMin();
1917 dst->b_useScamin = src->GetUseSca();
1918 dst->IsActive = src->m_bIsActive;
1921static void cloneHyperlinkListEx(
RoutePoint* dst,
1924 if (src->m_HyperlinkList ==
nullptr)
return;
1926 if (src->m_HyperlinkList->GetCount() > 0) {
1927 wxPlugin_HyperlinkListNode* linknode = src->m_HyperlinkList->GetFirst();
1932 h->DescrText = link->DescrText;
1933 h->Link = link->Link;
1934 h->LType = link->Type;
1936 dst->m_HyperlinkList->Append(h);
1938 linknode = linknode->GetNext();
1945 src->m_MarkName, src->m_GUID);
1947 pWP->m_bIsolatedMark =
true;
1949 cloneHyperlinkListEx(pWP, src);
1951 pWP->m_MarkDescription = src->m_MarkDescription;
1953 if (src->m_CreateTime.IsValid())
1954 pWP->SetCreateTime(src->m_CreateTime);
1956 wxDateTime dtnow(wxDateTime::Now());
1957 pWP->SetCreateTime(dtnow);
1960 pWP->m_btemp = (b_permanent ==
false);
1963 pWP->SetIconName(src->IconName);
1964 pWP->SetWaypointRangeRingsNumber(src->nrange_rings);
1965 pWP->SetWaypointRangeRingsStep(src->RangeRingSpace);
1966 pWP->SetWaypointRangeRingsColour(src->RangeRingColor);
1967 pWP->SetScaMin(src->scamin);
1968 pWP->SetUseSca(src->b_useScamin);
1969 pWP->SetNameShown(src->IsNameVisible);
1970 pWP->SetVisible(src->IsVisible);
1976 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(GUID);
1978 if (!prp)
return false;
1980 PlugInExFromRoutePoint(pwaypoint, prp);
1990 bool b_unique =
true;
1991 wxRoutePointListNode* prpnode = pWayPointMan->GetWaypointList()->GetFirst();
1995 if (prp->m_GUID == pwaypointex->m_GUID) {
1999 prpnode = prpnode->GetNext();
2002 if (!b_unique)
return false;
2004 RoutePoint* pWP = CreateNewPoint(pwaypointex, b_permanent);
2006 pWP->SetShowWaypointRangeRings(pwaypointex->nrange_rings > 0);
2008 pSelect->AddSelectableRoutePoint(pWP->m_lat, pWP->m_lon, pWP);
2009 if (b_permanent) pConfig->AddNewWayPoint(pWP, -1);
2011 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
2012 pRouteManagerDialog->UpdateWptListCtrl();
2019 bool b_found =
false;
2020 RoutePoint* prp = pWayPointMan->FindRoutePointByGUID(pwaypoint->m_GUID);
2022 if (prp) b_found =
true;
2025 double lat_save = prp->m_lat;
2026 double lon_save = prp->m_lon;
2028 prp->m_lat = pwaypoint->m_lat;
2029 prp->m_lon = pwaypoint->m_lon;
2030 prp->SetIconName(pwaypoint->IconName);
2031 prp->SetName(pwaypoint->m_MarkName);
2032 prp->m_MarkDescription = pwaypoint->m_MarkDescription;
2033 prp->SetVisible(pwaypoint->IsVisible);
2034 if (pwaypoint->m_CreateTime.IsValid())
2035 prp->SetCreateTime(pwaypoint->m_CreateTime);
2039 if (pwaypoint->m_HyperlinkList) {
2040 prp->m_HyperlinkList->Clear();
2041 if (pwaypoint->m_HyperlinkList->GetCount() > 0) {
2042 wxPlugin_HyperlinkListNode* linknode =
2043 pwaypoint->m_HyperlinkList->GetFirst();
2048 h->DescrText = link->DescrText;
2049 h->Link = link->Link;
2050 h->LType = link->Type;
2052 prp->m_HyperlinkList->Append(h);
2054 linknode = linknode->GetNext();
2060 prp->SetWaypointRangeRingsNumber(pwaypoint->nrange_rings);
2061 prp->SetWaypointRangeRingsStep(pwaypoint->RangeRingSpace);
2062 prp->SetWaypointRangeRingsColour(pwaypoint->RangeRingColor);
2063 prp->SetScaMin(pwaypoint->scamin);
2064 prp->SetUseSca(pwaypoint->b_useScamin);
2065 prp->SetNameShown(pwaypoint->IsNameVisible);
2067 prp->SetShowWaypointRangeRings(pwaypoint->nrange_rings > 0);
2069 if (prp) prp->ReLoadIcon();
2071 auto canvas = gFrame->GetPrimaryCanvas();
2072 SelectCtx ctx(canvas->m_bShowNavobjects, canvas->GetCanvasTrueScale(),
2073 canvas->GetScaleValue());
2075 pSelect->FindSelection(ctx, lat_save, lon_save, SELTYPE_ROUTEPOINT);
2077 pFind->m_slat = pwaypoint->m_lat;
2078 pFind->m_slon = pwaypoint->m_lon;
2081 if (!prp->m_btemp) pConfig->UpdateWayPoint(prp);
2083 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
2084 pRouteManagerDialog->UpdateWptListCtrl();
2096 wxDateTime plannedDeparture;
2098 wxPlugin_WaypointExListNode* pwpnode = proute->pWaypointList->GetFirst();
2100 pwaypointex = pwpnode->GetData();
2102 pWP = pWayPointMan->FindRoutePointByGUID(pwaypointex->m_GUID);
2104 pWP = CreateNewPoint(pwaypointex, b_permanent);
2105 pWP->m_bIsolatedMark =
false;
2108 route->AddPoint(pWP);
2110 pSelect->AddSelectableRoutePoint(pWP->m_lat, pWP->m_lon, pWP);
2113 pSelect->AddSelectableRouteSegment(pWP_src->m_lat, pWP_src->m_lon,
2114 pWP->m_lat, pWP->m_lon, pWP_src, pWP,
2117 plannedDeparture = pwaypointex->m_CreateTime;
2121 pwpnode = pwpnode->GetNext();
2124 route->m_PlannedDeparture = plannedDeparture;
2126 route->m_RouteNameString = proute->m_NameString;
2127 route->m_RouteStartString = proute->m_StartString;
2128 route->m_RouteEndString = proute->m_EndString;
2129 if (!proute->m_GUID.IsEmpty()) {
2130 route->m_GUID = proute->m_GUID;
2132 route->m_btemp = (b_permanent ==
false);
2133 route->SetVisible(proute->m_isVisible);
2134 route->m_RouteDescription = proute->m_Description;
2136 pRouteList->Append(route);
2138 if (b_permanent) pConfig->AddNewRoute(route);
2140 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
2141 pRouteManagerDialog->UpdateRouteListCtrl();
2147 bool b_found =
false;
2150 Route* pRoute = g_pRouteMan->FindRouteByGUID(proute->m_GUID);
2151 if (pRoute) b_found =
true;
2154 bool b_permanent = !pRoute->m_btemp;
2155 g_pRouteMan->
DeleteRoute(pRoute, NavObjectChanges::getInstance());
2157 b_found = AddPlugInRouteEx(proute, b_permanent);
2171std::unique_ptr<PlugIn_Waypoint_Ex> GetWaypointEx_Plugin(
const wxString& GUID) {
2173 GetSingleWaypointEx(GUID, w.get());
2177std::unique_ptr<PlugIn_Route_Ex> GetRouteEx_Plugin(
const wxString& GUID) {
2178 std::unique_ptr<PlugIn_Route_Ex> r;
2179 Route* route = g_pRouteMan->FindRouteByGUID(GUID);
2180 if (route ==
nullptr)
return r;
2187 wxRoutePointListNode* node = route->pRoutePointList->GetFirst();
2190 src_wp = node->GetData();
2193 PlugInExFromRoutePoint(dst_wp, src_wp);
2195 dst_route->pWaypointList->Append(dst_wp);
2197 node = node->GetNext();
2199 dst_route->m_NameString = route->m_RouteNameString;
2200 dst_route->m_StartString = route->m_RouteStartString;
2201 dst_route->m_EndString = route->m_RouteEndString;
2202 dst_route->m_GUID = route->m_GUID;
2203 dst_route->m_isActive = g_pRouteMan->GetpActiveRoute() == route;
2204 dst_route->m_isVisible = route->IsVisible();
2205 dst_route->m_Description = route->m_RouteDescription;
2210wxString GetActiveWaypointGUID(
2212 RoutePoint* rp = g_pRouteMan->GetpActivePoint();
2214 return wxEmptyString;
2219wxString GetActiveRouteGUID(
2221 Route* rt = g_pRouteMan->GetpActiveRoute();
2223 return wxEmptyString;
2233 MyApp& app = wxGetApp();
2234 return (app.m_comm_bridge.GetPriorityMaps());
2237std::vector<std::string> GetActivePriorityIdentifiers() {
2238 std::vector<std::string> result;
2240 MyApp& app = wxGetApp();
2243 app.m_comm_bridge.GetPriorityContainer(
"position").active_source;
2244 result.push_back(
id);
2245 id = app.m_comm_bridge.GetPriorityContainer(
"velocity").active_source;
2246 result.push_back(
id);
2247 id = app.m_comm_bridge.GetPriorityContainer(
"heading").active_source;
2248 result.push_back(
id);
2249 id = app.m_comm_bridge.GetPriorityContainer(
"variation").active_source;
2250 result.push_back(
id);
2251 id = app.m_comm_bridge.GetPriorityContainer(
"satellites").active_source;
2252 result.push_back(
id);
2257double OCPN_GetDisplayContentScaleFactor() {
2259#if defined(__WXOSX__) || defined(__WXGTK3__)
2261 if (gFrame) rv = gFrame->GetContentScaleFactor();
2265double OCPN_GetWinDIPScaleFactor() {
2266 double scaler = 1.0;
2268 if (gFrame) scaler = (double)(gFrame->ToDIP(100)) / 100.;
2282bool GetFullScreen() {
return gFrame->IsFullScreen(); }
2284void SetFullScreen(
bool set_full_screen_on) {
2285 bool state = gFrame->IsFullScreen();
2286 if (set_full_screen_on && !state)
2287 gFrame->ToggleFullScreen();
2288 else if (!set_full_screen_on && state)
2289 gFrame->ToggleFullScreen();
2292extern bool g_useMUI;
2293void EnableMUIBar(
bool enable,
int CanvasIndex) {
2294 bool current_mui_state = g_useMUI;
2297 if (enable && !current_mui_state) {
2299 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2301 if (cc) cc->CreateMUIBar();
2303 }
else if (!enable && current_mui_state) {
2305 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2307 if (cc) cc->DestroyMuiBar();
2312bool GetEnableMUIBar(
int CanvasIndex) {
return g_useMUI; }
2314void EnableCompassGPSIcon(
bool enable,
int CanvasIndex) {
2315 if (CanvasIndex < GetCanvasCount()) {
2316 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2317 if (cc) cc->SetShowGPSCompassWindow(enable);
2321bool GetEnableCompassGPSIcon(
int CanvasIndex) {
2322 if (CanvasIndex < GetCanvasCount()) {
2323 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2325 return cc->GetShowGPSCompassWindow();
2332extern bool g_bShowStatusBar;
2333void EnableStatusBar(
bool enable) {
2334 g_bShowStatusBar = enable;
2335 gFrame->ConfigureStatusBar();
2338bool GetEnableStatusBar() {
return g_bShowStatusBar; }
2340void EnableChartBar(
bool enable,
int CanvasIndex) {
2341 bool current_chartbar_state = g_bShowChartBar;
2342 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2344 if (current_chartbar_state && !enable) {
2345 gFrame->ToggleChartBar(cc);
2346 g_bShowChartBar = current_chartbar_state;
2347 }
else if (!current_chartbar_state && enable) {
2348 gFrame->ToggleChartBar(cc);
2349 g_bShowChartBar = current_chartbar_state;
2352 g_bShowChartBar = enable;
2355bool GetEnableChartBar(
int CanvasIndex) {
return g_bShowChartBar; }
2357extern bool g_bShowMenuBar;
2358void EnableMenu(
bool enable) {
2360 if (g_bShowMenuBar) {
2361 g_bShowMenuBar =
false;
2362 if (gFrame->m_pMenuBar) {
2363 gFrame->SetMenuBar(NULL);
2364 gFrame->m_pMenuBar->Destroy();
2365 gFrame->m_pMenuBar = NULL;
2369 g_bShowMenuBar =
true;
2370 gFrame->BuildMenuBar();
2374bool GetEnableMenu() {
return g_bShowMenuBar; }
2376void SetGlobalColor(std::string table, std::string name, wxColor color) {
2377 if (ps52plib) ps52plib->m_chartSymbols.UpdateTableColor(table, name, color);
2380wxColor GetGlobalColorD(std::string map_name, std::string name) {
2381 wxColor ret = wxColor(*wxRED);
2383 int i_table = ps52plib->m_chartSymbols.FindColorTable(map_name.c_str());
2384 ret = ps52plib->m_chartSymbols.GetwxColor(name.c_str(), i_table);
2389void EnableLatLonGrid(
bool enable,
int CanvasIndex) {
2390 if (CanvasIndex < GetCanvasCount()) {
2391 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2392 if (cc) cc->SetShowGrid(enable);
2396void EnableChartOutlines(
bool enable,
int CanvasIndex) {
2397 if (CanvasIndex < GetCanvasCount()) {
2398 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2399 if (cc) cc->SetShowOutlines(enable);
2403void EnableDepthUnitDisplay(
bool enable,
int CanvasIndex) {
2404 if (CanvasIndex < GetCanvasCount()) {
2405 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2406 if (cc) cc->SetShowDepthUnits(enable);
2410void EnableAisTargetDisplay(
bool enable,
int CanvasIndex) {
2411 if (CanvasIndex < GetCanvasCount()) {
2412 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2413 if (cc) cc->SetShowAIS(enable);
2417void EnableTideStationsDisplay(
bool enable,
int CanvasIndex) {
2418 if (CanvasIndex < GetCanvasCount()) {
2419 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2420 if (cc) cc->ShowTides(enable);
2424void EnableCurrentStationsDisplay(
bool enable,
int CanvasIndex) {
2425 if (CanvasIndex < GetCanvasCount()) {
2426 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2427 if (cc) cc->ShowCurrents(enable);
2431void EnableENCTextDisplay(
bool enable,
int CanvasIndex) {
2432 if (CanvasIndex < GetCanvasCount()) {
2433 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2434 if (cc) cc->SetShowENCText(enable);
2438void EnableENCDepthSoundingsDisplay(
bool enable,
int CanvasIndex) {
2439 if (CanvasIndex < GetCanvasCount()) {
2440 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2441 if (cc) cc->SetShowENCDepth(enable);
2445void EnableBuoyLightLabelsDisplay(
bool enable,
int CanvasIndex) {
2446 if (CanvasIndex < GetCanvasCount()) {
2447 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2448 if (cc) cc->SetShowENCBuoyLabels(enable);
2452void EnableLightsDisplay(
bool enable,
int CanvasIndex) {
2453 if (CanvasIndex < GetCanvasCount()) {
2454 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2455 if (cc) cc->SetShowENCLights(enable);
2459void EnableLightDescriptionsDisplay(
bool enable,
int CanvasIndex) {
2460 if (CanvasIndex < GetCanvasCount()) {
2461 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2462 if (cc) cc->SetShowENCLightDesc(enable);
2466void SetENCDisplayCategory(PI_DisCat cat,
int CanvasIndex) {
2467 int valSet = STANDARD;
2469 case PI_DISPLAYBASE:
2470 valSet = DISPLAYBASE;
2478 case PI_MARINERS_STANDARD:
2479 valSet = MARINERS_STANDARD;
2485 if (CanvasIndex < GetCanvasCount()) {
2486 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2487 if (cc) cc->SetENCDisplayCategory(valSet);
2490PI_DisCat GetENCDisplayCategory(
int CanvasIndex) {
2491 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2493 return ((PI_DisCat)cc->GetENCDisplayCategory());
2495 return PI_DisCat::PI_STANDARD;
2498void SetNavigationMode(PI_NavMode mode,
int CanvasIndex) {
2499 int newMode = NORTH_UP_MODE;
2500 if (mode == PI_COURSE_UP_MODE)
2501 newMode = COURSE_UP_MODE;
2502 else if (mode == PI_HEAD_UP_MODE)
2503 newMode = HEAD_UP_MODE;
2505 if (CanvasIndex < GetCanvasCount()) {
2506 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2507 if (cc) cc->SetUpMode(newMode);
2510PI_NavMode GetNavigationMode(
int CanvasIndex) {
2511 if (CanvasIndex < GetCanvasCount()) {
2512 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2513 if (cc)
return ((PI_NavMode)cc->GetUpMode());
2515 return PI_NavMode::PI_NORTH_UP_MODE;
2518bool GetEnableLatLonGrid(
int CanvasIndex) {
2519 if (CanvasIndex < GetCanvasCount()) {
2520 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2521 if (cc)
return (cc->GetShowGrid());
2526bool GetEnableChartOutlines(
int CanvasIndex) {
2527 if (CanvasIndex < GetCanvasCount()) {
2528 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2529 if (cc)
return (cc->GetShowOutlines());
2534bool GetEnableDepthUnitDisplay(
int CanvasIndex) {
2535 if (CanvasIndex < GetCanvasCount()) {
2536 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2537 if (cc)
return (cc->GetShowDepthUnits());
2542bool GetEnableAisTargetDisplay(
int CanvasIndex) {
2543 if (CanvasIndex < GetCanvasCount()) {
2544 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2545 if (cc)
return (cc->GetShowAIS());
2550bool GetEnableTideStationsDisplay(
int CanvasIndex) {
2551 if (CanvasIndex < GetCanvasCount()) {
2552 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2553 if (cc)
return (cc->GetbShowTide());
2558bool GetEnableCurrentStationsDisplay(
int CanvasIndex) {
2559 if (CanvasIndex < GetCanvasCount()) {
2560 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2561 if (cc)
return (cc->GetbShowCurrent());
2566bool GetEnableENCTextDisplay(
int CanvasIndex) {
2567 if (CanvasIndex < GetCanvasCount()) {
2568 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2569 if (cc)
return (cc->GetShowENCText());
2574bool GetEnableENCDepthSoundingsDisplay(
int CanvasIndex) {
2575 if (CanvasIndex < GetCanvasCount()) {
2576 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2577 if (cc)
return (cc->GetShowENCDepth());
2582bool GetEnableBuoyLightLabelsDisplay(
int CanvasIndex) {
2583 if (CanvasIndex < GetCanvasCount()) {
2584 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2585 if (cc)
return (cc->GetShowENCBuoyLabels());
2590bool GetEnableLightsDisplay(
int CanvasIndex) {
2591 if (CanvasIndex < GetCanvasCount()) {
2592 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2593 if (cc)
return (cc->GetShowENCLights());
2598bool GetShowENCLightDesc(
int CanvasIndex) {
2599 if (CanvasIndex < GetCanvasCount()) {
2600 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2601 if (cc)
return (cc->GetbShowCurrent());
2606void EnableTouchMode(
bool enable) { g_btouch = enable; }
2608bool GetTouchMode() {
return g_btouch; }
2610void EnableLookaheadMode(
bool enable,
int CanvasIndex) {
2611 if (CanvasIndex < GetCanvasCount()) {
2612 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2613 if (cc) cc->ToggleLookahead();
2617bool GetEnableLookaheadMode(
int CanvasIndex) {
2618 if (CanvasIndex < GetCanvasCount()) {
2619 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2620 if (cc)
return (cc->GetLookahead());
2625extern bool g_bTrackActive;
2626void SetTrackingMode(
bool enable) {
2627 if (!g_bTrackActive && enable)
2629 else if (g_bTrackActive && !enable)
2632bool GetTrackingMode() {
return g_bTrackActive; }
2634void SetAppColorScheme(PI_ColorScheme cs) {
2635 gFrame->SetAndApplyColorScheme((ColorScheme)cs);
2637PI_ColorScheme GetAppColorScheme() {
2638 return (PI_ColorScheme)global_color_scheme;
2641void RequestWindowRefresh(wxWindow* win,
bool eraseBackground) {
2642 if (win) win->Refresh(eraseBackground);
2645void EnableSplitScreenLayout(
bool enable) {
2646 if (g_canvasConfig == 1) {
2651 gFrame->CreateCanvasLayout();
2652 gFrame->DoChartUpdate();
2657 gFrame->CreateCanvasLayout();
2658 gFrame->DoChartUpdate();
2667void PluginZoomCanvas(
int CanvasIndex,
double factor) {
2668 if (CanvasIndex < GetCanvasCount()) {
2669 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2674bool GetEnableMainToolbar() {
return (!g_disable_main_toolbar); }
2675void SetEnableMainToolbar(
bool enable) {
2676 g_disable_main_toolbar = !enable;
2677 if (g_MainToolbar) g_MainToolbar->RefreshToolbar();
2680void ShowGlobalSettingsDialog() {
2681 if (gFrame) gFrame->ScheduleSettingsDialog();
2684void PluginCenterOwnship(
int CanvasIndex) {
2685 if (CanvasIndex < GetCanvasCount()) {
2686 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2688 bool bfollow = cc->GetbFollow();
2689 cc->ResetOwnshipOffset();
2693 cc->JumpToPosition(gLat, gLon, cc->
GetVPScale());
2698void PluginSetFollowMode(
int CanvasIndex,
bool enable_follow) {
2699 if (CanvasIndex < GetCanvasCount()) {
2700 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2702 if (cc->GetbFollow() != enable_follow) cc->TogglebFollow();
2707bool PluginGetFollowMode(
int CanvasIndex) {
2708 if (CanvasIndex < GetCanvasCount()) {
2709 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2710 if (cc)
return cc->GetbFollow();
2715void EnableCanvasFocusBar(
bool enable,
int CanvasIndex) {
2716 if (CanvasIndex < GetCanvasCount()) {
2717 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2718 if (cc) cc->SetShowFocusBar(enable);
2721bool GetEnableCanvasFocusBar(
int CanvasIndex) {
2722 if (CanvasIndex < GetCanvasCount()) {
2723 ChartCanvas* cc = g_canvasArray.Item(CanvasIndex);
2724 if (cc)
return (cc->GetShowFocusBar());
2729bool GetEnableTenHertzUpdate() {
return g_btenhertz; }
2731void EnableTenHertzUpdate(
bool enable) { g_btenhertz = enable; }
2733void ConfigFlushAndReload() {
2736 pConfig->LoadMyConfigRaw(
false);
2737 pConfig->LoadCanvasConfigs(
false);
float GetVPScale()
Return the ViewPort scale factor, in physical pixels per meter.
void ZoomCanvasSimple(double factor)
Perform an immediate zoom operation without smooth transitions.
Manages the chart database and provides access to chart data.
bool LoadBinary(const wxString &filename, ArrayOfCDI &dir_array_check)
Load the chart database from a binary file.
Wrapper class for plugin-based charts.
wxFont * FindOrCreateFont(int point_size, wxFontFamily family, wxFontStyle style, wxFontWeight weight, bool underline=false, const wxString &facename=wxEmptyString, wxFontEncoding encoding=wxFONTENCODING_DEFAULT)
Creates or finds a matching font in the font cache.
wxColour GetFontColor(const wxString &TextElement) const
Gets the text color for a UI element.
bool AddAuxKey(wxString key)
Adds new plugin-defined font configuration key.
bool SetFontColor(const wxString &TextElement, const wxColour color) const
Sets the text color for a UI element.
wxFont * GetFont(const wxString &TextElement, int requested_font_size=0)
Gets a font object for a UI element.
Basic data for a loaded plugin, trivially copyable.
bool DeleteRoute(Route *pRoute, NavObjectChanges *nav_obj_changes)
Represents a single point in a track.
Represents a track, which is a series of connected track points.
Represents the view port for chart display in OpenCPN.
double view_scale_ppm
Requested view scale in physical pixels per meter (ppm), before applying projections.
double ref_scale
The nominal scale of the "reference chart" for this view.
int pix_height
Height of the viewport in physical pixels.
double rotation
Rotation angle of the viewport in radians.
int pix_width
Width of the viewport in physical pixels.
wxPoint2DDouble GetDoublePixFromLL(double lat, double lon)
Convert latitude and longitude on the ViewPort to physical pixel coordinates with double precision.
double skew
Angular distortion (shear transform) applied to the viewport in radians.
void GetLLFromPix(const wxPoint &p, double *lat, double *lon)
Convert physical pixel coordinates on the ViewPort to latitude and longitude.
double clon
Center longitude of the viewport in degrees.
double clat
Center latitude of the viewport in degrees.
wxPoint GetPixFromLL(double lat, double lon)
Convert latitude and longitude on the ViewPort to physical pixel coordinates.
double chart_scale
Chart scale denominator (e.g., 50000 for a 1:50000 scale).
Device context class that can use either wxDC or OpenGL for drawing.
Raw messages layer, supports sending and recieving navmsg messages.
wxFont * GetOCPNScaledFont(wxString item, int default_size)
Retrieves a font from FontMgr, optionally scaled for physical readability.
wxFont GetOCPNGUIScaledFont(wxString item)
Retrieves a font optimized for touch and high-resolution interfaces.
General purpose GUI support.
PlugIn Object Definition/API.
wxFont * OCPNGetFont(wxString TextElement, int default_size)
Gets a font for UI elements.
wxFont GetOCPNGUIScaledFont_PlugIn(wxString item)
Gets a uniquely scaled font copy for responsive UI elements.
wxFont * FindOrCreateFont_PlugIn(int point_size, wxFontFamily family, wxFontStyle style, wxFontWeight weight, bool underline, const wxString &facename, wxFontEncoding encoding)
Creates or finds a font in the font cache.
int GetGlobalWatchdogTimoutSeconds()
Comm Global Watchdog Query
wxColour GetFontColour_PlugIn(wxString TextElement)
Gets color configured for a UI text element.
bool PlugInPlaySoundEx(wxString &sound_file, int deviceIndex)
Start playing a sound file asynchronously.
bool PlugInSetFontColor(const wxString TextElement, const wxColour color)
Sets text color for a UI element.
std::vector< std::string > GetPriorityMaps()
Comm Priority query support methods
bool AddPersistentFontKey(wxString TextElement)
Registers a new font configuration element.
wxString g_locale
Global locale setting for OpenCPN UI.
void PlugInPlaySound(wxString &sound_file)
Start playing a sound file asynchronously.
double g_display_size_mm
The width of the physical screen in millimeters.
Tools to send data to plugins.