42#include <wx/bmpcbox.h>
44#include <wx/filename.h>
45#include <wx/graphics.h>
47#include <wx/listbook.h>
48#include <wx/listimpl.cpp>
49#include <wx/progdlg.h>
50#include <wx/sstream.h>
52#include <wx/timectrl.h>
53#include <wx/tokenzr.h>
55#include "model/ais_decoder.h"
58#include "model/config_vars.h"
59#include "model/conn_params.h"
60#include "model/cutil.h"
61#include "model/geodesic.h"
62#include "model/georef.h"
63#include "model/idents.h"
64#include "model/multiplexer.h"
65#include "model/nav_object_database.h"
66#include "model/navutil_base.h"
67#include "model/own_ship.h"
69#include "model/route.h"
70#include "model/routeman.h"
71#include "model/select.h"
72#include "model/track.h"
75#include "CanvasConfig.h"
88#include "observable_globvar.h"
90#include "ocpn_frame.h"
92#include "OCPNPlatform.h"
93#include "OCPN_Sound.h"
96#include "snd_config.h"
100#include "glChartCanvas.h"
104#include "androidUTIL.h"
112extern double g_ChartNotRenderScaleFactor;
113extern int g_restore_stackindex;
114extern int g_restore_dbindex;
115extern RouteList *pRouteList;
116extern std::vector<Track *> g_TrackList;
117extern LayerList *pLayerList;
119extern double vLat, vLon;
120extern double kLat, kLon;
121extern ColorScheme global_color_scheme;
122extern int g_nbrightness;
123extern bool g_bShowStatusBar;
124extern bool g_bUIexpert;
125extern bool g_bFullscreen;
127extern wxString g_SENCPrefix;
128extern wxString g_UserPresLibData;
130extern wxString *pInit_Chart_Dir;
131extern wxString gWorldMapLocation;
132extern wxString gWorldShapefileLocation;
134extern bool s_bSetSystemTime;
135extern bool g_bDisplayGrid;
136extern bool g_bPlayShipsBells;
137extern int g_iSoundDeviceIndex;
138extern bool g_bFullscreenToolbar;
139extern bool g_bShowLayers;
140extern bool g_bTransparentToolbar;
141extern bool g_bPermanentMOBIcon;
143extern bool g_bShowDepthUnits;
144extern bool g_bAutoAnchorMark;
145extern bool g_bskew_comp;
146extern bool g_bopengl;
147extern bool g_bSoftwareGL;
148extern bool g_bsmoothpanzoom;
149extern bool g_fog_overzoom;
150extern double g_overzoom_emphasis_base;
151extern bool g_oz_vector_scale;
152extern double g_plus_minus_zoom_factor;
153extern bool g_bShowOutlines;
154extern bool g_bShowActiveRouteHighway;
155extern bool g_bShowRouteTotal;
156extern int g_nAWDefault;
158extern bool g_btenhertz;
159extern bool g_declutter_anchorage;
161extern int g_nframewin_x;
162extern int g_nframewin_y;
163extern int g_nframewin_posx;
164extern int g_nframewin_posy;
165extern bool g_bframemax;
167extern wxString g_VisibleLayers;
168extern wxString g_InvisibleLayers;
169extern wxString g_VisiNameinLayers;
170extern wxString g_InVisiNameinLayers;
172extern wxArrayString *pMessageOnceArray;
175extern bool g_bShowLiveETA;
176extern double g_defaultBoatSpeed;
177extern double g_defaultBoatSpeedUserUnit;
179extern bool g_bUseOnlyConfirmedAISName;
180extern int g_ScaledNumWeightSOG;
182extern int g_S57_dialog_sx, g_S57_dialog_sy;
183int g_S57_extradialog_sx, g_S57_extradialog_sy;
185extern int g_iNavAidRadarRingsNumberVisible;
186extern bool g_bNavAidRadarRingsShown;
187extern float g_fNavAidRadarRingsStep;
188extern int g_pNavAidRadarRingsStepUnits;
189extern bool g_bWayPointPreventDragging;
190extern bool g_bConfirmObjectDelete;
191extern wxColour g_colourOwnshipRangeRingsColour;
193extern bool g_bEnableZoomToCursor;
194extern wxString g_toolbarConfig;
195extern double g_TrackIntervalSeconds;
197extern int g_nCacheLimit;
198extern int g_memCacheLimit;
200extern bool g_bGDAL_Debug;
201extern bool g_bDebugCM93;
202extern bool g_bDebugS57;
204extern double g_ownship_predictor_minutes;
205extern int g_cog_predictor_style;
206extern wxString g_cog_predictor_color;
207extern int g_cog_predictor_endmarker;
208extern int g_cog_predictor_width;
209extern int g_ownship_HDTpredictor_style;
210extern wxString g_ownship_HDTpredictor_color;
211extern int g_ownship_HDTpredictor_endmarker;
212extern int g_ownship_HDTpredictor_width;
213extern double g_ownship_HDTpredictor_miles;
215extern bool g_own_ship_sog_cog_calc;
216extern int g_own_ship_sog_cog_calc_damp_sec;
218extern bool g_bShowMenuBar;
219extern bool g_bShowCompassWin;
221extern s52plib *ps52plib;
223extern int g_cm93_zoom_factor;
224extern bool g_b_legacy_input_filter_behaviour;
225extern bool g_bShowDetailSlider;
226extern int g_detailslider_dialog_x, g_detailslider_dialog_y;
228extern bool g_bUseGreenShip;
230extern int g_OwnShipmmsi;
231extern int g_OwnShipIconType;
232extern double g_n_ownship_length_meters;
233extern double g_n_ownship_beam_meters;
234extern double g_n_gps_antenna_offset_y;
235extern double g_n_gps_antenna_offset_x;
236extern int g_n_ownship_min_mm;
237extern int g_maxzoomin;
239extern bool g_bShowShipToActive;
240extern int g_shipToActiveStyle;
241extern int g_shipToActiveColor;
243extern bool g_bPreserveScaleOnX;
244extern bool g_bsimplifiedScalebar;
246extern bool g_bUseGLL;
248extern wxString g_locale;
249extern wxString g_localeOverride;
251extern bool g_bCourseUp;
252extern bool g_bLookAhead;
253extern int g_COGAvgSec;
254extern bool g_bShowChartBar;
256extern int g_MemFootMB;
258extern wxString g_AW1GUID;
259extern wxString g_AW2GUID;
260extern int g_BSBImgDebug;
262extern int n_NavMessageShown;
263extern wxString g_config_version_string;
265extern wxString g_CmdSoundString;
267extern bool g_bDebugGPSD;
271extern bool g_bQuiltEnable;
272extern bool g_bFullScreenQuilt;
273extern bool g_bQuiltStart;
275extern int g_SkewCompUpdatePeriod;
277extern int g_maintoolbar_x;
278extern int g_maintoolbar_y;
279extern long g_maintoolbar_orient;
281extern int g_lastClientRectx;
282extern int g_lastClientRecty;
283extern int g_lastClientRectw;
284extern int g_lastClientRecth;
286extern bool g_bHighliteTracks;
287extern int g_cog_predictor_width;
288extern int g_ais_cog_predictor_width;
290extern wxColour g_colourTrackLineColour;
291extern wxString g_default_wp_icon;
293extern ChartGroupArray *g_pGroupArray;
295extern bool g_bDebugOGL;
296extern int g_tcwin_scale;
297extern wxString g_uploadConnection;
300extern std::vector<std::string> TideCurrentDataSet;
301extern wxString g_TCData_Dir;
305extern bool g_bGLexpert;
307extern int g_SENC_LOD_pixels;
308extern ArrayOfMmsiProperties g_MMSI_Props_Array;
310extern int g_chart_zoom_modifier_raster;
311extern int g_chart_zoom_modifier_vector;
313extern bool g_bShowTrackPointTime;
315extern bool g_bAdvanceRouteWaypointOnArrivalOnly;
316extern double g_display_size_mm;
317extern std::vector<size_t> g_config_display_size_mm;
318extern bool g_config_display_size_manual;
320extern bool g_benable_rotate;
321extern bool g_bEmailCrashReport;
323extern int g_default_font_size;
324extern wxString g_default_font_facename;
326extern bool g_bAutoHideToolbar;
327extern int g_nAutoHideToolbar;
328extern int g_GUIScaleFactor;
329extern int g_ChartScaleFactor;
330extern float g_MarkScaleFactorExp;
332extern int g_ShipScaleFactor;
333extern float g_ShipScaleFactorExp;
334extern int g_ENCSoundingScaleFactor;
335extern int g_ENCTextScaleFactor;
337extern int g_iENCToolbarPosX;
338extern int g_iENCToolbarPosY;
339extern bool g_bRollover;
341extern bool g_bSpaceDropMark;
343extern bool g_bShowTide;
344extern bool g_bShowCurrent;
346extern wxString g_uiStyle;
347extern bool g_btrackContinuous;
352extern unsigned int g_canvasConfig;
353extern wxString g_lastAppliedTemplateGUID;
355extern int g_route_prop_x, g_route_prop_y;
356extern int g_route_prop_sx, g_route_prop_sy;
357extern int g_AndroidVersionCode;
359extern wxString g_ObjQFileExt;
363bool g_bShowMuiZoomButtons =
true;
365double g_mouse_zoom_sensitivity;
366int g_mouse_zoom_sensitivity_ui;
373static const long long lNaN = 0xfff8000000000000;
374#define NAN (*(double *)&lNaN)
379wxString GetLayerName(
int id) {
380 wxString name(_T(
"unknown layer"));
381 if (
id <= 0)
return (name);
382 LayerList::iterator it;
384 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
386 if (lay->m_LayerID ==
id)
return (lay->m_LayerName);
392void appendOSDirSlash(wxString *pString);
399MyConfig::MyConfig(
const wxString &LocalFileName)
400 : wxFileConfig(_T (
""), _T (
""), LocalFileName, _T (
""),
401 wxCONFIG_USE_LOCAL_FILE) {
403 wxFileName config_file(LocalFileName);
405 config_file.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
406 m_sNavObjSetFile += _T (
"navobj.xml" );
407 m_sNavObjSetChangesFile = m_sNavObjSetFile + _T (
".changes" );
409 m_pNavObjectInputSet = NULL;
410 m_pNavObjectChangesSet = NavObjectChanges::getInstance();
413MyConfig::~MyConfig() {}
415void MyConfig::CreateRotatingNavObjBackup() {
421 if (wxFileExists(m_sNavObjSetFile)) {
422 int month = wxDateTime::Now().GetMonth() + 1;
424 wxString::Format(_T(
"%s.m%d"), m_sNavObjSetFile.c_str(), month);
425 if (!wxFileExists(fn)) {
426 wxCopyFile(m_sNavObjSetFile, fn);
429 for (wxDateTime::wxDateTime_t i = 1; i <= month - 3; i++) {
430 fn = wxString::Format(_T(
"%s.m%d"), m_sNavObjSetFile.c_str(), i);
431 if (wxFileExists(fn)) {
435 for (wxDateTime::wxDateTime_t i = month + 1; i <= 12; i++) {
436 fn = wxString::Format(_T(
"%s.m%d"), m_sNavObjSetFile.c_str(), i);
437 if (wxFileExists(fn)) {
442 for (wxDateTime::wxDateTime_t i = month + 1; i <= 12 - month; i++) {
443 fn = wxString::Format(_T(
"%s.m%d"), m_sNavObjSetFile.c_str(), i);
444 if (wxFileExists(fn)) {
450 wxDateTime::wxDateTime_t week = wxDateTime::Now().GetWeekOfYear();
451 fn = wxString::Format(_T(
"%s.w%u"), m_sNavObjSetFile.c_str(), week);
452 if (!wxFileExists(fn)) {
453 wxCopyFile(m_sNavObjSetFile, fn);
456 for (wxDateTime::wxDateTime_t i = 1; i <= week - 4; i++) {
457 fn = wxString::Format(_T(
"%s.w%u"), m_sNavObjSetFile.c_str(), i);
458 if (wxFileExists(fn)) {
462 for (wxDateTime::wxDateTime_t i = week + 1; i <= 53; i++) {
463 fn = wxString::Format(_T(
"%s.w%u"), m_sNavObjSetFile.c_str(), i);
464 if (wxFileExists(fn)) {
469 for (wxDateTime::wxDateTime_t i = week + 1; i <= 53 - week; i++) {
470 fn = wxString::Format(_T(
"%s.w%u"), m_sNavObjSetFile.c_str(), i);
471 if (wxFileExists(fn)) {
482 if (g_navobjbackups > 0) {
484 wxString oldname = m_sNavObjSetFile;
485 wxString newname = wxString::Format(_T(
"%s.1"), m_sNavObjSetFile.c_str());
487 wxFileOffset s_diff = 1;
488 if (::wxFileExists(newname)) {
489 if (f.Open(oldname)) {
494 if (f.Open(newname)) {
495 s_diff -= f.Length();
501 for (
int i = g_navobjbackups - 1; i >= 1; i--) {
502 oldname = wxString::Format(_T(
"%s.%d"), m_sNavObjSetFile.c_str(), i);
504 wxString::Format(_T(
"%s.%d"), m_sNavObjSetFile.c_str(), i + 1);
505 if (wxFile::Exists(oldname)) wxCopyFile(oldname, newname);
508 wxULongLong size = wxFileName::GetSize(m_sNavObjSetFile);
509 if (wxFile::Exists(m_sNavObjSetFile) && size > 0) {
510 newname = wxString::Format(_T(
"%s.1"), m_sNavObjSetFile.c_str());
511 wxCopyFile(m_sNavObjSetFile, newname);
517 for (
int i = g_navobjbackups + 1; i <= 99; i++)
519 wxString::Format(_T(
"%s.%d"), m_sNavObjSetFile.c_str(), i)))
520 wxRemoveFile(wxString::Format(_T(
"%s.%d"), m_sNavObjSetFile.c_str(), i));
525int MyConfig::LoadMyConfig() {
526 int display_width, display_height;
527 display_width = g_monitor_info[g_current_monitor].width;
528 display_height = g_monitor_info[g_current_monitor].height;
532 g_TalkerIdText = _T(
"EC");
533 g_maxWPNameLength = 6;
534 g_NMEAAPBPrecision = 3;
537 g_GLOptions.m_bUseAcceleratedPanning =
true;
538 g_GLOptions.m_GLPolygonSmoothing =
true;
539 g_GLOptions.m_GLLineSmoothing =
true;
540 g_GLOptions.m_iTextureDimension = 512;
541 g_GLOptions.m_iTextureMemorySize = 128;
543 g_GLOptions.m_iTextureMemorySize =
544 wxMax(128, g_GLOptions.m_iTextureMemorySize);
545 g_GLOptions.m_bTextureCompressionCaching =
546 g_GLOptions.m_bTextureCompression;
550 g_maintoolbar_orient = wxTB_HORIZONTAL;
551 g_iENCToolbarPosX = -1;
552 g_iENCToolbarPosY = -1;
553 g_restore_dbindex = -1;
554 g_ChartNotRenderScaleFactor = 1.5;
555 g_detailslider_dialog_x = 200L;
556 g_detailslider_dialog_y = 200L;
557 g_SENC_LOD_pixels = 2;
558 g_SkewCompUpdatePeriod = 10;
560 g_bShowStatusBar = 1;
561 g_bShowCompassWin = 1;
562 g_iSoundDeviceIndex = -1;
563 g_bFullscreenToolbar = 1;
564 g_bTransparentToolbar = 0;
566 g_bShowDepthUnits = 1;
567 g_bShowActiveRouteHighway = 1;
569 g_defaultBoatSpeed = 6.0;
570 g_ownship_predictor_minutes = 5;
571 g_cog_predictor_style = 105;
572 g_cog_predictor_color = _T(
"rgb(255,0,0)" );
573 g_cog_predictor_endmarker = 1;
574 g_ownship_HDTpredictor_style = 105;
575 g_ownship_HDTpredictor_color = _T(
"rgb(255,0,0)" );
576 g_ownship_HDTpredictor_endmarker = 1;
577 g_ownship_HDTpredictor_width = 0;
578 g_cog_predictor_width = 3;
579 g_ownship_HDTpredictor_miles = 1;
580 g_n_ownship_min_mm = 2;
581 g_own_ship_sog_cog_calc_damp_sec = 1;
582 g_bFullScreenQuilt = 1;
583 g_track_rotate_time_type = TIME_TYPE_COMPUTER;
584 g_bHighliteTracks = 1;
585 g_bPreserveScaleOnX = 1;
587 g_benableAISNameCache =
true;
588 g_n_arrival_circle_radius = 0.05;
589 g_plus_minus_zoom_factor = 2.0;
590 g_mouse_zoom_sensitivity = 1.5;
591 g_datetime_format =
"UTC";
593 g_AISShowTracks_Mins = 20;
594 g_AISShowTracks_Limit = 300.0;
595 g_ShowScaled_Num = 10;
596 g_ScaledNumWeightSOG = 50;
597 g_ScaledNumWeightCPA = 60;
598 g_ScaledNumWeightTCPA = 25;
599 g_ScaledSizeMinimal = 50;
600 g_ScaledNumWeightRange = 75;
601 g_ScaledNumWeightSizeOfT = 25;
602 g_Show_Target_Name_Scale = 250000;
603 g_bWplUsePosition = 0;
605 g_ais_cog_predictor_width = 3;
606 g_ais_alert_dialog_sx = 200;
607 g_ais_alert_dialog_sy = 200;
608 g_ais_alert_dialog_x = 200;
609 g_ais_alert_dialog_y = 200;
610 g_ais_query_dialog_x = 200;
611 g_ais_query_dialog_y = 200;
612 g_AisTargetList_range = 40;
613 g_AisTargetList_sortColumn = 2;
614 g_S57_dialog_sx = 400;
615 g_S57_dialog_sy = 400;
616 g_S57_extradialog_sx = 400;
617 g_S57_extradialog_sy = 400;
626 g_iNavAidRadarRingsNumberVisible = 0;
627 g_bNavAidRadarRingsShown =
false;
628 g_fNavAidRadarRingsStep = 1.0;
629 g_pNavAidRadarRingsStepUnits = 0;
630 g_colourOwnshipRangeRingsColour = *wxRED;
631 g_iWaypointRangeRingsNumber = 0;
632 g_fWaypointRangeRingsStep = 1.0;
633 g_iWaypointRangeRingsStepUnits = 0;
634 g_colourWaypointRangeRingsColour = wxColour(*wxRED);
635 g_bConfirmObjectDelete =
true;
637 g_TrackIntervalSeconds = 60.0;
638 g_TrackDeltaDistance = 0.10;
639 g_route_line_width = 2;
640 g_track_line_width = 2;
641 g_colourTrackLineColour = wxColour(243, 229, 47);
644 g_default_wp_icon = _T(
"triangle");
645 g_default_routepoint_icon = _T(
"diamond");
649 g_ObjQFileExt = _T(
"txt,rtf,png,html,gif,tif,jpg");
652 int ret_Val = LoadMyConfigRaw();
656 g_ChartScaleFactorExp =
657 g_Platform->GetChartScaleFactorExp(g_ChartScaleFactor);
658 g_ShipScaleFactorExp =
659 g_Platform->GetChartScaleFactorExp(g_ShipScaleFactor);
660 g_MarkScaleFactorExp =
661 g_Platform->GetMarkScaleFactorExp(g_ChartScaleFactor);
663 g_COGFilterSec = wxMin(g_COGFilterSec, MAX_COGSOG_FILTER_SECONDS);
664 g_COGFilterSec = wxMax(g_COGFilterSec, 1);
665 g_SOGFilterSec = g_COGFilterSec;
667 if (!g_bShowTrue && !g_bShowMag) g_bShowTrue =
true;
669 wxMin(g_COGAvgSec, MAX_COG_AVERAGE_SECONDS);
671 if (g_bInlandEcdis) g_bLookAhead = 1;
673 if (g_bdisable_opengl) g_bopengl =
false;
677 g_GLOptions.m_iTextureMemorySize =
678 wxMax(128, g_GLOptions.m_iTextureMemorySize);
679 g_GLOptions.m_bTextureCompressionCaching =
680 g_GLOptions.m_bTextureCompression;
684 g_chart_zoom_modifier_raster = wxMin(g_chart_zoom_modifier_raster, 5);
685 g_chart_zoom_modifier_raster = wxMax(g_chart_zoom_modifier_raster, -5);
686 g_chart_zoom_modifier_vector = wxMin(g_chart_zoom_modifier_vector, 5);
687 g_chart_zoom_modifier_vector = wxMax(g_chart_zoom_modifier_vector, -5);
688 g_cm93_zoom_factor = wxMin(g_cm93_zoom_factor, CM93_ZOOM_FACTOR_MAX_RANGE);
690 wxMax(g_cm93_zoom_factor, (-CM93_ZOOM_FACTOR_MAX_RANGE));
692 if ((g_detailslider_dialog_x < 0) ||
693 (g_detailslider_dialog_x > display_width))
694 g_detailslider_dialog_x = 5;
695 if ((g_detailslider_dialog_y < 0) ||
696 (g_detailslider_dialog_y > display_height))
697 g_detailslider_dialog_y = 5;
699 g_defaultBoatSpeedUserUnit = toUsrSpeed(g_defaultBoatSpeed, -1);
700 g_n_ownship_min_mm = wxMax(g_n_ownship_min_mm, 2);
702 if (g_navobjbackups > 99) g_navobjbackups = 99;
703 if (g_navobjbackups < 0) g_navobjbackups = 0;
704 g_n_arrival_circle_radius = wxClip(g_n_arrival_circle_radius, 0.001, 0.6);
706 g_selection_radius_mm = wxMax(g_selection_radius_mm, 0.5);
707 g_selection_radius_touch_mm = wxMax(g_selection_radius_touch_mm, 1.0);
709 g_Show_Target_Name_Scale = wxMax(5000, g_Show_Target_Name_Scale);
711 if ((g_ais_alert_dialog_x < 0) || (g_ais_alert_dialog_x > display_width))
712 g_ais_alert_dialog_x = 5;
713 if ((g_ais_alert_dialog_y < 0) || (g_ais_alert_dialog_y > display_height))
714 g_ais_alert_dialog_y = 5;
715 if ((g_ais_query_dialog_x < 0) || (g_ais_query_dialog_x > display_width))
716 g_ais_query_dialog_x = 5;
717 if ((g_ais_query_dialog_y < 0) || (g_ais_query_dialog_y > display_height))
718 g_ais_query_dialog_y = 5;
720 SwitchInlandEcdisMode(g_bInlandEcdis);
722 global_color_scheme =
723 GLOBAL_COLOR_SCHEME_DUSK;
732int MyConfig::LoadMyConfigRaw(
bool bAsTemplate) {
736 int display_width, display_height;
737 display_width = g_monitor_info[g_current_monitor].width;
738 display_height = g_monitor_info[g_current_monitor].height;
741 SetPath(_T (
"/Settings" ));
742 Read(
"ActiveRoute", &g_active_route);
743 Read(
"PersistActiveRoute", &g_persist_active_route);
744 Read(_T (
"LastAppliedTemplate" ), &g_lastAppliedTemplateGUID);
745 Read(_T (
"CompatOS" ), &g_compatOS);
746 Read(_T (
"CompatOsVersion" ), &g_compatOsVersion);
749 Read(_T (
"ConfigVersionString" ), &g_config_version_string);
750 Read(_T(
"CmdSoundString"), &g_CmdSoundString, wxString(OCPN_SOUND_CMD));
751 if (wxIsEmpty(g_CmdSoundString)) g_CmdSoundString = wxString(OCPN_SOUND_CMD);
752 Read(_T (
"NavMessageShown" ), &n_NavMessageShown);
754 Read(_T (
"AndroidVersionCode" ), &g_AndroidVersionCode);
756 Read(_T (
"UIexpert" ), &g_bUIexpert);
758 Read(_T (
"UIStyle" ), &g_uiStyle);
760 Read(_T (
"NCacheLimit" ), &g_nCacheLimit);
762 Read(_T (
"InlandEcdis" ),
766 Read(_T(
"SpaceDropMark" ), &g_bSpaceDropMark);
769 Read(_T (
"MEMCacheLimit" ), &mem_limit);
771 g_memCacheLimit = mem_limit * 1024;
773 Read(_T (
"UseModernUI5" ), &g_useMUI);
775 Read(_T(
"NCPUCount" ), &g_nCPUCount);
777 Read(_T (
"DebugGDAL" ), &g_bGDAL_Debug);
778 Read(_T (
"DebugNMEA" ), &g_nNMEADebug);
779 Read(_T (
"AnchorWatchDefault" ), &g_nAWDefault);
780 Read(_T (
"AnchorWatchMax" ), &g_nAWMax);
781 Read(_T (
"GPSDogTimeout" ), &gps_watchdog_timeout_ticks);
782 Read(_T (
"DebugCM93" ), &g_bDebugCM93);
783 Read(_T (
"DebugS57" ),
785 Read(_T (
"DebugBSBImg" ), &g_BSBImgDebug);
786 Read(_T (
"DebugGPSD" ), &g_bDebugGPSD);
787 Read(_T (
"MaxZoomScale" ), &g_maxzoomin);
788 g_maxzoomin = wxMax(g_maxzoomin, 50);
790 Read(_T (
"DefaultFontSize"), &g_default_font_size);
791 Read(_T (
"DefaultFontFacename"), &g_default_font_facename);
793 Read(_T (
"UseGreenShipIcon" ), &g_bUseGreenShip);
795 Read(_T (
"AutoHideToolbar" ), &g_bAutoHideToolbar);
796 Read(_T (
"AutoHideToolbarSecs" ), &g_nAutoHideToolbar);
798 Read(_T (
"UseSimplifiedScalebar" ), &g_bsimplifiedScalebar);
799 Read(_T (
"ShowTide" ), &g_bShowTide);
800 Read(_T (
"ShowCurrent" ), &g_bShowCurrent);
803 Read(_T (
"DisplaySizeMM" ), &size_mm);
805 Read(_T (
"SelectionRadiusMM" ), &g_selection_radius_mm);
806 Read(_T (
"SelectionRadiusTouchMM" ), &g_selection_radius_touch_mm);
809 g_config_display_size_mm.clear();
810 wxStringTokenizer tokenizer(size_mm,
",");
811 while (tokenizer.HasMoreTokens()) {
812 wxString token = tokenizer.GetNextToken();
815 size = std::stoi(token.ToStdString());
816 }
catch (std::invalid_argument &e) {
819 if (size > 100 && size < 2000) {
820 g_config_display_size_mm.push_back(size);
822 g_config_display_size_mm.push_back(0);
825 Read(_T (
"DisplaySizeManual" ), &g_config_display_size_manual);
828 Read(_T (
"GUIScaleFactor" ), &g_GUIScaleFactor);
830 Read(_T (
"ChartObjectScaleFactor" ), &g_ChartScaleFactor);
831 Read(_T (
"ShipScaleFactor" ), &g_ShipScaleFactor);
832 Read(_T (
"ENCSoundingScaleFactor" ), &g_ENCSoundingScaleFactor);
833 Read(_T (
"ENCTextScaleFactor" ), &g_ENCTextScaleFactor);
834 Read(_T (
"ObjQueryAppendFilesExt" ), &g_ObjQFileExt);
837 Read(
"CatalogCustomURL", &g_catalog_custom_url);
838 Read(
"CatalogChannel", &g_catalog_channel);
840 Read(
"NetmaskBits", &g_netmask_bits);
844 Read(_T (
"FilterNMEA_Avg" ), &g_bfilter_cogsog);
845 Read(_T (
"FilterNMEA_Sec" ), &g_COGFilterSec);
846 Read(_T (
"GPSIdent" ), &g_GPS_Ident);
847 Read(_T (
"UseGarminHostUpload" ), &g_bGarminHostUpload);
848 Read(_T (
"UseNMEA_GLL" ), &g_bUseGLL);
849 Read(_T (
"UseMagAPB" ), &g_bMagneticAPB);
850 Read(_T (
"TrackContinuous" ), &g_btrackContinuous,
false);
851 Read(_T (
"FilterTrackDropLargeJump" ), &g_trackFilterMax, 1000);
854 Read(_T (
"ShowTrue" ), &g_bShowTrue);
855 Read(_T (
"ShowMag" ), &g_bShowMag);
858 Read(_T (
"UserMagVariation" ), &umv);
859 if (umv.Len()) umv.ToDouble(&g_UserVar);
861 Read(_T (
"ScreenBrightness" ), &g_nbrightness);
863 Read(_T (
"MemFootprintTargetMB" ), &g_MemFootMB);
865 Read(_T (
"WindowsComPortMax" ), &g_nCOMPortCheck);
867 Read(_T (
"ChartQuilting" ), &g_bQuiltEnable);
868 Read(_T (
"ChartQuiltingInitial" ), &g_bQuiltStart);
870 Read(_T (
"CourseUpMode" ), &g_bCourseUp);
871 Read(_T (
"COGUPAvgSeconds" ), &g_COGAvgSec);
872 Read(_T (
"LookAheadMode" ), &g_bLookAhead);
873 Read(_T (
"SkewToNorthUp" ), &g_bskew_comp);
874 Read(_T (
"TenHzUpdate" ), &g_btenhertz, 0);
875 Read(_T (
"DeclutterAnchorage" ), &g_declutter_anchorage, 0);
877 Read(_T(
"NMEAAPBPrecision" ), &g_NMEAAPBPrecision);
879 Read(_T(
"TalkerIdText" ), &g_TalkerIdText);
880 Read(_T(
"MaxWaypointNameLength" ), &g_maxWPNameLength);
881 Read(_T(
"MbtilesMaxLayers" ), &g_mbtilesMaxLayers);
883 Read(_T(
"ShowTrackPointTime" ), &g_bShowTrackPointTime,
true);
887 Read(_T (
"OpenGLExpert" ), &g_bGLexpert,
false);
888 Read(_T (
"UseAcceleratedPanning" ), &g_GLOptions.m_bUseAcceleratedPanning,
890 Read(_T (
"GPUTextureCompression" ), &g_GLOptions.m_bTextureCompression);
891 Read(_T (
"GPUTextureCompressionCaching" ),
892 &g_GLOptions.m_bTextureCompressionCaching);
893 Read(_T (
"PolygonSmoothing" ), &g_GLOptions.m_GLPolygonSmoothing);
894 Read(_T (
"LineSmoothing" ), &g_GLOptions.m_GLLineSmoothing);
895 Read(_T (
"GPUTextureDimension" ), &g_GLOptions.m_iTextureDimension);
896 Read(_T (
"GPUTextureMemSize" ), &g_GLOptions.m_iTextureMemorySize);
897 Read(_T (
"DebugOpenGL" ), &g_bDebugOGL);
898 Read(_T (
"OpenGL" ), &g_bopengl);
899 Read(_T (
"SoftwareGL" ), &g_bSoftwareGL);
903 Read(_T (
"SmoothPanZoom" ), &g_bsmoothpanzoom);
905 Read(_T (
"ToolbarX"), &g_maintoolbar_x);
906 Read(_T (
"ToolbarY" ), &g_maintoolbar_y);
907 Read(_T (
"ToolbarOrient" ), &g_maintoolbar_orient);
908 Read(_T (
"GlobalToolbarConfig" ), &g_toolbarConfig);
910 Read(_T (
"iENCToolbarX"), &g_iENCToolbarPosX);
911 Read(_T (
"iENCToolbarY"), &g_iENCToolbarPosY);
913 Read(_T (
"AnchorWatch1GUID" ), &g_AW1GUID);
914 Read(_T (
"AnchorWatch2GUID" ), &g_AW2GUID);
916 Read(_T (
"InitialStackIndex" ), &g_restore_stackindex);
917 Read(_T (
"InitialdBIndex" ), &g_restore_dbindex);
919 Read(_T (
"ChartNotRenderScaleFactor" ), &g_ChartNotRenderScaleFactor);
921 Read(_T (
"MobileTouch" ), &g_btouch);
931 Read(_T (
"EnableRolloverBlock" ), &g_bRollover);
933 Read(_T (
"ZoomDetailFactor" ), &g_chart_zoom_modifier_raster);
934 Read(_T (
"ZoomDetailFactorVector" ), &g_chart_zoom_modifier_vector);
935 Read(_T (
"PlusMinusZoomFactor" ), &g_plus_minus_zoom_factor, 2.0);
936 Read(
"MouseZoomSensitivity", &g_mouse_zoom_sensitivity, 1.3);
937 g_mouse_zoom_sensitivity_ui =
939 Read(_T (
"CM93DetailFactor" ), &g_cm93_zoom_factor);
941 Read(_T (
"CM93DetailZoomPosX" ), &g_detailslider_dialog_x);
942 Read(_T (
"CM93DetailZoomPosY" ), &g_detailslider_dialog_y);
943 Read(_T (
"ShowCM93DetailSlider" ), &g_bShowDetailSlider);
945 Read(_T (
"SENC_LOD_Pixels" ), &g_SENC_LOD_pixels);
947 Read(_T (
"SkewCompUpdatePeriod" ), &g_SkewCompUpdatePeriod);
949 Read(_T (
"SetSystemTime" ), &s_bSetSystemTime);
950 Read(_T (
"ShowStatusBar" ), &g_bShowStatusBar);
952 Read(_T (
"ShowMenuBar" ), &g_bShowMenuBar);
954 Read(_T (
"Fullscreen" ), &g_bFullscreen);
955 Read(_T (
"ShowCompassWindow" ), &g_bShowCompassWin);
956 Read(_T (
"ShowGrid" ), &g_bDisplayGrid);
957 Read(_T (
"PlayShipsBells" ), &g_bPlayShipsBells);
958 Read(_T (
"SoundDeviceIndex" ), &g_iSoundDeviceIndex);
959 Read(_T (
"FullscreenToolbar" ), &g_bFullscreenToolbar);
960 Read(_T (
"PermanentMOBIcon" ), &g_bPermanentMOBIcon);
961 Read(_T (
"ShowLayers" ), &g_bShowLayers);
962 Read(_T (
"ShowDepthUnits" ), &g_bShowDepthUnits);
963 Read(_T (
"AutoAnchorDrop" ), &g_bAutoAnchorMark);
964 Read(_T (
"ShowChartOutlines" ), &g_bShowOutlines);
965 Read(_T (
"ShowActiveRouteHighway" ), &g_bShowActiveRouteHighway);
966 Read(_T (
"ShowActiveRouteTotal" ), &g_bShowRouteTotal);
967 Read(_T (
"MostRecentGPSUploadConnection" ), &g_uploadConnection);
968 Read(_T (
"ShowChartBar" ), &g_bShowChartBar);
969 Read(_T (
"SDMMFormat" ),
973 Read(_T (
"DistanceFormat" ),
976 Read(_T (
"SpeedFormat" ),
978 Read(_T (
"WindSpeedFormat" ),
979 &g_iWindSpeedFormat);
980 Read(_T (
"TemperatureFormat"), &g_iTempFormat);
983 Read(_T (
"LiveETA" ), &g_bShowLiveETA);
984 Read(_T (
"DefaultBoatSpeed" ), &g_defaultBoatSpeed);
986 Read(_T (
"OwnshipCOGPredictorMinutes" ), &g_ownship_predictor_minutes);
987 Read(_T (
"OwnshipCOGPredictorStyle" ), &g_cog_predictor_style);
988 Read(_T (
"OwnshipCOGPredictorColor" ), &g_cog_predictor_color);
989 Read(_T (
"OwnshipCOGPredictorEndmarker" ), &g_cog_predictor_endmarker);
990 Read(_T (
"OwnshipCOGPredictorWidth" ), &g_cog_predictor_width);
991 Read(_T (
"OwnshipHDTPredictorStyle" ), &g_ownship_HDTpredictor_style);
992 Read(_T (
"OwnshipHDTPredictorColor" ), &g_ownship_HDTpredictor_color);
993 Read(_T (
"OwnshipHDTPredictorEndmarker" ),
994 &g_ownship_HDTpredictor_endmarker);
995 Read(_T (
"OwnshipHDTPredictorWidth" ), &g_ownship_HDTpredictor_width);
996 Read(_T (
"OwnshipHDTPredictorMiles" ), &g_ownship_HDTpredictor_miles);
998 Read(_T (
"OwnShipMMSINumber" ), &g_OwnShipmmsi);
999 Read(_T (
"OwnShipIconType" ), &g_OwnShipIconType);
1000 Read(_T (
"OwnShipLength" ), &g_n_ownship_length_meters);
1001 Read(_T (
"OwnShipWidth" ), &g_n_ownship_beam_meters);
1002 Read(_T (
"OwnShipGPSOffsetX" ), &g_n_gps_antenna_offset_x);
1003 Read(_T (
"OwnShipGPSOffsetY" ), &g_n_gps_antenna_offset_y);
1004 Read(_T (
"OwnShipMinSize" ), &g_n_ownship_min_mm);
1005 Read(_T (
"OwnShipSogCogCalc" ), &g_own_ship_sog_cog_calc);
1006 Read(_T (
"OwnShipSogCogCalcDampSec"), &g_own_ship_sog_cog_calc_damp_sec);
1007 Read(_T (
"ShowDirectRouteLine"), &g_bShowShipToActive);
1008 Read(_T (
"DirectRouteLineStyle"), &g_shipToActiveStyle);
1009 Read(_T(
"DirectRouteLineColor" ), &g_shipToActiveColor);
1012 Read(_T (
"RouteArrivalCircleRadius" ), &racr);
1013 if (racr.Len()) racr.ToDouble(&g_n_arrival_circle_radius);
1015 Read(_T (
"FullScreenQuilt" ), &g_bFullScreenQuilt);
1017 Read(_T (
"StartWithTrackActive" ), &g_bTrackCarryOver);
1018 Read(_T (
"AutomaticDailyTracks" ), &g_bTrackDaily);
1019 Read(_T (
"TrackRotateAt" ), &g_track_rotate_time);
1020 Read(_T (
"TrackRotateTimeType" ), &g_track_rotate_time_type);
1021 Read(_T (
"HighlightTracks" ), &g_bHighliteTracks);
1023 Read(_T (
"DateTimeFormat" ), &g_datetime_format);
1026 Read(_T (
"PlanSpeed" ), &stps);
1027 if (!stps.IsEmpty()) stps.ToDouble(&g_PlanSpeed);
1029 Read(_T (
"VisibleLayers" ), &g_VisibleLayers);
1030 Read(_T (
"InvisibleLayers" ), &g_InvisibleLayers);
1031 Read(_T (
"VisNameInLayers" ), &g_VisiNameinLayers);
1032 Read(_T (
"InvisNameInLayers" ), &g_InVisiNameinLayers);
1034 Read(_T (
"PreserveScaleOnX" ), &g_bPreserveScaleOnX);
1036 Read(_T (
"ShowMUIZoomButtons" ), &g_bShowMuiZoomButtons);
1038 Read(_T (
"Locale" ), &g_locale);
1039 Read(_T (
"LocaleOverride" ), &g_localeOverride);
1042 Read(_T (
"KeepNavobjBackups" ), &g_navobjbackups);
1046 Read(_T (
"LegacyInputCOMPortFilterBehaviour" ),
1047 &g_b_legacy_input_filter_behaviour);
1050 Read(_T(
"AdvanceRouteWaypointOnArrivalOnly" ),
1051 &g_bAdvanceRouteWaypointOnArrivalOnly);
1052 Read(
"EnableRootMenuDebug", &g_enable_root_menu_debug);
1054 Read(_T (
"EnableRotateKeys" ), &g_benable_rotate);
1055 Read(_T (
"EmailCrashReport" ), &g_bEmailCrashReport);
1057 g_benableAISNameCache =
true;
1058 Read(_T (
"EnableAISNameCache" ), &g_benableAISNameCache);
1060 Read(_T (
"EnableUDPNullHeader" ), &g_benableUDPNullHeader);
1062 SetPath(_T (
"/Settings/GlobalState" ));
1064 Read(_T (
"FrameWinX" ), &g_nframewin_x);
1065 Read(_T (
"FrameWinY" ), &g_nframewin_y);
1066 Read(_T (
"FrameWinPosX" ), &g_nframewin_posx);
1067 Read(_T (
"FrameWinPosY" ), &g_nframewin_posy);
1068 Read(_T (
"FrameMax" ), &g_bframemax);
1070 Read(_T (
"ClientPosX" ), &g_lastClientRectx);
1071 Read(_T (
"ClientPosY" ), &g_lastClientRecty);
1072 Read(_T (
"ClientSzX" ), &g_lastClientRectw);
1073 Read(_T (
"ClientSzY" ), &g_lastClientRecth);
1075 Read(_T(
"RoutePropSizeX" ), &g_route_prop_sx);
1076 Read(_T(
"RoutePropSizeY" ), &g_route_prop_sy);
1077 Read(_T(
"RoutePropPosX" ), &g_route_prop_x);
1078 Read(_T(
"RoutePropPosY" ), &g_route_prop_y);
1081 Read(_T (
"S52_DEPTH_UNIT_SHOW" ), &read_int);
1082 if (read_int >= 0) {
1083 read_int = wxMax(read_int, 0);
1084 read_int = wxMin(read_int, 2);
1085 g_nDepthUnitDisplay = read_int;
1089 SetPath(_T (
"/Settings/Audio" ));
1092 wxString sound_dir = g_Platform->GetSharedDataDir();
1093 sound_dir.Append(_T(
"sounds"));
1094 sound_dir.Append(wxFileName::GetPathSeparator());
1096 g_AIS_sound_file = sound_dir + _T(
"beep_ssl.wav");
1097 g_DSC_sound_file = sound_dir + _T(
"phonering1.wav");
1098 g_SART_sound_file = sound_dir + _T(
"beep3.wav");
1099 g_anchorwatch_sound_file = sound_dir + _T(
"beep1.wav");
1101 Read(_T (
"AISAlertSoundFile" ), &g_AIS_sound_file);
1102 Read(_T (
"DSCAlertSoundFile" ), &g_DSC_sound_file);
1103 Read(_T (
"SARTAlertSoundFile" ), &g_SART_sound_file);
1104 Read(_T (
"AnchorAlarmSoundFile" ), &g_anchorwatch_sound_file);
1106 Read(_T (
"bAIS_GCPA_AlertAudio" ), &g_bAIS_GCPA_Alert_Audio);
1107 Read(_T (
"bAIS_SART_AlertAudio" ), &g_bAIS_SART_Alert_Audio);
1108 Read(_T (
"bAIS_DSC_AlertAudio" ), &g_bAIS_DSC_Alert_Audio);
1109 Read(_T (
"bAnchorAlertAudio" ), &g_bAnchor_Alert_Audio);
1113 SetPath(_T (
"/Settings/AIS" ));
1115 g_bUseOnlyConfirmedAISName =
false;
1116 Read(_T (
"UseOnlyConfirmedAISName" ), &g_bUseOnlyConfirmedAISName);
1118 Read(_T (
"bNoCPAMax" ), &g_bCPAMax);
1120 Read(_T (
"NoCPAMaxNMi" ), &s);
1121 s.ToDouble(&g_CPAMax_NM);
1123 Read(_T (
"bCPAWarn" ), &g_bCPAWarn);
1125 Read(_T (
"CPAWarnNMi" ), &s);
1126 s.ToDouble(&g_CPAWarn_NM);
1128 Read(_T (
"bTCPAMax" ), &g_bTCPA_Max);
1130 Read(_T (
"TCPAMaxMinutes" ), &s);
1131 s.ToDouble(&g_TCPA_Max);
1133 Read(_T (
"bMarkLostTargets" ), &g_bMarkLost);
1135 Read(_T (
"MarkLost_Minutes" ), &s);
1136 s.ToDouble(&g_MarkLost_Mins);
1138 Read(_T (
"bRemoveLostTargets" ), &g_bRemoveLost);
1140 Read(_T (
"RemoveLost_Minutes" ), &s);
1141 s.ToDouble(&g_RemoveLost_Mins);
1143 Read(_T (
"bShowCOGArrows" ), &g_bShowCOG);
1145 Read(_T (
"bSyncCogPredictors"), &g_bSyncCogPredictors);
1147 Read(_T (
"CogArrowMinutes" ), &s);
1148 s.ToDouble(&g_ShowCOG_Mins);
1150 Read(_T (
"bShowTargetTracks" ), &g_bAISShowTracks);
1152 if (
Read(_T (
"TargetTracksLimit" ), &s)) {
1153 s.ToDouble(&g_AISShowTracks_Limit);
1154 g_AISShowTracks_Limit = wxMax(300.0, g_AISShowTracks_Limit);
1156 if (
Read(_T (
"TargetTracksMinutes" ), &s)) {
1157 s.ToDouble(&g_AISShowTracks_Mins);
1158 g_AISShowTracks_Mins = wxMax(1.0, g_AISShowTracks_Mins);
1159 g_AISShowTracks_Mins = wxMin(g_AISShowTracks_Limit, g_AISShowTracks_Mins);
1162 Read(_T (
"bHideMooredTargets" ), &g_bHideMoored);
1163 if (
Read(_T (
"MooredTargetMaxSpeedKnots" ), &s))
1164 s.ToDouble(&g_ShowMoored_Kts);
1166 g_SOGminCOG_kts = 0.2;
1167 if (
Read(_T (
"SOGMinimumForCOGDisplay" ), &s)) s.ToDouble(&g_SOGminCOG_kts);
1169 Read(_T (
"bShowScaledTargets"), &g_bAllowShowScaled);
1170 Read(_T (
"AISScaledNumber" ), &g_ShowScaled_Num);
1171 Read(_T (
"AISScaledNumberWeightSOG" ), &g_ScaledNumWeightSOG);
1172 Read(_T (
"AISScaledNumberWeightCPA" ), &g_ScaledNumWeightCPA);
1173 Read(_T (
"AISScaledNumberWeightTCPA" ), &g_ScaledNumWeightTCPA);
1174 Read(_T (
"AISScaledNumberWeightRange" ), &g_ScaledNumWeightRange);
1175 Read(_T (
"AISScaledNumberWeightSizeOfTarget" ), &g_ScaledNumWeightSizeOfT);
1176 Read(_T (
"AISScaledSizeMinimal" ), &g_ScaledSizeMinimal);
1177 Read(_T(
"AISShowScaled"), &g_bShowScaled);
1179 Read(_T (
"bShowAreaNotices" ), &g_bShowAreaNotices);
1180 Read(_T (
"bDrawAISSize" ), &g_bDrawAISSize);
1181 Read(_T (
"bDrawAISRealtime" ), &g_bDrawAISRealtime);
1182 Read(_T (
"bShowAISName" ), &g_bShowAISName);
1183 Read(_T (
"AISRealtimeMinSpeedKnots" ), &g_AIS_RealtPred_Kts, 0.7);
1184 Read(_T (
"bAISAlertDialog" ), &g_bAIS_CPA_Alert);
1185 Read(_T (
"ShowAISTargetNameScale" ), &g_Show_Target_Name_Scale);
1186 Read(_T (
"bWplIsAprsPositionReport" ), &g_bWplUsePosition);
1187 Read(_T (
"WplSelAction"), &g_WplAction);
1188 Read(_T (
"AISCOGPredictorWidth" ), &g_ais_cog_predictor_width);
1190 Read(_T (
"bAISAlertAudio" ), &g_bAIS_CPA_Alert_Audio);
1191 Read(_T (
"AISAlertAudioFile" ), &g_sAIS_Alert_Sound_File);
1192 Read(_T (
"bAISAlertSuppressMoored" ), &g_bAIS_CPA_Alert_Suppress_Moored);
1194 Read(_T (
"bAISAlertAckTimeout" ), &g_bAIS_ACK_Timeout);
1195 if (
Read(_T (
"AlertAckTimeoutMinutes" ), &s)) s.ToDouble(&g_AckTimeout_Mins);
1197 Read(_T (
"AlertDialogSizeX" ), &g_ais_alert_dialog_sx);
1198 Read(_T (
"AlertDialogSizeY" ), &g_ais_alert_dialog_sy);
1199 Read(_T (
"AlertDialogPosX" ), &g_ais_alert_dialog_x);
1200 Read(_T (
"AlertDialogPosY" ), &g_ais_alert_dialog_y);
1201 Read(_T (
"QueryDialogPosX" ), &g_ais_query_dialog_x);
1202 Read(_T (
"QueryDialogPosY" ), &g_ais_query_dialog_y);
1204 Read(_T (
"AISTargetListPerspective" ), &g_AisTargetList_perspective);
1205 Read(_T (
"AISTargetListRange" ), &g_AisTargetList_range);
1206 Read(_T (
"AISTargetListSortColumn" ), &g_AisTargetList_sortColumn);
1207 Read(_T (
"bAISTargetListSortReverse" ), &g_bAisTargetList_sortReverse);
1208 Read(_T (
"AISTargetListColumnSpec" ), &g_AisTargetList_column_spec);
1209 Read(_T (
"AISTargetListColumnOrder"), &g_AisTargetList_column_order);
1211 Read(_T (
"bAISRolloverShowClass" ), &g_bAISRolloverShowClass);
1212 Read(_T (
"bAISRolloverShowCOG" ), &g_bAISRolloverShowCOG);
1213 Read(_T (
"bAISRolloverShowCPA" ), &g_bAISRolloverShowCPA);
1215 Read(_T (
"S57QueryDialogSizeX" ), &g_S57_dialog_sx);
1216 Read(_T (
"S57QueryDialogSizeY" ), &g_S57_dialog_sy);
1217 Read(_T (
"S57QueryExtraDialogSizeX" ), &g_S57_extradialog_sx);
1218 Read(_T (
"S57QueryExtraDialogSizeY" ), &g_S57_extradialog_sy);
1220 wxString strpres(_T (
"PresentationLibraryData" ));
1222 SetPath(_T (
"/Directories" ));
1223 Read(strpres, &valpres);
1224 if (!valpres.IsEmpty()) g_UserPresLibData = valpres;
1226 wxString strs(_T (
"SENCFileLocation" ));
1227 SetPath(_T (
"/Directories" ));
1230 if (!vals.IsEmpty()) g_SENCPrefix = vals;
1232 SetPath(_T (
"/Directories" ));
1234 Read(_T (
"InitChartDir" ), &vald);
1236 wxString dirnamed(vald);
1237 if (!dirnamed.IsEmpty()) {
1238 if (pInit_Chart_Dir->IsEmpty())
1240 pInit_Chart_Dir->Clear();
1241 pInit_Chart_Dir->Append(vald);
1245 Read(_T (
"GPXIODir" ), &g_gpx_path);
1246 Read(_T (
"TCDataDir" ), &g_TCData_Dir);
1247 Read(_T (
"BasemapDir"), &gWorldMapLocation);
1248 Read(_T (
"BaseShapefileDir"), &gWorldShapefileLocation);
1249 Read(_T (
"pluginInstallDir"), &g_winPluginDir);
1250 wxLogMessage(
"winPluginDir, read from ini file: %s",
1251 g_winPluginDir.mb_str().data());
1253 SetPath(_T (
"/Settings/GlobalState" ));
1255 if (
Read(_T (
"nColorScheme" ), &read_int))
1256 global_color_scheme = (ColorScheme)read_int;
1259 SetPath(_T (
"/Settings/NMEADataSource" ));
1261 TheConnectionParams().clear();
1262 wxString connectionconfigs;
1263 Read(_T(
"DataConnections" ), &connectionconfigs);
1264 if (!connectionconfigs.IsEmpty()) {
1265 wxArrayString confs = wxStringTokenize(connectionconfigs, _T(
"|"));
1266 for (
size_t i = 0; i < confs.Count(); i++) {
1269 wxLogMessage(_T(
"Skipped invalid DataStream config"));
1273 TheConnectionParams().push_back(prm);
1278 SetPath(_T (
"/Settings/GlobalState" ));
1281 double st_lat, st_lon;
1282 if (
Read(_T (
"VPLatLon" ), &st)) {
1283 sscanf(st.mb_str(wxConvUTF8),
"%lf,%lf", &st_lat, &st_lon);
1286 if (fabs(st_lon) < 360.) {
1287 while (st_lon < -180.) st_lon += 360.;
1289 while (st_lon > 180.) st_lon -= 360.;
1294 if (fabs(st_lat) < 90.0) vLat = st_lat;
1296 s.Printf(_T (
"Setting Viewpoint Lat/Lon %g, %g" ), vLat, vLon);
1300 double st_view_scale, st_rotation;
1301 if (
Read(wxString(_T (
"VPScale" )), &st)) {
1302 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_view_scale);
1304 st_view_scale = fmax(st_view_scale, .001 / 32);
1305 st_view_scale = fmin(st_view_scale, 4);
1308 if (
Read(wxString(_T (
"VPRotation" )), &st)) {
1309 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_rotation);
1311 st_rotation = fmin(st_rotation, 360);
1312 st_rotation = fmax(st_rotation, 0);
1317 if (
Read(_T (
"OwnShipLatLon" ), &sll)) {
1318 sscanf(sll.mb_str(wxConvUTF8),
"%lf,%lf", &lat, &lon);
1321 if (fabs(lon) < 360.) {
1322 while (lon < -180.) lon += 360.;
1324 while (lon > 180.) lon -= 360.;
1329 if (fabs(lat) < 90.0) gLat = lat;
1331 s.Printf(_T (
"Setting Ownship Lat/Lon %g, %g" ), gLat, gLon);
1338 SetPath(_T (
"/Settings/AuxFontKeys" ));
1343 bool bContk = GetFirstEntry(strk, dummyk);
1344 bool bNewKey =
false;
1347 bNewKey = FontMgr::Get().
AddAuxKey(kval);
1348 if (!bAsTemplate && !bNewKey) {
1352 bContk = GetNextEntry(strk, dummyk);
1356 SetPath(_T (
"/Settings/X11Fonts" ));
1360 SetPath(_T (
"/Settings/GTKFonts" ));
1364 SetPath(_T (
"/Settings/MSWFonts" ));
1368 SetPath(_T (
"/Settings/MacFonts" ));
1372 SetPath(_T (
"/Settings/QTFonts" ));
1378 wxArrayString deleteList;
1380 bool bCont = GetFirstEntry(str, dummy);
1384 if (str.StartsWith(_T(
"Font"))) {
1387 deleteList.Add(str);
1388 wxString oldKey = pval.BeforeFirst(_T(
':'));
1392 if (pval.IsEmpty() || pval.StartsWith(_T(
":"))) {
1393 deleteList.Add(str);
1397 bCont = GetNextEntry(str, dummy);
1400 for (
unsigned int i = 0; i < deleteList.Count(); i++) {
1401 DeleteEntry(deleteList[i]);
1406 SetPath(_T (
"/TideCurrentDataSources" ));
1407 if (GetNumberOfEntries()) {
1408 TideCurrentDataSet.clear();
1411 bool bCont = GetFirstEntry(str, dummy);
1418 if (std::find(TideCurrentDataSet.begin(), TideCurrentDataSet.end(),
1419 val.ToStdString()) == TideCurrentDataSet.end()) {
1420 TideCurrentDataSet.push_back(val.ToStdString());
1422 bCont = GetNextEntry(str, dummy);
1427 LoadConfigGroups(g_pGroupArray);
1432 SetPath(_T (
"/Settings/Others" ));
1435 Read(_T (
"RadarRingsNumberVisible" ), &val);
1436 if (val.Length() > 0) g_iNavAidRadarRingsNumberVisible = atoi(val.mb_str());
1437 g_bNavAidRadarRingsShown = g_iNavAidRadarRingsNumberVisible > 0;
1439 Read(_T (
"RadarRingsStep" ), &val);
1440 if (val.Length() > 0) g_fNavAidRadarRingsStep = atof(val.mb_str());
1442 Read(_T (
"RadarRingsStepUnits" ), &g_pNavAidRadarRingsStepUnits);
1444 wxString l_wxsOwnshipRangeRingsColour;
1445 Read(_T (
"RadarRingsColour" ), &l_wxsOwnshipRangeRingsColour);
1446 if (l_wxsOwnshipRangeRingsColour.Length())
1447 g_colourOwnshipRangeRingsColour.Set(l_wxsOwnshipRangeRingsColour);
1450 Read(_T (
"WaypointRangeRingsNumber" ), &val);
1451 if (val.Length() > 0) g_iWaypointRangeRingsNumber = atoi(val.mb_str());
1453 Read(_T (
"WaypointRangeRingsStep" ), &val);
1454 if (val.Length() > 0) g_fWaypointRangeRingsStep = atof(val.mb_str());
1456 Read(_T (
"WaypointRangeRingsStepUnits" ), &g_iWaypointRangeRingsStepUnits);
1458 wxString l_wxsWaypointRangeRingsColour;
1459 Read(_T(
"WaypointRangeRingsColour" ), &l_wxsWaypointRangeRingsColour);
1460 g_colourWaypointRangeRingsColour.Set(l_wxsWaypointRangeRingsColour);
1462 if (!
Read(_T(
"WaypointUseScaMin"), &g_bUseWptScaMin)) g_bUseWptScaMin =
false;
1463 if (!
Read(_T(
"WaypointScaMinValue"), &g_iWpt_ScaMin))
1464 g_iWpt_ScaMin = 2147483646;
1465 if (!
Read(_T(
"WaypointUseScaMinOverrule"), &g_bOverruleScaMin))
1466 g_bOverruleScaMin =
false;
1467 if (!
Read(_T(
"WaypointsShowName"), &g_bShowWptName)) g_bShowWptName =
true;
1468 if (!
Read(_T(
"UserIconsFirst"), &g_bUserIconsFirst)) g_bUserIconsFirst =
true;
1471 bool b300RadarRings =
true;
1472 if (
Read(_T (
"ShowRadarRings" ), &b300RadarRings)) {
1473 if (!b300RadarRings) g_iNavAidRadarRingsNumberVisible = 0;
1476 Read(_T (
"ConfirmObjectDeletion" ), &g_bConfirmObjectDelete);
1479 g_bWayPointPreventDragging =
false;
1480 Read(_T (
"WaypointPreventDragging" ), &g_bWayPointPreventDragging);
1482 g_bEnableZoomToCursor =
false;
1483 Read(_T (
"EnableZoomToCursor" ), &g_bEnableZoomToCursor);
1486 Read(_T (
"TrackIntervalSeconds" ), &val);
1487 if (val.Length() > 0) {
1488 double tval = atof(val.mb_str());
1489 if (tval >= 2.) g_TrackIntervalSeconds = tval;
1493 Read(_T (
"TrackDeltaDistance" ), &val);
1494 if (val.Length() > 0) {
1495 double tval = atof(val.mb_str());
1496 if (tval >= 0.05) g_TrackDeltaDistance = tval;
1499 Read(_T (
"TrackPrecision" ), &g_nTrackPrecision);
1501 Read(_T (
"NavObjectFileName" ), m_sNavObjSetFile);
1503 Read(_T (
"RouteLineWidth" ), &g_route_line_width);
1504 Read(_T (
"TrackLineWidth" ), &g_track_line_width);
1506 wxString l_wxsTrackLineColour;
1507 if (
Read(_T(
"TrackLineColour" ), &l_wxsTrackLineColour))
1508 g_colourTrackLineColour.Set(l_wxsTrackLineColour);
1510 Read(_T (
"TideCurrentWindowScale" ), &g_tcwin_scale);
1511 Read(_T (
"DefaultWPIcon" ), &g_default_wp_icon);
1512 Read(_T (
"DefaultRPIcon" ), &g_default_routepoint_icon);
1514 SetPath(_T (
"/MmsiProperties" ));
1515 int iPMax = GetNumberOfEntries();
1517 g_MMSI_Props_Array.Empty();
1520 bool bCont = pConfig->GetFirstEntry(str, dummy);
1522 pConfig->Read(str, &val);
1525 g_MMSI_Props_Array.Add(pProps);
1527 bCont = pConfig->GetNextEntry(str, dummy);
1534void MyConfig::LoadS57Config() {
1535 if (!ps52plib)
return;
1539 SetPath(_T (
"/Settings/GlobalState" ));
1541 Read(_T (
"bShowS57Text" ), &read_int, 1);
1542 ps52plib->SetShowS57Text(!(read_int == 0));
1544 Read(_T (
"bShowS57ImportantTextOnly" ), &read_int, 0);
1545 ps52plib->SetShowS57ImportantTextOnly(!(read_int == 0));
1547 Read(_T (
"bShowLightDescription" ), &read_int, 0);
1548 ps52plib->SetShowLdisText(!(read_int == 0));
1550 Read(_T (
"bExtendLightSectors" ), &read_int, 0);
1551 ps52plib->SetExtendLightSectors(!(read_int == 0));
1553 Read(_T (
"nDisplayCategory" ), &read_int, (
enum _DisCat)STANDARD);
1554 ps52plib->SetDisplayCategory((
enum _DisCat)read_int);
1556 Read(_T (
"nSymbolStyle" ), &read_int, (
enum _LUPname)PAPER_CHART);
1557 ps52plib->m_nSymbolStyle = (LUPname)read_int;
1559 Read(_T (
"nBoundaryStyle" ), &read_int, PLAIN_BOUNDARIES);
1560 ps52plib->m_nBoundaryStyle = (LUPname)read_int;
1562 Read(_T (
"bShowSoundg" ), &read_int, 1);
1563 ps52plib->m_bShowSoundg = !(read_int == 0);
1565 Read(_T (
"bShowMeta" ), &read_int, 0);
1566 ps52plib->m_bShowMeta = !(read_int == 0);
1568 Read(_T (
"bUseSCAMIN" ), &read_int, 1);
1569 ps52plib->m_bUseSCAMIN = !(read_int == 0);
1571 Read(_T (
"bUseSUPER_SCAMIN" ), &read_int, 0);
1572 ps52plib->m_bUseSUPER_SCAMIN = !(read_int == 0);
1574 Read(_T (
"bShowAtonText" ), &read_int, 1);
1575 ps52plib->m_bShowAtonText = !(read_int == 0);
1577 Read(_T (
"bDeClutterText" ), &read_int, 0);
1578 ps52plib->m_bDeClutterText = !(read_int == 0);
1580 Read(_T (
"bShowNationalText" ), &read_int, 0);
1581 ps52plib->m_bShowNationalTexts = !(read_int == 0);
1583 Read(_T (
"ENCSoundingScaleFactor" ), &read_int, 0);
1584 ps52plib->m_nSoundingFactor = read_int;
1586 Read(_T (
"ENCTextScaleFactor" ), &read_int, 0);
1587 ps52plib->m_nTextFactor = read_int;
1589 if (
Read(_T (
"S52_MAR_SAFETY_CONTOUR" ), &dval, 3.0)) {
1590 S52_setMarinerParam(S52_MAR_SAFETY_CONTOUR, dval);
1591 S52_setMarinerParam(S52_MAR_SAFETY_DEPTH,
1595 if (
Read(_T (
"S52_MAR_SHALLOW_CONTOUR" ), &dval, 2.0))
1596 S52_setMarinerParam(S52_MAR_SHALLOW_CONTOUR, dval);
1598 if (
Read(_T (
"S52_MAR_DEEP_CONTOUR" ), &dval, 6.0))
1599 S52_setMarinerParam(S52_MAR_DEEP_CONTOUR, dval);
1601 if (
Read(_T (
"S52_MAR_TWO_SHADES" ), &dval, 0.0))
1602 S52_setMarinerParam(S52_MAR_TWO_SHADES, dval);
1604 ps52plib->UpdateMarinerParams();
1606 SetPath(_T (
"/Settings/GlobalState" ));
1607 Read(_T (
"S52_DEPTH_UNIT_SHOW" ), &read_int, 1);
1608 read_int = wxMax(read_int, 0);
1609 read_int = wxMin(read_int, 2);
1610 ps52plib->m_nDepthUnitDisplay = read_int;
1611 g_nDepthUnitDisplay = read_int;
1617 SetPath(_T (
"/Settings/ObjectFilter" ));
1619 int iOBJMax = GetNumberOfEntries();
1627 bool bCont = pConfig->GetFirstEntry(str, dummy);
1629 pConfig->Read(str, &val);
1631 bool bNeedNew =
true;
1633 if (str.StartsWith(_T (
"viz" ), &sObj)) {
1634 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
1636 pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
1637 if (!strncmp(pOLE->OBJLName, sObj.mb_str(), 6)) {
1645 pOLE = (OBJLElement *)calloc(
sizeof(OBJLElement), 1);
1646 memcpy(pOLE->OBJLName, sObj.mb_str(), OBJL_NAME_LEN);
1649 ps52plib->pOBJLArray->Add((
void *)pOLE);
1652 bCont = pConfig->GetNextEntry(str, dummy);
1658static bool ReloadPendingChanges(
const wxString &changes_path) {
1659 wxULongLong size = wxFileName::GetSize(changes_path);
1664 auto pNavObjectChangesSet = NavObjectChanges::getTempInstance();
1665 pNavObjectChangesSet->Init(changes_path);
1666 auto res = pNavObjectChangesSet->load_file(changes_path.fn_str());
1671 if (::wxFileExists(changes_path)) ::wxRemoveFile(changes_path);
1673 if (size == 0 || res.status != pugi::xml_parse_status::status_ok) {
1674 wxLogMessage(changes_path +
" seems corrupted, not applying it.");
1675 pNavObjectChangesSet->reset();
1679 wxLogMessage(_T(
"Applying NavObjChanges"));
1680 pNavObjectChangesSet->ApplyChanges();
1684wxString MyConfig::FindNewestUsableBackup()
const {
1685 wxString newest_backup;
1687 for (
int i = 1; i <= g_navobjbackups; i++) {
1688 wxString backup = m_sNavObjSetFile +
"." + wxString::Format(
"%d", i);
1689 if (wxFileExists(backup) && wxFileName::GetSize(backup) > 461 &&
1690 doc.load_file(backup.fn_str()).status ==
1691 pugi::xml_parse_status::status_ok) {
1692 newest_backup = backup;
1696 return newest_backup;
1699void MyConfig::LoadNavObjects() {
1701 wxLogMessage(_T(
"Loading navobjects from navobj.xml"));
1703 if (NULL == m_pNavObjectInputSet)
1707 wxString newest_backup;
1708 if (::wxFileExists(m_sNavObjSetFile)) {
1709 if (wxFileName::GetSize(m_sNavObjSetFile) <
1714 wxLogMessage(
"Navobjects file exists, but seems truncated!");
1715 newest_backup = FindNewestUsableBackup();
1716 if (wxFileExists(newest_backup)) {
1717 wxLogMessage(
"We do have a backup " + newest_backup +
1718 " that looks healthy and will use it.");
1719 wxCopyFile(newest_backup, m_sNavObjSetFile,
true);
1723 newest_backup = FindNewestUsableBackup();
1724 if (wxFileExists(newest_backup)) {
1725 wxLogMessage(
"We do have a backup " + newest_backup +
1726 " that looks healthy and will use it.");
1727 wxCopyFile(newest_backup, m_sNavObjSetFile,
true);
1730 "No navobjects.xml file or usable backup exist, will create a new "
1734 bool success =
false;
1737 if (::wxFileExists(m_sNavObjSetFile) &&
1738 m_pNavObjectInputSet->load_file(m_sNavObjSetFile.fn_str()).status ==
1739 pugi::xml_parse_status::status_ok) {
1740 CreateRotatingNavObjBackup();
1743 success = m_pNavObjectInputSet->LoadAllGPXObjects(
false, wpt_dups);
1748 wxString corrupted_file =
1750 wxDateTime::Now().Format(
".corrupted.%Y-%m-%d-%H-%M-%S");
1751 wxRenameFile(m_sNavObjSetFile, corrupted_file,
true);
1752 wxLogMessage(
"Error while loading navobjects from " + m_sNavObjSetFile +
1753 ", the corrupted file was renamed to " + corrupted_file);
1760 newest_backup = FindNewestUsableBackup();
1762 m_pNavObjectInputSet->reset();
1763 if (wxFileExists(newest_backup) &&
1764 m_pNavObjectInputSet->load_file(newest_backup.fn_str()).status ==
1765 pugi::xml_parse_status::status_ok) {
1766 success = m_pNavObjectInputSet->LoadAllGPXObjects(
false, wpt_dups);
1767 wxLogMessage(
"We do have a healthy backup " + newest_backup +
1768 " and did load it.");
1771 "No usable backup found, a new navobj.xml file will be created.");
1772 m_pNavObjectInputSet->reset();
1776 wxLogMessage(_T(
"Done loading navobjects, %d duplicate waypoints ignored"),
1780 _T(
"Failed to load navobjects, creating a new navobj.xml file."));
1782 delete m_pNavObjectInputSet;
1784 if (::wxFileExists(m_sNavObjSetChangesFile)) {
1785 if (ReloadPendingChanges(m_sNavObjSetChangesFile)) {
1789 m_pNavObjectChangesSet->Init(m_sNavObjSetChangesFile);
1792 active_route.Notify();
1795bool MyConfig::LoadLayers(wxString &path) {
1796 wxArrayString file_array;
1800 if (dir.IsOpened()) {
1802 bool cont = dir.GetFirst(&filename);
1805 filename.Prepend(wxFileName::GetPathSeparator());
1806 filename.Prepend(path);
1807 wxFileName f(filename);
1809 if (f.GetExt().IsSameAs(wxT(
"gpx")))
1810 file_array.Add(filename);
1812 if (wxDir::Exists(filename)) {
1813 wxDir dir(filename);
1814 if (dir.IsOpened()) {
1815 nfiles = dir.GetAllFiles(filename, &file_array,
1821 if (file_array.GetCount()) {
1823 l->m_LayerID = ++g_LayerIdx;
1824 l->m_LayerFileName = file_array[0];
1825 if (file_array.GetCount() <= 1)
1826 wxFileName::SplitPath(file_array[0], NULL, NULL, &(l->m_LayerName),
1829 wxFileName::SplitPath(filename, NULL, NULL, &(l->m_LayerName), NULL,
1832 bool bLayerViz = g_bShowLayers;
1834 if (g_VisibleLayers.Contains(l->m_LayerName)) bLayerViz =
true;
1835 if (g_InvisibleLayers.Contains(l->m_LayerName)) bLayerViz =
false;
1837 l->m_bHasVisibleNames = wxCHK_UNDETERMINED;
1838 if (g_VisiNameinLayers.Contains(l->m_LayerName))
1839 l->m_bHasVisibleNames = wxCHK_CHECKED;
1840 if (g_InVisiNameinLayers.Contains(l->m_LayerName))
1841 l->m_bHasVisibleNames = wxCHK_UNCHECKED;
1843 l->m_bIsVisibleOnChart = bLayerViz;
1846 laymsg.Printf(wxT(
"New layer %d: %s"), l->m_LayerID,
1847 l->m_LayerName.c_str());
1848 wxLogMessage(laymsg);
1850 pLayerList->Insert(l);
1854 for (
unsigned int i = 0; i < file_array.GetCount(); i++) {
1855 wxString file_path = file_array[i];
1857 if (::wxFileExists(file_path)) {
1859 if (pSet->load_file(file_path.fn_str()).status !=
1860 pugi::xml_parse_status::status_ok) {
1861 wxLogMessage(
"Error loading GPX file " + file_path);
1864 long nItems = pSet->LoadAllGPXObjectsAsLayer(
1865 l->m_LayerID, bLayerViz, l->m_bHasVisibleNames);
1866 l->m_NoOfItems += nItems;
1867 l->m_LayerType = _(
"Persistent");
1870 objmsg.Printf(wxT(
"Loaded GPX file %s with %ld items."),
1871 file_path.c_str(), nItems);
1872 wxLogMessage(objmsg);
1879 cont = dir.GetNext(&filename);
1882 g_bLayersLoaded =
true;
1887bool MyConfig::LoadChartDirArray(ArrayOfCDI &ChartDirArray) {
1889 SetPath(_T (
"/ChartDirectories" ));
1890 int iDirMax = GetNumberOfEntries();
1892 ChartDirArray.Empty();
1895 int nAdjustChartDirs = 0;
1897 bool bCont = pConfig->GetFirstEntry(str, dummy);
1899 pConfig->Read(str, &val);
1901 wxString dirname(val);
1902 if (!dirname.IsEmpty()) {
1917 if (dirname.Find(_T (
"SampleCharts" )) ==
1922 pConfig->DeleteEntry(str);
1923 wxString new_dir = dirname.Mid(dirname.Find(_T (
"SampleCharts" )));
1924 new_dir.Prepend(g_Platform->GetSharedDataDir());
1929 cdi.fullpath = dirname.BeforeFirst(
'^');
1930 cdi.magic_number = dirname.AfterFirst(
'^');
1932 ChartDirArray.Add(cdi);
1936 bCont = pConfig->GetNextEntry(str, dummy);
1939 if (nAdjustChartDirs) pConfig->UpdateChartDirs(ChartDirArray);
1945void MyConfig::AddNewRoute(
Route *r) { m_pNavObjectChangesSet->AddNewRoute(r); }
1947void MyConfig::UpdateRoute(
Route *r) { m_pNavObjectChangesSet->UpdateRoute(r); }
1949void MyConfig::DeleteConfigRoute(
Route *pr) {
1950 m_pNavObjectChangesSet->DeleteConfigRoute(pr);
1953void MyConfig::AddNewTrack(
Track *pt) {
1954 m_pNavObjectChangesSet->AddNewTrack(pt);
1957void MyConfig::UpdateTrack(
Track *pt) {
1958 m_pNavObjectChangesSet->UpdateTrack(pt);
1961void MyConfig::DeleteConfigTrack(
Track *pt) {
1962 m_pNavObjectChangesSet->DeleteConfigTrack(pt);
1965void MyConfig::AddNewWayPoint(
RoutePoint *pWP,
int crm) {
1966 m_pNavObjectChangesSet->AddNewWayPoint(pWP);
1969void MyConfig::UpdateWayPoint(
RoutePoint *pWP) {
1970 m_pNavObjectChangesSet->UpdateWayPoint(pWP);
1973void MyConfig::DeleteWayPoint(
RoutePoint *pWP) {
1974 m_pNavObjectChangesSet->DeleteWayPoint(pWP);
1977void MyConfig::AddNewTrackPoint(
TrackPoint *pWP,
const wxString &parent_GUID) {
1978 m_pNavObjectChangesSet->AddNewTrackPoint(pWP, parent_GUID);
1981bool MyConfig::UpdateChartDirs(ArrayOfCDI &dir_array) {
1985 SetPath(_T (
"/ChartDirectories" ));
1986 int iDirMax = GetNumberOfEntries();
1990 for (
int i = 0; i < iDirMax; i++) {
1991 GetFirstEntry(key, dummy);
1992 DeleteEntry(key,
false);
1996 iDirMax = dir_array.GetCount();
1998 for (
int iDir = 0; iDir < iDirMax; iDir++) {
2001 wxString dirn = cdi.fullpath;
2002 dirn.Append(_T(
"^"));
2003 dirn.Append(cdi.magic_number);
2005 str_buf.Printf(_T (
"ChartDir%d" ), iDir + 1);
2007 Write(str_buf, dirn);
2019void MyConfig::CreateConfigGroups(ChartGroupArray *pGroupArray) {
2020 if (!pGroupArray)
return;
2022 SetPath(_T (
"/Groups" ));
2023 Write(_T (
"GroupCount" ), (
int)pGroupArray->GetCount());
2025 for (
unsigned int i = 0; i < pGroupArray->GetCount(); i++) {
2028 s.Printf(_T(
"Group%d"), i + 1);
2029 s.Prepend(_T (
"/Groups/" ));
2032 Write(_T (
"GroupName" ), pGroup->m_group_name);
2033 Write(_T (
"GroupItemCount" ), (
int)pGroup->m_element_array.size());
2035 for (
unsigned int j = 0; j < pGroup->m_element_array.size(); j++) {
2037 sg.Printf(_T(
"Group%d/Item%d"), i + 1, j);
2038 sg.Prepend(_T (
"/Groups/" ));
2040 Write(_T (
"IncludeItem" ), pGroup->m_element_array[j].m_element_name);
2043 wxArrayString u = pGroup->m_element_array[j].m_missing_name_array;
2045 for (
unsigned int k = 0; k < u.GetCount(); k++) {
2049 Write(_T (
"ExcludeItems" ), t);
2055void MyConfig::DestroyConfigGroups(
void) {
2056 DeleteGroup(_T (
"/Groups" ));
2059void MyConfig::LoadConfigGroups(ChartGroupArray *pGroupArray) {
2060 SetPath(_T (
"/Groups" ));
2061 unsigned int group_count;
2062 Read(_T (
"GroupCount" ), (
int *)&group_count, 0);
2064 for (
unsigned int i = 0; i < group_count; i++) {
2067 s.Printf(_T(
"Group%d"), i + 1);
2068 s.Prepend(_T (
"/Groups/" ));
2072 Read(_T (
"GroupName" ), &t);
2073 pGroup->m_group_name = t;
2075 unsigned int item_count;
2076 Read(_T (
"GroupItemCount" ), (
int *)&item_count);
2077 for (
unsigned int j = 0; j < item_count; j++) {
2079 sg.Printf(_T(
"Group%d/Item%d"), i + 1, j);
2080 sg.Prepend(_T (
"/Groups/" ));
2084 Read(_T (
"IncludeItem" ), &v);
2088 if (
Read(_T (
"ExcludeItems" ), &u)) {
2090 wxStringTokenizer tk(u, _T(
";"));
2091 while (tk.HasMoreTokens()) {
2092 wxString token = tk.GetNextToken();
2093 pelement.m_missing_name_array.Add(token);
2097 pGroup->m_element_array.push_back(std::move(pelement));
2099 pGroupArray->Add(pGroup);
2103void MyConfig::LoadCanvasConfigs(
bool bApplyAsTemplate) {
2106 auto &config_array = ConfigMgr::Get().GetCanvasConfigArray();
2108 SetPath(_T (
"/Canvas" ));
2111 if (!HasEntry(_T (
"CanvasConfig" ))) {
2113 pcc->LoadFromLegacyConfig(
this);
2114 config_array.Add(pcc);
2119 Read(_T (
"CanvasConfig" ), (
int *)&g_canvasConfig, 0);
2122 if (config_array.GetCount() == 0) {
2123 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 1);
2126 LoadConfigCanvas(pcca, bApplyAsTemplate);
2127 config_array.Add(pcca);
2129 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 2);
2132 LoadConfigCanvas(pcca, bApplyAsTemplate);
2133 config_array.Add(pcca);
2136 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 1);
2138 LoadConfigCanvas(pcca, bApplyAsTemplate);
2140 if (config_array.GetCount() > 1) {
2142 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 2);
2144 LoadConfigCanvas(pcca, bApplyAsTemplate);
2146 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 2);
2149 LoadConfigCanvas(pcca, bApplyAsTemplate);
2150 config_array.Add(pcca);
2155void MyConfig::LoadConfigCanvas(
canvasConfig *cConfig,
bool bApplyAsTemplate) {
2157 double st_lat, st_lon;
2159 if (!bApplyAsTemplate) {
2161 cConfig->
iLat = START_LAT;
2162 cConfig->
iLon = START_LON;
2164 if (
Read(_T (
"canvasVPLatLon" ), &st)) {
2165 sscanf(st.mb_str(wxConvUTF8),
"%lf,%lf", &st_lat, &st_lon);
2168 if (fabs(st_lon) < 360.) {
2169 while (st_lon < -180.) st_lon += 360.;
2171 while (st_lon > 180.) st_lon -= 360.;
2173 cConfig->
iLon = st_lon;
2176 if (fabs(st_lat) < 90.0) cConfig->
iLat = st_lat;
2182 double st_view_scale;
2183 if (
Read(wxString(_T (
"canvasVPScale" )), &st)) {
2184 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_view_scale);
2186 st_view_scale = fmax(st_view_scale, .001 / 32);
2187 st_view_scale = fmin(st_view_scale, 4);
2188 cConfig->
iScale = st_view_scale;
2192 if (
Read(wxString(_T (
"canvasVPRotation" )), &st)) {
2193 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_rotation);
2195 st_rotation = fmin(st_rotation, 360);
2196 st_rotation = fmax(st_rotation, 0);
2197 cConfig->
iRotation = st_rotation * PI / 180.;
2200 Read(_T (
"canvasInitialdBIndex" ), &cConfig->DBindex, 0);
2201 Read(_T (
"canvasbFollow" ), &cConfig->
bFollow, 0);
2204 Read(_T (
"canvasHeadUp" ), &cConfig->
bHeadUp, 0);
2208 Read(_T (
"ActiveChartGroup" ), &cConfig->GroupID, 0);
2211 if (cConfig->GroupID && bApplyAsTemplate) {
2212 if (cConfig->GroupID > (
int)g_pGroupArray->GetCount()) cConfig->GroupID = 0;
2218 Read(_T (
"canvasQuilt" ), &cConfig->
bQuilt, 1);
2228 Read(_T (
"canvasENCDisplayCategory" ), &cConfig->nENCDisplayCategory,
2230 Read(_T (
"canvasENCShowDepths" ), &cConfig->bShowENCDepths, 1);
2231 Read(_T (
"canvasENCShowBuoyLabels" ), &cConfig->bShowENCBuoyLabels, 1);
2232 Read(_T (
"canvasENCShowLightDescriptions" ),
2233 &cConfig->bShowENCLightDescriptions, 1);
2234 Read(_T (
"canvasENCShowLights" ), &cConfig->bShowENCLights, 1);
2235 Read(_T (
"canvasENCShowVisibleSectorLights" ),
2236 &cConfig->bShowENCVisibleSectorLights, 0);
2237 Read(_T (
"canvasENCShowAnchorInfo" ), &cConfig->bShowENCAnchorInfo, 0);
2238 Read(_T (
"canvasENCShowDataQuality" ), &cConfig->bShowENCDataQuality, 0);
2241 Read(_T (
"canvasSizeX" ), &sx, 0);
2242 Read(_T (
"canvasSizeY" ), &sy, 0);
2246void MyConfig::SaveCanvasConfigs() {
2247 auto &config_array = ConfigMgr::Get().GetCanvasConfigArray();
2249 SetPath(_T (
"/Canvas" ));
2250 Write(_T (
"CanvasConfig" ), (
int)g_canvasConfig);
2255 switch (g_canvasConfig) {
2259 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 1);
2262 if (config_array.GetCount() > 0) {
2263 pcc = config_array.Item(0);
2265 SaveConfigCanvas(pcc);
2272 if (config_array.GetCount() > 1) {
2273 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 1);
2275 pcc = config_array.Item(0);
2277 SaveConfigCanvas(pcc);
2280 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 2);
2282 pcc = config_array.Item(1);
2284 SaveConfigCanvas(pcc);
2291void MyConfig::SaveConfigCanvas(
canvasConfig *cConfig) {
2298 st1.Printf(_T (
"%10.4f,%10.4f" ), vp.
clat, vp.
clon);
2299 Write(_T (
"canvasVPLatLon" ), st1);
2301 Write(_T (
"canvasVPScale" ), st1);
2302 st1.Printf(_T (
"%i" ), ((
int)(vp.
rotation * 180 / PI)) % 360);
2303 Write(_T (
"canvasVPRotation" ), st1);
2306 int restore_dbindex = 0;
2308 if (pcs) restore_dbindex = pcs->GetCurrentEntrydbIndex();
2309 if (cConfig->
canvas->GetQuiltMode())
2310 restore_dbindex = cConfig->
canvas->GetQuiltReferenceChartIndex();
2311 Write(_T (
"canvasInitialdBIndex" ), restore_dbindex);
2313 Write(_T (
"canvasbFollow" ), cConfig->
canvas->m_bFollow);
2314 Write(_T (
"ActiveChartGroup" ), cConfig->
canvas->m_groupIndex);
2316 Write(_T (
"canvasQuilt" ), cConfig->
canvas->GetQuiltMode());
2317 Write(_T (
"canvasShowGrid" ), cConfig->
canvas->GetShowGrid());
2318 Write(_T (
"canvasShowOutlines" ), cConfig->
canvas->GetShowOutlines());
2319 Write(_T (
"canvasShowDepthUnits" ), cConfig->
canvas->GetShowDepthUnits());
2321 Write(_T (
"canvasShowAIS" ), cConfig->
canvas->GetShowAIS());
2322 Write(_T (
"canvasAttenAIS" ), cConfig->
canvas->GetAttenAIS());
2324 Write(_T (
"canvasShowTides" ), cConfig->
canvas->GetbShowTide());
2325 Write(_T (
"canvasShowCurrents" ), cConfig->
canvas->GetbShowCurrent());
2328 Write(_T (
"canvasShowENCText" ), cConfig->
canvas->GetShowENCText());
2329 Write(_T (
"canvasENCDisplayCategory" ),
2330 cConfig->
canvas->GetENCDisplayCategory());
2331 Write(_T (
"canvasENCShowDepths" ), cConfig->
canvas->GetShowENCDepth());
2332 Write(_T (
"canvasENCShowBuoyLabels" ),
2333 cConfig->
canvas->GetShowENCBuoyLabels());
2334 Write(_T (
"canvasENCShowLightDescriptions" ),
2335 cConfig->
canvas->GetShowENCLightDesc());
2336 Write(_T (
"canvasENCShowLights" ), cConfig->
canvas->GetShowENCLights());
2337 Write(_T (
"canvasENCShowVisibleSectorLights" ),
2338 cConfig->
canvas->GetShowVisibleSectors());
2339 Write(_T (
"canvasENCShowAnchorInfo" ),
2340 cConfig->
canvas->GetShowENCAnchor());
2341 Write(_T (
"canvasENCShowDataQuality" ),
2342 cConfig->
canvas->GetShowENCDataQual());
2343 Write(_T (
"canvasCourseUp" ),
2344 cConfig->
canvas->GetUpMode() == COURSE_UP_MODE);
2345 Write(_T (
"canvasHeadUp" ), cConfig->
canvas->GetUpMode() == HEAD_UP_MODE);
2346 Write(_T (
"canvasLookahead" ), cConfig->
canvas->GetLookahead());
2348 int width = cConfig->
canvas->GetSize().x;
2356 Write(_T (
"canvasSizeX" ), width);
2357 Write(_T (
"canvasSizeY" ), cConfig->
canvas->GetSize().y);
2361void MyConfig::UpdateSettings() {
2369 SetPath(_T (
"/Settings" ));
2371 Write(_T (
"LastAppliedTemplate" ), g_lastAppliedTemplateGUID);
2372 Write(_T (
"CompatOS" ), g_compatOS);
2373 Write(_T (
"CompatOsVersion" ), g_compatOsVersion);
2374 Write(_T (
"ConfigVersionString" ), g_config_version_string);
2375 if (wxIsEmpty(g_CmdSoundString)) g_CmdSoundString = wxString(OCPN_SOUND_CMD);
2376 Write(_T(
"CmdSoundString" ), g_CmdSoundString);
2377 Write(_T (
"NavMessageShown" ), n_NavMessageShown);
2378 Write(_T (
"InlandEcdis" ), g_bInlandEcdis);
2380 Write(_T (
"AndroidVersionCode" ), g_AndroidVersionCode);
2382 Write(_T (
"UIexpert" ), g_bUIexpert);
2383 Write(_T(
"SpaceDropMark" ), g_bSpaceDropMark);
2387 Write(_T (
"ShowStatusBar" ), g_bShowStatusBar);
2389 Write(_T (
"ShowMenuBar" ), g_bShowMenuBar);
2391 Write(_T (
"DefaultFontSize" ), g_default_font_size);
2392 Write(_T (
"DefaultFontFacename" ), g_default_font_facename);
2394 Write(_T (
"Fullscreen" ), g_bFullscreen);
2395 Write(_T (
"ShowCompassWindow" ), g_bShowCompassWin);
2396 Write(_T (
"SetSystemTime" ), s_bSetSystemTime);
2397 Write(_T (
"ShowGrid" ), g_bDisplayGrid);
2398 Write(_T (
"PlayShipsBells" ), g_bPlayShipsBells);
2399 Write(_T (
"SoundDeviceIndex" ), g_iSoundDeviceIndex);
2400 Write(_T (
"FullscreenToolbar" ), g_bFullscreenToolbar);
2401 Write(_T (
"TransparentToolbar" ), g_bTransparentToolbar);
2402 Write(_T (
"PermanentMOBIcon" ), g_bPermanentMOBIcon);
2403 Write(_T (
"ShowLayers" ), g_bShowLayers);
2404 Write(_T (
"AutoAnchorDrop" ), g_bAutoAnchorMark);
2405 Write(_T (
"ShowChartOutlines" ), g_bShowOutlines);
2406 Write(_T (
"ShowActiveRouteTotal" ), g_bShowRouteTotal);
2407 Write(_T (
"ShowActiveRouteHighway" ), g_bShowActiveRouteHighway);
2408 Write(_T (
"SDMMFormat" ), g_iSDMMFormat);
2409 Write(_T (
"MostRecentGPSUploadConnection" ), g_uploadConnection);
2410 Write(_T (
"ShowChartBar" ), g_bShowChartBar);
2412 Write(_T (
"GUIScaleFactor" ), g_GUIScaleFactor);
2413 Write(_T (
"ChartObjectScaleFactor" ), g_ChartScaleFactor);
2414 Write(_T (
"ShipScaleFactor" ), g_ShipScaleFactor);
2415 Write(_T (
"ENCSoundingScaleFactor" ), g_ENCSoundingScaleFactor);
2416 Write(_T (
"ENCTextScaleFactor" ), g_ENCTextScaleFactor);
2417 Write(_T (
"ObjQueryAppendFilesExt" ), g_ObjQFileExt);
2420 Write(_T(
"CatalogCustomURL"), g_catalog_custom_url);
2421 Write(_T(
"CatalogChannel"), g_catalog_channel);
2423 Write(
"NetmaskBits", g_netmask_bits);
2424 Write(_T (
"FilterNMEA_Avg" ), g_bfilter_cogsog);
2425 Write(_T (
"FilterNMEA_Sec" ), g_COGFilterSec);
2427 Write(_T (
"TrackContinuous" ), g_btrackContinuous);
2429 Write(_T (
"ShowTrue" ), g_bShowTrue);
2430 Write(_T (
"ShowMag" ), g_bShowMag);
2431 Write(_T (
"UserMagVariation" ), wxString::Format(_T(
"%.2f"), g_UserVar));
2433 Write(_T (
"CM93DetailFactor" ), g_cm93_zoom_factor);
2434 Write(_T (
"CM93DetailZoomPosX" ), g_detailslider_dialog_x);
2435 Write(_T (
"CM93DetailZoomPosY" ), g_detailslider_dialog_y);
2436 Write(_T (
"ShowCM93DetailSlider" ), g_bShowDetailSlider);
2438 Write(_T (
"SkewToNorthUp" ), g_bskew_comp);
2439 if (!g_bdisable_opengl) {
2441 Write(_T (
"OpenGL" ), g_bopengl);
2443 Write(_T (
"SoftwareGL" ), g_bSoftwareGL);
2445 Write(_T (
"ZoomDetailFactor" ), g_chart_zoom_modifier_raster);
2446 Write(_T (
"ZoomDetailFactorVector" ), g_chart_zoom_modifier_vector);
2448 Write(_T (
"FogOnOverzoom" ), g_fog_overzoom);
2449 Write(_T (
"OverzoomVectorScale" ), g_oz_vector_scale);
2450 Write(_T (
"OverzoomEmphasisBase" ), g_overzoom_emphasis_base);
2451 Write(_T (
"PlusMinusZoomFactor" ), g_plus_minus_zoom_factor);
2452 Write(
"MouseZoomSensitivity",
2454 Write(_T (
"ShowMUIZoomButtons" ), g_bShowMuiZoomButtons);
2458 Write(_T (
"UseAcceleratedPanning" ), g_GLOptions.m_bUseAcceleratedPanning);
2460 Write(_T (
"GPUTextureCompression" ), g_GLOptions.m_bTextureCompression);
2461 Write(_T (
"GPUTextureCompressionCaching" ),
2462 g_GLOptions.m_bTextureCompressionCaching);
2463 Write(_T (
"GPUTextureDimension" ), g_GLOptions.m_iTextureDimension);
2464 Write(_T (
"GPUTextureMemSize" ), g_GLOptions.m_iTextureMemorySize);
2465 Write(_T (
"PolygonSmoothing" ), g_GLOptions.m_GLPolygonSmoothing);
2466 Write(_T (
"LineSmoothing" ), g_GLOptions.m_GLLineSmoothing);
2468 Write(_T (
"SmoothPanZoom" ), g_bsmoothpanzoom);
2470 Write(_T (
"CourseUpMode" ), g_bCourseUp);
2471 if (!g_bInlandEcdis)
Write(_T (
"LookAheadMode" ), g_bLookAhead);
2472 Write(_T (
"TenHzUpdate" ), g_btenhertz);
2474 Write(_T (
"COGUPAvgSeconds" ), g_COGAvgSec);
2475 Write(_T (
"UseMagAPB" ), g_bMagneticAPB);
2477 Write(_T (
"OwnshipCOGPredictorMinutes" ), g_ownship_predictor_minutes);
2478 Write(_T (
"OwnshipCOGPredictorStyle" ), g_cog_predictor_style);
2479 Write(_T (
"OwnshipCOGPredictorColor" ), g_cog_predictor_color);
2480 Write(_T (
"OwnshipCOGPredictorEndmarker" ), g_cog_predictor_endmarker);
2481 Write(_T (
"OwnshipCOGPredictorWidth" ), g_cog_predictor_width);
2482 Write(_T (
"OwnshipHDTPredictorStyle" ), g_ownship_HDTpredictor_style);
2483 Write(_T (
"OwnshipHDTPredictorColor" ), g_ownship_HDTpredictor_color);
2484 Write(_T (
"OwnshipHDTPredictorEndmarker" ),
2485 g_ownship_HDTpredictor_endmarker);
2486 Write(_T (
"OwnShipMMSINumber" ), g_OwnShipmmsi);
2487 Write(_T (
"OwnshipHDTPredictorWidth" ), g_ownship_HDTpredictor_width);
2488 Write(_T (
"OwnshipHDTPredictorMiles" ), g_ownship_HDTpredictor_miles);
2490 Write(_T (
"OwnShipIconType" ), g_OwnShipIconType);
2491 Write(_T (
"OwnShipLength" ), g_n_ownship_length_meters);
2492 Write(_T (
"OwnShipWidth" ), g_n_ownship_beam_meters);
2493 Write(_T (
"OwnShipGPSOffsetX" ), g_n_gps_antenna_offset_x);
2494 Write(_T (
"OwnShipGPSOffsetY" ), g_n_gps_antenna_offset_y);
2495 Write(_T (
"OwnShipMinSize" ), g_n_ownship_min_mm);
2496 Write(_T (
"OwnShipSogCogCalc" ), g_own_ship_sog_cog_calc);
2497 Write(_T (
"OwnShipSogCogCalcDampSec"), g_own_ship_sog_cog_calc_damp_sec);
2498 Write(_T (
"ShowDirectRouteLine"), g_bShowShipToActive);
2499 Write(_T (
"DirectRouteLineStyle"), g_shipToActiveStyle);
2500 Write(_T (
"DirectRouteLineColor" ), g_shipToActiveColor);
2505 Write(_T (
"RouteArrivalCircleRadius" ),
2506 wxString::Format(_T(
"%.2f"), g_n_arrival_circle_radius));
2508 Write(_T (
"ChartQuilting" ), g_bQuiltEnable);
2510 Write(_T (
"PreserveScaleOnX" ), g_bPreserveScaleOnX);
2512 Write(_T (
"StartWithTrackActive" ), g_bTrackCarryOver);
2513 Write(_T (
"AutomaticDailyTracks" ), g_bTrackDaily);
2514 Write(_T (
"TrackRotateAt" ), g_track_rotate_time);
2515 Write(_T (
"TrackRotateTimeType" ), g_track_rotate_time_type);
2516 Write(_T (
"HighlightTracks" ), g_bHighliteTracks);
2518 Write(_T (
"DateTimeFormat" ), g_datetime_format);
2519 Write(_T (
"InitialStackIndex" ), g_restore_stackindex);
2520 Write(_T (
"InitialdBIndex" ), g_restore_dbindex);
2522 Write(_T(
"NMEAAPBPrecision" ), g_NMEAAPBPrecision);
2524 Write(_T(
"TalkerIdText"), g_TalkerIdText);
2525 Write(_T(
"ShowTrackPointTime"), g_bShowTrackPointTime);
2527 Write(_T (
"AnchorWatch1GUID" ), g_AW1GUID);
2528 Write(_T (
"AnchorWatch2GUID" ), g_AW2GUID);
2530 Write(_T (
"ToolbarX" ), g_maintoolbar_x);
2531 Write(_T (
"ToolbarY" ), g_maintoolbar_y);
2534 Write(_T (
"iENCToolbarX" ), g_iENCToolbarPosX);
2535 Write(_T (
"iENCToolbarY" ), g_iENCToolbarPosY);
2537 if (!g_bInlandEcdis) {
2538 Write(_T (
"GlobalToolbarConfig" ), g_toolbarConfig);
2539 Write(_T (
"DistanceFormat" ), g_iDistanceFormat);
2540 Write(_T (
"SpeedFormat" ), g_iSpeedFormat);
2541 Write(_T (
"WindSpeedFormat" ), g_iWindSpeedFormat);
2542 Write(_T (
"ShowDepthUnits" ), g_bShowDepthUnits);
2543 Write(_T (
"TemperatureFormat" ), g_iTempFormat);
2545 Write(_T (
"GPSIdent" ), g_GPS_Ident);
2546 Write(
"ActiveRoute", g_active_route);
2547 Write(
"PersistActiveRoute", g_persist_active_route);
2548 Write(_T (
"UseGarminHostUpload" ), g_bGarminHostUpload);
2550 Write(_T (
"MobileTouch" ), g_btouch);
2552 Write(_T (
"EnableRolloverBlock" ), g_bRollover);
2554 Write(_T (
"AutoHideToolbar" ), g_bAutoHideToolbar);
2555 Write(_T (
"AutoHideToolbarSecs" ), g_nAutoHideToolbar);
2558 for (
const auto &mm : g_config_display_size_mm) {
2559 st0.Append(wxString::Format(_T (
"%zu," ), mm));
2562 Write(_T (
"DisplaySizeMM" ), st0);
2563 Write(_T (
"DisplaySizeManual" ), g_config_display_size_manual);
2565 Write(_T (
"SelectionRadiusMM" ), g_selection_radius_mm);
2566 Write(_T (
"SelectionRadiusTouchMM" ), g_selection_radius_touch_mm);
2568 st0.Printf(_T (
"%g" ), g_PlanSpeed);
2569 Write(_T (
"PlanSpeed" ), st0);
2571 if (g_bLayersLoaded) {
2572 wxString vis, invis, visnames, invisnames;
2573 LayerList::iterator it;
2575 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
2577 if (lay->IsVisibleOnChart())
2578 vis += (lay->m_LayerName) + _T(
";");
2580 invis += (lay->m_LayerName) + _T(
";");
2582 if (lay->HasVisibleNames() == wxCHK_CHECKED) {
2583 visnames += (lay->m_LayerName) + _T(
";");
2584 }
else if (lay->HasVisibleNames() == wxCHK_UNCHECKED) {
2585 invisnames += (lay->m_LayerName) + _T(
";");
2588 Write(_T (
"VisibleLayers" ), vis);
2589 Write(_T (
"InvisibleLayers" ), invis);
2590 Write(_T (
"VisNameInLayers" ), visnames);
2591 Write(_T (
"InvisNameInLayers" ), invisnames);
2593 Write(_T (
"Locale" ), g_locale);
2594 Write(_T (
"LocaleOverride" ), g_localeOverride);
2596 Write(_T (
"KeepNavobjBackups" ), g_navobjbackups);
2597 Write(_T (
"LegacyInputCOMPortFilterBehaviour" ),
2598 g_b_legacy_input_filter_behaviour);
2599 Write(_T(
"AdvanceRouteWaypointOnArrivalOnly" ),
2600 g_bAdvanceRouteWaypointOnArrivalOnly);
2601 Write(
"EnableRootMenuDebug", g_enable_root_menu_debug);
2604 Write(_T(
"LiveETA" ), g_bShowLiveETA);
2605 Write(_T(
"DefaultBoatSpeed" ), g_defaultBoatSpeed);
2609 SetPath(_T (
"/Settings/ObjectFilter" ));
2612 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
2614 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
2616 wxString st1(_T (
"viz" ));
2618 strncpy(name, pOLE->OBJLName, 6);
2620 st1.Append(wxString(name, wxConvUTF8));
2621 Write(st1, pOLE->nViz);
2627 SetPath(_T (
"/Settings/GlobalState" ));
2644 st1.Printf(_T (
"%10.4f, %10.4f" ), gLat, gLon);
2645 Write(_T (
"OwnShipLatLon" ), st1);
2648 SetPath(_T (
"/Settings/GlobalState" ));
2649 if (!g_bInlandEcdis)
2650 Write(_T (
"nColorScheme" ), (
int)gFrame->GetColorScheme());
2652 Write(_T (
"FrameWinX" ), g_nframewin_x);
2653 Write(_T (
"FrameWinY" ), g_nframewin_y);
2654 Write(_T (
"FrameWinPosX" ), g_nframewin_posx);
2655 Write(_T (
"FrameWinPosY" ), g_nframewin_posy);
2656 Write(_T (
"FrameMax" ), g_bframemax);
2658 Write(_T (
"ClientPosX" ), g_lastClientRectx);
2659 Write(_T (
"ClientPosY" ), g_lastClientRecty);
2660 Write(_T (
"ClientSzX" ), g_lastClientRectw);
2661 Write(_T (
"ClientSzY" ), g_lastClientRecth);
2663 Write(_T (
"S52_DEPTH_UNIT_SHOW" ), g_nDepthUnitDisplay);
2665 Write(_T(
"RoutePropSizeX" ), g_route_prop_sx);
2666 Write(_T(
"RoutePropSizeY" ), g_route_prop_sy);
2667 Write(_T(
"RoutePropPosX" ), g_route_prop_x);
2668 Write(_T(
"RoutePropPosY" ), g_route_prop_y);
2671 SetPath(_T (
"/Settings/Audio" ));
2672 Write(_T (
"AISAlertSoundFile" ), g_AIS_sound_file);
2673 Write(_T (
"DSCAlertSoundFile" ), g_DSC_sound_file);
2674 Write(_T (
"SARTAlertSoundFile" ), g_SART_sound_file);
2675 Write(_T (
"AnchorAlarmSoundFile" ), g_anchorwatch_sound_file);
2677 Write(_T (
"bAIS_GCPA_AlertAudio" ), g_bAIS_GCPA_Alert_Audio);
2678 Write(_T (
"bAIS_SART_AlertAudio" ), g_bAIS_SART_Alert_Audio);
2679 Write(_T (
"bAIS_DSC_AlertAudio" ), g_bAIS_DSC_Alert_Audio);
2680 Write(_T (
"bAnchorAlertAudio" ), g_bAnchor_Alert_Audio);
2683 SetPath(_T (
"/Settings/AIS" ));
2685 Write(_T (
"bNoCPAMax" ), g_bCPAMax);
2686 Write(_T (
"NoCPAMaxNMi" ), g_CPAMax_NM);
2687 Write(_T (
"bCPAWarn" ), g_bCPAWarn);
2688 Write(_T (
"CPAWarnNMi" ), g_CPAWarn_NM);
2689 Write(_T (
"bTCPAMax" ), g_bTCPA_Max);
2690 Write(_T (
"TCPAMaxMinutes" ), g_TCPA_Max);
2691 Write(_T (
"bMarkLostTargets" ), g_bMarkLost);
2692 Write(_T (
"MarkLost_Minutes" ), g_MarkLost_Mins);
2693 Write(_T (
"bRemoveLostTargets" ), g_bRemoveLost);
2694 Write(_T (
"RemoveLost_Minutes" ), g_RemoveLost_Mins);
2695 Write(_T (
"bShowCOGArrows" ), g_bShowCOG);
2696 Write(_T (
"bSyncCogPredictors" ), g_bSyncCogPredictors);
2697 Write(_T (
"CogArrowMinutes" ), g_ShowCOG_Mins);
2698 Write(_T (
"bShowTargetTracks" ), g_bAISShowTracks);
2699 Write(_T (
"TargetTracksMinutes" ), g_AISShowTracks_Mins);
2701 Write(_T (
"bHideMooredTargets" ), g_bHideMoored);
2702 Write(_T (
"MooredTargetMaxSpeedKnots" ), g_ShowMoored_Kts);
2704 Write(_T (
"bAISAlertDialog" ), g_bAIS_CPA_Alert);
2705 Write(_T (
"bAISAlertAudio" ), g_bAIS_CPA_Alert_Audio);
2707 Write(_T (
"AISAlertAudioFile" ), g_sAIS_Alert_Sound_File);
2708 Write(_T (
"bAISAlertSuppressMoored" ), g_bAIS_CPA_Alert_Suppress_Moored);
2709 Write(_T (
"bShowAreaNotices" ), g_bShowAreaNotices);
2710 Write(_T (
"bDrawAISSize" ), g_bDrawAISSize);
2711 Write(_T (
"bDrawAISRealtime" ), g_bDrawAISRealtime);
2712 Write(_T (
"AISRealtimeMinSpeedKnots" ), g_AIS_RealtPred_Kts);
2713 Write(_T (
"bShowAISName" ), g_bShowAISName);
2714 Write(_T (
"ShowAISTargetNameScale" ), g_Show_Target_Name_Scale);
2715 Write(_T (
"bWplIsAprsPositionReport" ), g_bWplUsePosition);
2716 Write(_T (
"WplSelAction" ), g_WplAction);
2717 Write(_T (
"AISCOGPredictorWidth" ), g_ais_cog_predictor_width);
2718 Write(_T (
"bShowScaledTargets" ), g_bAllowShowScaled);
2719 Write(_T (
"AISScaledNumber" ), g_ShowScaled_Num);
2720 Write(_T (
"AISScaledNumberWeightSOG" ), g_ScaledNumWeightSOG);
2721 Write(_T (
"AISScaledNumberWeightCPA" ), g_ScaledNumWeightCPA);
2722 Write(_T (
"AISScaledNumberWeightTCPA" ), g_ScaledNumWeightTCPA);
2723 Write(_T (
"AISScaledNumberWeightRange" ), g_ScaledNumWeightRange);
2724 Write(_T (
"AISScaledNumberWeightSizeOfTarget" ), g_ScaledNumWeightSizeOfT);
2725 Write(_T (
"AISScaledSizeMinimal" ), g_ScaledSizeMinimal);
2726 Write(_T (
"AISShowScaled"), g_bShowScaled);
2728 Write(_T (
"AlertDialogSizeX" ), g_ais_alert_dialog_sx);
2729 Write(_T (
"AlertDialogSizeY" ), g_ais_alert_dialog_sy);
2730 Write(_T (
"AlertDialogPosX" ), g_ais_alert_dialog_x);
2731 Write(_T (
"AlertDialogPosY" ), g_ais_alert_dialog_y);
2732 Write(_T (
"QueryDialogPosX" ), g_ais_query_dialog_x);
2733 Write(_T (
"QueryDialogPosY" ), g_ais_query_dialog_y);
2734 Write(_T (
"AISTargetListPerspective" ), g_AisTargetList_perspective);
2735 Write(_T (
"AISTargetListRange" ), g_AisTargetList_range);
2736 Write(_T (
"AISTargetListSortColumn" ), g_AisTargetList_sortColumn);
2737 Write(_T (
"bAISTargetListSortReverse" ), g_bAisTargetList_sortReverse);
2738 Write(_T (
"AISTargetListColumnSpec" ), g_AisTargetList_column_spec);
2739 Write(_T (
"AISTargetListColumnOrder"), g_AisTargetList_column_order);
2741 Write(_T (
"S57QueryDialogSizeX" ), g_S57_dialog_sx);
2742 Write(_T (
"S57QueryDialogSizeY" ), g_S57_dialog_sy);
2743 Write(_T (
"S57QueryExtraDialogSizeX" ), g_S57_extradialog_sx);
2744 Write(_T (
"S57QueryExtraDialogSizeY" ), g_S57_extradialog_sy);
2746 Write(_T (
"bAISRolloverShowClass" ), g_bAISRolloverShowClass);
2747 Write(_T (
"bAISRolloverShowCOG" ), g_bAISRolloverShowCOG);
2748 Write(_T (
"bAISRolloverShowCPA" ), g_bAISRolloverShowCPA);
2750 Write(_T (
"bAISAlertAckTimeout" ), g_bAIS_ACK_Timeout);
2751 Write(_T (
"AlertAckTimeoutMinutes" ), g_AckTimeout_Mins);
2753 SetPath(_T (
"/Settings/GlobalState" ));
2755 Write(_T (
"bShowS57Text" ), ps52plib->GetShowS57Text());
2756 Write(_T (
"bShowS57ImportantTextOnly" ),
2757 ps52plib->GetShowS57ImportantTextOnly());
2758 if (!g_bInlandEcdis)
2759 Write(_T (
"nDisplayCategory" ), (
long)ps52plib->GetDisplayCategory());
2760 Write(_T (
"nSymbolStyle" ), (
int)ps52plib->m_nSymbolStyle);
2761 Write(_T (
"nBoundaryStyle" ), (
int)ps52plib->m_nBoundaryStyle);
2763 Write(_T (
"bShowSoundg" ), ps52plib->m_bShowSoundg);
2764 Write(_T (
"bShowMeta" ), ps52plib->m_bShowMeta);
2765 Write(_T (
"bUseSCAMIN" ), ps52plib->m_bUseSCAMIN);
2766 Write(_T (
"bUseSUPER_SCAMIN" ), ps52plib->m_bUseSUPER_SCAMIN);
2767 Write(_T (
"bShowAtonText" ), ps52plib->m_bShowAtonText);
2768 Write(_T (
"bShowLightDescription" ), ps52plib->m_bShowLdisText);
2769 Write(_T (
"bExtendLightSectors" ), ps52plib->m_bExtendLightSectors);
2770 Write(_T (
"bDeClutterText" ), ps52plib->m_bDeClutterText);
2771 Write(_T (
"bShowNationalText" ), ps52plib->m_bShowNationalTexts);
2773 Write(_T (
"S52_MAR_SAFETY_CONTOUR" ),
2774 S52_getMarinerParam(S52_MAR_SAFETY_CONTOUR));
2775 Write(_T (
"S52_MAR_SHALLOW_CONTOUR" ),
2776 S52_getMarinerParam(S52_MAR_SHALLOW_CONTOUR));
2777 Write(_T (
"S52_MAR_DEEP_CONTOUR" ),
2778 S52_getMarinerParam(S52_MAR_DEEP_CONTOUR));
2779 Write(_T (
"S52_MAR_TWO_SHADES" ), S52_getMarinerParam(S52_MAR_TWO_SHADES));
2780 Write(_T (
"S52_DEPTH_UNIT_SHOW" ), ps52plib->m_nDepthUnitDisplay);
2781 Write(_T (
"ENCSoundingScaleFactor" ), g_ENCSoundingScaleFactor);
2782 Write(_T (
"ENCTextScaleFactor" ), g_ENCTextScaleFactor);
2784 SetPath(_T (
"/Directories" ));
2785 Write(_T (
"S57DataLocation" ), _T(
""));
2788 SetPath(_T (
"/Directories" ));
2789 Write(_T (
"InitChartDir" ), *pInit_Chart_Dir);
2790 Write(_T (
"GPXIODir" ), g_gpx_path);
2791 Write(_T (
"TCDataDir" ), g_TCData_Dir);
2792 Write(_T (
"BasemapDir" ), g_Platform->NormalizePath(gWorldMapLocation));
2793 Write(_T (
"BaseShapefileDir" ),
2794 g_Platform->NormalizePath(gWorldShapefileLocation));
2795 Write(_T (
"pluginInstallDir" ), g_Platform->NormalizePath(g_winPluginDir));
2797 SetPath(_T (
"/Settings/NMEADataSource" ));
2798 wxString connectionconfigs;
2799 for (
size_t i = 0; i < TheConnectionParams().size(); i++) {
2800 if (i > 0) connectionconfigs.Append(_T(
"|"));
2801 connectionconfigs.Append(TheConnectionParams()[i]->Serialize());
2803 Write(_T (
"DataConnections" ), connectionconfigs);
2808 SetPath(_T (
"/Settings/AuxFontKeys" ));
2811 for (
unsigned int i = 0; i < keyArray.GetCount(); i++) {
2813 key.Printf(_T(
"Key%i"), i);
2814 wxString keyval = keyArray[i];
2820 font_path = (_T (
"/Settings/X11Fonts" ));
2824 font_path = (_T (
"/Settings/GTKFonts" ));
2828 font_path = (_T (
"/Settings/MSWFonts" ));
2832 font_path = (_T (
"/Settings/MacFonts" ));
2836 font_path = (_T (
"/Settings/QTFonts" ));
2839 DeleteGroup(font_path);
2845 for (
int i = 0; i < nFonts; i++) {
2846 wxString cfstring(FontMgr::Get().GetConfigString(i));
2848 Write(cfstring, valstring);
2852 DeleteGroup(_T (
"/TideCurrentDataSources" ));
2853 SetPath(_T (
"/TideCurrentDataSources" ));
2854 unsigned int id = 0;
2855 for (
auto val : TideCurrentDataSet) {
2857 key.Printf(_T(
"tcds%d"),
id);
2858 Write(key, wxString(val));
2862 SetPath(_T (
"/Settings/Others" ));
2865 Write(_T (
"ShowRadarRings" ),
2866 (
bool)(g_iNavAidRadarRingsNumberVisible > 0));
2867 Write(_T (
"RadarRingsNumberVisible" ), g_iNavAidRadarRingsNumberVisible);
2868 Write(_T (
"RadarRingsStep" ), g_fNavAidRadarRingsStep);
2869 Write(_T (
"RadarRingsStepUnits" ), g_pNavAidRadarRingsStepUnits);
2870 Write(_T (
"RadarRingsColour" ),
2871 g_colourOwnshipRangeRingsColour.GetAsString(wxC2S_HTML_SYNTAX));
2872 Write(_T(
"WaypointUseScaMin" ), g_bUseWptScaMin);
2873 Write(_T(
"WaypointScaMinValue" ), g_iWpt_ScaMin);
2874 Write(_T(
"WaypointUseScaMinOverrule" ), g_bOverruleScaMin);
2875 Write(_T(
"WaypointsShowName"), g_bShowWptName);
2876 Write(_T(
"UserIconsFirst"), g_bUserIconsFirst);
2879 Write(_T (
"WaypointRangeRingsNumber" ), g_iWaypointRangeRingsNumber);
2880 Write(_T (
"WaypointRangeRingsStep" ), g_fWaypointRangeRingsStep);
2881 Write(_T (
"WaypointRangeRingsStepUnits" ), g_iWaypointRangeRingsStepUnits);
2882 Write(_T (
"WaypointRangeRingsColour" ),
2883 g_colourWaypointRangeRingsColour.GetAsString(wxC2S_HTML_SYNTAX));
2885 Write(_T (
"ConfirmObjectDeletion" ), g_bConfirmObjectDelete);
2888 Write(_T (
"WaypointPreventDragging" ), g_bWayPointPreventDragging);
2890 Write(_T (
"EnableZoomToCursor" ), g_bEnableZoomToCursor);
2892 Write(_T (
"TrackIntervalSeconds" ), g_TrackIntervalSeconds);
2893 Write(_T (
"TrackDeltaDistance" ), g_TrackDeltaDistance);
2894 Write(_T (
"TrackPrecision" ), g_nTrackPrecision);
2896 Write(_T (
"RouteLineWidth" ), g_route_line_width);
2897 Write(_T (
"TrackLineWidth" ), g_track_line_width);
2898 Write(_T (
"TrackLineColour" ),
2899 g_colourTrackLineColour.GetAsString(wxC2S_HTML_SYNTAX));
2900 Write(_T (
"DefaultWPIcon" ), g_default_wp_icon);
2901 Write(_T (
"DefaultRPIcon" ), g_default_routepoint_icon);
2903 DeleteGroup(_T (
"/MmsiProperties" ));
2904 SetPath(_T (
"/MmsiProperties" ));
2905 for (
unsigned int i = 0; i < g_MMSI_Props_Array.GetCount(); i++) {
2907 p.Printf(_T(
"Props%d"), i);
2908 Write(p, g_MMSI_Props_Array[i]->Serialize());
2911 SaveCanvasConfigs();
2914 SendMessageToAllPlugins(
"GLOBAL_SETTINGS_UPDATED", wxEmptyString);
2917void MyConfig::UpdateNavObjOnly() {
2921 pNavObjectSet->CreateAllGPXObjects();
2922 pNavObjectSet->SaveFile(m_sNavObjSetFile);
2924 delete pNavObjectSet;
2927void MyConfig::UpdateNavObj(
bool bRecreate) {
2931 pNavObjectSet->CreateAllGPXObjects();
2932 pNavObjectSet->SaveFile(m_sNavObjSetFile);
2934 delete pNavObjectSet;
2936 if (m_pNavObjectChangesSet->m_changes_file)
2937 fclose(m_pNavObjectChangesSet->m_changes_file);
2939 if (::wxFileExists(m_sNavObjSetChangesFile)) {
2941 wxRemoveFile(m_sNavObjSetChangesFile);
2945 m_pNavObjectChangesSet->Init(m_sNavObjSetChangesFile);
2947 m_pNavObjectChangesSet->reset();
2948 if (m_pNavObjectChangesSet->load_file(m_sNavObjSetChangesFile.fn_str())
2949 .status != pugi::xml_parse_status::status_ok) {
2950 wxLogMessage(
"Error while loading " + m_sNavObjSetChangesFile +
2951 ", ignoring contents of the file.");
2952 m_pNavObjectChangesSet->reset();
2957static wxFileName exportFileName(wxWindow *parent,
2958 const wxString suggestedName) {
2961 wxString validName{suggestedName};
2964 validName.Replace(_T(
"/"), _T(
"-"));
2965 validName.Replace(_T(
":"), _T(
"_"));
2968 if (!validName.EndsWith(
".gpx")) {
2969 wxFileName fn(validName);
2972 validName = fn.GetFullName();
2975 int response = g_Platform->DoFileSelectorDialog(
2976 parent, &path, _(
"Export GPX file"), g_gpx_path, validName, wxT(
"*.gpx"));
2978 if (response == wxID_OK) {
2979 wxFileName fn(path);
2980 g_gpx_path = fn.GetPath();
2981 fn.SetExt(_T(
"gpx"));
2984 if (wxFileExists(fn.GetFullPath())) {
2986 OCPNMessageBox(NULL, _(
"Overwrite existing file?"), _T(
"Confirm"),
2987 wxICON_QUESTION | wxYES_NO | wxCANCEL);
2988 if (answer != wxID_YES)
return ret;
2996bool MyConfig::IsChangesFileDirty() {
2997 return m_pNavObjectChangesSet->IsDirty();
3000bool ExportGPXRoutes(wxWindow *parent, RouteList *pRoutes,
3001 const wxString suggestedName) {
3002 wxFileName fn = exportFileName(parent, suggestedName);
3005 pgpx->AddGPXRoutesList(pRoutes);
3008 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
3010 pgpx->SaveFile(fns);
3011 AndroidSecureCopyFile(fns, fn.GetFullPath());
3013 pgpx->SaveFile(fn.GetFullPath());
3024bool ExportGPXTracks(wxWindow *parent, std::vector<Track *> *pTracks,
3025 const wxString suggestedName) {
3026 wxFileName fn = exportFileName(parent, suggestedName);
3029 pgpx->AddGPXTracksList(pTracks);
3031 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
3033 pgpx->SaveFile(fns);
3034 AndroidSecureCopyFile(fns, fn.GetFullPath());
3036 pgpx->SaveFile(fn.GetFullPath());
3045bool ExportGPXWaypoints(wxWindow *parent, RoutePointList *pRoutePoints,
3046 const wxString suggestedName) {
3047 wxFileName fn = exportFileName(parent, suggestedName);
3050 pgpx->AddGPXPointsList(pRoutePoints);
3053 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
3055 pgpx->SaveFile(fns);
3056 AndroidSecureCopyFile(fns, fn.GetFullPath());
3058 pgpx->SaveFile(fn.GetFullPath());
3068void ExportGPX(wxWindow *parent,
bool bviz_only,
bool blayer) {
3069 wxFileName fn = exportFileName(parent, _T(
"userobjects.gpx"));
3071 ::wxBeginBusyCursor();
3075 wxGenericProgressDialog *pprog =
nullptr;
3076 int count = pWayPointMan->GetWaypointList()->GetCount();
3077 int progStep = count / 32;
3079 pprog =
new wxGenericProgressDialog(
3080 _(
"Export GPX file"), _T(
"0/0"), count, NULL,
3081 wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME |
3082 wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME);
3083 pprog->SetSize(400, wxDefaultCoord);
3090 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
3093 if (pprog && !(ic % progStep)) {
3095 msg.Printf(_T(
"%d/%d"), ic, count);
3096 pprog->Update(ic, msg);
3100 pr = node->GetData();
3108 if (pr->IsShared() || !WptIsInRouteList(pr)) pgpx->AddGPXWaypoint(pr);
3111 node = node->GetNext();
3114 wxRouteListNode *node1 = pRouteList->GetFirst();
3116 Route *pRoute = node1->GetData();
3120 if (bviz_only && !pRoute->IsVisible()) b_add =
false;
3124 if (b_add) pgpx->AddGPXRoute(pRoute);
3126 node1 = node1->GetNext();
3129 for (
Track *pTrack : g_TrackList) {
3132 if (bviz_only && !pTrack->IsVisible()) b_add =
false;
3134 if (pTrack->m_bIsInLayer && !blayer) b_add =
false;
3136 if (b_add) pgpx->AddGPXTrack(pTrack);
3143 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
3145 pgpx->SaveFile(fns);
3146 AndroidSecureCopyFile(fns, fn.GetFullPath());
3148 pgpx->SaveFile(fn.GetFullPath());
3152 ::wxEndBusyCursor();
3158void UI_ImportGPX(wxWindow *parent,
bool islayer, wxString dirpath,
3159 bool isdirectory,
bool isPersistent) {
3160 int response = wxID_CANCEL;
3161 wxArrayString file_array;
3164 if (!islayer || dirpath.IsSameAs(_T(
""))) {
3169 wxFileDialog *popenDialog =
3170 new wxFileDialog(NULL, _(
"Import GPX file"), g_gpx_path, wxT(
""),
3171 wxT(
"GPX files (*.gpx)|*.gpx|All files (*.*)|*.*"),
3172 wxFD_OPEN | wxFD_MULTIPLE);
3174 if (g_bresponsive && parent)
3175 popenDialog = g_Platform->AdjustFileDialogFont(parent, popenDialog);
3177 popenDialog->Centre();
3180 if (parent) parent->HideWithEffect(wxSHOW_EFFECT_BLEND);
3183 response = popenDialog->ShowModal();
3186 if (parent) parent->ShowWithEffect(wxSHOW_EFFECT_BLEND);
3189 if (response == wxID_OK) {
3190 popenDialog->GetPaths(file_array);
3193 if (file_array.GetCount()) {
3194 wxFileName fn(file_array[0]);
3195 g_gpx_path = fn.GetPath();
3201 response = g_Platform->DoFileSelectorDialog(
3202 NULL, &path, _(
"Import GPX file"), g_gpx_path, _T(
""), wxT(
"*.gpx"));
3204 file_array.Add(path);
3205 wxFileName fn(path);
3206 g_gpx_path = fn.GetPath();
3212 if (wxDir::GetAllFiles(dirpath, &file_array, wxT(
"*.gpx")))
3215 file_array.Add(dirpath);
3220 if (response == wxID_OK) {
3223 l->m_LayerID = ++g_LayerIdx;
3224 l->m_LayerFileName = file_array[0];
3225 if (file_array.GetCount() <= 1)
3226 wxFileName::SplitPath(file_array[0], NULL, NULL, &(l->m_LayerName),
3229 if (dirpath.IsSameAs(_T(
"")))
3230 wxFileName::SplitPath(g_gpx_path, NULL, NULL, &(l->m_LayerName), NULL,
3233 wxFileName::SplitPath(dirpath, NULL, NULL, &(l->m_LayerName), NULL,
3237 bool bLayerViz = g_bShowLayers;
3238 if (g_VisibleLayers.Contains(l->m_LayerName)) bLayerViz =
true;
3239 if (g_InvisibleLayers.Contains(l->m_LayerName)) bLayerViz =
false;
3240 l->m_bIsVisibleOnChart = bLayerViz;
3243 l->m_bHasVisibleNames = wxCHK_CHECKED;
3246 laymsg.Printf(wxT(
"New layer %d: %s"), l->m_LayerID,
3247 l->m_LayerName.c_str());
3248 wxLogMessage(laymsg);
3250 pLayerList->Insert(l);
3253 for (
unsigned int i = 0; i < file_array.GetCount(); i++) {
3254 wxString path = file_array[i];
3256 if (::wxFileExists(path)) {
3258 if (pSet->load_file(path.fn_str()).status !=
3259 pugi::xml_parse_status::status_ok) {
3260 wxLogMessage(
"Error loading GPX file " + path);
3267 l->m_NoOfItems = pSet->LoadAllGPXObjectsAsLayer(
3268 l->m_LayerID, l->m_bIsVisibleOnChart, l->m_bHasVisibleNames);
3269 l->m_LayerType = isPersistent ? _(
"Persistent") : _(
"Temporary");
3274 wxString destf, f, name, ext;
3275 f = l->m_LayerFileName;
3276 wxFileName::SplitPath(f, NULL, NULL, &name, &ext);
3278 appendOSDirSlash(&destf);
3279 destf.Append(_T(
"layers"));
3280 appendOSDirSlash(&destf);
3281 if (!wxDirExists(destf)) {
3282 if (!wxMkdir(destf, wxS_DIR_DEFAULT))
3283 wxLogMessage(_T(
"Error creating layer directory"));
3286 destf << name << _T(
".") << ext;
3288 if (wxCopyFile(f, destf,
true))
3289 msg.Printf(_T(
"File: %s.%s also added to persistent layers"),
3292 msg.Printf(_T(
"Failed adding %s.%s to persistent layers"), name,
3298 pSet->LoadAllGPXObjects(
3304 wxString::Format(_T(
"%d ") + _(
"duplicate waypoints detected "
3305 "during import and ignored."),
3307 _(
"OpenCPN Info"), wxICON_INFORMATION | wxOK, 10);
3319void SwitchInlandEcdisMode(
bool Switch) {
3321 wxLogMessage(_T(
"Switch InlandEcdis mode On"));
3325 g_iDistanceFormat = 2;
3328 if (ps52plib) ps52plib->SetDisplayCategory(STANDARD);
3329 g_bDrawAISSize =
false;
3330 if (gFrame) gFrame->RequestNewToolbars(
true);
3332 wxLogMessage(_T(
"Switch InlandEcdis mode Off"));
3335 pConfig->SetPath(_T (
"/Settings" ));
3336 pConfig->Read(_T (
"GlobalToolbarConfig" ), &g_toolbarConfig);
3337 pConfig->Read(_T (
"DistanceFormat" ), &g_iDistanceFormat);
3338 pConfig->Read(_T (
"SpeedFormat" ), &g_iSpeedFormat);
3339 pConfig->Read(_T (
"ShowDepthUnits" ), &g_bShowDepthUnits, 1);
3341 pConfig->Read(_T (
"nDisplayCategory" ), &read_int,
3342 (
enum _DisCat)STANDARD);
3343 if (ps52plib) ps52plib->SetDisplayCategory((
enum _DisCat)read_int);
3344 pConfig->SetPath(_T (
"/Settings/AIS" ));
3345 pConfig->Read(_T (
"bDrawAISSize" ), &g_bDrawAISSize);
3346 pConfig->Read(_T (
"bDrawAISRealtime" ), &g_bDrawAISRealtime);
3348 if (gFrame) gFrame->RequestNewToolbars(
true);
3360wxString FormatGPXDateTime(wxDateTime dt) {
3362 return dt.Format(wxT(
"%Y-%m-%dT%H:%M:%SZ"));
3369bool LogMessageOnce(
const wxString &msg) {
3372 for (
unsigned int i = 0; i < pMessageOnceArray->GetCount(); i++) {
3373 if (msg.IsSameAs(pMessageOnceArray->Item(i)))
return false;
3377 pMessageOnceArray->Add(msg);
3388wxDateTime toUsrDateTime(
const wxDateTime ts,
const int format,
3390 if (!ts.IsValid()) {
3393 int effective_format = format;
3394 if (effective_format == GLOBAL_SETTINGS_INPUT) {
3395 if (::g_datetime_format ==
"UTC") {
3396 effective_format = UTCINPUT;
3397 }
else if (::g_datetime_format ==
"LMT") {
3398 effective_format = LMTINPUT;
3399 }
else if (::g_datetime_format ==
"Local Time") {
3400 effective_format = LTINPUT;
3403 effective_format = UTCINPUT;
3407 switch (effective_format) {
3409 if (std::isnan(lon)) {
3410 dt = wxInvalidDateTime;
3413 ts.Add(wxTimeSpan(wxTimeSpan(0, 0, wxLongLong(lon * 3600. / 15.))));
3428wxDateTime fromUsrDateTime(
const wxDateTime ts,
const int format,
3430 if (!ts.IsValid()) {
3433 int effective_format = format;
3434 if (effective_format == GLOBAL_SETTINGS_INPUT) {
3435 if (::g_datetime_format ==
"UTC") {
3436 effective_format = UTCINPUT;
3437 }
else if (::g_datetime_format ==
"LMT") {
3438 effective_format = LMTINPUT;
3439 }
else if (::g_datetime_format ==
"Local Time") {
3440 effective_format = LTINPUT;
3443 effective_format = UTCINPUT;
3447 switch (effective_format) {
3449 if (std::isnan(lon)) {
3450 dt = wxInvalidDateTime;
3452 dt = ts.Subtract(wxTimeSpan(0, 0, wxLongLong(lon * 3600. / 15.)));
3469double fromUsrDistance(
double usr_distance,
int unit) {
3471 if (
unit == -1)
unit = g_iDistanceFormat;
3477 ret = usr_distance / 1.15078;
3480 ret = usr_distance / 1.852;
3483 ret = usr_distance / 1852;
3486 ret = usr_distance / 6076.12;
3494double fromUsrSpeed(
double usr_speed,
int unit) {
3496 if (
unit == -1)
unit = g_iSpeedFormat;
3502 ret = usr_speed / 1.15078;
3505 ret = usr_speed / 1.852;
3508 ret = usr_speed / 0.514444444;
3516double fromUsrWindSpeed(
double usr_wspeed,
int unit) {
3518 if (
unit == -1)
unit = g_iWindSpeedFormat;
3524 ret = usr_wspeed / 0.514444444;
3527 ret = usr_wspeed / 1.15078;
3530 ret = usr_wspeed / 1.852;
3539double fromUsrTemp(
double usr_temp,
int unit) {
3541 if (
unit == -1)
unit = g_iTempFormat;
3547 ret = (usr_temp - 32) * 5.0 / 9.0;
3550 ret = usr_temp - 273.15;
3556wxString formatAngle(
double angle) {
3558 if (g_bShowMag && g_bShowTrue) {
3559 out.Printf(wxT(
"%03.0f %cT (%.0f %cM)"), angle, 0x00B0, toMagnetic(angle),
3561 }
else if (g_bShowTrue) {
3562 out.Printf(wxT(
"%03.0f %cT"), angle, 0x00B0);
3564 out.Printf(wxT(
"%03.0f %cM"), toMagnetic(angle), 0x00B0);
3570void AlphaBlending(
ocpnDC &dc,
int x,
int y,
int size_x,
int size_y,
3571 float radius, wxColour color,
unsigned char transparency) {
3572 wxDC *pdc = dc.GetDC();
3575 wxBitmap obm(size_x, size_y);
3577 mdc1.SelectObject(obm);
3578 mdc1.Blit(0, 0, size_x, size_y, pdc, x, y);
3579 mdc1.SelectObject(wxNullBitmap);
3580 wxImage oim = obm.ConvertToImage();
3583 wxBitmap olbm(size_x, size_y);
3584 wxMemoryDC oldc(olbm);
3585 if (!oldc.IsOk())
return;
3587 oldc.SetBackground(*wxBLACK_BRUSH);
3588 oldc.SetBrush(*wxWHITE_BRUSH);
3591 if (radius > 0.0) oldc.DrawRoundedRectangle(0, 0, size_x, size_y, radius);
3593 wxImage dest = olbm.ConvertToImage();
3594 unsigned char *dest_data =
3595 (
unsigned char *)malloc(size_x * size_y * 3 *
sizeof(
unsigned char));
3596 unsigned char *bg = oim.GetData();
3597 unsigned char *box = dest.GetData();
3598 unsigned char *d = dest_data;
3605 float alpha = 1.0 - (float)transparency / 255.0;
3606 int sb = size_x * size_y;
3607 for (
int i = 0; i < sb; i++) {
3609 if (*box == 0 && radius > 0.0) a = 1.0;
3610 int r = ((*bg++) * a) + (1.0 - a) * color.Red();
3613 int g = ((*bg++) * a) + (1.0 - a) * color.Green();
3616 int b = ((*bg++) * a) + (1.0 - a) * color.Blue();
3621 dest.SetData(dest_data);
3625 dc.DrawBitmap(dbm, x, y,
false);
3629 dc.CalcBoundingBox(x, y);
3630 dc.CalcBoundingBox(x + size_x, y + size_y);
3635 float radMod = wxMax(radius, 2.0);
3636 wxColour c(color.Red(), color.Green(), color.Blue(), transparency);
3637 dc.SetBrush(wxBrush(c));
3638 dc.SetPen(wxPen(c, 1));
3639 dc.DrawRoundedRectangle(x, y, size_x, size_y, radMod);
3641 glDisable(GL_BLEND);
3647void DimeControl(wxWindow *ctrl) {
3653 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) {
3661 if (wxSystemSettings::GetColour(wxSystemColour::wxSYS_COLOUR_WINDOW).Red() <
3668 if (NULL == ctrl)
return;
3670 wxColour col, window_back_color, gridline, uitext, udkrd, ctrl_back_color,
3672 col = GetGlobalColor(_T(
"DILG0"));
3673 window_back_color = GetGlobalColor(_T(
"DILG1"));
3674 ctrl_back_color = GetGlobalColor(_T(
"DILG1"));
3675 text_color = GetGlobalColor(_T(
"DILG3"));
3676 uitext = GetGlobalColor(_T(
"UITX1"));
3677 udkrd = GetGlobalColor(_T(
"UDKRD"));
3678 gridline = GetGlobalColor(_T(
"GREY2"));
3680 DimeControl(ctrl, col, window_back_color, ctrl_back_color, text_color, uitext,
3684void DimeControl(wxWindow *ctrl, wxColour col, wxColour window_back_color,
3685 wxColour ctrl_back_color, wxColour text_color, wxColour uitext,
3686 wxColour udkrd, wxColour gridline) {
3692 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) {
3697 ColorScheme cs = global_color_scheme;
3701 (cs == GLOBAL_COLOR_SCHEME_DUSK || cs == GLOBAL_COLOR_SCHEME_NIGHT);
3703 static int depth = 0;
3709 window_back_color = wxNullColour;
3711 window_back_color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
3713 col = wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX);
3714 uitext = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
3717 ctrl->SetBackgroundColour(window_back_color);
3718 if (darkMode) ctrl->SetForegroundColour(text_color);
3721 wxWindowList kids = ctrl->GetChildren();
3722 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
3723 wxWindowListNode *node = kids.Item(i);
3724 wxWindow *win = node->GetData();
3726 if (
dynamic_cast<wxListBox *
>(win) ||
dynamic_cast<wxListCtrl *
>(win) ||
3727 dynamic_cast<wxTextCtrl *
>(win) ||
3728 dynamic_cast<wxTimePickerCtrl *
>(win)) {
3729 win->SetBackgroundColour(col);
3730 }
else if (
dynamic_cast<wxStaticText *
>(win) ||
3731 dynamic_cast<wxCheckBox *
>(win) ||
3732 dynamic_cast<wxRadioButton *
>(win)) {
3733 win->SetForegroundColour(uitext);
3740 else if (
dynamic_cast<wxBitmapComboBox *
>(win) ||
3741 dynamic_cast<wxChoice *
>(win) ||
dynamic_cast<wxComboBox *
>(win) ||
3742 dynamic_cast<wxTreeCtrl *
>(win)) {
3743 win->SetBackgroundColour(col);
3746 else if (
dynamic_cast<wxScrolledWindow *
>(win) ||
3747 dynamic_cast<wxGenericDirCtrl *
>(win) ||
3748 dynamic_cast<wxListbook *
>(win) ||
dynamic_cast<wxButton *
>(win) ||
3749 dynamic_cast<wxToggleButton *
>(win)) {
3750 win->SetBackgroundColour(window_back_color);
3753 else if (
dynamic_cast<wxNotebook *
>(win)) {
3754 win->SetBackgroundColour(window_back_color);
3755 win->SetForegroundColour(text_color);
3759 else if (
dynamic_cast<wxHtmlWindow *
>(win)) {
3760 if (cs != GLOBAL_COLOR_SCHEME_DAY && cs != GLOBAL_COLOR_SCHEME_RGB)
3761 win->SetBackgroundColour(ctrl_back_color);
3763 win->SetBackgroundColour(wxNullColour);
3766 else if (
dynamic_cast<wxGrid *
>(win)) {
3767 dynamic_cast<wxGrid *
>(win)->SetDefaultCellBackgroundColour(
3769 dynamic_cast<wxGrid *
>(win)->SetDefaultCellTextColour(uitext);
3770 dynamic_cast<wxGrid *
>(win)->SetLabelBackgroundColour(col);
3771 dynamic_cast<wxGrid *
>(win)->SetLabelTextColour(uitext);
3772 dynamic_cast<wxGrid *
>(win)->SetGridLineColour(gridline);
3775 if (win->GetChildren().GetCount() > 0) {
3778 DimeControl(w, col, window_back_color, ctrl_back_color, text_color,
3779 uitext, udkrd, gridline);
3785#define LUMIMOSITY_NIGHT (-0.8)
3786#define LUMIMOSITY_DUSK (-0.5)
3788wxColor GetDimedColor(
const wxColor &c) {
3789 switch (global_color_scheme) {
3790 case ColorScheme::GLOBAL_COLOR_SCHEME_NIGHT:
3792 wxMax(0, wxMin(c.Red() + c.Red() * LUMIMOSITY_NIGHT, 255)),
3793 wxMax(0, wxMin(c.Green() + c.Green() * LUMIMOSITY_NIGHT, 255)),
3794 wxMax(0, wxMin(c.Blue() + c.Blue() * LUMIMOSITY_NIGHT, 255))));
3795 case ColorScheme::GLOBAL_COLOR_SCHEME_DUSK:
3797 wxColor(wxMax(0, wxMin(c.Red() + c.Red() * LUMIMOSITY_DUSK, 255)),
3798 wxMax(0, wxMin(c.Green() + c.Green() * LUMIMOSITY_DUSK, 255)),
3799 wxMax(0, wxMin(c.Blue() + c.Blue() * LUMIMOSITY_DUSK, 255))));
bool g_bresponsive
Flag to control adaptive UI scaling.
Global state for AIS decoder.
Represents an individual component within a ChartGroup.
Represents a user-defined collection of logically related charts.
wxString GetFullConfigDesc(int i) const
Gets description of font at index i.
bool AddAuxKey(wxString key)
Adds new plugin-defined font configuration key.
void LoadFontNative(wxString *pConfigString, wxString *pNativeDesc)
Loads font settings from a string descriptor.
static wxString GetFontConfigKey(const wxString &description)
Creates configuration key from UI element name by combining locale with hash.
int GetNumFonts(void) const
Gets the total number of font configurations currently loaded.
wxArrayString & GetAuxKeyArray()
Gets array of plugin-defined font configuration keys.
Wrapper for global variable, supports notification events when value changes.
Represents a layer of chart objects in OpenCPN.
static int config_to_ui(double value)
Convert configuration 1.02..3.0 value to slider scale 1..100.
static double ui_to_config(int slider_pos)
Convert a slider scale 1-100 value to configuration value 1.02..3.0.
Represents a waypoint or mark within the navigation system.
bool m_bIsVisible
Flag indicating if the waypoint should be drawn on the chart.
bool m_bIsInLayer
Flag indicating if the waypoint belongs to a layer.
Represents a navigational route in the navigation system.
bool m_bIsInLayer
Flag indicating whether this route belongs to a layer.
Represents a single point in a track.
Represents a track, which is a series of connected track points.
ViewPort - Core geographic projection and coordinate transformation engine.
double view_scale_ppm
Requested view scale in physical pixels per meter (ppm), before applying projections.
double rotation
Rotation angle of the viewport in radians.
double clon
Center longitude of the viewport in degrees.
double clat
Center latitude of the viewport in degrees.
Encapsulates persistent canvas configuration.
double iLat
Latitude of the center of the chart, in degrees.
bool bShowOutlines
Display chart outlines.
wxSize canvasSize
Canvas dimensions.
bool bShowDepthUnits
Display depth unit indicators.
double iLon
Longitude of the center of the chart, in degrees.
double iRotation
Initial rotation angle in radians.
bool bCourseUp
Orient display to course up.
bool bQuilt
Enable chart quilting.
bool bFollow
Enable vessel following mode.
double iScale
Initial chart scale factor.
bool bShowENCText
Display ENC text elements.
bool bShowAIS
Display AIS targets.
bool bShowGrid
Display coordinate grid.
ChartCanvas * canvas
Pointer to associated chart canvas.
bool bShowCurrents
Display current information.
bool bShowTides
Display tide information.
bool bLookahead
Enable lookahead mode.
bool bHeadUp
Orient display to heading up.
bool bAttenAIS
Enable AIS target attenuation.
Device context class that can use either wxDC or OpenGL for drawing.
Global variables reflecting command line options and arguments.
NavmsgFilter Read(const std::string &name)
Read filter with given name from disk.
bool Write(const NavmsgFilter &filter, const std::string &name)
Write contents for given filter to disk.
PlugIn Object Definition/API.
Tools to send data to plugins.