26 #include <wx/wxprec.h>
43 #include <wx/bmpcbox.h>
45 #include <wx/filename.h>
46 #include <wx/graphics.h>
48 #include <wx/listbook.h>
49 #include <wx/listimpl.cpp>
50 #include <wx/progdlg.h>
51 #include <wx/sstream.h>
52 #include <wx/tglbtn.h>
53 #include <wx/timectrl.h>
54 #include <wx/tokenzr.h>
56 #include "model/ais_decoder.h"
59 #include "model/config_vars.h"
60 #include "model/conn_params.h"
61 #include "model/cutil.h"
62 #include "model/geodesic.h"
63 #include "model/georef.h"
64 #include "model/idents.h"
65 #include "model/multiplexer.h"
66 #include "model/nav_object_database.h"
67 #include "model/navutil_base.h"
68 #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"
76 #include "chartbase.h"
81 #include "ConfigMgr.h"
88 #include "NMEALogWindow.h"
89 #include "observable_globvar.h"
91 #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"
112 extern double g_ChartNotRenderScaleFactor;
113 extern int g_restore_stackindex;
114 extern int g_restore_dbindex;
115 extern RouteList *pRouteList;
116 extern std::vector<Track*> g_TrackList;
117 extern LayerList *pLayerList;
119 extern double vLat, vLon;
120 extern double kLat, kLon;
121 extern ColorScheme global_color_scheme;
122 extern int g_nbrightness;
123 extern bool g_bShowStatusBar;
124 extern bool g_bUIexpert;
125 extern bool g_bFullscreen;
127 extern wxString g_SENCPrefix;
128 extern wxString g_UserPresLibData;
130 extern wxString *pInit_Chart_Dir;
131 extern wxString gWorldMapLocation;
132 extern wxString gWorldShapefileLocation;
134 extern bool s_bSetSystemTime;
135 extern bool g_bDisplayGrid;
136 extern bool g_bPlayShipsBells;
137 extern int g_iSoundDeviceIndex;
138 extern bool g_bFullscreenToolbar;
139 extern bool g_bShowLayers;
140 extern bool g_bTransparentToolbar;
141 extern bool g_bPermanentMOBIcon;
143 extern bool g_bShowDepthUnits;
144 extern bool g_bAutoAnchorMark;
145 extern bool g_bskew_comp;
146 extern bool g_bopengl;
147 extern bool g_bSoftwareGL;
148 extern bool g_bsmoothpanzoom;
149 extern bool g_fog_overzoom;
150 extern double g_overzoom_emphasis_base;
151 extern bool g_oz_vector_scale;
152 extern double g_plus_minus_zoom_factor;
153 extern bool g_bShowOutlines;
154 extern bool g_bShowActiveRouteHighway;
155 extern bool g_bShowRouteTotal;
156 extern int g_nAWDefault;
159 extern int g_nframewin_x;
160 extern int g_nframewin_y;
161 extern int g_nframewin_posx;
162 extern int g_nframewin_posy;
163 extern bool g_bframemax;
165 extern wxString g_VisibleLayers;
166 extern wxString g_InvisibleLayers;
167 extern wxString g_VisiNameinLayers;
168 extern wxString g_InVisiNameinLayers;
170 extern wxArrayString *pMessageOnceArray;
173 extern bool g_bShowLiveETA;
174 extern double g_defaultBoatSpeed;
175 extern double g_defaultBoatSpeedUserUnit;
177 extern bool g_bUseOnlyConfirmedAISName;
178 extern int g_ScaledNumWeightSOG;
180 extern int g_S57_dialog_sx, g_S57_dialog_sy;
181 int g_S57_extradialog_sx, g_S57_extradialog_sy;
183 extern int g_iNavAidRadarRingsNumberVisible;
184 extern bool g_bNavAidRadarRingsShown;
185 extern float g_fNavAidRadarRingsStep;
186 extern int g_pNavAidRadarRingsStepUnits;
187 extern bool g_bWayPointPreventDragging;
188 extern bool g_bConfirmObjectDelete;
189 extern wxColour g_colourOwnshipRangeRingsColour;
191 extern bool g_bEnableZoomToCursor;
192 extern wxString g_toolbarConfig;
193 extern double g_TrackIntervalSeconds;
195 extern int g_nCacheLimit;
196 extern int g_memCacheLimit;
198 extern bool g_bGDAL_Debug;
199 extern bool g_bDebugCM93;
200 extern bool g_bDebugS57;
202 extern double g_ownship_predictor_minutes;
203 extern int g_cog_predictor_style;
204 extern wxString g_cog_predictor_color;
205 extern int g_cog_predictor_endmarker;
206 extern int g_cog_predictor_width;
207 extern int g_ownship_HDTpredictor_style;
208 extern wxString g_ownship_HDTpredictor_color;
209 extern int g_ownship_HDTpredictor_endmarker;
210 extern int g_ownship_HDTpredictor_width;
211 extern double g_ownship_HDTpredictor_miles;
213 extern bool g_own_ship_sog_cog_calc;
214 extern int g_own_ship_sog_cog_calc_damp_sec;
216 extern bool g_bShowMenuBar;
217 extern bool g_bShowCompassWin;
219 extern s52plib *ps52plib;
221 extern int g_cm93_zoom_factor;
222 extern bool g_b_legacy_input_filter_behaviour;
223 extern bool g_bShowDetailSlider;
224 extern int g_detailslider_dialog_x, g_detailslider_dialog_y;
226 extern bool g_bUseGreenShip;
228 extern int g_OwnShipIconType;
229 extern double g_n_ownship_length_meters;
230 extern double g_n_ownship_beam_meters;
231 extern double g_n_gps_antenna_offset_y;
232 extern double g_n_gps_antenna_offset_x;
233 extern int g_n_ownship_min_mm;
234 extern int g_maxzoomin;
236 extern bool g_bShowShipToActive;
237 extern int g_shipToActiveStyle;
238 extern int g_shipToActiveColor;
240 extern bool g_bPreserveScaleOnX;
241 extern bool g_bsimplifiedScalebar;
243 extern bool g_bUseGLL;
245 extern wxString g_locale;
246 extern wxString g_localeOverride;
248 extern bool g_bCourseUp;
249 extern bool g_bLookAhead;
250 extern int g_COGAvgSec;
251 extern bool g_bShowChartBar;
253 extern int g_MemFootMB;
255 extern wxString g_AW1GUID;
256 extern wxString g_AW2GUID;
257 extern int g_BSBImgDebug;
259 extern int n_NavMessageShown;
260 extern wxString g_config_version_string;
262 extern wxString g_CmdSoundString;
264 extern bool g_bDebugGPSD;
266 extern bool g_bfilter_cogsog;
267 extern int g_COGFilterSec;
268 extern int g_SOGFilterSec;
272 extern bool g_bQuiltEnable;
273 extern bool g_bFullScreenQuilt;
274 extern bool g_bQuiltStart;
276 extern int g_SkewCompUpdatePeriod;
278 extern int g_maintoolbar_x;
279 extern int g_maintoolbar_y;
280 extern long g_maintoolbar_orient;
282 extern int g_lastClientRectx;
283 extern int g_lastClientRecty;
284 extern int g_lastClientRectw;
285 extern int g_lastClientRecth;
287 extern bool g_bHighliteTracks;
288 extern int g_cog_predictor_width;
289 extern int g_ais_cog_predictor_width;
291 extern wxColour g_colourTrackLineColour;
292 extern wxString g_default_wp_icon;
294 extern ChartGroupArray *g_pGroupArray;
296 extern bool g_bDebugOGL;
297 extern int g_tcwin_scale;
298 extern wxString g_uploadConnection;
301 extern std::vector<std::string> TideCurrentDataSet;
302 extern wxString g_TCData_Dir;
304 extern bool g_bresponsive;
306 extern bool g_bGLexpert;
308 extern int g_SENC_LOD_pixels;
309 extern ArrayOfMmsiProperties g_MMSI_Props_Array;
311 extern int g_chart_zoom_modifier_raster;
312 extern int g_chart_zoom_modifier_vector;
314 extern bool g_bShowTrackPointTime;
316 extern bool g_bAdvanceRouteWaypointOnArrivalOnly;
317 extern double g_display_size_mm;
318 extern std::vector<size_t> g_config_display_size_mm;
319 extern bool g_config_display_size_manual;
321 extern bool g_benable_rotate;
322 extern bool g_bEmailCrashReport;
324 extern int g_default_font_size;
325 extern wxString g_default_font_facename;
327 extern bool g_bAutoHideToolbar;
328 extern int g_nAutoHideToolbar;
329 extern int g_GUIScaleFactor;
330 extern int g_ChartScaleFactor;
331 extern float g_MarkScaleFactorExp;
333 extern int g_ShipScaleFactor;
334 extern float g_ShipScaleFactorExp;
335 extern int g_ENCSoundingScaleFactor;
336 extern int g_ENCTextScaleFactor;
338 extern int g_iENCToolbarPosX;
339 extern int g_iENCToolbarPosY;
340 extern bool g_bRollover;
342 extern bool g_bSpaceDropMark;
344 extern bool g_bShowTide;
345 extern bool g_bShowCurrent;
347 extern wxString g_uiStyle;
348 extern bool g_btrackContinuous;
349 extern bool g_useMUI;
353 extern unsigned int g_canvasConfig;
354 extern wxString g_lastAppliedTemplateGUID;
356 extern int g_route_prop_x, g_route_prop_y;
357 extern int g_route_prop_sx, g_route_prop_sy;
358 extern int g_AndroidVersionCode;
360 extern wxString g_ObjQFileExt;
363 bool g_bLayersLoaded;
364 bool g_bShowMuiZoomButtons =
true;
366 double g_mouse_zoom_sensitivity;
367 int g_mouse_zoom_sensitivity_ui;
374 static const long long lNaN = 0xfff8000000000000;
375 #define NAN (*(double *)&lNaN)
380 wxString GetLayerName(
int id) {
381 wxString name(_T(
"unknown layer"));
382 if (
id <= 0)
return (name);
383 LayerList::iterator it;
385 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
387 if (lay->m_LayerID ==
id)
return (lay->m_LayerName);
393 void appendOSDirSlash(wxString *pString);
400 MyConfig::MyConfig(
const wxString &LocalFileName)
401 : wxFileConfig(_T (
""), _T (
""), LocalFileName, _T (
""),
402 wxCONFIG_USE_LOCAL_FILE) {
404 wxFileName config_file(LocalFileName);
406 config_file.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
407 m_sNavObjSetFile += _T (
"navobj.xml" );
408 m_sNavObjSetChangesFile = m_sNavObjSetFile + _T (
".changes" );
410 m_pNavObjectInputSet = NULL;
411 m_pNavObjectChangesSet = NavObjectChanges::getInstance();
414 MyConfig::~MyConfig() {
417 void MyConfig::CreateRotatingNavObjBackup() {
423 if(wxFileExists(m_sNavObjSetFile)) {
424 int month = wxDateTime::Now().GetMonth() + 1;
425 wxString fn = wxString::Format(_T(
"%s.m%d"), m_sNavObjSetFile.c_str(), month);
426 if (!wxFileExists(fn)) {
427 wxCopyFile(m_sNavObjSetFile, fn);
430 for (wxDateTime::wxDateTime_t i = 1; i <= month - 3; i++) {
431 fn = wxString::Format(_T(
"%s.m%d"), m_sNavObjSetFile.c_str(), i);
432 if (wxFileExists(fn)) {
436 for (wxDateTime::wxDateTime_t i = month + 1; i <= 12; i++) {
437 fn = wxString::Format(_T(
"%s.m%d"), m_sNavObjSetFile.c_str(), i);
438 if (wxFileExists(fn)) {
443 for (wxDateTime::wxDateTime_t i = month + 1; i <= 12 - month; i++) {
444 fn = wxString::Format(_T(
"%s.m%d"), m_sNavObjSetFile.c_str(), i);
445 if (wxFileExists(fn)) {
451 wxDateTime::wxDateTime_t week = wxDateTime::Now().GetWeekOfYear();
452 fn = wxString::Format(_T(
"%s.w%u"), m_sNavObjSetFile.c_str(), week);
453 if (!wxFileExists(fn)) {
454 wxCopyFile(m_sNavObjSetFile, fn);
457 for (wxDateTime::wxDateTime_t i = 1; i <= week - 4; i++) {
458 fn = wxString::Format(_T(
"%s.w%u"), m_sNavObjSetFile.c_str(), i);
459 if (wxFileExists(fn)) {
463 for (wxDateTime::wxDateTime_t i = week + 1; i <= 53; i++) {
464 fn = wxString::Format(_T(
"%s.w%u"), m_sNavObjSetFile.c_str(), i);
465 if (wxFileExists(fn)) {
470 for (wxDateTime::wxDateTime_t i = week + 1; i <= 53 - week; i++) {
471 fn = wxString::Format(_T(
"%s.w%u"), m_sNavObjSetFile.c_str(), i);
472 if (wxFileExists(fn)) {
483 if (g_navobjbackups > 0) {
485 wxString oldname = m_sNavObjSetFile;
486 wxString newname = wxString::Format(_T(
"%s.1"), m_sNavObjSetFile.c_str());
488 wxFileOffset s_diff = 1;
489 if (::wxFileExists(newname)) {
490 if (f.Open(oldname)) {
495 if (f.Open(newname)) {
496 s_diff -= f.Length();
502 for (
int i = g_navobjbackups - 1; i >= 1; i--) {
503 oldname = wxString::Format(_T(
"%s.%d"), m_sNavObjSetFile.c_str(), i);
505 wxString::Format(_T(
"%s.%d"), m_sNavObjSetFile.c_str(), i + 1);
506 if (wxFile::Exists(oldname)) wxCopyFile(oldname, newname);
509 wxULongLong size = wxFileName::GetSize(m_sNavObjSetFile);
510 if (wxFile::Exists(m_sNavObjSetFile) && size > 0) {
511 newname = wxString::Format(_T(
"%s.1"), m_sNavObjSetFile.c_str());
512 wxCopyFile(m_sNavObjSetFile, newname);
518 for (
int i = g_navobjbackups + 1; i <= 99; i++)
520 wxString::Format(_T(
"%s.%d"), m_sNavObjSetFile.c_str(), i)))
521 wxRemoveFile(wxString::Format(_T(
"%s.%d"), m_sNavObjSetFile.c_str(), i));
526 int MyConfig::LoadMyConfig() {
527 int display_width, display_height;
528 display_width = g_monitor_info[g_current_monitor].width;
529 display_height = g_monitor_info[g_current_monitor].height;
533 g_TalkerIdText = _T(
"EC");
534 g_maxWPNameLength = 6;
535 g_NMEAAPBPrecision = 3;
538 g_GLOptions.m_bUseAcceleratedPanning =
true;
539 g_GLOptions.m_GLPolygonSmoothing =
true;
540 g_GLOptions.m_GLLineSmoothing =
true;
541 g_GLOptions.m_iTextureDimension = 512;
542 g_GLOptions.m_iTextureMemorySize = 128;
544 g_GLOptions.m_iTextureMemorySize =
545 wxMax(128, g_GLOptions.m_iTextureMemorySize);
546 g_GLOptions.m_bTextureCompressionCaching =
547 g_GLOptions.m_bTextureCompression;
551 g_maintoolbar_orient = wxTB_HORIZONTAL;
552 g_iENCToolbarPosX = -1;
553 g_iENCToolbarPosY = -1;
554 g_restore_dbindex = -1;
555 g_ChartNotRenderScaleFactor = 1.5;
556 g_detailslider_dialog_x = 200L;
557 g_detailslider_dialog_y = 200L;
558 g_SENC_LOD_pixels = 2;
559 g_SkewCompUpdatePeriod = 10;
561 g_bShowStatusBar = 1;
562 g_bShowCompassWin = 1;
563 g_iSoundDeviceIndex = -1;
564 g_bFullscreenToolbar = 1;
565 g_bTransparentToolbar = 0;
567 g_bShowDepthUnits = 1;
568 g_bShowActiveRouteHighway = 1;
570 g_defaultBoatSpeed = 6.0;
571 g_ownship_predictor_minutes = 5;
572 g_cog_predictor_style = 105;
573 g_cog_predictor_color = _T(
"rgb(255,0,0)" );
574 g_cog_predictor_endmarker = 1;
575 g_ownship_HDTpredictor_style = 105;
576 g_ownship_HDTpredictor_color = _T(
"rgb(255,0,0)" );
577 g_ownship_HDTpredictor_endmarker = 1;
578 g_ownship_HDTpredictor_width = 0;
579 g_cog_predictor_width = 3;
580 g_ownship_HDTpredictor_miles = 1;
581 g_n_ownship_min_mm = 2;
582 g_own_ship_sog_cog_calc_damp_sec = 1;
583 g_bFullScreenQuilt = 1;
584 g_track_rotate_time_type = TIME_TYPE_COMPUTER;
585 g_bHighliteTracks = 1;
586 g_bPreserveScaleOnX = 1;
588 g_benableAISNameCache =
true;
589 g_n_arrival_circle_radius = 0.05;
590 g_plus_minus_zoom_factor = 2.0;
591 g_mouse_zoom_sensitivity = 1.5;
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");
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;
732 int 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))
752 g_CmdSoundString = wxString(OCPN_SOUND_CMD);
753 Read(_T (
"NavMessageShown" ), &n_NavMessageShown);
755 Read(_T (
"AndroidVersionCode" ), &g_AndroidVersionCode);
757 Read(_T (
"UIexpert" ), &g_bUIexpert);
759 Read(_T (
"UIStyle" ), &g_uiStyle);
761 Read(_T (
"NCacheLimit" ), &g_nCacheLimit);
763 Read(_T (
"InlandEcdis" ),
767 Read(_T(
"SpaceDropMark" ), &g_bSpaceDropMark);
770 Read(_T (
"MEMCacheLimit" ), &mem_limit);
772 g_memCacheLimit = mem_limit * 1024;
774 Read(_T (
"UseModernUI5" ), &g_useMUI);
776 Read(_T(
"NCPUCount" ), &g_nCPUCount);
778 Read(_T (
"DebugGDAL" ), &g_bGDAL_Debug);
779 Read(_T (
"DebugNMEA" ), &g_nNMEADebug);
780 Read(_T (
"AnchorWatchDefault" ), &g_nAWDefault);
781 Read(_T (
"AnchorWatchMax" ), &g_nAWMax);
782 Read(_T (
"GPSDogTimeout" ), &gps_watchdog_timeout_ticks);
783 Read(_T (
"DebugCM93" ), &g_bDebugCM93);
784 Read(_T (
"DebugS57" ),
786 Read(_T (
"DebugBSBImg" ), &g_BSBImgDebug);
787 Read(_T (
"DebugGPSD" ), &g_bDebugGPSD);
788 Read(_T (
"MaxZoomScale" ), &g_maxzoomin);
789 g_maxzoomin = wxMax(g_maxzoomin, 50);
791 Read(_T (
"DefaultFontSize"), &g_default_font_size);
792 Read(_T (
"DefaultFontFacename"), &g_default_font_facename);
794 Read(_T (
"UseGreenShipIcon" ), &g_bUseGreenShip);
796 Read(_T (
"AutoHideToolbar" ), &g_bAutoHideToolbar);
797 Read(_T (
"AutoHideToolbarSecs" ), &g_nAutoHideToolbar);
799 Read(_T (
"UseSimplifiedScalebar" ), &g_bsimplifiedScalebar);
800 Read(_T (
"ShowTide" ), &g_bShowTide);
801 Read(_T (
"ShowCurrent" ), &g_bShowCurrent);
804 Read(_T (
"DisplaySizeMM" ), &size_mm);
806 Read(_T (
"SelectionRadiusMM" ), &g_selection_radius_mm);
807 Read(_T (
"SelectionRadiusTouchMM" ), &g_selection_radius_touch_mm);
810 g_config_display_size_mm.clear();
811 wxStringTokenizer tokenizer(size_mm,
",");
812 while ( tokenizer.HasMoreTokens() )
814 wxString token = tokenizer.GetNextToken();
817 size = std::stoi(token.ToStdString());
818 }
catch (std::invalid_argument &e) {
821 if (size > 100 && size < 2000) {
822 g_config_display_size_mm.push_back(size);
824 g_config_display_size_mm.push_back(0);
827 Read(_T (
"DisplaySizeManual" ), &g_config_display_size_manual);
830 Read(_T (
"GUIScaleFactor" ), &g_GUIScaleFactor);
832 Read(_T (
"ChartObjectScaleFactor" ), &g_ChartScaleFactor);
833 Read(_T (
"ShipScaleFactor" ), &g_ShipScaleFactor);
834 Read(_T (
"ENCSoundingScaleFactor" ), &g_ENCSoundingScaleFactor);
835 Read(_T (
"ENCTextScaleFactor" ), &g_ENCTextScaleFactor);
836 Read(_T (
"ObjQueryAppendFilesExt" ), &g_ObjQFileExt);
839 Read(
"CatalogCustomURL", &g_catalog_custom_url);
840 Read(
"CatalogChannel", &g_catalog_channel);
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);
875 Read(_T(
"NMEAAPBPrecision" ), &g_NMEAAPBPrecision);
877 Read(_T(
"TalkerIdText" ), &g_TalkerIdText);
878 Read(_T(
"MaxWaypointNameLength" ), &g_maxWPNameLength);
879 Read(_T(
"MbtilesMaxLayers" ), &g_mbtilesMaxLayers);
881 Read(_T(
"ShowTrackPointTime" ), &g_bShowTrackPointTime,
true);
885 Read(_T (
"OpenGLExpert" ), &g_bGLexpert,
false);
886 Read(_T (
"UseAcceleratedPanning" ), &g_GLOptions.m_bUseAcceleratedPanning,
888 Read(_T (
"GPUTextureCompression" ), &g_GLOptions.m_bTextureCompression);
889 Read(_T (
"GPUTextureCompressionCaching" ),
890 &g_GLOptions.m_bTextureCompressionCaching);
891 Read(_T (
"PolygonSmoothing" ), &g_GLOptions.m_GLPolygonSmoothing);
892 Read(_T (
"LineSmoothing" ), &g_GLOptions.m_GLLineSmoothing);
893 Read(_T (
"GPUTextureDimension" ), &g_GLOptions.m_iTextureDimension);
894 Read(_T (
"GPUTextureMemSize" ), &g_GLOptions.m_iTextureMemorySize);
895 Read(_T (
"DebugOpenGL" ), &g_bDebugOGL);
896 Read(_T (
"OpenGL" ), &g_bopengl);
897 Read(_T (
"SoftwareGL" ), &g_bSoftwareGL);
901 Read(_T (
"SmoothPanZoom" ), &g_bsmoothpanzoom);
903 Read(_T (
"ToolbarX"), &g_maintoolbar_x);
904 Read(_T (
"ToolbarY" ), &g_maintoolbar_y);
905 Read(_T (
"ToolbarOrient" ), &g_maintoolbar_orient);
906 Read(_T (
"GlobalToolbarConfig" ), &g_toolbarConfig);
908 Read(_T (
"iENCToolbarX"), &g_iENCToolbarPosX);
909 Read(_T (
"iENCToolbarY"), &g_iENCToolbarPosY);
911 Read(_T (
"AnchorWatch1GUID" ), &g_AW1GUID);
912 Read(_T (
"AnchorWatch2GUID" ), &g_AW2GUID);
914 Read(_T (
"InitialStackIndex" ), &g_restore_stackindex);
915 Read(_T (
"InitialdBIndex" ), &g_restore_dbindex);
917 Read(_T (
"ChartNotRenderScaleFactor" ), &g_ChartNotRenderScaleFactor);
919 Read(_T (
"MobileTouch" ), &g_btouch);
924 g_bresponsive =
true;
926 g_bresponsive =
false;
929 Read(_T (
"EnableRolloverBlock" ), &g_bRollover);
931 Read(_T (
"ZoomDetailFactor" ), &g_chart_zoom_modifier_raster);
932 Read(_T (
"ZoomDetailFactorVector" ), &g_chart_zoom_modifier_vector);
933 Read(_T (
"PlusMinusZoomFactor" ), &g_plus_minus_zoom_factor, 2.0);
934 Read(
"MouseZoomSensitivity", &g_mouse_zoom_sensitivity, 1.3);
935 g_mouse_zoom_sensitivity_ui =
937 Read(_T (
"CM93DetailFactor" ), &g_cm93_zoom_factor);
939 Read(_T (
"CM93DetailZoomPosX" ), &g_detailslider_dialog_x);
940 Read(_T (
"CM93DetailZoomPosY" ), &g_detailslider_dialog_y);
941 Read(_T (
"ShowCM93DetailSlider" ), &g_bShowDetailSlider);
943 Read(_T (
"SENC_LOD_Pixels" ), &g_SENC_LOD_pixels);
945 Read(_T (
"SkewCompUpdatePeriod" ), &g_SkewCompUpdatePeriod);
947 Read(_T (
"SetSystemTime" ), &s_bSetSystemTime);
948 Read(_T (
"ShowStatusBar" ), &g_bShowStatusBar);
950 Read(_T (
"ShowMenuBar" ), &g_bShowMenuBar);
952 Read(_T (
"Fullscreen" ), &g_bFullscreen);
953 Read(_T (
"ShowCompassWindow" ), &g_bShowCompassWin);
954 Read(_T (
"ShowGrid" ), &g_bDisplayGrid);
955 Read(_T (
"PlayShipsBells" ), &g_bPlayShipsBells);
956 Read(_T (
"SoundDeviceIndex" ), &g_iSoundDeviceIndex);
957 Read(_T (
"FullscreenToolbar" ), &g_bFullscreenToolbar);
958 Read(_T (
"PermanentMOBIcon" ), &g_bPermanentMOBIcon);
959 Read(_T (
"ShowLayers" ), &g_bShowLayers);
960 Read(_T (
"ShowDepthUnits" ), &g_bShowDepthUnits);
961 Read(_T (
"AutoAnchorDrop" ), &g_bAutoAnchorMark);
962 Read(_T (
"ShowChartOutlines" ), &g_bShowOutlines);
963 Read(_T (
"ShowActiveRouteHighway" ), &g_bShowActiveRouteHighway);
964 Read(_T (
"ShowActiveRouteTotal" ), &g_bShowRouteTotal);
965 Read(_T (
"MostRecentGPSUploadConnection" ), &g_uploadConnection);
966 Read(_T (
"ShowChartBar" ), &g_bShowChartBar);
967 Read(_T (
"SDMMFormat" ),
971 Read(_T (
"DistanceFormat" ),
974 Read(_T (
"SpeedFormat" ),
976 Read(_T (
"WindSpeedFormat" ),
977 &g_iWindSpeedFormat);
978 Read(_T (
"TemperatureFormat"), &g_iTempFormat);
981 Read(_T (
"LiveETA" ), &g_bShowLiveETA);
982 Read(_T (
"DefaultBoatSpeed" ), &g_defaultBoatSpeed);
984 Read(_T (
"OwnshipCOGPredictorMinutes" ), &g_ownship_predictor_minutes);
985 Read(_T (
"OwnshipCOGPredictorStyle" ), &g_cog_predictor_style);
986 Read(_T (
"OwnshipCOGPredictorColor" ), &g_cog_predictor_color);
987 Read(_T (
"OwnshipCOGPredictorEndmarker" ), &g_cog_predictor_endmarker);
988 Read(_T (
"OwnshipCOGPredictorWidth" ), &g_cog_predictor_width);
989 Read(_T (
"OwnshipHDTPredictorStyle" ), &g_ownship_HDTpredictor_style);
990 Read(_T (
"OwnshipHDTPredictorColor" ), &g_ownship_HDTpredictor_color);
991 Read(_T (
"OwnshipHDTPredictorEndmarker" ), &g_ownship_HDTpredictor_endmarker);
992 Read(_T (
"OwnshipHDTPredictorWidth" ), &g_ownship_HDTpredictor_width);
993 Read(_T (
"OwnshipHDTPredictorMiles" ), &g_ownship_HDTpredictor_miles);
995 Read(_T (
"OwnShipIconType" ), &g_OwnShipIconType);
996 Read(_T (
"OwnShipLength" ), &g_n_ownship_length_meters);
997 Read(_T (
"OwnShipWidth" ), &g_n_ownship_beam_meters);
998 Read(_T (
"OwnShipGPSOffsetX" ), &g_n_gps_antenna_offset_x);
999 Read(_T (
"OwnShipGPSOffsetY" ), &g_n_gps_antenna_offset_y);
1000 Read(_T (
"OwnShipMinSize" ), &g_n_ownship_min_mm);
1001 Read(_T (
"OwnShipSogCogCalc" ), &g_own_ship_sog_cog_calc);
1002 Read(_T (
"OwnShipSogCogCalcDampSec"), &g_own_ship_sog_cog_calc_damp_sec);
1003 Read(_T (
"ShowDirectRouteLine"), &g_bShowShipToActive);
1004 Read(_T (
"DirectRouteLineStyle"), &g_shipToActiveStyle);
1005 Read(_T(
"DirectRouteLineColor" ), &g_shipToActiveColor);
1008 Read(_T (
"RouteArrivalCircleRadius" ), &racr);
1009 if (racr.Len()) racr.ToDouble(&g_n_arrival_circle_radius);
1011 Read(_T (
"FullScreenQuilt" ), &g_bFullScreenQuilt);
1013 Read(_T (
"StartWithTrackActive" ), &g_bTrackCarryOver);
1014 Read(_T (
"AutomaticDailyTracks" ), &g_bTrackDaily);
1015 Read(_T (
"TrackRotateAt" ), &g_track_rotate_time);
1016 Read(_T (
"TrackRotateTimeType" ), &g_track_rotate_time_type);
1017 Read(_T (
"HighlightTracks" ), &g_bHighliteTracks);
1020 Read(_T (
"PlanSpeed" ), &stps);
1021 if (!stps.IsEmpty()) stps.ToDouble(&g_PlanSpeed);
1023 Read(_T (
"VisibleLayers" ), &g_VisibleLayers);
1024 Read(_T (
"InvisibleLayers" ), &g_InvisibleLayers);
1025 Read(_T (
"VisNameInLayers" ), &g_VisiNameinLayers);
1026 Read(_T (
"InvisNameInLayers" ), &g_InVisiNameinLayers);
1028 Read(_T (
"PreserveScaleOnX" ), &g_bPreserveScaleOnX);
1030 Read(_T (
"ShowMUIZoomButtons" ), &g_bShowMuiZoomButtons);
1032 Read(_T (
"Locale" ), &g_locale);
1033 Read(_T (
"LocaleOverride" ), &g_localeOverride);
1036 Read(_T (
"KeepNavobjBackups" ), &g_navobjbackups);
1038 NMEALogWindow::GetInstance().SetSize(Read(_T(
"NMEALogWindowSizeX"), 600L),
1039 Read(_T(
"NMEALogWindowSizeY"), 400L));
1040 NMEALogWindow::GetInstance().SetPos(Read(_T(
"NMEALogWindowPosX"), 10L),
1041 Read(_T(
"NMEALogWindowPosY"), 10L));
1042 NMEALogWindow::GetInstance().CheckPos(display_width, display_height);
1046 Read(_T (
"LegacyInputCOMPortFilterBehaviour" ),
1047 &g_b_legacy_input_filter_behaviour);
1050 Read(_T(
"AdvanceRouteWaypointOnArrivalOnly" ),
1051 &g_bAdvanceRouteWaypointOnArrivalOnly);
1053 Read(_T (
"EnableRotateKeys" ), &g_benable_rotate);
1054 Read(_T (
"EmailCrashReport" ), &g_bEmailCrashReport);
1056 g_benableAISNameCache =
true;
1057 Read(_T (
"EnableAISNameCache" ), &g_benableAISNameCache);
1059 Read(_T (
"EnableUDPNullHeader" ), &g_benableUDPNullHeader);
1061 SetPath(_T (
"/Settings/GlobalState" ));
1063 Read(_T (
"FrameWinX" ), &g_nframewin_x);
1064 Read(_T (
"FrameWinY" ), &g_nframewin_y);
1065 Read(_T (
"FrameWinPosX" ), &g_nframewin_posx);
1066 Read(_T (
"FrameWinPosY" ), &g_nframewin_posy);
1067 Read(_T (
"FrameMax" ), &g_bframemax);
1069 Read(_T (
"ClientPosX" ), &g_lastClientRectx);
1070 Read(_T (
"ClientPosY" ), &g_lastClientRecty);
1071 Read(_T (
"ClientSzX" ), &g_lastClientRectw);
1072 Read(_T (
"ClientSzY" ), &g_lastClientRecth);
1074 Read(_T(
"RoutePropSizeX" ), &g_route_prop_sx);
1075 Read(_T(
"RoutePropSizeY" ), &g_route_prop_sy);
1076 Read(_T(
"RoutePropPosX" ), &g_route_prop_x);
1077 Read(_T(
"RoutePropPosY" ), &g_route_prop_y);
1080 Read(_T (
"S52_DEPTH_UNIT_SHOW" ), &read_int);
1081 if (read_int >= 0) {
1082 read_int = wxMax(read_int, 0);
1083 read_int = wxMin(read_int, 2);
1084 g_nDepthUnitDisplay = read_int;
1088 SetPath(_T (
"/Settings/Audio" ));
1091 wxString sound_dir = g_Platform->GetSharedDataDir();
1092 sound_dir.Append(_T(
"sounds"));
1093 sound_dir.Append(wxFileName::GetPathSeparator());
1095 g_AIS_sound_file = sound_dir + _T(
"beep_ssl.wav");
1096 g_DSC_sound_file = sound_dir + _T(
"phonering1.wav");
1097 g_SART_sound_file = sound_dir + _T(
"beep3.wav");
1098 g_anchorwatch_sound_file = sound_dir + _T(
"beep1.wav");
1100 Read(_T (
"AISAlertSoundFile" ), &g_AIS_sound_file);
1101 Read(_T (
"DSCAlertSoundFile" ), &g_DSC_sound_file);
1102 Read(_T (
"SARTAlertSoundFile" ), &g_SART_sound_file);
1103 Read(_T (
"AnchorAlarmSoundFile" ), &g_anchorwatch_sound_file);
1105 Read(_T (
"bAIS_GCPA_AlertAudio" ), &g_bAIS_GCPA_Alert_Audio);
1106 Read(_T (
"bAIS_SART_AlertAudio" ), &g_bAIS_SART_Alert_Audio);
1107 Read(_T (
"bAIS_DSC_AlertAudio" ), &g_bAIS_DSC_Alert_Audio);
1108 Read(_T (
"bAnchorAlertAudio" ), &g_bAnchor_Alert_Audio);
1112 SetPath(_T (
"/Settings/AIS" ));
1114 g_bUseOnlyConfirmedAISName =
false;
1115 Read(_T (
"UseOnlyConfirmedAISName" ), &g_bUseOnlyConfirmedAISName);
1117 Read(_T (
"bNoCPAMax" ), &g_bCPAMax);
1119 Read(_T (
"NoCPAMaxNMi" ), &s);
1120 s.ToDouble(&g_CPAMax_NM);
1122 Read(_T (
"bCPAWarn" ), &g_bCPAWarn);
1124 Read(_T (
"CPAWarnNMi" ), &s);
1125 s.ToDouble(&g_CPAWarn_NM);
1127 Read(_T (
"bTCPAMax" ), &g_bTCPA_Max);
1129 Read(_T (
"TCPAMaxMinutes" ), &s);
1130 s.ToDouble(&g_TCPA_Max);
1132 Read(_T (
"bMarkLostTargets" ), &g_bMarkLost);
1134 Read(_T (
"MarkLost_Minutes" ), &s);
1135 s.ToDouble(&g_MarkLost_Mins);
1137 Read(_T (
"bRemoveLostTargets" ), &g_bRemoveLost);
1139 Read(_T (
"RemoveLost_Minutes" ), &s);
1140 s.ToDouble(&g_RemoveLost_Mins);
1142 Read(_T (
"bShowCOGArrows" ), &g_bShowCOG);
1144 Read(_T (
"bSyncCogPredictors"), &g_bSyncCogPredictors);
1146 Read(_T (
"CogArrowMinutes" ), &s);
1147 s.ToDouble(&g_ShowCOG_Mins);
1149 Read(_T (
"bShowTargetTracks" ), &g_bAISShowTracks);
1151 if (Read(_T (
"TargetTracksLimit" ), &s)) {
1152 s.ToDouble(&g_AISShowTracks_Limit);
1153 g_AISShowTracks_Limit = wxMax(300.0, g_AISShowTracks_Limit);
1155 if (Read(_T (
"TargetTracksMinutes" ), &s)) {
1156 s.ToDouble(&g_AISShowTracks_Mins);
1157 g_AISShowTracks_Mins = wxMax(1.0, g_AISShowTracks_Mins);
1158 g_AISShowTracks_Mins = wxMin(g_AISShowTracks_Limit, g_AISShowTracks_Mins);
1161 Read(_T (
"bHideMooredTargets" ), &g_bHideMoored);
1162 if (Read(_T (
"MooredTargetMaxSpeedKnots" ), &s))
1163 s.ToDouble(&g_ShowMoored_Kts);
1165 g_SOGminCOG_kts = 0.2;
1166 if (Read(_T (
"SOGMinimumForCOGDisplay" ), &s))
1167 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 wxString connectionconfigs;
1262 Read(_T(
"DataConnections" ), &connectionconfigs);
1263 if (!connectionconfigs.IsEmpty()) {
1264 wxArrayString confs = wxStringTokenize(connectionconfigs, _T(
"|"));
1265 TheConnectionParams()->Clear();
1266 for (
size_t i = 0; i < confs.Count(); i++) {
1269 wxLogMessage(_T(
"Skipped invalid DataStream config"));
1273 TheConnectionParams()->Add(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(
':'));
1389 str = FontMgr::GetFontConfigKey(oldKey);
1392 if (pval.IsEmpty() || pval.StartsWith(_T(
":"))) {
1393 deleteList.Add(str);
1395 FontMgr::Get().LoadFontNative(&str, &pval);
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);
1416 if (std::find(TideCurrentDataSet.begin(), TideCurrentDataSet.end(), val.ToStdString()) == TideCurrentDataSet.end()) {
1417 TideCurrentDataSet.push_back(val.ToStdString());
1419 bCont = GetNextEntry(str, dummy);
1424 LoadConfigGroups(g_pGroupArray);
1429 SetPath(_T (
"/Settings/Others" ));
1432 Read(_T (
"RadarRingsNumberVisible" ), &val);
1433 if (val.Length() > 0) g_iNavAidRadarRingsNumberVisible = atoi(val.mb_str());
1434 g_bNavAidRadarRingsShown = g_iNavAidRadarRingsNumberVisible > 0;
1436 Read(_T (
"RadarRingsStep" ), &val);
1437 if (val.Length() > 0) g_fNavAidRadarRingsStep = atof(val.mb_str());
1439 Read(_T (
"RadarRingsStepUnits" ), &g_pNavAidRadarRingsStepUnits);
1441 wxString l_wxsOwnshipRangeRingsColour;
1442 Read(_T (
"RadarRingsColour" ), &l_wxsOwnshipRangeRingsColour);
1443 if (l_wxsOwnshipRangeRingsColour.Length())
1444 g_colourOwnshipRangeRingsColour.Set(l_wxsOwnshipRangeRingsColour);
1447 Read(_T (
"WaypointRangeRingsNumber" ), &val);
1448 if (val.Length() > 0) g_iWaypointRangeRingsNumber = atoi(val.mb_str());
1450 Read(_T (
"WaypointRangeRingsStep" ), &val);
1451 if (val.Length() > 0) g_fWaypointRangeRingsStep = atof(val.mb_str());
1453 Read(_T (
"WaypointRangeRingsStepUnits" ), &g_iWaypointRangeRingsStepUnits);
1455 wxString l_wxsWaypointRangeRingsColour;
1456 Read(_T(
"WaypointRangeRingsColour" ), &l_wxsWaypointRangeRingsColour);
1457 g_colourWaypointRangeRingsColour.Set(l_wxsWaypointRangeRingsColour);
1459 if (!Read(_T(
"WaypointUseScaMin"), &g_bUseWptScaMin)) g_bUseWptScaMin =
false;
1460 if (!Read(_T(
"WaypointScaMinValue"), &g_iWpt_ScaMin))
1461 g_iWpt_ScaMin = 2147483646;
1462 if (!Read(_T(
"WaypointUseScaMinOverrule"), &g_bOverruleScaMin))
1463 g_bOverruleScaMin =
false;
1464 if (!Read(_T(
"WaypointsShowName"), &g_bShowWptName)) g_bShowWptName =
true;
1465 if (!Read(_T(
"UserIconsFirst"), &g_bUserIconsFirst)) g_bUserIconsFirst =
true;
1468 bool b300RadarRings =
true;
1469 if (Read(_T (
"ShowRadarRings" ), &b300RadarRings)) {
1470 if (!b300RadarRings) g_iNavAidRadarRingsNumberVisible = 0;
1473 Read(_T (
"ConfirmObjectDeletion" ), &g_bConfirmObjectDelete);
1476 g_bWayPointPreventDragging =
false;
1477 Read(_T (
"WaypointPreventDragging" ), &g_bWayPointPreventDragging);
1479 g_bEnableZoomToCursor =
false;
1480 Read(_T (
"EnableZoomToCursor" ), &g_bEnableZoomToCursor);
1483 Read(_T (
"TrackIntervalSeconds" ), &val);
1484 if (val.Length() > 0) {
1485 double tval = atof(val.mb_str());
1486 if (tval >= 2.) g_TrackIntervalSeconds = tval;
1490 Read(_T (
"TrackDeltaDistance" ), &val);
1491 if (val.Length() > 0) {
1492 double tval = atof(val.mb_str());
1493 if (tval >= 0.05) g_TrackDeltaDistance = tval;
1496 Read(_T (
"TrackPrecision" ), &g_nTrackPrecision);
1498 Read(_T (
"NavObjectFileName" ), m_sNavObjSetFile);
1500 Read(_T (
"RouteLineWidth" ), &g_route_line_width);
1501 Read(_T (
"TrackLineWidth" ), &g_track_line_width);
1503 wxString l_wxsTrackLineColour;
1504 if (Read(_T(
"TrackLineColour" ), &l_wxsTrackLineColour))
1505 g_colourTrackLineColour.Set(l_wxsTrackLineColour);
1507 Read(_T (
"TideCurrentWindowScale" ), &g_tcwin_scale);
1508 Read(_T (
"DefaultWPIcon" ), &g_default_wp_icon);
1509 Read(_T (
"DefaultRPIcon" ), &g_default_routepoint_icon);
1511 SetPath(_T (
"/MmsiProperties" ));
1512 int iPMax = GetNumberOfEntries();
1514 g_MMSI_Props_Array.Empty();
1517 bool bCont = pConfig->GetFirstEntry(str, dummy);
1519 pConfig->Read(str, &val);
1522 g_MMSI_Props_Array.Add(pProps);
1524 bCont = pConfig->GetNextEntry(str, dummy);
1531 void MyConfig::LoadS57Config() {
1532 if (!ps52plib)
return;
1536 SetPath(_T (
"/Settings/GlobalState" ));
1538 Read(_T (
"bShowS57Text" ), &read_int, 1);
1539 ps52plib->SetShowS57Text(!(read_int == 0));
1541 Read(_T (
"bShowS57ImportantTextOnly" ), &read_int, 0);
1542 ps52plib->SetShowS57ImportantTextOnly(!(read_int == 0));
1544 Read(_T (
"bShowLightDescription" ), &read_int, 0);
1545 ps52plib->SetShowLdisText(!(read_int == 0));
1547 Read(_T (
"bExtendLightSectors" ), &read_int, 0);
1548 ps52plib->SetExtendLightSectors(!(read_int == 0));
1550 Read(_T (
"nDisplayCategory" ), &read_int, (
enum _DisCat)STANDARD);
1551 ps52plib->SetDisplayCategory((
enum _DisCat)read_int);
1553 Read(_T (
"nSymbolStyle" ), &read_int, (
enum _LUPname)PAPER_CHART);
1554 ps52plib->m_nSymbolStyle = (LUPname)read_int;
1556 Read(_T (
"nBoundaryStyle" ), &read_int, PLAIN_BOUNDARIES);
1557 ps52plib->m_nBoundaryStyle = (LUPname)read_int;
1559 Read(_T (
"bShowSoundg" ), &read_int, 1);
1560 ps52plib->m_bShowSoundg = !(read_int == 0);
1562 Read(_T (
"bShowMeta" ), &read_int, 0);
1563 ps52plib->m_bShowMeta = !(read_int == 0);
1565 Read(_T (
"bUseSCAMIN" ), &read_int, 1);
1566 ps52plib->m_bUseSCAMIN = !(read_int == 0);
1568 Read(_T (
"bUseSUPER_SCAMIN" ), &read_int, 0);
1569 ps52plib->m_bUseSUPER_SCAMIN = !(read_int == 0);
1571 Read(_T (
"bShowAtonText" ), &read_int, 1);
1572 ps52plib->m_bShowAtonText = !(read_int == 0);
1574 Read(_T (
"bDeClutterText" ), &read_int, 0);
1575 ps52plib->m_bDeClutterText = !(read_int == 0);
1577 Read(_T (
"bShowNationalText" ), &read_int, 0);
1578 ps52plib->m_bShowNationalTexts = !(read_int == 0);
1580 Read(_T (
"ENCSoundingScaleFactor" ), &read_int, 0);
1581 ps52plib->m_nSoundingFactor = read_int;
1583 Read(_T (
"ENCTextScaleFactor" ), &read_int, 0);
1584 ps52plib->m_nTextFactor = read_int;
1586 if (Read(_T (
"S52_MAR_SAFETY_CONTOUR" ), &dval, 3.0)) {
1587 S52_setMarinerParam(S52_MAR_SAFETY_CONTOUR, dval);
1588 S52_setMarinerParam(S52_MAR_SAFETY_DEPTH,
1592 if (Read(_T (
"S52_MAR_SHALLOW_CONTOUR" ), &dval, 2.0))
1593 S52_setMarinerParam(S52_MAR_SHALLOW_CONTOUR, dval);
1595 if (Read(_T (
"S52_MAR_DEEP_CONTOUR" ), &dval, 6.0))
1596 S52_setMarinerParam(S52_MAR_DEEP_CONTOUR, dval);
1598 if (Read(_T (
"S52_MAR_TWO_SHADES" ), &dval, 0.0))
1599 S52_setMarinerParam(S52_MAR_TWO_SHADES, dval);
1601 ps52plib->UpdateMarinerParams();
1603 SetPath(_T (
"/Settings/GlobalState" ));
1604 Read(_T (
"S52_DEPTH_UNIT_SHOW" ), &read_int, 1);
1605 read_int = wxMax(read_int, 0);
1606 read_int = wxMin(read_int, 2);
1607 ps52plib->m_nDepthUnitDisplay = read_int;
1608 g_nDepthUnitDisplay = read_int;
1614 SetPath(_T (
"/Settings/ObjectFilter" ));
1616 int iOBJMax = GetNumberOfEntries();
1624 bool bCont = pConfig->GetFirstEntry(str, dummy);
1626 pConfig->Read(str, &val);
1628 bool bNeedNew =
true;
1630 if (str.StartsWith(_T (
"viz" ), &sObj)) {
1631 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
1633 pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
1634 if (!strncmp(pOLE->OBJLName, sObj.mb_str(), 6)) {
1642 pOLE = (OBJLElement *)calloc(
sizeof(OBJLElement), 1);
1643 memcpy(pOLE->OBJLName, sObj.mb_str(), OBJL_NAME_LEN);
1646 ps52plib->pOBJLArray->Add((
void *)pOLE);
1649 bCont = pConfig->GetNextEntry(str, dummy);
1655 static bool ReloadPendingChanges(
const wxString& changes_path) {
1656 wxULongLong size = wxFileName::GetSize(changes_path);
1661 auto pNavObjectChangesSet = NavObjectChanges::getTempInstance();
1662 pNavObjectChangesSet->Init(changes_path);
1663 auto res = pNavObjectChangesSet->load_file(changes_path.fn_str());
1668 if (::wxFileExists(changes_path))
1669 ::wxRemoveFile(changes_path);
1671 if (size == 0 || res.status != pugi::xml_parse_status::status_ok) {
1672 wxLogMessage(changes_path +
" seems corrupted, not applying it.");
1673 pNavObjectChangesSet->reset();
1677 wxLogMessage(_T(
"Applying NavObjChanges"));
1678 pNavObjectChangesSet->ApplyChanges();
1682 wxString MyConfig::FindNewestUsableBackup()
const {
1683 wxString newest_backup;
1684 pugi::xml_document doc;
1685 for (
int i = 1; i <= g_navobjbackups; i++) {
1686 wxString backup = m_sNavObjSetFile +
"." + wxString::Format(
"%d", i);
1687 if (wxFileExists(backup) && wxFileName::GetSize(backup) > 461 && doc.load_file(backup.fn_str()).status == pugi::xml_parse_status::status_ok) {
1688 newest_backup = backup;
1692 return newest_backup;
1695 void MyConfig::LoadNavObjects() {
1697 wxLogMessage(_T(
"Loading navobjects from navobj.xml"));
1699 if (NULL == m_pNavObjectInputSet)
1703 wxString newest_backup;
1704 if (::wxFileExists(m_sNavObjSetFile)) {
1705 if (wxFileName::GetSize(m_sNavObjSetFile) < 461) {
1706 wxLogMessage(
"Navobjects file exists, but seems truncated!");
1707 newest_backup = FindNewestUsableBackup();
1708 if (wxFileExists(newest_backup)) {
1709 wxLogMessage(
"We do have a backup " + newest_backup +
" that looks healthy and will use it.");
1710 wxCopyFile(newest_backup, m_sNavObjSetFile,
true);
1714 newest_backup = FindNewestUsableBackup();
1715 if (wxFileExists(newest_backup)) {
1716 wxLogMessage(
"We do have a backup " + newest_backup +
" that looks healthy and will use it.");
1717 wxCopyFile(newest_backup, m_sNavObjSetFile,
true);
1719 wxLogMessage(
"No navobjects.xml file or usable backup exist, will create a new one.");
1722 bool success =
false;
1724 if(::wxFileExists(m_sNavObjSetFile) && m_pNavObjectInputSet->load_file(m_sNavObjSetFile.fn_str()).status == pugi::xml_parse_status::status_ok) {
1725 CreateRotatingNavObjBackup();
1726 success = m_pNavObjectInputSet->LoadAllGPXObjects(
false, wpt_dups);
1729 wxString corrupted_file = m_sNavObjSetFile + wxDateTime::Now().Format(
".corrupted.%Y-%m-%d-%H-%M-%S");
1730 wxRenameFile(m_sNavObjSetFile, corrupted_file,
true);
1731 wxLogMessage(
"Error while loading navobjects from " + m_sNavObjSetFile +
", the corrupted file was renamed to " + corrupted_file);
1733 if (newest_backup.IsEmpty()) {
1734 newest_backup = FindNewestUsableBackup();
1736 m_pNavObjectInputSet->reset();
1737 if (wxFileExists(newest_backup) && m_pNavObjectInputSet->load_file(newest_backup.fn_str()).status == pugi::xml_parse_status::status_ok) {
1738 success = m_pNavObjectInputSet->LoadAllGPXObjects(
false, wpt_dups);
1739 wxLogMessage(
"We do have a healthy backup " + newest_backup +
" and did load it.");
1741 wxLogMessage(
"No usable backup found, a new navobj.xml file will be created.");
1742 m_pNavObjectInputSet->reset();
1746 wxLogMessage(_T(
"Done loading navobjects, %d duplicate waypoints ignored"),
1749 wxLogMessage(_T(
"Failed to load navobjects, creating a new navobj.xml file."));
1751 delete m_pNavObjectInputSet;
1753 if (::wxFileExists(m_sNavObjSetChangesFile)) {
1754 if (ReloadPendingChanges(m_sNavObjSetChangesFile)) {
1758 m_pNavObjectChangesSet->Init(m_sNavObjSetChangesFile);
1761 active_route.Notify();
1764 bool MyConfig::LoadLayers(wxString &path) {
1765 wxArrayString file_array;
1769 if (dir.IsOpened()) {
1771 bool cont = dir.GetFirst(&filename);
1774 filename.Prepend(wxFileName::GetPathSeparator());
1775 filename.Prepend(path);
1776 wxFileName f(filename);
1778 if (f.GetExt().IsSameAs(wxT(
"gpx")))
1779 file_array.Add(filename);
1781 if (wxDir::Exists(filename)) {
1782 wxDir dir(filename);
1783 if (dir.IsOpened()) {
1784 nfiles = dir.GetAllFiles(filename, &file_array,
1790 if (file_array.GetCount()) {
1792 l->m_LayerID = ++g_LayerIdx;
1793 l->m_LayerFileName = file_array[0];
1794 if (file_array.GetCount() <= 1)
1795 wxFileName::SplitPath(file_array[0], NULL, NULL, &(l->m_LayerName),
1798 wxFileName::SplitPath(filename, NULL, NULL, &(l->m_LayerName), NULL,
1801 bool bLayerViz = g_bShowLayers;
1803 if (g_VisibleLayers.Contains(l->m_LayerName)) bLayerViz =
true;
1804 if (g_InvisibleLayers.Contains(l->m_LayerName)) bLayerViz =
false;
1806 l->m_bHasVisibleNames = wxCHK_UNDETERMINED;
1807 if (g_VisiNameinLayers.Contains(l->m_LayerName))
1808 l->m_bHasVisibleNames = wxCHK_CHECKED;
1809 if (g_InVisiNameinLayers.Contains(l->m_LayerName))
1810 l->m_bHasVisibleNames = wxCHK_UNCHECKED;
1812 l->m_bIsVisibleOnChart = bLayerViz;
1815 laymsg.Printf(wxT(
"New layer %d: %s"), l->m_LayerID,
1816 l->m_LayerName.c_str());
1817 wxLogMessage(laymsg);
1819 pLayerList->Insert(l);
1823 for (
unsigned int i = 0; i < file_array.GetCount(); i++) {
1824 wxString file_path = file_array[i];
1826 if (::wxFileExists(file_path)) {
1828 if (pSet->load_file(file_path.fn_str()).status != pugi::xml_parse_status::status_ok) {
1829 wxLogMessage(
"Error loading GPX file " + file_path);
1832 long nItems = pSet->LoadAllGPXObjectsAsLayer(
1833 l->m_LayerID, bLayerViz, l->m_bHasVisibleNames);
1834 l->m_NoOfItems += nItems;
1835 l->m_LayerType = _(
"Persistent");
1838 objmsg.Printf(wxT(
"Loaded GPX file %s with %ld items."),
1839 file_path.c_str(), nItems);
1840 wxLogMessage(objmsg);
1847 cont = dir.GetNext(&filename);
1850 g_bLayersLoaded =
true;
1855 bool MyConfig::LoadChartDirArray(ArrayOfCDI &ChartDirArray) {
1857 SetPath(_T (
"/ChartDirectories" ));
1858 int iDirMax = GetNumberOfEntries();
1860 ChartDirArray.Empty();
1863 int nAdjustChartDirs = 0;
1865 bool bCont = pConfig->GetFirstEntry(str, dummy);
1867 pConfig->Read(str, &val);
1869 wxString dirname(val);
1870 if (!dirname.IsEmpty()) {
1885 if (dirname.Find(_T (
"SampleCharts" )) ==
1890 pConfig->DeleteEntry(str);
1891 wxString new_dir = dirname.Mid(dirname.Find(_T (
"SampleCharts" )));
1892 new_dir.Prepend(g_Platform->GetSharedDataDir());
1897 cdi.fullpath = dirname.BeforeFirst(
'^');
1898 cdi.magic_number = dirname.AfterFirst(
'^');
1900 ChartDirArray.Add(cdi);
1904 bCont = pConfig->GetNextEntry(str, dummy);
1907 if (nAdjustChartDirs) pConfig->UpdateChartDirs(ChartDirArray);
1913 void MyConfig::AddNewRoute(
Route *r) {
1914 m_pNavObjectChangesSet->AddNewRoute(r);
1917 void MyConfig::UpdateRoute(
Route *r) {
1918 m_pNavObjectChangesSet->UpdateRoute(r);
1921 void MyConfig::DeleteConfigRoute(
Route *pr) {
1922 m_pNavObjectChangesSet->DeleteConfigRoute(pr);
1925 void MyConfig::AddNewTrack(
Track *pt) {
1926 m_pNavObjectChangesSet->AddNewTrack(pt);
1929 void MyConfig::UpdateTrack(
Track *pt) {
1930 m_pNavObjectChangesSet->UpdateTrack(pt);
1933 void MyConfig::DeleteConfigTrack(
Track *pt) {
1934 m_pNavObjectChangesSet->DeleteConfigTrack(pt);
1937 void MyConfig::AddNewWayPoint(
RoutePoint *pWP,
int crm) {
1938 m_pNavObjectChangesSet->AddNewWayPoint(pWP);
1941 void MyConfig::UpdateWayPoint(
RoutePoint *pWP) {
1942 m_pNavObjectChangesSet->UpdateWayPoint(pWP);
1945 void MyConfig::DeleteWayPoint(
RoutePoint *pWP) {
1946 m_pNavObjectChangesSet->DeleteWayPoint(pWP);
1949 void MyConfig::AddNewTrackPoint(
TrackPoint *pWP,
1950 const wxString &parent_GUID) {
1951 m_pNavObjectChangesSet->AddNewTrackPoint(pWP, parent_GUID);
1954 bool MyConfig::UpdateChartDirs(ArrayOfCDI &dir_array) {
1958 SetPath(_T (
"/ChartDirectories" ));
1959 int iDirMax = GetNumberOfEntries();
1963 for (
int i = 0; i < iDirMax; i++) {
1964 GetFirstEntry(key, dummy);
1965 DeleteEntry(key,
false);
1969 iDirMax = dir_array.GetCount();
1971 for (
int iDir = 0; iDir < iDirMax; iDir++) {
1974 wxString dirn = cdi.fullpath;
1975 dirn.Append(_T(
"^"));
1976 dirn.Append(cdi.magic_number);
1978 str_buf.Printf(_T (
"ChartDir%d" ), iDir + 1);
1980 Write(str_buf, dirn);
1992 void MyConfig::CreateConfigGroups(ChartGroupArray *pGroupArray) {
1993 if (!pGroupArray)
return;
1995 SetPath(_T (
"/Groups" ));
1996 Write(_T (
"GroupCount" ), (
int)pGroupArray->GetCount());
1998 for (
unsigned int i = 0; i < pGroupArray->GetCount(); i++) {
2001 s.Printf(_T(
"Group%d"), i + 1);
2002 s.Prepend(_T (
"/Groups/" ));
2005 Write(_T (
"GroupName" ), pGroup->m_group_name);
2006 Write(_T (
"GroupItemCount" ), (
int)pGroup->m_element_array.size());
2008 for (
unsigned int j = 0; j < pGroup->m_element_array.size(); j++) {
2010 sg.Printf(_T(
"Group%d/Item%d"), i + 1, j);
2011 sg.Prepend(_T (
"/Groups/" ));
2013 Write(_T (
"IncludeItem" ), pGroup->m_element_array[j].m_element_name);
2016 wxArrayString u = pGroup->m_element_array[j].m_missing_name_array;
2018 for (
unsigned int k = 0; k < u.GetCount(); k++) {
2022 Write(_T (
"ExcludeItems" ), t);
2028 void MyConfig::DestroyConfigGroups(
void) {
2029 DeleteGroup(_T (
"/Groups" ));
2032 void MyConfig::LoadConfigGroups(ChartGroupArray *pGroupArray) {
2033 SetPath(_T (
"/Groups" ));
2034 unsigned int group_count;
2035 Read(_T (
"GroupCount" ), (
int *)&group_count, 0);
2037 for (
unsigned int i = 0; i < group_count; i++) {
2040 s.Printf(_T(
"Group%d"), i + 1);
2041 s.Prepend(_T (
"/Groups/" ));
2045 Read(_T (
"GroupName" ), &t);
2046 pGroup->m_group_name = t;
2048 unsigned int item_count;
2049 Read(_T (
"GroupItemCount" ), (
int *)&item_count);
2050 for (
unsigned int j = 0; j < item_count; j++) {
2052 sg.Printf(_T(
"Group%d/Item%d"), i + 1, j);
2053 sg.Prepend(_T (
"/Groups/" ));
2057 Read(_T (
"IncludeItem" ), &v);
2061 if (Read(_T (
"ExcludeItems" ), &u)) {
2063 wxStringTokenizer tk(u, _T(
";"));
2064 while (tk.HasMoreTokens()) {
2065 wxString token = tk.GetNextToken();
2066 pelement.m_missing_name_array.Add(token);
2070 pGroup->m_element_array.push_back(std::move(pelement));
2072 pGroupArray->Add(pGroup);
2076 void MyConfig::LoadCanvasConfigs(
bool bApplyAsTemplate) {
2079 auto &config_array = ConfigMgr::Get().GetCanvasConfigArray();
2081 SetPath(_T (
"/Canvas" ));
2084 if (!HasEntry(_T (
"CanvasConfig" ))) {
2086 pcc->LoadFromLegacyConfig(
this);
2087 config_array.Add(pcc);
2092 Read(_T (
"CanvasConfig" ), (
int *)&g_canvasConfig, 0);
2096 if (config_array.GetCount() == 0) {
2097 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 1);
2100 LoadConfigCanvas(pcca, bApplyAsTemplate);
2101 config_array.Add(pcca);
2103 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 2);
2106 LoadConfigCanvas(pcca, bApplyAsTemplate);
2107 config_array.Add(pcca);
2110 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 1);
2112 LoadConfigCanvas(pcca, bApplyAsTemplate);
2114 if (config_array.GetCount() > 1) {
2116 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 2);
2118 LoadConfigCanvas(pcca, bApplyAsTemplate);
2120 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 2);
2123 LoadConfigCanvas(pcca, bApplyAsTemplate);
2124 config_array.Add(pcca);
2129 void MyConfig::LoadConfigCanvas(
canvasConfig *cConfig,
bool bApplyAsTemplate) {
2131 double st_lat, st_lon;
2133 if (!bApplyAsTemplate) {
2135 cConfig->iLat = START_LAT;
2136 cConfig->iLon = START_LON;
2138 if (Read(_T (
"canvasVPLatLon" ), &st)) {
2139 sscanf(st.mb_str(wxConvUTF8),
"%lf,%lf", &st_lat, &st_lon);
2142 if (fabs(st_lon) < 360.) {
2143 while (st_lon < -180.) st_lon += 360.;
2145 while (st_lon > 180.) st_lon -= 360.;
2147 cConfig->iLon = st_lon;
2150 if (fabs(st_lat) < 90.0) cConfig->iLat = st_lat;
2153 cConfig->iScale = .0003;
2154 cConfig->iRotation = 0;
2156 double st_view_scale;
2157 if (Read(wxString(_T (
"canvasVPScale" )), &st)) {
2158 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_view_scale);
2160 st_view_scale = fmax(st_view_scale, .001 / 32);
2161 st_view_scale = fmin(st_view_scale, 4);
2162 cConfig->iScale = st_view_scale;
2166 if (Read(wxString(_T (
"canvasVPRotation" )), &st)) {
2167 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_rotation);
2169 st_rotation = fmin(st_rotation, 360);
2170 st_rotation = fmax(st_rotation, 0);
2171 cConfig->iRotation = st_rotation * PI / 180.;
2174 Read(_T (
"canvasInitialdBIndex" ), &cConfig->DBindex, 0);
2175 Read(_T (
"canvasbFollow" ), &cConfig->bFollow, 0);
2177 Read(_T (
"canvasCourseUp" ), &cConfig->bCourseUp, 0);
2178 Read(_T (
"canvasHeadUp" ), &cConfig->bHeadUp, 0);
2179 Read(_T (
"canvasLookahead" ), &cConfig->bLookahead, 0);
2182 Read(_T (
"ActiveChartGroup" ), &cConfig->GroupID, 0);
2185 if (cConfig->GroupID && bApplyAsTemplate) {
2186 if (cConfig->GroupID > (
int)g_pGroupArray->GetCount()) cConfig->GroupID = 0;
2189 Read(_T (
"canvasShowTides" ), &cConfig->bShowTides, 0);
2190 Read(_T (
"canvasShowCurrents" ), &cConfig->bShowCurrents, 0);
2192 Read(_T (
"canvasQuilt" ), &cConfig->bQuilt, 1);
2193 Read(_T (
"canvasShowGrid" ), &cConfig->bShowGrid, 0);
2194 Read(_T (
"canvasShowOutlines" ), &cConfig->bShowOutlines, 0);
2195 Read(_T (
"canvasShowDepthUnits" ), &cConfig->bShowDepthUnits, 0);
2197 Read(_T (
"canvasShowAIS" ), &cConfig->bShowAIS, 1);
2198 Read(_T (
"canvasAttenAIS" ), &cConfig->bAttenAIS, 0);
2201 Read(_T (
"canvasShowENCText" ), &cConfig->bShowENCText, 1);
2202 Read(_T (
"canvasENCDisplayCategory" ), &cConfig->nENCDisplayCategory,
2204 Read(_T (
"canvasENCShowDepths" ), &cConfig->bShowENCDepths, 1);
2205 Read(_T (
"canvasENCShowBuoyLabels" ), &cConfig->bShowENCBuoyLabels, 1);
2206 Read(_T (
"canvasENCShowLightDescriptions" ),
2207 &cConfig->bShowENCLightDescriptions, 1);
2208 Read(_T (
"canvasENCShowLights" ), &cConfig->bShowENCLights, 1);
2209 Read(_T (
"canvasENCShowVisibleSectorLights" ),
2210 &cConfig->bShowENCVisibleSectorLights, 0);
2211 Read(_T (
"canvasENCShowAnchorInfo" ), &cConfig->bShowENCAnchorInfo, 0);
2212 Read(_T (
"canvasENCShowDataQuality" ), &cConfig->bShowENCDataQuality, 0);
2215 Read(_T (
"canvasSizeX" ), &sx, 0);
2216 Read(_T (
"canvasSizeY" ), &sy, 0);
2217 cConfig->canvasSize = wxSize(sx, sy);
2220 void MyConfig::SaveCanvasConfigs() {
2221 auto &config_array = ConfigMgr::Get().GetCanvasConfigArray();
2223 SetPath(_T (
"/Canvas" ));
2224 Write(_T (
"CanvasConfig" ), (
int)g_canvasConfig);
2229 switch (g_canvasConfig) {
2233 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 1);
2236 if (config_array.GetCount() > 0) {
2237 pcc = config_array.Item(0);
2239 SaveConfigCanvas(pcc);
2246 if (config_array.GetCount() > 1) {
2247 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 1);
2249 pcc = config_array.Item(0);
2251 SaveConfigCanvas(pcc);
2254 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 2);
2256 pcc = config_array.Item(1);
2258 SaveConfigCanvas(pcc);
2265 void MyConfig::SaveConfigCanvas(
canvasConfig *cConfig) {
2268 if (cConfig->canvas) {
2269 ViewPort vp = cConfig->canvas->GetVP();
2272 st1.Printf(_T (
"%10.4f,%10.4f" ), vp.clat, vp.clon);
2273 Write(_T (
"canvasVPLatLon" ), st1);
2274 st1.Printf(_T (
"%g" ), vp.view_scale_ppm);
2275 Write(_T (
"canvasVPScale" ), st1);
2276 st1.Printf(_T (
"%i" ), ((
int)(vp.rotation * 180 / PI)) % 360);
2277 Write(_T (
"canvasVPRotation" ), st1);
2280 int restore_dbindex = 0;
2281 ChartStack *pcs = cConfig->canvas->GetpCurrentStack();
2282 if (pcs) restore_dbindex = pcs->GetCurrentEntrydbIndex();
2283 if (cConfig->canvas->GetQuiltMode())
2284 restore_dbindex = cConfig->canvas->GetQuiltReferenceChartIndex();
2285 Write(_T (
"canvasInitialdBIndex" ), restore_dbindex);
2287 Write(_T (
"canvasbFollow" ), cConfig->canvas->m_bFollow);
2288 Write(_T (
"ActiveChartGroup" ), cConfig->canvas->m_groupIndex);
2290 Write(_T (
"canvasQuilt" ), cConfig->canvas->GetQuiltMode());
2291 Write(_T (
"canvasShowGrid" ), cConfig->canvas->GetShowGrid());
2292 Write(_T (
"canvasShowOutlines" ), cConfig->canvas->GetShowOutlines());
2293 Write(_T (
"canvasShowDepthUnits" ), cConfig->canvas->GetShowDepthUnits());
2295 Write(_T (
"canvasShowAIS" ), cConfig->canvas->GetShowAIS());
2296 Write(_T (
"canvasAttenAIS" ), cConfig->canvas->GetAttenAIS());
2298 Write(_T (
"canvasShowTides" ), cConfig->canvas->GetbShowTide());
2299 Write(_T (
"canvasShowCurrents" ), cConfig->canvas->GetbShowCurrent());
2302 Write(_T (
"canvasShowENCText" ), cConfig->canvas->GetShowENCText());
2303 Write(_T (
"canvasENCDisplayCategory" ),
2304 cConfig->canvas->GetENCDisplayCategory());
2305 Write(_T (
"canvasENCShowDepths" ), cConfig->canvas->GetShowENCDepth());
2306 Write(_T (
"canvasENCShowBuoyLabels" ),
2307 cConfig->canvas->GetShowENCBuoyLabels());
2308 Write(_T (
"canvasENCShowLightDescriptions" ),
2309 cConfig->canvas->GetShowENCLightDesc());
2310 Write(_T (
"canvasENCShowLights" ), cConfig->canvas->GetShowENCLights());
2311 Write(_T (
"canvasENCShowVisibleSectorLights" ),
2312 cConfig->canvas->GetShowVisibleSectors());
2313 Write(_T (
"canvasENCShowAnchorInfo" ),
2314 cConfig->canvas->GetShowENCAnchor());
2315 Write(_T (
"canvasENCShowDataQuality" ),
2316 cConfig->canvas->GetShowENCDataQual());
2317 Write(_T (
"canvasCourseUp" ),
2318 cConfig->canvas->GetUpMode() == COURSE_UP_MODE);
2319 Write(_T (
"canvasHeadUp" ), cConfig->canvas->GetUpMode() == HEAD_UP_MODE);
2320 Write(_T (
"canvasLookahead" ), cConfig->canvas->GetLookahead());
2322 int width = cConfig->canvas->GetSize().x;
2330 Write(_T (
"canvasSizeX" ), width);
2331 Write(_T (
"canvasSizeY" ), cConfig->canvas->GetSize().y);
2335 void MyConfig::UpdateSettings() {
2343 SetPath(_T (
"/Settings" ));
2345 Write(_T (
"LastAppliedTemplate" ), g_lastAppliedTemplateGUID);
2346 Write(_T (
"CompatOS" ), g_compatOS);
2347 Write(_T (
"CompatOsVersion" ), g_compatOsVersion);
2348 Write(_T (
"ConfigVersionString" ), g_config_version_string);
2349 if (wxIsEmpty(g_CmdSoundString))
2350 g_CmdSoundString = wxString(OCPN_SOUND_CMD);
2351 Write(_T(
"CmdSoundString" ), g_CmdSoundString);
2352 Write(_T (
"NavMessageShown" ), n_NavMessageShown);
2353 Write(_T (
"InlandEcdis" ), g_bInlandEcdis);
2355 Write(_T (
"AndroidVersionCode" ), g_AndroidVersionCode);
2357 Write(_T (
"UIexpert" ), g_bUIexpert);
2358 Write(_T(
"SpaceDropMark" ), g_bSpaceDropMark);
2362 Write(_T (
"ShowStatusBar" ), g_bShowStatusBar);
2364 Write(_T (
"ShowMenuBar" ), g_bShowMenuBar);
2366 Write(_T (
"DefaultFontSize" ), g_default_font_size);
2367 Write(_T (
"DefaultFontFacename" ), g_default_font_facename);
2369 Write(_T (
"Fullscreen" ), g_bFullscreen);
2370 Write(_T (
"ShowCompassWindow" ), g_bShowCompassWin);
2371 Write(_T (
"SetSystemTime" ), s_bSetSystemTime);
2372 Write(_T (
"ShowGrid" ), g_bDisplayGrid);
2373 Write(_T (
"PlayShipsBells" ), g_bPlayShipsBells);
2374 Write(_T (
"SoundDeviceIndex" ), g_iSoundDeviceIndex);
2375 Write(_T (
"FullscreenToolbar" ), g_bFullscreenToolbar);
2376 Write(_T (
"TransparentToolbar" ), g_bTransparentToolbar);
2377 Write(_T (
"PermanentMOBIcon" ), g_bPermanentMOBIcon);
2378 Write(_T (
"ShowLayers" ), g_bShowLayers);
2379 Write(_T (
"AutoAnchorDrop" ), g_bAutoAnchorMark);
2380 Write(_T (
"ShowChartOutlines" ), g_bShowOutlines);
2381 Write(_T (
"ShowActiveRouteTotal" ), g_bShowRouteTotal);
2382 Write(_T (
"ShowActiveRouteHighway" ), g_bShowActiveRouteHighway);
2383 Write(_T (
"SDMMFormat" ), g_iSDMMFormat);
2384 Write(_T (
"MostRecentGPSUploadConnection" ), g_uploadConnection);
2385 Write(_T (
"ShowChartBar" ), g_bShowChartBar);
2387 Write(_T (
"GUIScaleFactor" ), g_GUIScaleFactor);
2388 Write(_T (
"ChartObjectScaleFactor" ), g_ChartScaleFactor);
2389 Write(_T (
"ShipScaleFactor" ), g_ShipScaleFactor);
2390 Write(_T (
"ENCSoundingScaleFactor" ), g_ENCSoundingScaleFactor);
2391 Write(_T (
"ENCTextScaleFactor" ), g_ENCTextScaleFactor);
2392 Write(_T (
"ObjQueryAppendFilesExt" ), g_ObjQFileExt);
2395 Write(_T(
"CatalogCustomURL"), g_catalog_custom_url);
2396 Write(_T(
"CatalogChannel"), g_catalog_channel);
2398 Write(_T (
"FilterNMEA_Avg" ), g_bfilter_cogsog);
2399 Write(_T (
"FilterNMEA_Sec" ), g_COGFilterSec);
2401 Write(_T (
"TrackContinuous" ), g_btrackContinuous);
2403 Write(_T (
"ShowTrue" ), g_bShowTrue);
2404 Write(_T (
"ShowMag" ), g_bShowMag);
2405 Write(_T (
"UserMagVariation" ), wxString::Format(_T(
"%.2f"), g_UserVar));
2407 Write(_T (
"CM93DetailFactor" ), g_cm93_zoom_factor);
2408 Write(_T (
"CM93DetailZoomPosX" ), g_detailslider_dialog_x);
2409 Write(_T (
"CM93DetailZoomPosY" ), g_detailslider_dialog_y);
2410 Write(_T (
"ShowCM93DetailSlider" ), g_bShowDetailSlider);
2412 Write(_T (
"SkewToNorthUp" ), g_bskew_comp);
2413 if (!g_bdisable_opengl) {
2414 Write(_T (
"OpenGL" ), g_bopengl);
2416 Write(_T (
"SoftwareGL" ), g_bSoftwareGL);
2418 Write(_T (
"ZoomDetailFactor" ), g_chart_zoom_modifier_raster);
2419 Write(_T (
"ZoomDetailFactorVector" ), g_chart_zoom_modifier_vector);
2421 Write(_T (
"FogOnOverzoom" ), g_fog_overzoom);
2422 Write(_T (
"OverzoomVectorScale" ), g_oz_vector_scale);
2423 Write(_T (
"OverzoomEmphasisBase" ), g_overzoom_emphasis_base);
2424 Write(_T (
"PlusMinusZoomFactor" ), g_plus_minus_zoom_factor);
2425 Write(
"MouseZoomSensitivity",
2427 Write(_T (
"ShowMUIZoomButtons" ), g_bShowMuiZoomButtons);
2431 Write(_T (
"UseAcceleratedPanning" ), g_GLOptions.m_bUseAcceleratedPanning);
2433 Write(_T (
"GPUTextureCompression" ), g_GLOptions.m_bTextureCompression);
2434 Write(_T (
"GPUTextureCompressionCaching" ),
2435 g_GLOptions.m_bTextureCompressionCaching);
2436 Write(_T (
"GPUTextureDimension" ), g_GLOptions.m_iTextureDimension);
2437 Write(_T (
"GPUTextureMemSize" ), g_GLOptions.m_iTextureMemorySize);
2438 Write(_T (
"PolygonSmoothing" ), g_GLOptions.m_GLPolygonSmoothing);
2439 Write(_T (
"LineSmoothing" ), g_GLOptions.m_GLLineSmoothing);
2441 Write(_T (
"SmoothPanZoom" ), g_bsmoothpanzoom);
2443 Write(_T (
"CourseUpMode" ), g_bCourseUp);
2444 if (!g_bInlandEcdis) Write(_T (
"LookAheadMode" ), g_bLookAhead);
2445 Write(_T (
"COGUPAvgSeconds" ), g_COGAvgSec);
2446 Write(_T (
"UseMagAPB" ), g_bMagneticAPB);
2448 Write(_T (
"OwnshipCOGPredictorMinutes" ), g_ownship_predictor_minutes);
2449 Write(_T (
"OwnshipCOGPredictorStyle" ), g_cog_predictor_style);
2450 Write(_T (
"OwnshipCOGPredictorColor" ), g_cog_predictor_color);
2451 Write(_T (
"OwnshipCOGPredictorEndmarker" ), g_cog_predictor_endmarker);
2452 Write(_T (
"OwnshipCOGPredictorWidth" ), g_cog_predictor_width);
2453 Write(_T (
"OwnshipHDTPredictorStyle" ), g_ownship_HDTpredictor_style);
2454 Write(_T (
"OwnshipHDTPredictorColor" ), g_ownship_HDTpredictor_color);
2455 Write(_T (
"OwnshipHDTPredictorEndmarker" ), g_ownship_HDTpredictor_endmarker);
2456 Write(_T (
"OwnshipHDTPredictorWidth" ), g_ownship_HDTpredictor_width);
2457 Write(_T (
"OwnshipHDTPredictorMiles" ), g_ownship_HDTpredictor_miles);
2459 Write(_T (
"OwnShipIconType" ), g_OwnShipIconType);
2460 Write(_T (
"OwnShipLength" ), g_n_ownship_length_meters);
2461 Write(_T (
"OwnShipWidth" ), g_n_ownship_beam_meters);
2462 Write(_T (
"OwnShipGPSOffsetX" ), g_n_gps_antenna_offset_x);
2463 Write(_T (
"OwnShipGPSOffsetY" ), g_n_gps_antenna_offset_y);
2464 Write(_T (
"OwnShipMinSize" ), g_n_ownship_min_mm);
2465 Write(_T (
"OwnShipSogCogCalc" ), g_own_ship_sog_cog_calc);
2466 Write(_T (
"OwnShipSogCogCalcDampSec"), g_own_ship_sog_cog_calc_damp_sec);
2467 Write(_T (
"ShowDirectRouteLine"), g_bShowShipToActive);
2468 Write(_T (
"DirectRouteLineStyle"), g_shipToActiveStyle);
2469 Write(_T (
"DirectRouteLineColor" ), g_shipToActiveColor);
2474 Write(_T (
"RouteArrivalCircleRadius" ),
2475 wxString::Format(_T(
"%.2f"), g_n_arrival_circle_radius));
2477 Write(_T (
"ChartQuilting" ), g_bQuiltEnable);
2479 Write(_T (
"NMEALogWindowSizeX" ), NMEALogWindow::GetInstance().GetSizeW());
2480 Write(_T (
"NMEALogWindowSizeY" ), NMEALogWindow::GetInstance().GetSizeH());
2481 Write(_T (
"NMEALogWindowPosX" ), NMEALogWindow::GetInstance().GetPosX());
2482 Write(_T (
"NMEALogWindowPosY" ), NMEALogWindow::GetInstance().GetPosY());
2484 Write(_T (
"PreserveScaleOnX" ), g_bPreserveScaleOnX);
2486 Write(_T (
"StartWithTrackActive" ), g_bTrackCarryOver);
2487 Write(_T (
"AutomaticDailyTracks" ), g_bTrackDaily);
2488 Write(_T (
"TrackRotateAt" ), g_track_rotate_time);
2489 Write(_T (
"TrackRotateTimeType" ), g_track_rotate_time_type);
2490 Write(_T (
"HighlightTracks" ), g_bHighliteTracks);
2492 Write(_T (
"InitialStackIndex" ), g_restore_stackindex);
2493 Write(_T (
"InitialdBIndex" ), g_restore_dbindex);
2495 Write(_T(
"NMEAAPBPrecision" ), g_NMEAAPBPrecision);
2497 Write(_T(
"TalkerIdText"), g_TalkerIdText);
2498 Write(_T(
"ShowTrackPointTime"), g_bShowTrackPointTime);
2500 Write(_T (
"AnchorWatch1GUID" ), g_AW1GUID);
2501 Write(_T (
"AnchorWatch2GUID" ), g_AW2GUID);
2503 Write(_T (
"ToolbarX" ), g_maintoolbar_x);
2504 Write(_T (
"ToolbarY" ), g_maintoolbar_y);
2507 Write(_T (
"iENCToolbarX" ), g_iENCToolbarPosX);
2508 Write(_T (
"iENCToolbarY" ), g_iENCToolbarPosY);
2510 if (!g_bInlandEcdis) {
2511 Write(_T (
"GlobalToolbarConfig" ), g_toolbarConfig);
2512 Write(_T (
"DistanceFormat" ), g_iDistanceFormat);
2513 Write(_T (
"SpeedFormat" ), g_iSpeedFormat);
2514 Write(_T (
"WindSpeedFormat" ), g_iWindSpeedFormat);
2515 Write(_T (
"ShowDepthUnits" ), g_bShowDepthUnits);
2516 Write(_T (
"TemperatureFormat" ), g_iTempFormat);
2518 Write(_T (
"GPSIdent" ), g_GPS_Ident);
2519 Write(
"ActiveRoute" , g_active_route);
2520 Write(
"PersistActiveRoute", g_persist_active_route);
2521 Write(_T (
"UseGarminHostUpload" ), g_bGarminHostUpload);
2523 Write(_T (
"MobileTouch" ), g_btouch);
2524 Write(_T (
"ResponsiveGraphics" ), g_bresponsive);
2525 Write(_T (
"EnableRolloverBlock" ), g_bRollover);
2527 Write(_T (
"AutoHideToolbar" ), g_bAutoHideToolbar);
2528 Write(_T (
"AutoHideToolbarSecs" ), g_nAutoHideToolbar);
2531 for (
const auto &mm : g_config_display_size_mm) {
2532 st0.Append(wxString::Format(_T (
"%zu," ), mm));
2535 Write(_T (
"DisplaySizeMM" ), st0);
2536 Write(_T (
"DisplaySizeManual" ), g_config_display_size_manual);
2538 Write(_T (
"SelectionRadiusMM" ), g_selection_radius_mm);
2539 Write(_T (
"SelectionRadiusTouchMM" ), g_selection_radius_touch_mm);
2541 st0.Printf(_T (
"%g" ), g_PlanSpeed);
2542 Write(_T (
"PlanSpeed" ), st0);
2544 if (g_bLayersLoaded) {
2545 wxString vis, invis, visnames, invisnames;
2546 LayerList::iterator it;
2548 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
2550 if (lay->IsVisibleOnChart())
2551 vis += (lay->m_LayerName) + _T(
";");
2553 invis += (lay->m_LayerName) + _T(
";");
2555 if (lay->HasVisibleNames() == wxCHK_CHECKED) {
2556 visnames += (lay->m_LayerName) + _T(
";");
2557 }
else if (lay->HasVisibleNames() == wxCHK_UNCHECKED) {
2558 invisnames += (lay->m_LayerName) + _T(
";");
2561 Write(_T (
"VisibleLayers" ), vis);
2562 Write(_T (
"InvisibleLayers" ), invis);
2563 Write(_T (
"VisNameInLayers" ), visnames);
2564 Write(_T (
"InvisNameInLayers" ), invisnames);
2566 Write(_T (
"Locale" ), g_locale);
2567 Write(_T (
"LocaleOverride" ), g_localeOverride);
2569 Write(_T (
"KeepNavobjBackups" ), g_navobjbackups);
2570 Write(_T (
"LegacyInputCOMPortFilterBehaviour" ),
2571 g_b_legacy_input_filter_behaviour);
2572 Write(_T(
"AdvanceRouteWaypointOnArrivalOnly" ),
2573 g_bAdvanceRouteWaypointOnArrivalOnly);
2576 Write(_T(
"LiveETA" ), g_bShowLiveETA);
2577 Write(_T(
"DefaultBoatSpeed" ), g_defaultBoatSpeed);
2581 SetPath(_T (
"/Settings/ObjectFilter" ));
2584 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
2586 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
2588 wxString st1(_T (
"viz" ));
2590 strncpy(name, pOLE->OBJLName, 6);
2592 st1.Append(wxString(name, wxConvUTF8));
2593 Write(st1, pOLE->nViz);
2599 SetPath(_T (
"/Settings/GlobalState" ));
2616 st1.Printf(_T (
"%10.4f, %10.4f" ), gLat, gLon);
2617 Write(_T (
"OwnShipLatLon" ), st1);
2620 SetPath(_T (
"/Settings/GlobalState" ));
2621 if (!g_bInlandEcdis)
2622 Write(_T (
"nColorScheme" ), (
int)gFrame->GetColorScheme());
2624 Write(_T (
"FrameWinX" ), g_nframewin_x);
2625 Write(_T (
"FrameWinY" ), g_nframewin_y);
2626 Write(_T (
"FrameWinPosX" ), g_nframewin_posx);
2627 Write(_T (
"FrameWinPosY" ), g_nframewin_posy);
2628 Write(_T (
"FrameMax" ), g_bframemax);
2630 Write(_T (
"ClientPosX" ), g_lastClientRectx);
2631 Write(_T (
"ClientPosY" ), g_lastClientRecty);
2632 Write(_T (
"ClientSzX" ), g_lastClientRectw);
2633 Write(_T (
"ClientSzY" ), g_lastClientRecth);
2635 Write(_T (
"S52_DEPTH_UNIT_SHOW" ), g_nDepthUnitDisplay);
2637 Write(_T(
"RoutePropSizeX" ), g_route_prop_sx);
2638 Write(_T(
"RoutePropSizeY" ), g_route_prop_sy);
2639 Write(_T(
"RoutePropPosX" ), g_route_prop_x);
2640 Write(_T(
"RoutePropPosY" ), g_route_prop_y);
2643 SetPath(_T (
"/Settings/Audio" ));
2644 Write(_T (
"AISAlertSoundFile" ), g_AIS_sound_file);
2645 Write(_T (
"DSCAlertSoundFile" ), g_DSC_sound_file);
2646 Write(_T (
"SARTAlertSoundFile" ), g_SART_sound_file);
2647 Write(_T (
"AnchorAlarmSoundFile" ), g_anchorwatch_sound_file);
2649 Write(_T (
"bAIS_GCPA_AlertAudio" ), g_bAIS_GCPA_Alert_Audio);
2650 Write(_T (
"bAIS_SART_AlertAudio" ), g_bAIS_SART_Alert_Audio);
2651 Write(_T (
"bAIS_DSC_AlertAudio" ), g_bAIS_DSC_Alert_Audio);
2652 Write(_T (
"bAnchorAlertAudio" ), g_bAnchor_Alert_Audio);
2655 SetPath(_T (
"/Settings/AIS" ));
2657 Write(_T (
"bNoCPAMax" ), g_bCPAMax);
2658 Write(_T (
"NoCPAMaxNMi" ), g_CPAMax_NM);
2659 Write(_T (
"bCPAWarn" ), g_bCPAWarn);
2660 Write(_T (
"CPAWarnNMi" ), g_CPAWarn_NM);
2661 Write(_T (
"bTCPAMax" ), g_bTCPA_Max);
2662 Write(_T (
"TCPAMaxMinutes" ), g_TCPA_Max);
2663 Write(_T (
"bMarkLostTargets" ), g_bMarkLost);
2664 Write(_T (
"MarkLost_Minutes" ), g_MarkLost_Mins);
2665 Write(_T (
"bRemoveLostTargets" ), g_bRemoveLost);
2666 Write(_T (
"RemoveLost_Minutes" ), g_RemoveLost_Mins);
2667 Write(_T (
"bShowCOGArrows" ), g_bShowCOG);
2668 Write(_T (
"bSyncCogPredictors" ), g_bSyncCogPredictors);
2669 Write(_T (
"CogArrowMinutes" ), g_ShowCOG_Mins);
2670 Write(_T (
"bShowTargetTracks" ), g_bAISShowTracks);
2671 Write(_T (
"TargetTracksMinutes" ), g_AISShowTracks_Mins);
2673 Write(_T (
"bHideMooredTargets" ), g_bHideMoored);
2674 Write(_T (
"MooredTargetMaxSpeedKnots" ), g_ShowMoored_Kts);
2676 Write(_T (
"bAISAlertDialog" ), g_bAIS_CPA_Alert);
2677 Write(_T (
"bAISAlertAudio" ), g_bAIS_CPA_Alert_Audio);
2679 Write(_T (
"AISAlertAudioFile" ), g_sAIS_Alert_Sound_File);
2680 Write(_T (
"bAISAlertSuppressMoored" ), g_bAIS_CPA_Alert_Suppress_Moored);
2681 Write(_T (
"bShowAreaNotices" ), g_bShowAreaNotices);
2682 Write(_T (
"bDrawAISSize" ), g_bDrawAISSize);
2683 Write(_T (
"bDrawAISRealtime" ), g_bDrawAISRealtime);
2684 Write(_T (
"AISRealtimeMinSpeedKnots" ), g_AIS_RealtPred_Kts);
2685 Write(_T (
"bShowAISName" ), g_bShowAISName);
2686 Write(_T (
"ShowAISTargetNameScale" ), g_Show_Target_Name_Scale);
2687 Write(_T (
"bWplIsAprsPositionReport" ), g_bWplUsePosition);
2688 Write(_T (
"WplSelAction" ), g_WplAction);
2689 Write(_T (
"AISCOGPredictorWidth" ), g_ais_cog_predictor_width);
2690 Write(_T (
"bShowScaledTargets" ), g_bAllowShowScaled);
2691 Write(_T (
"AISScaledNumber" ), g_ShowScaled_Num);
2692 Write(_T (
"AISScaledNumberWeightSOG" ), g_ScaledNumWeightSOG);
2693 Write(_T (
"AISScaledNumberWeightCPA" ), g_ScaledNumWeightCPA);
2694 Write(_T (
"AISScaledNumberWeightTCPA" ), g_ScaledNumWeightTCPA);
2695 Write(_T (
"AISScaledNumberWeightRange" ), g_ScaledNumWeightRange);
2696 Write(_T (
"AISScaledNumberWeightSizeOfTarget" ), g_ScaledNumWeightSizeOfT);
2697 Write(_T (
"AISScaledSizeMinimal" ), g_ScaledSizeMinimal);
2698 Write(_T (
"AISShowScaled"), g_bShowScaled);
2700 Write(_T (
"AlertDialogSizeX" ), g_ais_alert_dialog_sx);
2701 Write(_T (
"AlertDialogSizeY" ), g_ais_alert_dialog_sy);
2702 Write(_T (
"AlertDialogPosX" ), g_ais_alert_dialog_x);
2703 Write(_T (
"AlertDialogPosY" ), g_ais_alert_dialog_y);
2704 Write(_T (
"QueryDialogPosX" ), g_ais_query_dialog_x);
2705 Write(_T (
"QueryDialogPosY" ), g_ais_query_dialog_y);
2706 Write(_T (
"AISTargetListPerspective" ), g_AisTargetList_perspective);
2707 Write(_T (
"AISTargetListRange" ), g_AisTargetList_range);
2708 Write(_T (
"AISTargetListSortColumn" ), g_AisTargetList_sortColumn);
2709 Write(_T (
"bAISTargetListSortReverse" ), g_bAisTargetList_sortReverse);
2710 Write(_T (
"AISTargetListColumnSpec" ), g_AisTargetList_column_spec);
2711 Write(_T (
"AISTargetListColumnOrder"), g_AisTargetList_column_order);
2713 Write(_T (
"S57QueryDialogSizeX" ), g_S57_dialog_sx);
2714 Write(_T (
"S57QueryDialogSizeY" ), g_S57_dialog_sy);
2715 Write(_T (
"S57QueryExtraDialogSizeX" ), g_S57_extradialog_sx);
2716 Write(_T (
"S57QueryExtraDialogSizeY" ), g_S57_extradialog_sy);
2718 Write(_T (
"bAISRolloverShowClass" ), g_bAISRolloverShowClass);
2719 Write(_T (
"bAISRolloverShowCOG" ), g_bAISRolloverShowCOG);
2720 Write(_T (
"bAISRolloverShowCPA" ), g_bAISRolloverShowCPA);
2722 Write(_T (
"bAISAlertAckTimeout" ), g_bAIS_ACK_Timeout);
2723 Write(_T (
"AlertAckTimeoutMinutes" ), g_AckTimeout_Mins);
2725 SetPath(_T (
"/Settings/GlobalState" ));
2727 Write(_T (
"bShowS57Text" ), ps52plib->GetShowS57Text());
2728 Write(_T (
"bShowS57ImportantTextOnly" ),
2729 ps52plib->GetShowS57ImportantTextOnly());
2730 if (!g_bInlandEcdis)
2731 Write(_T (
"nDisplayCategory" ), (
long)ps52plib->GetDisplayCategory());
2732 Write(_T (
"nSymbolStyle" ), (
int)ps52plib->m_nSymbolStyle);
2733 Write(_T (
"nBoundaryStyle" ), (
int)ps52plib->m_nBoundaryStyle);
2735 Write(_T (
"bShowSoundg" ), ps52plib->m_bShowSoundg);
2736 Write(_T (
"bShowMeta" ), ps52plib->m_bShowMeta);
2737 Write(_T (
"bUseSCAMIN" ), ps52plib->m_bUseSCAMIN);
2738 Write(_T (
"bUseSUPER_SCAMIN" ), ps52plib->m_bUseSUPER_SCAMIN);
2739 Write(_T (
"bShowAtonText" ), ps52plib->m_bShowAtonText);
2740 Write(_T (
"bShowLightDescription" ), ps52plib->m_bShowLdisText);
2741 Write(_T (
"bExtendLightSectors" ), ps52plib->m_bExtendLightSectors);
2742 Write(_T (
"bDeClutterText" ), ps52plib->m_bDeClutterText);
2743 Write(_T (
"bShowNationalText" ), ps52plib->m_bShowNationalTexts);
2745 Write(_T (
"S52_MAR_SAFETY_CONTOUR" ),
2746 S52_getMarinerParam(S52_MAR_SAFETY_CONTOUR));
2747 Write(_T (
"S52_MAR_SHALLOW_CONTOUR" ),
2748 S52_getMarinerParam(S52_MAR_SHALLOW_CONTOUR));
2749 Write(_T (
"S52_MAR_DEEP_CONTOUR" ),
2750 S52_getMarinerParam(S52_MAR_DEEP_CONTOUR));
2751 Write(_T (
"S52_MAR_TWO_SHADES" ), S52_getMarinerParam(S52_MAR_TWO_SHADES));
2752 Write(_T (
"S52_DEPTH_UNIT_SHOW" ), ps52plib->m_nDepthUnitDisplay);
2753 Write(_T (
"ENCSoundingScaleFactor" ), g_ENCSoundingScaleFactor);
2754 Write(_T (
"ENCTextScaleFactor" ), g_ENCTextScaleFactor);
2756 SetPath(_T (
"/Directories" ));
2757 Write(_T (
"S57DataLocation" ), _T(
""));
2760 SetPath(_T (
"/Directories" ));
2761 Write(_T (
"InitChartDir" ), *pInit_Chart_Dir);
2762 Write(_T (
"GPXIODir" ), g_gpx_path);
2763 Write(_T (
"TCDataDir" ), g_TCData_Dir);
2764 Write(_T (
"BasemapDir" ), g_Platform->NormalizePath(gWorldMapLocation));
2765 Write(_T (
"BaseShapefileDir" ), g_Platform->NormalizePath(gWorldShapefileLocation));
2766 Write(_T (
"pluginInstallDir" ), g_Platform->NormalizePath(g_winPluginDir));
2768 SetPath(_T (
"/Settings/NMEADataSource" ));
2769 wxString connectionconfigs;
2770 for (
size_t i = 0; i < TheConnectionParams()->Count(); i++) {
2771 if (i > 0) connectionconfigs.Append(_T(
"|"));
2772 connectionconfigs.Append(TheConnectionParams()->Item(i)->Serialize());
2774 Write(_T (
"DataConnections" ), connectionconfigs);
2779 SetPath(_T (
"/Settings/AuxFontKeys" ));
2781 wxArrayString keyArray = FontMgr::Get().GetAuxKeyArray();
2782 for (
unsigned int i = 0; i < keyArray.GetCount(); i++) {
2784 key.Printf(_T(
"Key%i"), i);
2785 wxString keyval = keyArray[i];
2791 font_path = (_T (
"/Settings/X11Fonts" ));
2795 font_path = (_T (
"/Settings/GTKFonts" ));
2799 font_path = (_T (
"/Settings/MSWFonts" ));
2803 font_path = (_T (
"/Settings/MacFonts" ));
2807 font_path = (_T (
"/Settings/QTFonts" ));
2810 DeleteGroup(font_path);
2814 int nFonts = FontMgr::Get().GetNumFonts();
2816 for (
int i = 0; i < nFonts; i++) {
2817 wxString cfstring(FontMgr::Get().GetConfigString(i));
2818 wxString valstring = FontMgr::Get().GetFullConfigDesc(i);
2819 Write(cfstring, valstring);
2823 DeleteGroup(_T (
"/TideCurrentDataSources" ));
2824 SetPath(_T (
"/TideCurrentDataSources" ));
2825 unsigned int id = 0;
2826 for (
auto val : TideCurrentDataSet) {
2828 key.Printf(_T(
"tcds%d"),
id);
2829 Write(key, wxString(val));
2833 SetPath(_T (
"/Settings/Others" ));
2836 Write(_T (
"ShowRadarRings" ),
2837 (
bool)(g_iNavAidRadarRingsNumberVisible > 0));
2838 Write(_T (
"RadarRingsNumberVisible" ), g_iNavAidRadarRingsNumberVisible);
2839 Write(_T (
"RadarRingsStep" ), g_fNavAidRadarRingsStep);
2840 Write(_T (
"RadarRingsStepUnits" ), g_pNavAidRadarRingsStepUnits);
2841 Write(_T (
"RadarRingsColour" ),
2842 g_colourOwnshipRangeRingsColour.GetAsString(wxC2S_HTML_SYNTAX));
2843 Write(_T(
"WaypointUseScaMin" ), g_bUseWptScaMin);
2844 Write(_T(
"WaypointScaMinValue" ), g_iWpt_ScaMin);
2845 Write(_T(
"WaypointUseScaMinOverrule" ), g_bOverruleScaMin);
2846 Write(_T(
"WaypointsShowName"), g_bShowWptName);
2847 Write(_T(
"UserIconsFirst"), g_bUserIconsFirst);
2850 Write(_T (
"WaypointRangeRingsNumber" ), g_iWaypointRangeRingsNumber);
2851 Write(_T (
"WaypointRangeRingsStep" ), g_fWaypointRangeRingsStep);
2852 Write(_T (
"WaypointRangeRingsStepUnits" ), g_iWaypointRangeRingsStepUnits);
2853 Write(_T (
"WaypointRangeRingsColour" ),
2854 g_colourWaypointRangeRingsColour.GetAsString(wxC2S_HTML_SYNTAX));
2856 Write(_T (
"ConfirmObjectDeletion" ), g_bConfirmObjectDelete);
2859 Write(_T (
"WaypointPreventDragging" ), g_bWayPointPreventDragging);
2861 Write(_T (
"EnableZoomToCursor" ), g_bEnableZoomToCursor);
2863 Write(_T (
"TrackIntervalSeconds" ), g_TrackIntervalSeconds);
2864 Write(_T (
"TrackDeltaDistance" ), g_TrackDeltaDistance);
2865 Write(_T (
"TrackPrecision" ), g_nTrackPrecision);
2867 Write(_T (
"RouteLineWidth" ), g_route_line_width);
2868 Write(_T (
"TrackLineWidth" ), g_track_line_width);
2869 Write(_T (
"TrackLineColour" ),
2870 g_colourTrackLineColour.GetAsString(wxC2S_HTML_SYNTAX));
2871 Write(_T (
"DefaultWPIcon" ), g_default_wp_icon);
2872 Write(_T (
"DefaultRPIcon" ), g_default_routepoint_icon);
2874 DeleteGroup(_T (
"/MmsiProperties" ));
2875 SetPath(_T (
"/MmsiProperties" ));
2876 for (
unsigned int i = 0; i < g_MMSI_Props_Array.GetCount(); i++) {
2878 p.Printf(_T(
"Props%d"), i);
2879 Write(p, g_MMSI_Props_Array[i]->Serialize());
2882 SaveCanvasConfigs();
2887 void MyConfig::UpdateNavObjOnly() {
2891 pNavObjectSet->CreateAllGPXObjects();
2892 pNavObjectSet->SaveFile(m_sNavObjSetFile);
2894 delete pNavObjectSet;
2897 void MyConfig::UpdateNavObj(
bool bRecreate) {
2901 pNavObjectSet->CreateAllGPXObjects();
2902 pNavObjectSet->SaveFile(m_sNavObjSetFile);
2904 delete pNavObjectSet;
2906 if (m_pNavObjectChangesSet->m_changes_file)
2907 fclose(m_pNavObjectChangesSet->m_changes_file);
2909 if (::wxFileExists(m_sNavObjSetChangesFile)) {
2911 wxRemoveFile(m_sNavObjSetChangesFile);
2915 m_pNavObjectChangesSet->Init(m_sNavObjSetChangesFile);
2917 m_pNavObjectChangesSet->reset();
2918 if (m_pNavObjectChangesSet->load_file(m_sNavObjSetChangesFile.fn_str()).status != pugi::xml_parse_status::status_ok) {
2919 wxLogMessage(
"Error while loading " + m_sNavObjSetChangesFile +
", ignoring contents of the file.");
2920 m_pNavObjectChangesSet->reset();
2925 static wxFileName exportFileName(wxWindow *parent,
2926 const wxString suggestedName) {
2929 wxString validName{suggestedName};
2932 validName.Replace(_T(
"/"), _T(
"-"));
2933 validName.Replace(_T(
":"), _T(
"_"));
2934 int response = g_Platform->DoFileSelectorDialog(
2935 parent, &path, _(
"Export GPX file"), g_gpx_path, validName, wxT(
"*.gpx"));
2937 if (response == wxID_OK) {
2938 wxFileName fn(path);
2939 g_gpx_path = fn.GetPath();
2940 fn.SetExt(_T(
"gpx"));
2943 if (wxFileExists(fn.GetFullPath())) {
2945 OCPNMessageBox(NULL, _(
"Overwrite existing file?"), _T(
"Confirm"),
2946 wxICON_QUESTION | wxYES_NO | wxCANCEL);
2947 if (answer != wxID_YES)
return ret;
2955 bool MyConfig::IsChangesFileDirty() {
2956 return m_pNavObjectChangesSet->IsDirty();
2959 bool ExportGPXRoutes(wxWindow *parent, RouteList *pRoutes,
2960 const wxString suggestedName) {
2961 wxFileName fn = exportFileName(parent, suggestedName);
2964 pgpx->AddGPXRoutesList(pRoutes);
2967 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
2969 pgpx->SaveFile(fns);
2970 AndroidSecureCopyFile(fns, fn.GetFullPath());
2972 pgpx->SaveFile(fn.GetFullPath());
2983 bool ExportGPXTracks(wxWindow *parent, std::vector<Track*> *pTracks,
2984 const wxString suggestedName) {
2985 wxFileName fn = exportFileName(parent, suggestedName);
2988 pgpx->AddGPXTracksList(pTracks);
2990 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
2992 pgpx->SaveFile(fns);
2993 AndroidSecureCopyFile(fns, fn.GetFullPath());
2995 pgpx->SaveFile(fn.GetFullPath());
3004 bool ExportGPXWaypoints(wxWindow *parent, RoutePointList *pRoutePoints,
3005 const wxString suggestedName) {
3006 wxFileName fn = exportFileName(parent, suggestedName);
3009 pgpx->AddGPXPointsList(pRoutePoints);
3012 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
3014 pgpx->SaveFile(fns);
3015 AndroidSecureCopyFile(fns, fn.GetFullPath());
3017 pgpx->SaveFile(fn.GetFullPath());
3027 void ExportGPX(wxWindow *parent,
bool bviz_only,
bool blayer) {
3028 wxFileName fn = exportFileName(parent, _T(
"userobjects.gpx"));
3030 ::wxBeginBusyCursor();
3034 wxGenericProgressDialog *pprog =
nullptr;
3035 int count = pWayPointMan->GetWaypointList()->GetCount();
3036 int progStep = count / 32;
3038 pprog =
new wxGenericProgressDialog(
3039 _(
"Export GPX file"), _T(
"0/0"), count, NULL,
3040 wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME |
3041 wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME);
3042 pprog->SetSize(400, wxDefaultCoord);
3049 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
3052 if (pprog && !(ic % progStep)) {
3054 msg.Printf(_T(
"%d/%d"), ic, count);
3055 pprog->Update(ic, msg);
3059 pr = node->GetData();
3063 if (bviz_only && !pr->m_bIsVisible) b_add =
false;
3065 if (pr->m_bIsInLayer && !blayer) b_add =
false;
3067 if (pr->IsShared() || !WptIsInRouteList(pr)) pgpx->AddGPXWaypoint(pr);
3070 node = node->GetNext();
3073 wxRouteListNode *node1 = pRouteList->GetFirst();
3075 Route *pRoute = node1->GetData();
3079 if (bviz_only && !pRoute->IsVisible()) b_add =
false;
3081 if (pRoute->m_bIsInLayer && !blayer) b_add =
false;
3083 if (b_add) pgpx->AddGPXRoute(pRoute);
3085 node1 = node1->GetNext();
3088 for (
Track* pTrack : g_TrackList) {
3091 if (bviz_only && !pTrack->IsVisible()) b_add =
false;
3093 if (pTrack->m_bIsInLayer && !blayer) b_add =
false;
3095 if (b_add) pgpx->AddGPXTrack(pTrack);
3102 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
3104 pgpx->SaveFile(fns);
3105 AndroidSecureCopyFile(fns, fn.GetFullPath());
3107 pgpx->SaveFile(fn.GetFullPath());
3111 ::wxEndBusyCursor();
3117 void UI_ImportGPX(wxWindow *parent,
bool islayer, wxString dirpath,
3118 bool isdirectory,
bool isPersistent) {
3119 int response = wxID_CANCEL;
3120 wxArrayString file_array;
3123 if (!islayer || dirpath.IsSameAs(_T(
""))) {
3128 wxFileDialog *popenDialog =
3129 new wxFileDialog(NULL, _(
"Import GPX file"), g_gpx_path, wxT(
""),
3130 wxT(
"GPX files (*.gpx)|*.gpx|All files (*.*)|*.*"),
3131 wxFD_OPEN | wxFD_MULTIPLE);
3133 if (g_bresponsive && parent)
3134 popenDialog = g_Platform->AdjustFileDialogFont(parent, popenDialog);
3136 popenDialog->Centre();
3139 if (parent) parent->HideWithEffect(wxSHOW_EFFECT_BLEND);
3142 response = popenDialog->ShowModal();
3145 if (parent) parent->ShowWithEffect(wxSHOW_EFFECT_BLEND);
3148 if (response == wxID_OK) {
3149 popenDialog->GetPaths(file_array);
3152 if (file_array.GetCount()) {
3153 wxFileName fn(file_array[0]);
3154 g_gpx_path = fn.GetPath();
3160 response = g_Platform->DoFileSelectorDialog(
3161 NULL, &path, _(
"Import GPX file"), g_gpx_path, _T(
""), wxT(
"*.gpx"));
3163 file_array.Add(path);
3164 wxFileName fn(path);
3165 g_gpx_path = fn.GetPath();
3171 if (wxDir::GetAllFiles(dirpath, &file_array, wxT(
"*.gpx")))
3174 file_array.Add(dirpath);
3179 if (response == wxID_OK) {
3182 l->m_LayerID = ++g_LayerIdx;
3183 l->m_LayerFileName = file_array[0];
3184 if (file_array.GetCount() <= 1)
3185 wxFileName::SplitPath(file_array[0], NULL, NULL, &(l->m_LayerName),
3188 if (dirpath.IsSameAs(_T(
"")))
3189 wxFileName::SplitPath(g_gpx_path, NULL, NULL, &(l->m_LayerName), NULL,
3192 wxFileName::SplitPath(dirpath, NULL, NULL, &(l->m_LayerName), NULL,
3196 bool bLayerViz = g_bShowLayers;
3197 if (g_VisibleLayers.Contains(l->m_LayerName)) bLayerViz =
true;
3198 if (g_InvisibleLayers.Contains(l->m_LayerName)) bLayerViz =
false;
3199 l->m_bIsVisibleOnChart = bLayerViz;
3202 l->m_bHasVisibleNames = wxCHK_CHECKED;
3205 laymsg.Printf(wxT(
"New layer %d: %s"), l->m_LayerID,
3206 l->m_LayerName.c_str());
3207 wxLogMessage(laymsg);
3209 pLayerList->Insert(l);
3212 for (
unsigned int i = 0; i < file_array.GetCount(); i++) {
3213 wxString path = file_array[i];
3215 if (::wxFileExists(path)) {
3217 if (pSet->load_file(path.fn_str()).status != pugi::xml_parse_status::status_ok) {
3218 wxLogMessage(
"Error loading GPX file " + path);
3225 l->m_NoOfItems = pSet->LoadAllGPXObjectsAsLayer(
3226 l->m_LayerID, l->m_bIsVisibleOnChart, l->m_bHasVisibleNames);
3227 l->m_LayerType = isPersistent ? _(
"Persistent") : _(
"Temporary");
3232 wxString destf, f, name, ext;
3233 f = l->m_LayerFileName;
3234 wxFileName::SplitPath(f, NULL, NULL, &name, &ext);
3236 appendOSDirSlash(&destf);
3237 destf.Append(_T(
"layers"));
3238 appendOSDirSlash(&destf);
3239 if (!wxDirExists(destf)) {
3240 if (!wxMkdir(destf, wxS_DIR_DEFAULT))
3241 wxLogMessage(_T(
"Error creating layer directory"));
3244 destf << name << _T(
".") << ext;
3246 if (wxCopyFile(f, destf,
true))
3247 msg.Printf(_T(
"File: %s.%s also added to persistent layers"),
3250 msg.Printf(_T(
"Failed adding %s.%s to persistent layers"), name,
3256 pSet->LoadAllGPXObjects(
3262 wxString::Format(_T(
"%d ") + _(
"duplicate waypoints detected "
3263 "during import and ignored."),
3265 _(
"OpenCPN Info"), wxICON_INFORMATION | wxOK, 10);
3277 void SwitchInlandEcdisMode(
bool Switch) {
3279 wxLogMessage(_T(
"Switch InlandEcdis mode On"));
3283 g_iDistanceFormat = 2;
3286 if (ps52plib) ps52plib->SetDisplayCategory(STANDARD);
3287 g_bDrawAISSize =
false;
3288 if (gFrame) gFrame->RequestNewToolbars(
true);
3290 wxLogMessage(_T(
"Switch InlandEcdis mode Off"));
3293 pConfig->SetPath(_T (
"/Settings" ));
3294 pConfig->Read(_T (
"GlobalToolbarConfig" ), &g_toolbarConfig);
3295 pConfig->Read(_T (
"DistanceFormat" ), &g_iDistanceFormat);
3296 pConfig->Read(_T (
"SpeedFormat" ), &g_iSpeedFormat);
3297 pConfig->Read(_T (
"ShowDepthUnits" ), &g_bShowDepthUnits, 1);
3299 pConfig->Read(_T (
"nDisplayCategory" ), &read_int,
3300 (
enum _DisCat)STANDARD);
3301 if (ps52plib) ps52plib->SetDisplayCategory((
enum _DisCat)read_int);
3302 pConfig->SetPath(_T (
"/Settings/AIS" ));
3303 pConfig->Read(_T (
"bDrawAISSize" ), &g_bDrawAISSize);
3304 pConfig->Read(_T (
"bDrawAISRealtime" ), &g_bDrawAISRealtime);
3306 if (gFrame) gFrame->RequestNewToolbars(
true);
3318 wxString FormatGPXDateTime(wxDateTime dt) {
3320 return dt.Format(wxT(
"%Y-%m-%dT%H:%M:%SZ"));
3327 bool LogMessageOnce(
const wxString &msg) {
3330 for (
unsigned int i = 0; i < pMessageOnceArray->GetCount(); i++) {
3331 if (msg.IsSameAs(pMessageOnceArray->Item(i)))
return false;
3335 pMessageOnceArray->Add(msg);
3349 double fromUsrDistance(
double usr_distance,
int unit) {
3351 if (
unit == -1)
unit = g_iDistanceFormat;
3357 ret = usr_distance / 1.15078;
3360 ret = usr_distance / 1.852;
3363 ret = usr_distance / 1852;
3366 ret = usr_distance / 6076.12;
3374 double fromUsrSpeed(
double usr_speed,
int unit) {
3376 if (
unit == -1)
unit = g_iSpeedFormat;
3382 ret = usr_speed / 1.15078;
3385 ret = usr_speed / 1.852;
3388 ret = usr_speed / 0.514444444;
3396 double fromUsrWindSpeed(
double usr_wspeed,
int unit) {
3398 if (
unit == -1)
unit = g_iWindSpeedFormat;
3404 ret = usr_wspeed / 0.514444444;
3407 ret = usr_wspeed / 1.15078;
3410 ret = usr_wspeed / 1.852;
3420 double fromUsrTemp(
double usr_temp,
int unit) {
3422 if (
unit == -1)
unit = g_iTempFormat;
3428 ret = (usr_temp - 32) * 5.0 / 9.0;
3431 ret = usr_temp - 273.15;
3437 wxString formatAngle(
double angle) {
3439 if (g_bShowMag && g_bShowTrue) {
3440 out.Printf(wxT(
"%03.0f %cT (%.0f %cM)"), angle, 0x00B0,
3441 toMagnetic(angle), 0x00B0);
3442 }
else if (g_bShowTrue) {
3443 out.Printf(wxT(
"%03.0f %cT"), angle, 0x00B0);
3445 out.Printf(wxT(
"%03.0f %cM"), toMagnetic(angle), 0x00B0);
3451 void AlphaBlending(
ocpnDC &dc,
int x,
int y,
int size_x,
int size_y,
3452 float radius, wxColour color,
unsigned char transparency) {
3453 wxDC *pdc = dc.GetDC();
3456 wxBitmap obm(size_x, size_y);
3458 mdc1.SelectObject(obm);
3459 mdc1.Blit(0, 0, size_x, size_y, pdc, x, y);
3460 mdc1.SelectObject(wxNullBitmap);
3461 wxImage oim = obm.ConvertToImage();
3464 wxBitmap olbm(size_x, size_y);
3465 wxMemoryDC oldc(olbm);
3466 if (!oldc.IsOk())
return;
3468 oldc.SetBackground(*wxBLACK_BRUSH);
3469 oldc.SetBrush(*wxWHITE_BRUSH);
3472 if (radius > 0.0) oldc.DrawRoundedRectangle(0, 0, size_x, size_y, radius);
3474 wxImage dest = olbm.ConvertToImage();
3475 unsigned char *dest_data =
3476 (
unsigned char *)malloc(size_x * size_y * 3 *
sizeof(
unsigned char));
3477 unsigned char *bg = oim.GetData();
3478 unsigned char *box = dest.GetData();
3479 unsigned char *d = dest_data;
3486 float alpha = 1.0 - (float)transparency / 255.0;
3487 int sb = size_x * size_y;
3488 for (
int i = 0; i < sb; i++) {
3490 if (*box == 0 && radius > 0.0) a = 1.0;
3491 int r = ((*bg++) * a) + (1.0 - a) * color.Red();
3494 int g = ((*bg++) * a) + (1.0 - a) * color.Green();
3497 int b = ((*bg++) * a) + (1.0 - a) * color.Blue();
3502 dest.SetData(dest_data);
3506 dc.DrawBitmap(dbm, x, y,
false);
3510 dc.CalcBoundingBox(x, y);
3511 dc.CalcBoundingBox(x + size_x, y + size_y);
3516 float radMod = wxMax(radius, 2.0);
3517 wxColour c(color.Red(), color.Green(), color.Blue(), transparency);
3518 dc.SetBrush(wxBrush(c));
3519 dc.SetPen(wxPen(c, 1));
3520 dc.DrawRoundedRectangle(x, y, size_x, size_y, radMod);
3522 glDisable(GL_BLEND);
3528 void GpxDocument::SeedRandom() {
3532 wxDateTime x = wxDateTime::UNow();
3533 long seed = x.GetMillisecond();
3534 seed *= x.GetTicks();
3538 void DimeControl(wxWindow *ctrl) {
3544 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) {
3552 if(wxSystemSettings::GetColour(wxSystemColour::wxSYS_COLOUR_WINDOW).Red() < 128) {
3557 if (NULL == ctrl)
return;
3559 wxColour col, window_back_color, gridline, uitext, udkrd, ctrl_back_color,
3561 col = GetGlobalColor(_T(
"DILG0"));
3562 window_back_color = GetGlobalColor(_T(
"DILG1"));
3563 ctrl_back_color = GetGlobalColor(_T(
"DILG1"));
3564 text_color = GetGlobalColor(_T(
"DILG3"));
3565 uitext = GetGlobalColor(_T(
"UITX1"));
3566 udkrd = GetGlobalColor(_T(
"UDKRD"));
3567 gridline = GetGlobalColor(_T(
"GREY2"));
3569 DimeControl(ctrl, col, window_back_color, ctrl_back_color, text_color, uitext,
3573 void DimeControl(wxWindow *ctrl, wxColour col, wxColour window_back_color,
3574 wxColour ctrl_back_color, wxColour text_color, wxColour uitext,
3575 wxColour udkrd, wxColour gridline) {
3581 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) {
3586 ColorScheme cs = global_color_scheme;
3590 (cs == GLOBAL_COLOR_SCHEME_DUSK || cs == GLOBAL_COLOR_SCHEME_NIGHT);
3592 static int depth = 0;
3598 window_back_color = wxNullColour;
3600 window_back_color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
3602 col = wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX);
3603 uitext = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
3606 ctrl->SetBackgroundColour(window_back_color);
3607 if (darkMode) ctrl->SetForegroundColour(text_color);
3610 wxWindowList kids = ctrl->GetChildren();
3611 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
3612 wxWindowListNode *node = kids.Item(i);
3613 wxWindow *win = node->GetData();
3615 if (win->IsKindOf(CLASSINFO(wxListBox)) ||
3616 win->IsKindOf(CLASSINFO(wxListCtrl)) ||
3617 win->IsKindOf(CLASSINFO(wxTextCtrl))
3618 || win->IsKindOf(CLASSINFO(wxTimePickerCtrl))
3620 win->SetBackgroundColour(col);
3621 }
else if (win->IsKindOf(CLASSINFO(wxStaticText)) ||
3622 win->IsKindOf(CLASSINFO(wxCheckBox)) ||
3623 win->IsKindOf(CLASSINFO(wxRadioButton))) {
3624 win->SetForegroundColour(uitext);
3631 else if (win->IsKindOf(CLASSINFO(wxBitmapComboBox)) ||
3632 win->IsKindOf(CLASSINFO(wxChoice)) ||
3633 win->IsKindOf(CLASSINFO(wxComboBox)) ||
3634 win->IsKindOf(CLASSINFO(wxTreeCtrl))) {
3635 win->SetBackgroundColour(col);
3638 else if (win->IsKindOf(CLASSINFO(wxScrolledWindow)) ||
3639 win->IsKindOf(CLASSINFO(wxGenericDirCtrl)) ||
3640 win->IsKindOf(CLASSINFO(wxListbook)) ||
3641 win->IsKindOf(CLASSINFO(wxButton)) ||
3642 win->IsKindOf(CLASSINFO(wxToggleButton))) {
3643 win->SetBackgroundColour(window_back_color);
3646 else if (win->IsKindOf(CLASSINFO(wxNotebook))) {
3647 ((wxNotebook *)win)->SetBackgroundColour(window_back_color);
3648 ((wxNotebook *)win)->SetForegroundColour(text_color);
3652 else if (win->IsKindOf(CLASSINFO(wxHtmlWindow))) {
3653 if (cs != GLOBAL_COLOR_SCHEME_DAY && cs != GLOBAL_COLOR_SCHEME_RGB)
3654 ((wxPanel *)win)->SetBackgroundColour(ctrl_back_color);
3656 ((wxPanel *)win)->SetBackgroundColour(wxNullColour);
3659 else if (win->IsKindOf(CLASSINFO(wxGrid))) {
3660 ((wxGrid *)win)->SetDefaultCellBackgroundColour(window_back_color);
3661 ((wxGrid *)win)->SetDefaultCellTextColour(uitext);
3662 ((wxGrid *)win)->SetLabelBackgroundColour(col);
3663 ((wxGrid *)win)->SetLabelTextColour(uitext);
3664 #if !wxCHECK_VERSION(3, 0, 0)
3665 ((wxGrid *)win)->SetDividerPen(wxPen(col));
3667 ((wxGrid *)win)->SetGridLineColour(gridline);
3670 if (win->GetChildren().GetCount() > 0) {
3673 DimeControl(w, col, window_back_color, ctrl_back_color, text_color,
3674 uitext, udkrd, gridline);
3680 #define LUMIMOSITY_NIGHT (-0.8)
3681 #define LUMIMOSITY_DUSK (-0.5)
3683 wxColor GetDimedColor(
const wxColor& c)
3685 switch (global_color_scheme) {
3686 case ColorScheme::GLOBAL_COLOR_SCHEME_NIGHT:
3688 wxColor(wxMax(0, wxMin(c.Red() + c.Red() * LUMIMOSITY_NIGHT, 255)),
3689 wxMax(0, wxMin(c.Green() + c.Green() * LUMIMOSITY_NIGHT, 255)),
3690 wxMax(0, wxMin(c.Blue() + c.Blue() * LUMIMOSITY_NIGHT, 255))));
3691 case ColorScheme::GLOBAL_COLOR_SCHEME_DUSK:
3693 wxColor(wxMax(0, wxMin(c.Red() + c.Red() * LUMIMOSITY_DUSK, 255)),
3694 wxMax(0, wxMin(c.Green() + c.Green() * LUMIMOSITY_DUSK, 255)),
3695 wxMax(0, wxMin(c.Blue() + c.Blue() * LUMIMOSITY_DUSK, 255))));
Global state for AIS decoder.
Wrapper for global variable, supports notification events when value changes.
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.
Global variables reflecting command line options and arguments.