42#include <wx/bmpcbox.h>
44#include <wx/filename.h>
45#include <wx/graphics.h>
47#include <wx/listbook.h>
48#include <wx/listimpl.cpp>
49#include <wx/progdlg.h>
50#include <wx/sstream.h>
52#include <wx/timectrl.h>
53#include <wx/tokenzr.h>
55#include "model/ais_decoder.h"
58#include "model/config_vars.h"
59#include "model/conn_params.h"
60#include "model/cutil.h"
61#include "model/geodesic.h"
62#include "model/georef.h"
63#include "model/idents.h"
64#include "model/multiplexer.h"
65#include "model/nav_object_database.h"
66#include "model/navutil_base.h"
67#include "model/own_ship.h"
69#include "model/route.h"
70#include "model/routeman.h"
71#include "model/select.h"
72#include "model/track.h"
75#include "CanvasConfig.h"
88#include "observable_globvar.h"
90#include "ocpn_frame.h"
92#include "OCPNPlatform.h"
93#include "OCPN_Sound.h"
96#include "snd_config.h"
100#include "glChartCanvas.h"
104#include "androidUTIL.h"
112extern double g_ChartNotRenderScaleFactor;
113extern int g_restore_stackindex;
114extern int g_restore_dbindex;
115extern RouteList *pRouteList;
116extern std::vector<Track *> g_TrackList;
117extern LayerList *pLayerList;
119extern double vLat, vLon;
120extern double kLat, kLon;
121extern ColorScheme global_color_scheme;
122extern int g_nbrightness;
123extern bool g_bShowStatusBar;
124extern bool g_bUIexpert;
125extern bool g_bFullscreen;
127extern wxString g_SENCPrefix;
128extern wxString g_UserPresLibData;
130extern wxString *pInit_Chart_Dir;
131extern wxString gWorldMapLocation;
132extern wxString gWorldShapefileLocation;
134extern bool s_bSetSystemTime;
135extern bool g_bDisplayGrid;
136extern bool g_bPlayShipsBells;
137extern int g_iSoundDeviceIndex;
138extern bool g_bFullscreenToolbar;
139extern bool g_bShowLayers;
140extern bool g_bTransparentToolbar;
141extern bool g_bPermanentMOBIcon;
143extern bool g_bShowDepthUnits;
144extern bool g_bAutoAnchorMark;
145extern bool g_bskew_comp;
146extern bool g_bopengl;
147extern bool g_bSoftwareGL;
148extern bool g_bsmoothpanzoom;
149extern bool g_fog_overzoom;
150extern double g_overzoom_emphasis_base;
151extern bool g_oz_vector_scale;
152extern double g_plus_minus_zoom_factor;
153extern bool g_bShowOutlines;
154extern bool g_bShowActiveRouteHighway;
155extern bool g_bShowRouteTotal;
156extern int g_nAWDefault;
158extern bool g_btenhertz;
160extern int g_nframewin_x;
161extern int g_nframewin_y;
162extern int g_nframewin_posx;
163extern int g_nframewin_posy;
164extern bool g_bframemax;
166extern wxString g_VisibleLayers;
167extern wxString g_InvisibleLayers;
168extern wxString g_VisiNameinLayers;
169extern wxString g_InVisiNameinLayers;
171extern wxArrayString *pMessageOnceArray;
174extern bool g_bShowLiveETA;
175extern double g_defaultBoatSpeed;
176extern double g_defaultBoatSpeedUserUnit;
178extern bool g_bUseOnlyConfirmedAISName;
179extern int g_ScaledNumWeightSOG;
181extern int g_S57_dialog_sx, g_S57_dialog_sy;
182int g_S57_extradialog_sx, g_S57_extradialog_sy;
184extern int g_iNavAidRadarRingsNumberVisible;
185extern bool g_bNavAidRadarRingsShown;
186extern float g_fNavAidRadarRingsStep;
187extern int g_pNavAidRadarRingsStepUnits;
188extern bool g_bWayPointPreventDragging;
189extern bool g_bConfirmObjectDelete;
190extern wxColour g_colourOwnshipRangeRingsColour;
192extern bool g_bEnableZoomToCursor;
193extern wxString g_toolbarConfig;
194extern double g_TrackIntervalSeconds;
196extern int g_nCacheLimit;
197extern int g_memCacheLimit;
199extern bool g_bGDAL_Debug;
200extern bool g_bDebugCM93;
201extern bool g_bDebugS57;
203extern double g_ownship_predictor_minutes;
204extern int g_cog_predictor_style;
205extern wxString g_cog_predictor_color;
206extern int g_cog_predictor_endmarker;
207extern int g_cog_predictor_width;
208extern int g_ownship_HDTpredictor_style;
209extern wxString g_ownship_HDTpredictor_color;
210extern int g_ownship_HDTpredictor_endmarker;
211extern int g_ownship_HDTpredictor_width;
212extern double g_ownship_HDTpredictor_miles;
214extern bool g_own_ship_sog_cog_calc;
215extern int g_own_ship_sog_cog_calc_damp_sec;
217extern bool g_bShowMenuBar;
218extern bool g_bShowCompassWin;
220extern s52plib *ps52plib;
222extern int g_cm93_zoom_factor;
223extern bool g_b_legacy_input_filter_behaviour;
224extern bool g_bShowDetailSlider;
225extern int g_detailslider_dialog_x, g_detailslider_dialog_y;
227extern bool g_bUseGreenShip;
229extern int g_OwnShipmmsi;
230extern int g_OwnShipIconType;
231extern double g_n_ownship_length_meters;
232extern double g_n_ownship_beam_meters;
233extern double g_n_gps_antenna_offset_y;
234extern double g_n_gps_antenna_offset_x;
235extern int g_n_ownship_min_mm;
236extern int g_maxzoomin;
238extern bool g_bShowShipToActive;
239extern int g_shipToActiveStyle;
240extern int g_shipToActiveColor;
242extern bool g_bPreserveScaleOnX;
243extern bool g_bsimplifiedScalebar;
245extern bool g_bUseGLL;
247extern wxString g_locale;
248extern wxString g_localeOverride;
250extern bool g_bCourseUp;
251extern bool g_bLookAhead;
252extern int g_COGAvgSec;
253extern bool g_bShowChartBar;
255extern int g_MemFootMB;
257extern wxString g_AW1GUID;
258extern wxString g_AW2GUID;
259extern int g_BSBImgDebug;
261extern int n_NavMessageShown;
262extern wxString g_config_version_string;
264extern wxString g_CmdSoundString;
266extern bool g_bDebugGPSD;
270extern bool g_bQuiltEnable;
271extern bool g_bFullScreenQuilt;
272extern bool g_bQuiltStart;
274extern int g_SkewCompUpdatePeriod;
276extern int g_maintoolbar_x;
277extern int g_maintoolbar_y;
278extern long g_maintoolbar_orient;
280extern int g_lastClientRectx;
281extern int g_lastClientRecty;
282extern int g_lastClientRectw;
283extern int g_lastClientRecth;
285extern bool g_bHighliteTracks;
286extern int g_cog_predictor_width;
287extern int g_ais_cog_predictor_width;
289extern wxColour g_colourTrackLineColour;
290extern wxString g_default_wp_icon;
292extern ChartGroupArray *g_pGroupArray;
294extern bool g_bDebugOGL;
295extern int g_tcwin_scale;
296extern wxString g_uploadConnection;
299extern std::vector<std::string> TideCurrentDataSet;
300extern wxString g_TCData_Dir;
304extern bool g_bGLexpert;
306extern int g_SENC_LOD_pixels;
307extern ArrayOfMmsiProperties g_MMSI_Props_Array;
309extern int g_chart_zoom_modifier_raster;
310extern int g_chart_zoom_modifier_vector;
312extern bool g_bShowTrackPointTime;
314extern bool g_bAdvanceRouteWaypointOnArrivalOnly;
315extern double g_display_size_mm;
316extern std::vector<size_t> g_config_display_size_mm;
317extern bool g_config_display_size_manual;
319extern bool g_benable_rotate;
320extern bool g_bEmailCrashReport;
322extern int g_default_font_size;
323extern wxString g_default_font_facename;
325extern bool g_bAutoHideToolbar;
326extern int g_nAutoHideToolbar;
327extern int g_GUIScaleFactor;
328extern int g_ChartScaleFactor;
329extern float g_MarkScaleFactorExp;
331extern int g_ShipScaleFactor;
332extern float g_ShipScaleFactorExp;
333extern int g_ENCSoundingScaleFactor;
334extern int g_ENCTextScaleFactor;
336extern int g_iENCToolbarPosX;
337extern int g_iENCToolbarPosY;
338extern bool g_bRollover;
340extern bool g_bSpaceDropMark;
342extern bool g_bShowTide;
343extern bool g_bShowCurrent;
345extern wxString g_uiStyle;
346extern bool g_btrackContinuous;
351extern unsigned int g_canvasConfig;
352extern wxString g_lastAppliedTemplateGUID;
354extern int g_route_prop_x, g_route_prop_y;
355extern int g_route_prop_sx, g_route_prop_sy;
356extern int g_AndroidVersionCode;
358extern wxString g_ObjQFileExt;
362bool g_bShowMuiZoomButtons =
true;
364double g_mouse_zoom_sensitivity;
365int g_mouse_zoom_sensitivity_ui;
372static const long long lNaN = 0xfff8000000000000;
373#define NAN (*(double *)&lNaN)
378wxString GetLayerName(
int id) {
379 wxString name(_T(
"unknown layer"));
380 if (
id <= 0)
return (name);
381 LayerList::iterator it;
383 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
385 if (lay->m_LayerID ==
id)
return (lay->m_LayerName);
391void appendOSDirSlash(wxString *pString);
398MyConfig::MyConfig(
const wxString &LocalFileName)
399 : wxFileConfig(_T (
""), _T (
""), LocalFileName, _T (
""),
400 wxCONFIG_USE_LOCAL_FILE) {
402 wxFileName config_file(LocalFileName);
404 config_file.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR);
405 m_sNavObjSetFile += _T (
"navobj.xml" );
406 m_sNavObjSetChangesFile = m_sNavObjSetFile + _T (
".changes" );
408 m_pNavObjectInputSet = NULL;
409 m_pNavObjectChangesSet = NavObjectChanges::getInstance();
412MyConfig::~MyConfig() {}
414void MyConfig::CreateRotatingNavObjBackup() {
420 if (wxFileExists(m_sNavObjSetFile)) {
421 int month = wxDateTime::Now().GetMonth() + 1;
423 wxString::Format(_T(
"%s.m%d"), m_sNavObjSetFile.c_str(), month);
424 if (!wxFileExists(fn)) {
425 wxCopyFile(m_sNavObjSetFile, fn);
428 for (wxDateTime::wxDateTime_t i = 1; i <= month - 3; i++) {
429 fn = wxString::Format(_T(
"%s.m%d"), m_sNavObjSetFile.c_str(), i);
430 if (wxFileExists(fn)) {
434 for (wxDateTime::wxDateTime_t i = month + 1; i <= 12; i++) {
435 fn = wxString::Format(_T(
"%s.m%d"), m_sNavObjSetFile.c_str(), i);
436 if (wxFileExists(fn)) {
441 for (wxDateTime::wxDateTime_t i = month + 1; i <= 12 - month; i++) {
442 fn = wxString::Format(_T(
"%s.m%d"), m_sNavObjSetFile.c_str(), i);
443 if (wxFileExists(fn)) {
449 wxDateTime::wxDateTime_t week = wxDateTime::Now().GetWeekOfYear();
450 fn = wxString::Format(_T(
"%s.w%u"), m_sNavObjSetFile.c_str(), week);
451 if (!wxFileExists(fn)) {
452 wxCopyFile(m_sNavObjSetFile, fn);
455 for (wxDateTime::wxDateTime_t i = 1; i <= week - 4; i++) {
456 fn = wxString::Format(_T(
"%s.w%u"), m_sNavObjSetFile.c_str(), i);
457 if (wxFileExists(fn)) {
461 for (wxDateTime::wxDateTime_t i = week + 1; i <= 53; i++) {
462 fn = wxString::Format(_T(
"%s.w%u"), m_sNavObjSetFile.c_str(), i);
463 if (wxFileExists(fn)) {
468 for (wxDateTime::wxDateTime_t i = week + 1; i <= 53 - week; i++) {
469 fn = wxString::Format(_T(
"%s.w%u"), m_sNavObjSetFile.c_str(), i);
470 if (wxFileExists(fn)) {
481 if (g_navobjbackups > 0) {
483 wxString oldname = m_sNavObjSetFile;
484 wxString newname = wxString::Format(_T(
"%s.1"), m_sNavObjSetFile.c_str());
486 wxFileOffset s_diff = 1;
487 if (::wxFileExists(newname)) {
488 if (f.Open(oldname)) {
493 if (f.Open(newname)) {
494 s_diff -= f.Length();
500 for (
int i = g_navobjbackups - 1; i >= 1; i--) {
501 oldname = wxString::Format(_T(
"%s.%d"), m_sNavObjSetFile.c_str(), i);
503 wxString::Format(_T(
"%s.%d"), m_sNavObjSetFile.c_str(), i + 1);
504 if (wxFile::Exists(oldname)) wxCopyFile(oldname, newname);
507 wxULongLong size = wxFileName::GetSize(m_sNavObjSetFile);
508 if (wxFile::Exists(m_sNavObjSetFile) && size > 0) {
509 newname = wxString::Format(_T(
"%s.1"), m_sNavObjSetFile.c_str());
510 wxCopyFile(m_sNavObjSetFile, newname);
516 for (
int i = g_navobjbackups + 1; i <= 99; i++)
518 wxString::Format(_T(
"%s.%d"), m_sNavObjSetFile.c_str(), i)))
519 wxRemoveFile(wxString::Format(_T(
"%s.%d"), m_sNavObjSetFile.c_str(), i));
524int MyConfig::LoadMyConfig() {
525 int display_width, display_height;
526 display_width = g_monitor_info[g_current_monitor].width;
527 display_height = g_monitor_info[g_current_monitor].height;
531 g_TalkerIdText = _T(
"EC");
532 g_maxWPNameLength = 6;
533 g_NMEAAPBPrecision = 3;
536 g_GLOptions.m_bUseAcceleratedPanning =
true;
537 g_GLOptions.m_GLPolygonSmoothing =
true;
538 g_GLOptions.m_GLLineSmoothing =
true;
539 g_GLOptions.m_iTextureDimension = 512;
540 g_GLOptions.m_iTextureMemorySize = 128;
542 g_GLOptions.m_iTextureMemorySize =
543 wxMax(128, g_GLOptions.m_iTextureMemorySize);
544 g_GLOptions.m_bTextureCompressionCaching =
545 g_GLOptions.m_bTextureCompression;
549 g_maintoolbar_orient = wxTB_HORIZONTAL;
550 g_iENCToolbarPosX = -1;
551 g_iENCToolbarPosY = -1;
552 g_restore_dbindex = -1;
553 g_ChartNotRenderScaleFactor = 1.5;
554 g_detailslider_dialog_x = 200L;
555 g_detailslider_dialog_y = 200L;
556 g_SENC_LOD_pixels = 2;
557 g_SkewCompUpdatePeriod = 10;
559 g_bShowStatusBar = 1;
560 g_bShowCompassWin = 1;
561 g_iSoundDeviceIndex = -1;
562 g_bFullscreenToolbar = 1;
563 g_bTransparentToolbar = 0;
565 g_bShowDepthUnits = 1;
566 g_bShowActiveRouteHighway = 1;
568 g_defaultBoatSpeed = 6.0;
569 g_ownship_predictor_minutes = 5;
570 g_cog_predictor_style = 105;
571 g_cog_predictor_color = _T(
"rgb(255,0,0)" );
572 g_cog_predictor_endmarker = 1;
573 g_ownship_HDTpredictor_style = 105;
574 g_ownship_HDTpredictor_color = _T(
"rgb(255,0,0)" );
575 g_ownship_HDTpredictor_endmarker = 1;
576 g_ownship_HDTpredictor_width = 0;
577 g_cog_predictor_width = 3;
578 g_ownship_HDTpredictor_miles = 1;
579 g_n_ownship_min_mm = 2;
580 g_own_ship_sog_cog_calc_damp_sec = 1;
581 g_bFullScreenQuilt = 1;
582 g_track_rotate_time_type = TIME_TYPE_COMPUTER;
583 g_bHighliteTracks = 1;
584 g_bPreserveScaleOnX = 1;
586 g_benableAISNameCache =
true;
587 g_n_arrival_circle_radius = 0.05;
588 g_plus_minus_zoom_factor = 2.0;
589 g_mouse_zoom_sensitivity = 1.5;
590 g_datetime_format =
"UTC";
592 g_AISShowTracks_Mins = 20;
593 g_AISShowTracks_Limit = 300.0;
594 g_ShowScaled_Num = 10;
595 g_ScaledNumWeightSOG = 50;
596 g_ScaledNumWeightCPA = 60;
597 g_ScaledNumWeightTCPA = 25;
598 g_ScaledSizeMinimal = 50;
599 g_ScaledNumWeightRange = 75;
600 g_ScaledNumWeightSizeOfT = 25;
601 g_Show_Target_Name_Scale = 250000;
602 g_bWplUsePosition = 0;
604 g_ais_cog_predictor_width = 3;
605 g_ais_alert_dialog_sx = 200;
606 g_ais_alert_dialog_sy = 200;
607 g_ais_alert_dialog_x = 200;
608 g_ais_alert_dialog_y = 200;
609 g_ais_query_dialog_x = 200;
610 g_ais_query_dialog_y = 200;
611 g_AisTargetList_range = 40;
612 g_AisTargetList_sortColumn = 2;
613 g_S57_dialog_sx = 400;
614 g_S57_dialog_sy = 400;
615 g_S57_extradialog_sx = 400;
616 g_S57_extradialog_sy = 400;
625 g_iNavAidRadarRingsNumberVisible = 0;
626 g_bNavAidRadarRingsShown =
false;
627 g_fNavAidRadarRingsStep = 1.0;
628 g_pNavAidRadarRingsStepUnits = 0;
629 g_colourOwnshipRangeRingsColour = *wxRED;
630 g_iWaypointRangeRingsNumber = 0;
631 g_fWaypointRangeRingsStep = 1.0;
632 g_iWaypointRangeRingsStepUnits = 0;
633 g_colourWaypointRangeRingsColour = wxColour(*wxRED);
634 g_bConfirmObjectDelete =
true;
636 g_TrackIntervalSeconds = 60.0;
637 g_TrackDeltaDistance = 0.10;
638 g_route_line_width = 2;
639 g_track_line_width = 2;
640 g_colourTrackLineColour = wxColour(243, 229, 47);
643 g_default_wp_icon = _T(
"triangle");
644 g_default_routepoint_icon = _T(
"diamond");
648 g_ObjQFileExt = _T(
"txt,rtf,png,html,gif,tif,jpg");
651 int ret_Val = LoadMyConfigRaw();
655 g_ChartScaleFactorExp =
656 g_Platform->GetChartScaleFactorExp(g_ChartScaleFactor);
657 g_ShipScaleFactorExp =
658 g_Platform->GetChartScaleFactorExp(g_ShipScaleFactor);
659 g_MarkScaleFactorExp =
660 g_Platform->GetMarkScaleFactorExp(g_ChartScaleFactor);
662 g_COGFilterSec = wxMin(g_COGFilterSec, MAX_COGSOG_FILTER_SECONDS);
663 g_COGFilterSec = wxMax(g_COGFilterSec, 1);
664 g_SOGFilterSec = g_COGFilterSec;
666 if (!g_bShowTrue && !g_bShowMag) g_bShowTrue =
true;
668 wxMin(g_COGAvgSec, MAX_COG_AVERAGE_SECONDS);
670 if (g_bInlandEcdis) g_bLookAhead = 1;
672 if (g_bdisable_opengl) g_bopengl =
false;
676 g_GLOptions.m_iTextureMemorySize =
677 wxMax(128, g_GLOptions.m_iTextureMemorySize);
678 g_GLOptions.m_bTextureCompressionCaching =
679 g_GLOptions.m_bTextureCompression;
683 g_chart_zoom_modifier_raster = wxMin(g_chart_zoom_modifier_raster, 5);
684 g_chart_zoom_modifier_raster = wxMax(g_chart_zoom_modifier_raster, -5);
685 g_chart_zoom_modifier_vector = wxMin(g_chart_zoom_modifier_vector, 5);
686 g_chart_zoom_modifier_vector = wxMax(g_chart_zoom_modifier_vector, -5);
687 g_cm93_zoom_factor = wxMin(g_cm93_zoom_factor, CM93_ZOOM_FACTOR_MAX_RANGE);
689 wxMax(g_cm93_zoom_factor, (-CM93_ZOOM_FACTOR_MAX_RANGE));
691 if ((g_detailslider_dialog_x < 0) ||
692 (g_detailslider_dialog_x > display_width))
693 g_detailslider_dialog_x = 5;
694 if ((g_detailslider_dialog_y < 0) ||
695 (g_detailslider_dialog_y > display_height))
696 g_detailslider_dialog_y = 5;
698 g_defaultBoatSpeedUserUnit = toUsrSpeed(g_defaultBoatSpeed, -1);
699 g_n_ownship_min_mm = wxMax(g_n_ownship_min_mm, 2);
701 if (g_navobjbackups > 99) g_navobjbackups = 99;
702 if (g_navobjbackups < 0) g_navobjbackups = 0;
703 g_n_arrival_circle_radius = wxClip(g_n_arrival_circle_radius, 0.001, 0.6);
705 g_selection_radius_mm = wxMax(g_selection_radius_mm, 0.5);
706 g_selection_radius_touch_mm = wxMax(g_selection_radius_touch_mm, 1.0);
708 g_Show_Target_Name_Scale = wxMax(5000, g_Show_Target_Name_Scale);
710 if ((g_ais_alert_dialog_x < 0) || (g_ais_alert_dialog_x > display_width))
711 g_ais_alert_dialog_x = 5;
712 if ((g_ais_alert_dialog_y < 0) || (g_ais_alert_dialog_y > display_height))
713 g_ais_alert_dialog_y = 5;
714 if ((g_ais_query_dialog_x < 0) || (g_ais_query_dialog_x > display_width))
715 g_ais_query_dialog_x = 5;
716 if ((g_ais_query_dialog_y < 0) || (g_ais_query_dialog_y > display_height))
717 g_ais_query_dialog_y = 5;
719 SwitchInlandEcdisMode(g_bInlandEcdis);
721 global_color_scheme =
722 GLOBAL_COLOR_SCHEME_DUSK;
731int MyConfig::LoadMyConfigRaw(
bool bAsTemplate) {
735 int display_width, display_height;
736 display_width = g_monitor_info[g_current_monitor].width;
737 display_height = g_monitor_info[g_current_monitor].height;
740 SetPath(_T (
"/Settings" ));
741 Read(
"ActiveRoute", &g_active_route);
742 Read(
"PersistActiveRoute", &g_persist_active_route);
743 Read(_T (
"LastAppliedTemplate" ), &g_lastAppliedTemplateGUID);
744 Read(_T (
"CompatOS" ), &g_compatOS);
745 Read(_T (
"CompatOsVersion" ), &g_compatOsVersion);
748 Read(_T (
"ConfigVersionString" ), &g_config_version_string);
749 Read(_T(
"CmdSoundString"), &g_CmdSoundString, wxString(OCPN_SOUND_CMD));
750 if (wxIsEmpty(g_CmdSoundString)) g_CmdSoundString = wxString(OCPN_SOUND_CMD);
751 Read(_T (
"NavMessageShown" ), &n_NavMessageShown);
753 Read(_T (
"AndroidVersionCode" ), &g_AndroidVersionCode);
755 Read(_T (
"UIexpert" ), &g_bUIexpert);
757 Read(_T (
"UIStyle" ), &g_uiStyle);
759 Read(_T (
"NCacheLimit" ), &g_nCacheLimit);
761 Read(_T (
"InlandEcdis" ),
765 Read(_T(
"SpaceDropMark" ), &g_bSpaceDropMark);
768 Read(_T (
"MEMCacheLimit" ), &mem_limit);
770 g_memCacheLimit = mem_limit * 1024;
772 Read(_T (
"UseModernUI5" ), &g_useMUI);
774 Read(_T(
"NCPUCount" ), &g_nCPUCount);
776 Read(_T (
"DebugGDAL" ), &g_bGDAL_Debug);
777 Read(_T (
"DebugNMEA" ), &g_nNMEADebug);
778 Read(_T (
"AnchorWatchDefault" ), &g_nAWDefault);
779 Read(_T (
"AnchorWatchMax" ), &g_nAWMax);
780 Read(_T (
"GPSDogTimeout" ), &gps_watchdog_timeout_ticks);
781 Read(_T (
"DebugCM93" ), &g_bDebugCM93);
782 Read(_T (
"DebugS57" ),
784 Read(_T (
"DebugBSBImg" ), &g_BSBImgDebug);
785 Read(_T (
"DebugGPSD" ), &g_bDebugGPSD);
786 Read(_T (
"MaxZoomScale" ), &g_maxzoomin);
787 g_maxzoomin = wxMax(g_maxzoomin, 50);
789 Read(_T (
"DefaultFontSize"), &g_default_font_size);
790 Read(_T (
"DefaultFontFacename"), &g_default_font_facename);
792 Read(_T (
"UseGreenShipIcon" ), &g_bUseGreenShip);
794 Read(_T (
"AutoHideToolbar" ), &g_bAutoHideToolbar);
795 Read(_T (
"AutoHideToolbarSecs" ), &g_nAutoHideToolbar);
797 Read(_T (
"UseSimplifiedScalebar" ), &g_bsimplifiedScalebar);
798 Read(_T (
"ShowTide" ), &g_bShowTide);
799 Read(_T (
"ShowCurrent" ), &g_bShowCurrent);
802 Read(_T (
"DisplaySizeMM" ), &size_mm);
804 Read(_T (
"SelectionRadiusMM" ), &g_selection_radius_mm);
805 Read(_T (
"SelectionRadiusTouchMM" ), &g_selection_radius_touch_mm);
808 g_config_display_size_mm.clear();
809 wxStringTokenizer tokenizer(size_mm,
",");
810 while (tokenizer.HasMoreTokens()) {
811 wxString token = tokenizer.GetNextToken();
814 size = std::stoi(token.ToStdString());
815 }
catch (std::invalid_argument &e) {
818 if (size > 100 && size < 2000) {
819 g_config_display_size_mm.push_back(size);
821 g_config_display_size_mm.push_back(0);
824 Read(_T (
"DisplaySizeManual" ), &g_config_display_size_manual);
827 Read(_T (
"GUIScaleFactor" ), &g_GUIScaleFactor);
829 Read(_T (
"ChartObjectScaleFactor" ), &g_ChartScaleFactor);
830 Read(_T (
"ShipScaleFactor" ), &g_ShipScaleFactor);
831 Read(_T (
"ENCSoundingScaleFactor" ), &g_ENCSoundingScaleFactor);
832 Read(_T (
"ENCTextScaleFactor" ), &g_ENCTextScaleFactor);
833 Read(_T (
"ObjQueryAppendFilesExt" ), &g_ObjQFileExt);
836 Read(
"CatalogCustomURL", &g_catalog_custom_url);
837 Read(
"CatalogChannel", &g_catalog_channel);
839 Read(
"NetmaskBits", &g_netmask_bits);
843 Read(_T (
"FilterNMEA_Avg" ), &g_bfilter_cogsog);
844 Read(_T (
"FilterNMEA_Sec" ), &g_COGFilterSec);
845 Read(_T (
"GPSIdent" ), &g_GPS_Ident);
846 Read(_T (
"UseGarminHostUpload" ), &g_bGarminHostUpload);
847 Read(_T (
"UseNMEA_GLL" ), &g_bUseGLL);
848 Read(_T (
"UseMagAPB" ), &g_bMagneticAPB);
849 Read(_T (
"TrackContinuous" ), &g_btrackContinuous,
false);
850 Read(_T (
"FilterTrackDropLargeJump" ), &g_trackFilterMax, 1000);
853 Read(_T (
"ShowTrue" ), &g_bShowTrue);
854 Read(_T (
"ShowMag" ), &g_bShowMag);
857 Read(_T (
"UserMagVariation" ), &umv);
858 if (umv.Len()) umv.ToDouble(&g_UserVar);
860 Read(_T (
"ScreenBrightness" ), &g_nbrightness);
862 Read(_T (
"MemFootprintTargetMB" ), &g_MemFootMB);
864 Read(_T (
"WindowsComPortMax" ), &g_nCOMPortCheck);
866 Read(_T (
"ChartQuilting" ), &g_bQuiltEnable);
867 Read(_T (
"ChartQuiltingInitial" ), &g_bQuiltStart);
869 Read(_T (
"CourseUpMode" ), &g_bCourseUp);
870 Read(_T (
"COGUPAvgSeconds" ), &g_COGAvgSec);
871 Read(_T (
"LookAheadMode" ), &g_bLookAhead);
872 Read(_T (
"SkewToNorthUp" ), &g_bskew_comp);
873 Read(_T (
"TenHzUpdate" ), &g_btenhertz, 0);
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);
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" ),
992 &g_ownship_HDTpredictor_endmarker);
993 Read(_T (
"OwnshipHDTPredictorWidth" ), &g_ownship_HDTpredictor_width);
994 Read(_T (
"OwnshipHDTPredictorMiles" ), &g_ownship_HDTpredictor_miles);
996 Read(_T (
"OwnShipMMSINumber" ), &g_OwnShipmmsi);
997 Read(_T (
"OwnShipIconType" ), &g_OwnShipIconType);
998 Read(_T (
"OwnShipLength" ), &g_n_ownship_length_meters);
999 Read(_T (
"OwnShipWidth" ), &g_n_ownship_beam_meters);
1000 Read(_T (
"OwnShipGPSOffsetX" ), &g_n_gps_antenna_offset_x);
1001 Read(_T (
"OwnShipGPSOffsetY" ), &g_n_gps_antenna_offset_y);
1002 Read(_T (
"OwnShipMinSize" ), &g_n_ownship_min_mm);
1003 Read(_T (
"OwnShipSogCogCalc" ), &g_own_ship_sog_cog_calc);
1004 Read(_T (
"OwnShipSogCogCalcDampSec"), &g_own_ship_sog_cog_calc_damp_sec);
1005 Read(_T (
"ShowDirectRouteLine"), &g_bShowShipToActive);
1006 Read(_T (
"DirectRouteLineStyle"), &g_shipToActiveStyle);
1007 Read(_T(
"DirectRouteLineColor" ), &g_shipToActiveColor);
1010 Read(_T (
"RouteArrivalCircleRadius" ), &racr);
1011 if (racr.Len()) racr.ToDouble(&g_n_arrival_circle_radius);
1013 Read(_T (
"FullScreenQuilt" ), &g_bFullScreenQuilt);
1015 Read(_T (
"StartWithTrackActive" ), &g_bTrackCarryOver);
1016 Read(_T (
"AutomaticDailyTracks" ), &g_bTrackDaily);
1017 Read(_T (
"TrackRotateAt" ), &g_track_rotate_time);
1018 Read(_T (
"TrackRotateTimeType" ), &g_track_rotate_time_type);
1019 Read(_T (
"HighlightTracks" ), &g_bHighliteTracks);
1021 Read(_T (
"DateTimeFormat" ), &g_datetime_format);
1024 Read(_T (
"PlanSpeed" ), &stps);
1025 if (!stps.IsEmpty()) stps.ToDouble(&g_PlanSpeed);
1027 Read(_T (
"VisibleLayers" ), &g_VisibleLayers);
1028 Read(_T (
"InvisibleLayers" ), &g_InvisibleLayers);
1029 Read(_T (
"VisNameInLayers" ), &g_VisiNameinLayers);
1030 Read(_T (
"InvisNameInLayers" ), &g_InVisiNameinLayers);
1032 Read(_T (
"PreserveScaleOnX" ), &g_bPreserveScaleOnX);
1034 Read(_T (
"ShowMUIZoomButtons" ), &g_bShowMuiZoomButtons);
1036 Read(_T (
"Locale" ), &g_locale);
1037 Read(_T (
"LocaleOverride" ), &g_localeOverride);
1040 Read(_T (
"KeepNavobjBackups" ), &g_navobjbackups);
1044 Read(_T (
"LegacyInputCOMPortFilterBehaviour" ),
1045 &g_b_legacy_input_filter_behaviour);
1048 Read(_T(
"AdvanceRouteWaypointOnArrivalOnly" ),
1049 &g_bAdvanceRouteWaypointOnArrivalOnly);
1050 Read(
"EnableRootMenuDebug", &g_enable_root_menu_debug);
1052 Read(_T (
"EnableRotateKeys" ), &g_benable_rotate);
1053 Read(_T (
"EmailCrashReport" ), &g_bEmailCrashReport);
1055 g_benableAISNameCache =
true;
1056 Read(_T (
"EnableAISNameCache" ), &g_benableAISNameCache);
1058 Read(_T (
"EnableUDPNullHeader" ), &g_benableUDPNullHeader);
1060 SetPath(_T (
"/Settings/GlobalState" ));
1062 Read(_T (
"FrameWinX" ), &g_nframewin_x);
1063 Read(_T (
"FrameWinY" ), &g_nframewin_y);
1064 Read(_T (
"FrameWinPosX" ), &g_nframewin_posx);
1065 Read(_T (
"FrameWinPosY" ), &g_nframewin_posy);
1066 Read(_T (
"FrameMax" ), &g_bframemax);
1068 Read(_T (
"ClientPosX" ), &g_lastClientRectx);
1069 Read(_T (
"ClientPosY" ), &g_lastClientRecty);
1070 Read(_T (
"ClientSzX" ), &g_lastClientRectw);
1071 Read(_T (
"ClientSzY" ), &g_lastClientRecth);
1073 Read(_T(
"RoutePropSizeX" ), &g_route_prop_sx);
1074 Read(_T(
"RoutePropSizeY" ), &g_route_prop_sy);
1075 Read(_T(
"RoutePropPosX" ), &g_route_prop_x);
1076 Read(_T(
"RoutePropPosY" ), &g_route_prop_y);
1079 Read(_T (
"S52_DEPTH_UNIT_SHOW" ), &read_int);
1080 if (read_int >= 0) {
1081 read_int = wxMax(read_int, 0);
1082 read_int = wxMin(read_int, 2);
1083 g_nDepthUnitDisplay = read_int;
1087 SetPath(_T (
"/Settings/Audio" ));
1090 wxString sound_dir = g_Platform->GetSharedDataDir();
1091 sound_dir.Append(_T(
"sounds"));
1092 sound_dir.Append(wxFileName::GetPathSeparator());
1094 g_AIS_sound_file = sound_dir + _T(
"beep_ssl.wav");
1095 g_DSC_sound_file = sound_dir + _T(
"phonering1.wav");
1096 g_SART_sound_file = sound_dir + _T(
"beep3.wav");
1097 g_anchorwatch_sound_file = sound_dir + _T(
"beep1.wav");
1099 Read(_T (
"AISAlertSoundFile" ), &g_AIS_sound_file);
1100 Read(_T (
"DSCAlertSoundFile" ), &g_DSC_sound_file);
1101 Read(_T (
"SARTAlertSoundFile" ), &g_SART_sound_file);
1102 Read(_T (
"AnchorAlarmSoundFile" ), &g_anchorwatch_sound_file);
1104 Read(_T (
"bAIS_GCPA_AlertAudio" ), &g_bAIS_GCPA_Alert_Audio);
1105 Read(_T (
"bAIS_SART_AlertAudio" ), &g_bAIS_SART_Alert_Audio);
1106 Read(_T (
"bAIS_DSC_AlertAudio" ), &g_bAIS_DSC_Alert_Audio);
1107 Read(_T (
"bAnchorAlertAudio" ), &g_bAnchor_Alert_Audio);
1111 SetPath(_T (
"/Settings/AIS" ));
1113 g_bUseOnlyConfirmedAISName =
false;
1114 Read(_T (
"UseOnlyConfirmedAISName" ), &g_bUseOnlyConfirmedAISName);
1116 Read(_T (
"bNoCPAMax" ), &g_bCPAMax);
1118 Read(_T (
"NoCPAMaxNMi" ), &s);
1119 s.ToDouble(&g_CPAMax_NM);
1121 Read(_T (
"bCPAWarn" ), &g_bCPAWarn);
1123 Read(_T (
"CPAWarnNMi" ), &s);
1124 s.ToDouble(&g_CPAWarn_NM);
1126 Read(_T (
"bTCPAMax" ), &g_bTCPA_Max);
1128 Read(_T (
"TCPAMaxMinutes" ), &s);
1129 s.ToDouble(&g_TCPA_Max);
1131 Read(_T (
"bMarkLostTargets" ), &g_bMarkLost);
1133 Read(_T (
"MarkLost_Minutes" ), &s);
1134 s.ToDouble(&g_MarkLost_Mins);
1136 Read(_T (
"bRemoveLostTargets" ), &g_bRemoveLost);
1138 Read(_T (
"RemoveLost_Minutes" ), &s);
1139 s.ToDouble(&g_RemoveLost_Mins);
1141 Read(_T (
"bShowCOGArrows" ), &g_bShowCOG);
1143 Read(_T (
"bSyncCogPredictors"), &g_bSyncCogPredictors);
1145 Read(_T (
"CogArrowMinutes" ), &s);
1146 s.ToDouble(&g_ShowCOG_Mins);
1148 Read(_T (
"bShowTargetTracks" ), &g_bAISShowTracks);
1150 if (
Read(_T (
"TargetTracksLimit" ), &s)) {
1151 s.ToDouble(&g_AISShowTracks_Limit);
1152 g_AISShowTracks_Limit = wxMax(300.0, g_AISShowTracks_Limit);
1154 if (
Read(_T (
"TargetTracksMinutes" ), &s)) {
1155 s.ToDouble(&g_AISShowTracks_Mins);
1156 g_AISShowTracks_Mins = wxMax(1.0, g_AISShowTracks_Mins);
1157 g_AISShowTracks_Mins = wxMin(g_AISShowTracks_Limit, g_AISShowTracks_Mins);
1160 Read(_T (
"bHideMooredTargets" ), &g_bHideMoored);
1161 if (
Read(_T (
"MooredTargetMaxSpeedKnots" ), &s))
1162 s.ToDouble(&g_ShowMoored_Kts);
1164 g_SOGminCOG_kts = 0.2;
1165 if (
Read(_T (
"SOGMinimumForCOGDisplay" ), &s)) s.ToDouble(&g_SOGminCOG_kts);
1167 Read(_T (
"bShowScaledTargets"), &g_bAllowShowScaled);
1168 Read(_T (
"AISScaledNumber" ), &g_ShowScaled_Num);
1169 Read(_T (
"AISScaledNumberWeightSOG" ), &g_ScaledNumWeightSOG);
1170 Read(_T (
"AISScaledNumberWeightCPA" ), &g_ScaledNumWeightCPA);
1171 Read(_T (
"AISScaledNumberWeightTCPA" ), &g_ScaledNumWeightTCPA);
1172 Read(_T (
"AISScaledNumberWeightRange" ), &g_ScaledNumWeightRange);
1173 Read(_T (
"AISScaledNumberWeightSizeOfTarget" ), &g_ScaledNumWeightSizeOfT);
1174 Read(_T (
"AISScaledSizeMinimal" ), &g_ScaledSizeMinimal);
1175 Read(_T(
"AISShowScaled"), &g_bShowScaled);
1177 Read(_T (
"bShowAreaNotices" ), &g_bShowAreaNotices);
1178 Read(_T (
"bDrawAISSize" ), &g_bDrawAISSize);
1179 Read(_T (
"bDrawAISRealtime" ), &g_bDrawAISRealtime);
1180 Read(_T (
"bShowAISName" ), &g_bShowAISName);
1181 Read(_T (
"AISRealtimeMinSpeedKnots" ), &g_AIS_RealtPred_Kts, 0.7);
1182 Read(_T (
"bAISAlertDialog" ), &g_bAIS_CPA_Alert);
1183 Read(_T (
"ShowAISTargetNameScale" ), &g_Show_Target_Name_Scale);
1184 Read(_T (
"bWplIsAprsPositionReport" ), &g_bWplUsePosition);
1185 Read(_T (
"WplSelAction"), &g_WplAction);
1186 Read(_T (
"AISCOGPredictorWidth" ), &g_ais_cog_predictor_width);
1188 Read(_T (
"bAISAlertAudio" ), &g_bAIS_CPA_Alert_Audio);
1189 Read(_T (
"AISAlertAudioFile" ), &g_sAIS_Alert_Sound_File);
1190 Read(_T (
"bAISAlertSuppressMoored" ), &g_bAIS_CPA_Alert_Suppress_Moored);
1192 Read(_T (
"bAISAlertAckTimeout" ), &g_bAIS_ACK_Timeout);
1193 if (
Read(_T (
"AlertAckTimeoutMinutes" ), &s)) s.ToDouble(&g_AckTimeout_Mins);
1195 Read(_T (
"AlertDialogSizeX" ), &g_ais_alert_dialog_sx);
1196 Read(_T (
"AlertDialogSizeY" ), &g_ais_alert_dialog_sy);
1197 Read(_T (
"AlertDialogPosX" ), &g_ais_alert_dialog_x);
1198 Read(_T (
"AlertDialogPosY" ), &g_ais_alert_dialog_y);
1199 Read(_T (
"QueryDialogPosX" ), &g_ais_query_dialog_x);
1200 Read(_T (
"QueryDialogPosY" ), &g_ais_query_dialog_y);
1202 Read(_T (
"AISTargetListPerspective" ), &g_AisTargetList_perspective);
1203 Read(_T (
"AISTargetListRange" ), &g_AisTargetList_range);
1204 Read(_T (
"AISTargetListSortColumn" ), &g_AisTargetList_sortColumn);
1205 Read(_T (
"bAISTargetListSortReverse" ), &g_bAisTargetList_sortReverse);
1206 Read(_T (
"AISTargetListColumnSpec" ), &g_AisTargetList_column_spec);
1207 Read(_T (
"AISTargetListColumnOrder"), &g_AisTargetList_column_order);
1209 Read(_T (
"bAISRolloverShowClass" ), &g_bAISRolloverShowClass);
1210 Read(_T (
"bAISRolloverShowCOG" ), &g_bAISRolloverShowCOG);
1211 Read(_T (
"bAISRolloverShowCPA" ), &g_bAISRolloverShowCPA);
1213 Read(_T (
"S57QueryDialogSizeX" ), &g_S57_dialog_sx);
1214 Read(_T (
"S57QueryDialogSizeY" ), &g_S57_dialog_sy);
1215 Read(_T (
"S57QueryExtraDialogSizeX" ), &g_S57_extradialog_sx);
1216 Read(_T (
"S57QueryExtraDialogSizeY" ), &g_S57_extradialog_sy);
1218 wxString strpres(_T (
"PresentationLibraryData" ));
1220 SetPath(_T (
"/Directories" ));
1221 Read(strpres, &valpres);
1222 if (!valpres.IsEmpty()) g_UserPresLibData = valpres;
1224 wxString strs(_T (
"SENCFileLocation" ));
1225 SetPath(_T (
"/Directories" ));
1228 if (!vals.IsEmpty()) g_SENCPrefix = vals;
1230 SetPath(_T (
"/Directories" ));
1232 Read(_T (
"InitChartDir" ), &vald);
1234 wxString dirnamed(vald);
1235 if (!dirnamed.IsEmpty()) {
1236 if (pInit_Chart_Dir->IsEmpty())
1238 pInit_Chart_Dir->Clear();
1239 pInit_Chart_Dir->Append(vald);
1243 Read(_T (
"GPXIODir" ), &g_gpx_path);
1244 Read(_T (
"TCDataDir" ), &g_TCData_Dir);
1245 Read(_T (
"BasemapDir"), &gWorldMapLocation);
1246 Read(_T (
"BaseShapefileDir"), &gWorldShapefileLocation);
1247 Read(_T (
"pluginInstallDir"), &g_winPluginDir);
1248 wxLogMessage(
"winPluginDir, read from ini file: %s",
1249 g_winPluginDir.mb_str().data());
1251 SetPath(_T (
"/Settings/GlobalState" ));
1253 if (
Read(_T (
"nColorScheme" ), &read_int))
1254 global_color_scheme = (ColorScheme)read_int;
1257 SetPath(_T (
"/Settings/NMEADataSource" ));
1259 wxString connectionconfigs;
1260 Read(_T(
"DataConnections" ), &connectionconfigs);
1261 if (!connectionconfigs.IsEmpty()) {
1262 wxArrayString confs = wxStringTokenize(connectionconfigs, _T(
"|"));
1263 TheConnectionParams().clear();
1264 for (
size_t i = 0; i < confs.Count(); i++) {
1267 wxLogMessage(_T(
"Skipped invalid DataStream config"));
1271 TheConnectionParams().push_back(prm);
1276 SetPath(_T (
"/Settings/GlobalState" ));
1279 double st_lat, st_lon;
1280 if (
Read(_T (
"VPLatLon" ), &st)) {
1281 sscanf(st.mb_str(wxConvUTF8),
"%lf,%lf", &st_lat, &st_lon);
1284 if (fabs(st_lon) < 360.) {
1285 while (st_lon < -180.) st_lon += 360.;
1287 while (st_lon > 180.) st_lon -= 360.;
1292 if (fabs(st_lat) < 90.0) vLat = st_lat;
1294 s.Printf(_T (
"Setting Viewpoint Lat/Lon %g, %g" ), vLat, vLon);
1298 double st_view_scale, st_rotation;
1299 if (
Read(wxString(_T (
"VPScale" )), &st)) {
1300 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_view_scale);
1302 st_view_scale = fmax(st_view_scale, .001 / 32);
1303 st_view_scale = fmin(st_view_scale, 4);
1306 if (
Read(wxString(_T (
"VPRotation" )), &st)) {
1307 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_rotation);
1309 st_rotation = fmin(st_rotation, 360);
1310 st_rotation = fmax(st_rotation, 0);
1315 if (
Read(_T (
"OwnShipLatLon" ), &sll)) {
1316 sscanf(sll.mb_str(wxConvUTF8),
"%lf,%lf", &lat, &lon);
1319 if (fabs(lon) < 360.) {
1320 while (lon < -180.) lon += 360.;
1322 while (lon > 180.) lon -= 360.;
1327 if (fabs(lat) < 90.0) gLat = lat;
1329 s.Printf(_T (
"Setting Ownship Lat/Lon %g, %g" ), gLat, gLon);
1336 SetPath(_T (
"/Settings/AuxFontKeys" ));
1341 bool bContk = GetFirstEntry(strk, dummyk);
1342 bool bNewKey =
false;
1345 bNewKey = FontMgr::Get().
AddAuxKey(kval);
1346 if (!bAsTemplate && !bNewKey) {
1350 bContk = GetNextEntry(strk, dummyk);
1354 SetPath(_T (
"/Settings/X11Fonts" ));
1358 SetPath(_T (
"/Settings/GTKFonts" ));
1362 SetPath(_T (
"/Settings/MSWFonts" ));
1366 SetPath(_T (
"/Settings/MacFonts" ));
1370 SetPath(_T (
"/Settings/QTFonts" ));
1376 wxArrayString deleteList;
1378 bool bCont = GetFirstEntry(str, dummy);
1382 if (str.StartsWith(_T(
"Font"))) {
1385 deleteList.Add(str);
1386 wxString oldKey = pval.BeforeFirst(_T(
':'));
1390 if (pval.IsEmpty() || pval.StartsWith(_T(
":"))) {
1391 deleteList.Add(str);
1395 bCont = GetNextEntry(str, dummy);
1398 for (
unsigned int i = 0; i < deleteList.Count(); i++) {
1399 DeleteEntry(deleteList[i]);
1404 SetPath(_T (
"/TideCurrentDataSources" ));
1405 if (GetNumberOfEntries()) {
1406 TideCurrentDataSet.clear();
1409 bool bCont = GetFirstEntry(str, dummy);
1416 if (std::find(TideCurrentDataSet.begin(), TideCurrentDataSet.end(),
1417 val.ToStdString()) == TideCurrentDataSet.end()) {
1418 TideCurrentDataSet.push_back(val.ToStdString());
1420 bCont = GetNextEntry(str, dummy);
1425 LoadConfigGroups(g_pGroupArray);
1430 SetPath(_T (
"/Settings/Others" ));
1433 Read(_T (
"RadarRingsNumberVisible" ), &val);
1434 if (val.Length() > 0) g_iNavAidRadarRingsNumberVisible = atoi(val.mb_str());
1435 g_bNavAidRadarRingsShown = g_iNavAidRadarRingsNumberVisible > 0;
1437 Read(_T (
"RadarRingsStep" ), &val);
1438 if (val.Length() > 0) g_fNavAidRadarRingsStep = atof(val.mb_str());
1440 Read(_T (
"RadarRingsStepUnits" ), &g_pNavAidRadarRingsStepUnits);
1442 wxString l_wxsOwnshipRangeRingsColour;
1443 Read(_T (
"RadarRingsColour" ), &l_wxsOwnshipRangeRingsColour);
1444 if (l_wxsOwnshipRangeRingsColour.Length())
1445 g_colourOwnshipRangeRingsColour.Set(l_wxsOwnshipRangeRingsColour);
1448 Read(_T (
"WaypointRangeRingsNumber" ), &val);
1449 if (val.Length() > 0) g_iWaypointRangeRingsNumber = atoi(val.mb_str());
1451 Read(_T (
"WaypointRangeRingsStep" ), &val);
1452 if (val.Length() > 0) g_fWaypointRangeRingsStep = atof(val.mb_str());
1454 Read(_T (
"WaypointRangeRingsStepUnits" ), &g_iWaypointRangeRingsStepUnits);
1456 wxString l_wxsWaypointRangeRingsColour;
1457 Read(_T(
"WaypointRangeRingsColour" ), &l_wxsWaypointRangeRingsColour);
1458 g_colourWaypointRangeRingsColour.Set(l_wxsWaypointRangeRingsColour);
1460 if (!
Read(_T(
"WaypointUseScaMin"), &g_bUseWptScaMin)) g_bUseWptScaMin =
false;
1461 if (!
Read(_T(
"WaypointScaMinValue"), &g_iWpt_ScaMin))
1462 g_iWpt_ScaMin = 2147483646;
1463 if (!
Read(_T(
"WaypointUseScaMinOverrule"), &g_bOverruleScaMin))
1464 g_bOverruleScaMin =
false;
1465 if (!
Read(_T(
"WaypointsShowName"), &g_bShowWptName)) g_bShowWptName =
true;
1466 if (!
Read(_T(
"UserIconsFirst"), &g_bUserIconsFirst)) g_bUserIconsFirst =
true;
1469 bool b300RadarRings =
true;
1470 if (
Read(_T (
"ShowRadarRings" ), &b300RadarRings)) {
1471 if (!b300RadarRings) g_iNavAidRadarRingsNumberVisible = 0;
1474 Read(_T (
"ConfirmObjectDeletion" ), &g_bConfirmObjectDelete);
1477 g_bWayPointPreventDragging =
false;
1478 Read(_T (
"WaypointPreventDragging" ), &g_bWayPointPreventDragging);
1480 g_bEnableZoomToCursor =
false;
1481 Read(_T (
"EnableZoomToCursor" ), &g_bEnableZoomToCursor);
1484 Read(_T (
"TrackIntervalSeconds" ), &val);
1485 if (val.Length() > 0) {
1486 double tval = atof(val.mb_str());
1487 if (tval >= 2.) g_TrackIntervalSeconds = tval;
1491 Read(_T (
"TrackDeltaDistance" ), &val);
1492 if (val.Length() > 0) {
1493 double tval = atof(val.mb_str());
1494 if (tval >= 0.05) g_TrackDeltaDistance = tval;
1497 Read(_T (
"TrackPrecision" ), &g_nTrackPrecision);
1499 Read(_T (
"NavObjectFileName" ), m_sNavObjSetFile);
1501 Read(_T (
"RouteLineWidth" ), &g_route_line_width);
1502 Read(_T (
"TrackLineWidth" ), &g_track_line_width);
1504 wxString l_wxsTrackLineColour;
1505 if (
Read(_T(
"TrackLineColour" ), &l_wxsTrackLineColour))
1506 g_colourTrackLineColour.Set(l_wxsTrackLineColour);
1508 Read(_T (
"TideCurrentWindowScale" ), &g_tcwin_scale);
1509 Read(_T (
"DefaultWPIcon" ), &g_default_wp_icon);
1510 Read(_T (
"DefaultRPIcon" ), &g_default_routepoint_icon);
1512 SetPath(_T (
"/MmsiProperties" ));
1513 int iPMax = GetNumberOfEntries();
1515 g_MMSI_Props_Array.Empty();
1518 bool bCont = pConfig->GetFirstEntry(str, dummy);
1520 pConfig->Read(str, &val);
1523 g_MMSI_Props_Array.Add(pProps);
1525 bCont = pConfig->GetNextEntry(str, dummy);
1532void MyConfig::LoadS57Config() {
1533 if (!ps52plib)
return;
1537 SetPath(_T (
"/Settings/GlobalState" ));
1539 Read(_T (
"bShowS57Text" ), &read_int, 1);
1540 ps52plib->SetShowS57Text(!(read_int == 0));
1542 Read(_T (
"bShowS57ImportantTextOnly" ), &read_int, 0);
1543 ps52plib->SetShowS57ImportantTextOnly(!(read_int == 0));
1545 Read(_T (
"bShowLightDescription" ), &read_int, 0);
1546 ps52plib->SetShowLdisText(!(read_int == 0));
1548 Read(_T (
"bExtendLightSectors" ), &read_int, 0);
1549 ps52plib->SetExtendLightSectors(!(read_int == 0));
1551 Read(_T (
"nDisplayCategory" ), &read_int, (
enum _DisCat)STANDARD);
1552 ps52plib->SetDisplayCategory((
enum _DisCat)read_int);
1554 Read(_T (
"nSymbolStyle" ), &read_int, (
enum _LUPname)PAPER_CHART);
1555 ps52plib->m_nSymbolStyle = (LUPname)read_int;
1557 Read(_T (
"nBoundaryStyle" ), &read_int, PLAIN_BOUNDARIES);
1558 ps52plib->m_nBoundaryStyle = (LUPname)read_int;
1560 Read(_T (
"bShowSoundg" ), &read_int, 1);
1561 ps52plib->m_bShowSoundg = !(read_int == 0);
1563 Read(_T (
"bShowMeta" ), &read_int, 0);
1564 ps52plib->m_bShowMeta = !(read_int == 0);
1566 Read(_T (
"bUseSCAMIN" ), &read_int, 1);
1567 ps52plib->m_bUseSCAMIN = !(read_int == 0);
1569 Read(_T (
"bUseSUPER_SCAMIN" ), &read_int, 0);
1570 ps52plib->m_bUseSUPER_SCAMIN = !(read_int == 0);
1572 Read(_T (
"bShowAtonText" ), &read_int, 1);
1573 ps52plib->m_bShowAtonText = !(read_int == 0);
1575 Read(_T (
"bDeClutterText" ), &read_int, 0);
1576 ps52plib->m_bDeClutterText = !(read_int == 0);
1578 Read(_T (
"bShowNationalText" ), &read_int, 0);
1579 ps52plib->m_bShowNationalTexts = !(read_int == 0);
1581 Read(_T (
"ENCSoundingScaleFactor" ), &read_int, 0);
1582 ps52plib->m_nSoundingFactor = read_int;
1584 Read(_T (
"ENCTextScaleFactor" ), &read_int, 0);
1585 ps52plib->m_nTextFactor = read_int;
1587 if (
Read(_T (
"S52_MAR_SAFETY_CONTOUR" ), &dval, 3.0)) {
1588 S52_setMarinerParam(S52_MAR_SAFETY_CONTOUR, dval);
1589 S52_setMarinerParam(S52_MAR_SAFETY_DEPTH,
1593 if (
Read(_T (
"S52_MAR_SHALLOW_CONTOUR" ), &dval, 2.0))
1594 S52_setMarinerParam(S52_MAR_SHALLOW_CONTOUR, dval);
1596 if (
Read(_T (
"S52_MAR_DEEP_CONTOUR" ), &dval, 6.0))
1597 S52_setMarinerParam(S52_MAR_DEEP_CONTOUR, dval);
1599 if (
Read(_T (
"S52_MAR_TWO_SHADES" ), &dval, 0.0))
1600 S52_setMarinerParam(S52_MAR_TWO_SHADES, dval);
1602 ps52plib->UpdateMarinerParams();
1604 SetPath(_T (
"/Settings/GlobalState" ));
1605 Read(_T (
"S52_DEPTH_UNIT_SHOW" ), &read_int, 1);
1606 read_int = wxMax(read_int, 0);
1607 read_int = wxMin(read_int, 2);
1608 ps52plib->m_nDepthUnitDisplay = read_int;
1609 g_nDepthUnitDisplay = read_int;
1615 SetPath(_T (
"/Settings/ObjectFilter" ));
1617 int iOBJMax = GetNumberOfEntries();
1625 bool bCont = pConfig->GetFirstEntry(str, dummy);
1627 pConfig->Read(str, &val);
1629 bool bNeedNew =
true;
1631 if (str.StartsWith(_T (
"viz" ), &sObj)) {
1632 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
1634 pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
1635 if (!strncmp(pOLE->OBJLName, sObj.mb_str(), 6)) {
1643 pOLE = (OBJLElement *)calloc(
sizeof(OBJLElement), 1);
1644 memcpy(pOLE->OBJLName, sObj.mb_str(), OBJL_NAME_LEN);
1647 ps52plib->pOBJLArray->Add((
void *)pOLE);
1650 bCont = pConfig->GetNextEntry(str, dummy);
1656static bool ReloadPendingChanges(
const wxString &changes_path) {
1657 wxULongLong size = wxFileName::GetSize(changes_path);
1662 auto pNavObjectChangesSet = NavObjectChanges::getTempInstance();
1663 pNavObjectChangesSet->Init(changes_path);
1664 auto res = pNavObjectChangesSet->load_file(changes_path.fn_str());
1669 if (::wxFileExists(changes_path)) ::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();
1682wxString MyConfig::FindNewestUsableBackup()
const {
1683 wxString newest_backup;
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 &&
1688 doc.load_file(backup.fn_str()).status ==
1689 pugi::xml_parse_status::status_ok) {
1690 newest_backup = backup;
1694 return newest_backup;
1697void MyConfig::LoadNavObjects() {
1699 wxLogMessage(_T(
"Loading navobjects from navobj.xml"));
1701 if (NULL == m_pNavObjectInputSet)
1705 wxString newest_backup;
1706 if (::wxFileExists(m_sNavObjSetFile)) {
1707 if (wxFileName::GetSize(m_sNavObjSetFile) <
1712 wxLogMessage(
"Navobjects file exists, but seems truncated!");
1713 newest_backup = FindNewestUsableBackup();
1714 if (wxFileExists(newest_backup)) {
1715 wxLogMessage(
"We do have a backup " + newest_backup +
1716 " that looks healthy and will use it.");
1717 wxCopyFile(newest_backup, m_sNavObjSetFile,
true);
1721 newest_backup = FindNewestUsableBackup();
1722 if (wxFileExists(newest_backup)) {
1723 wxLogMessage(
"We do have a backup " + newest_backup +
1724 " that looks healthy and will use it.");
1725 wxCopyFile(newest_backup, m_sNavObjSetFile,
true);
1728 "No navobjects.xml file or usable backup exist, will create a new "
1732 bool success =
false;
1735 if (::wxFileExists(m_sNavObjSetFile) &&
1736 m_pNavObjectInputSet->load_file(m_sNavObjSetFile.fn_str()).status ==
1737 pugi::xml_parse_status::status_ok) {
1738 CreateRotatingNavObjBackup();
1741 success = m_pNavObjectInputSet->LoadAllGPXObjects(
false, wpt_dups);
1746 wxString corrupted_file =
1748 wxDateTime::Now().Format(
".corrupted.%Y-%m-%d-%H-%M-%S");
1749 wxRenameFile(m_sNavObjSetFile, corrupted_file,
true);
1750 wxLogMessage(
"Error while loading navobjects from " + m_sNavObjSetFile +
1751 ", the corrupted file was renamed to " + corrupted_file);
1758 newest_backup = FindNewestUsableBackup();
1760 m_pNavObjectInputSet->reset();
1761 if (wxFileExists(newest_backup) &&
1762 m_pNavObjectInputSet->load_file(newest_backup.fn_str()).status ==
1763 pugi::xml_parse_status::status_ok) {
1764 success = m_pNavObjectInputSet->LoadAllGPXObjects(
false, wpt_dups);
1765 wxLogMessage(
"We do have a healthy backup " + newest_backup +
1766 " and did load it.");
1769 "No usable backup found, a new navobj.xml file will be created.");
1770 m_pNavObjectInputSet->reset();
1774 wxLogMessage(_T(
"Done loading navobjects, %d duplicate waypoints ignored"),
1778 _T(
"Failed to load navobjects, creating a new navobj.xml file."));
1780 delete m_pNavObjectInputSet;
1782 if (::wxFileExists(m_sNavObjSetChangesFile)) {
1783 if (ReloadPendingChanges(m_sNavObjSetChangesFile)) {
1787 m_pNavObjectChangesSet->Init(m_sNavObjSetChangesFile);
1790 active_route.Notify();
1793bool MyConfig::LoadLayers(wxString &path) {
1794 wxArrayString file_array;
1798 if (dir.IsOpened()) {
1800 bool cont = dir.GetFirst(&filename);
1803 filename.Prepend(wxFileName::GetPathSeparator());
1804 filename.Prepend(path);
1805 wxFileName f(filename);
1807 if (f.GetExt().IsSameAs(wxT(
"gpx")))
1808 file_array.Add(filename);
1810 if (wxDir::Exists(filename)) {
1811 wxDir dir(filename);
1812 if (dir.IsOpened()) {
1813 nfiles = dir.GetAllFiles(filename, &file_array,
1819 if (file_array.GetCount()) {
1821 l->m_LayerID = ++g_LayerIdx;
1822 l->m_LayerFileName = file_array[0];
1823 if (file_array.GetCount() <= 1)
1824 wxFileName::SplitPath(file_array[0], NULL, NULL, &(l->m_LayerName),
1827 wxFileName::SplitPath(filename, NULL, NULL, &(l->m_LayerName), NULL,
1830 bool bLayerViz = g_bShowLayers;
1832 if (g_VisibleLayers.Contains(l->m_LayerName)) bLayerViz =
true;
1833 if (g_InvisibleLayers.Contains(l->m_LayerName)) bLayerViz =
false;
1835 l->m_bHasVisibleNames = wxCHK_UNDETERMINED;
1836 if (g_VisiNameinLayers.Contains(l->m_LayerName))
1837 l->m_bHasVisibleNames = wxCHK_CHECKED;
1838 if (g_InVisiNameinLayers.Contains(l->m_LayerName))
1839 l->m_bHasVisibleNames = wxCHK_UNCHECKED;
1841 l->m_bIsVisibleOnChart = bLayerViz;
1844 laymsg.Printf(wxT(
"New layer %d: %s"), l->m_LayerID,
1845 l->m_LayerName.c_str());
1846 wxLogMessage(laymsg);
1848 pLayerList->Insert(l);
1852 for (
unsigned int i = 0; i < file_array.GetCount(); i++) {
1853 wxString file_path = file_array[i];
1855 if (::wxFileExists(file_path)) {
1857 if (pSet->load_file(file_path.fn_str()).status !=
1858 pugi::xml_parse_status::status_ok) {
1859 wxLogMessage(
"Error loading GPX file " + file_path);
1862 long nItems = pSet->LoadAllGPXObjectsAsLayer(
1863 l->m_LayerID, bLayerViz, l->m_bHasVisibleNames);
1864 l->m_NoOfItems += nItems;
1865 l->m_LayerType = _(
"Persistent");
1868 objmsg.Printf(wxT(
"Loaded GPX file %s with %ld items."),
1869 file_path.c_str(), nItems);
1870 wxLogMessage(objmsg);
1877 cont = dir.GetNext(&filename);
1880 g_bLayersLoaded =
true;
1885bool MyConfig::LoadChartDirArray(ArrayOfCDI &ChartDirArray) {
1887 SetPath(_T (
"/ChartDirectories" ));
1888 int iDirMax = GetNumberOfEntries();
1890 ChartDirArray.Empty();
1893 int nAdjustChartDirs = 0;
1895 bool bCont = pConfig->GetFirstEntry(str, dummy);
1897 pConfig->Read(str, &val);
1899 wxString dirname(val);
1900 if (!dirname.IsEmpty()) {
1915 if (dirname.Find(_T (
"SampleCharts" )) ==
1920 pConfig->DeleteEntry(str);
1921 wxString new_dir = dirname.Mid(dirname.Find(_T (
"SampleCharts" )));
1922 new_dir.Prepend(g_Platform->GetSharedDataDir());
1927 cdi.fullpath = dirname.BeforeFirst(
'^');
1928 cdi.magic_number = dirname.AfterFirst(
'^');
1930 ChartDirArray.Add(cdi);
1934 bCont = pConfig->GetNextEntry(str, dummy);
1937 if (nAdjustChartDirs) pConfig->UpdateChartDirs(ChartDirArray);
1943void MyConfig::AddNewRoute(
Route *r) { m_pNavObjectChangesSet->AddNewRoute(r); }
1945void MyConfig::UpdateRoute(
Route *r) { m_pNavObjectChangesSet->UpdateRoute(r); }
1947void MyConfig::DeleteConfigRoute(
Route *pr) {
1948 m_pNavObjectChangesSet->DeleteConfigRoute(pr);
1951void MyConfig::AddNewTrack(
Track *pt) {
1952 m_pNavObjectChangesSet->AddNewTrack(pt);
1955void MyConfig::UpdateTrack(
Track *pt) {
1956 m_pNavObjectChangesSet->UpdateTrack(pt);
1959void MyConfig::DeleteConfigTrack(
Track *pt) {
1960 m_pNavObjectChangesSet->DeleteConfigTrack(pt);
1963void MyConfig::AddNewWayPoint(
RoutePoint *pWP,
int crm) {
1964 m_pNavObjectChangesSet->AddNewWayPoint(pWP);
1967void MyConfig::UpdateWayPoint(
RoutePoint *pWP) {
1968 m_pNavObjectChangesSet->UpdateWayPoint(pWP);
1971void MyConfig::DeleteWayPoint(
RoutePoint *pWP) {
1972 m_pNavObjectChangesSet->DeleteWayPoint(pWP);
1975void MyConfig::AddNewTrackPoint(
TrackPoint *pWP,
const wxString &parent_GUID) {
1976 m_pNavObjectChangesSet->AddNewTrackPoint(pWP, parent_GUID);
1979bool MyConfig::UpdateChartDirs(ArrayOfCDI &dir_array) {
1983 SetPath(_T (
"/ChartDirectories" ));
1984 int iDirMax = GetNumberOfEntries();
1988 for (
int i = 0; i < iDirMax; i++) {
1989 GetFirstEntry(key, dummy);
1990 DeleteEntry(key,
false);
1994 iDirMax = dir_array.GetCount();
1996 for (
int iDir = 0; iDir < iDirMax; iDir++) {
1999 wxString dirn = cdi.fullpath;
2000 dirn.Append(_T(
"^"));
2001 dirn.Append(cdi.magic_number);
2003 str_buf.Printf(_T (
"ChartDir%d" ), iDir + 1);
2005 Write(str_buf, dirn);
2017void MyConfig::CreateConfigGroups(ChartGroupArray *pGroupArray) {
2018 if (!pGroupArray)
return;
2020 SetPath(_T (
"/Groups" ));
2021 Write(_T (
"GroupCount" ), (
int)pGroupArray->GetCount());
2023 for (
unsigned int i = 0; i < pGroupArray->GetCount(); i++) {
2026 s.Printf(_T(
"Group%d"), i + 1);
2027 s.Prepend(_T (
"/Groups/" ));
2030 Write(_T (
"GroupName" ), pGroup->m_group_name);
2031 Write(_T (
"GroupItemCount" ), (
int)pGroup->m_element_array.size());
2033 for (
unsigned int j = 0; j < pGroup->m_element_array.size(); j++) {
2035 sg.Printf(_T(
"Group%d/Item%d"), i + 1, j);
2036 sg.Prepend(_T (
"/Groups/" ));
2038 Write(_T (
"IncludeItem" ), pGroup->m_element_array[j].m_element_name);
2041 wxArrayString u = pGroup->m_element_array[j].m_missing_name_array;
2043 for (
unsigned int k = 0; k < u.GetCount(); k++) {
2047 Write(_T (
"ExcludeItems" ), t);
2053void MyConfig::DestroyConfigGroups(
void) {
2054 DeleteGroup(_T (
"/Groups" ));
2057void MyConfig::LoadConfigGroups(ChartGroupArray *pGroupArray) {
2058 SetPath(_T (
"/Groups" ));
2059 unsigned int group_count;
2060 Read(_T (
"GroupCount" ), (
int *)&group_count, 0);
2062 for (
unsigned int i = 0; i < group_count; i++) {
2065 s.Printf(_T(
"Group%d"), i + 1);
2066 s.Prepend(_T (
"/Groups/" ));
2070 Read(_T (
"GroupName" ), &t);
2071 pGroup->m_group_name = t;
2073 unsigned int item_count;
2074 Read(_T (
"GroupItemCount" ), (
int *)&item_count);
2075 for (
unsigned int j = 0; j < item_count; j++) {
2077 sg.Printf(_T(
"Group%d/Item%d"), i + 1, j);
2078 sg.Prepend(_T (
"/Groups/" ));
2082 Read(_T (
"IncludeItem" ), &v);
2086 if (
Read(_T (
"ExcludeItems" ), &u)) {
2088 wxStringTokenizer tk(u, _T(
";"));
2089 while (tk.HasMoreTokens()) {
2090 wxString token = tk.GetNextToken();
2091 pelement.m_missing_name_array.Add(token);
2095 pGroup->m_element_array.push_back(std::move(pelement));
2097 pGroupArray->Add(pGroup);
2101void MyConfig::LoadCanvasConfigs(
bool bApplyAsTemplate) {
2104 auto &config_array = ConfigMgr::Get().GetCanvasConfigArray();
2106 SetPath(_T (
"/Canvas" ));
2109 if (!HasEntry(_T (
"CanvasConfig" ))) {
2111 pcc->LoadFromLegacyConfig(
this);
2112 config_array.Add(pcc);
2117 Read(_T (
"CanvasConfig" ), (
int *)&g_canvasConfig, 0);
2120 if (config_array.GetCount() == 0) {
2121 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 1);
2124 LoadConfigCanvas(pcca, bApplyAsTemplate);
2125 config_array.Add(pcca);
2127 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 2);
2130 LoadConfigCanvas(pcca, bApplyAsTemplate);
2131 config_array.Add(pcca);
2134 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 1);
2136 LoadConfigCanvas(pcca, bApplyAsTemplate);
2138 if (config_array.GetCount() > 1) {
2140 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 2);
2142 LoadConfigCanvas(pcca, bApplyAsTemplate);
2144 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 2);
2147 LoadConfigCanvas(pcca, bApplyAsTemplate);
2148 config_array.Add(pcca);
2153void MyConfig::LoadConfigCanvas(
canvasConfig *cConfig,
bool bApplyAsTemplate) {
2155 double st_lat, st_lon;
2157 if (!bApplyAsTemplate) {
2159 cConfig->
iLat = START_LAT;
2160 cConfig->
iLon = START_LON;
2162 if (
Read(_T (
"canvasVPLatLon" ), &st)) {
2163 sscanf(st.mb_str(wxConvUTF8),
"%lf,%lf", &st_lat, &st_lon);
2166 if (fabs(st_lon) < 360.) {
2167 while (st_lon < -180.) st_lon += 360.;
2169 while (st_lon > 180.) st_lon -= 360.;
2171 cConfig->
iLon = st_lon;
2174 if (fabs(st_lat) < 90.0) cConfig->
iLat = st_lat;
2180 double st_view_scale;
2181 if (
Read(wxString(_T (
"canvasVPScale" )), &st)) {
2182 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_view_scale);
2184 st_view_scale = fmax(st_view_scale, .001 / 32);
2185 st_view_scale = fmin(st_view_scale, 4);
2186 cConfig->
iScale = st_view_scale;
2190 if (
Read(wxString(_T (
"canvasVPRotation" )), &st)) {
2191 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_rotation);
2193 st_rotation = fmin(st_rotation, 360);
2194 st_rotation = fmax(st_rotation, 0);
2195 cConfig->
iRotation = st_rotation * PI / 180.;
2198 Read(_T (
"canvasInitialdBIndex" ), &cConfig->DBindex, 0);
2199 Read(_T (
"canvasbFollow" ), &cConfig->
bFollow, 0);
2202 Read(_T (
"canvasHeadUp" ), &cConfig->
bHeadUp, 0);
2206 Read(_T (
"ActiveChartGroup" ), &cConfig->GroupID, 0);
2209 if (cConfig->GroupID && bApplyAsTemplate) {
2210 if (cConfig->GroupID > (
int)g_pGroupArray->GetCount()) cConfig->GroupID = 0;
2216 Read(_T (
"canvasQuilt" ), &cConfig->
bQuilt, 1);
2226 Read(_T (
"canvasENCDisplayCategory" ), &cConfig->nENCDisplayCategory,
2228 Read(_T (
"canvasENCShowDepths" ), &cConfig->bShowENCDepths, 1);
2229 Read(_T (
"canvasENCShowBuoyLabels" ), &cConfig->bShowENCBuoyLabels, 1);
2230 Read(_T (
"canvasENCShowLightDescriptions" ),
2231 &cConfig->bShowENCLightDescriptions, 1);
2232 Read(_T (
"canvasENCShowLights" ), &cConfig->bShowENCLights, 1);
2233 Read(_T (
"canvasENCShowVisibleSectorLights" ),
2234 &cConfig->bShowENCVisibleSectorLights, 0);
2235 Read(_T (
"canvasENCShowAnchorInfo" ), &cConfig->bShowENCAnchorInfo, 0);
2236 Read(_T (
"canvasENCShowDataQuality" ), &cConfig->bShowENCDataQuality, 0);
2239 Read(_T (
"canvasSizeX" ), &sx, 0);
2240 Read(_T (
"canvasSizeY" ), &sy, 0);
2244void MyConfig::SaveCanvasConfigs() {
2245 auto &config_array = ConfigMgr::Get().GetCanvasConfigArray();
2247 SetPath(_T (
"/Canvas" ));
2248 Write(_T (
"CanvasConfig" ), (
int)g_canvasConfig);
2253 switch (g_canvasConfig) {
2257 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 1);
2260 if (config_array.GetCount() > 0) {
2261 pcc = config_array.Item(0);
2263 SaveConfigCanvas(pcc);
2270 if (config_array.GetCount() > 1) {
2271 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 1);
2273 pcc = config_array.Item(0);
2275 SaveConfigCanvas(pcc);
2278 s.Printf(_T(
"/Canvas/CanvasConfig%d"), 2);
2280 pcc = config_array.Item(1);
2282 SaveConfigCanvas(pcc);
2289void MyConfig::SaveConfigCanvas(
canvasConfig *cConfig) {
2296 st1.Printf(_T (
"%10.4f,%10.4f" ), vp.
clat, vp.
clon);
2297 Write(_T (
"canvasVPLatLon" ), st1);
2299 Write(_T (
"canvasVPScale" ), st1);
2300 st1.Printf(_T (
"%i" ), ((
int)(vp.
rotation * 180 / PI)) % 360);
2301 Write(_T (
"canvasVPRotation" ), st1);
2304 int restore_dbindex = 0;
2306 if (pcs) restore_dbindex = pcs->GetCurrentEntrydbIndex();
2307 if (cConfig->
canvas->GetQuiltMode())
2308 restore_dbindex = cConfig->
canvas->GetQuiltReferenceChartIndex();
2309 Write(_T (
"canvasInitialdBIndex" ), restore_dbindex);
2311 Write(_T (
"canvasbFollow" ), cConfig->
canvas->m_bFollow);
2312 Write(_T (
"ActiveChartGroup" ), cConfig->
canvas->m_groupIndex);
2314 Write(_T (
"canvasQuilt" ), cConfig->
canvas->GetQuiltMode());
2315 Write(_T (
"canvasShowGrid" ), cConfig->
canvas->GetShowGrid());
2316 Write(_T (
"canvasShowOutlines" ), cConfig->
canvas->GetShowOutlines());
2317 Write(_T (
"canvasShowDepthUnits" ), cConfig->
canvas->GetShowDepthUnits());
2319 Write(_T (
"canvasShowAIS" ), cConfig->
canvas->GetShowAIS());
2320 Write(_T (
"canvasAttenAIS" ), cConfig->
canvas->GetAttenAIS());
2322 Write(_T (
"canvasShowTides" ), cConfig->
canvas->GetbShowTide());
2323 Write(_T (
"canvasShowCurrents" ), cConfig->
canvas->GetbShowCurrent());
2326 Write(_T (
"canvasShowENCText" ), cConfig->
canvas->GetShowENCText());
2327 Write(_T (
"canvasENCDisplayCategory" ),
2328 cConfig->
canvas->GetENCDisplayCategory());
2329 Write(_T (
"canvasENCShowDepths" ), cConfig->
canvas->GetShowENCDepth());
2330 Write(_T (
"canvasENCShowBuoyLabels" ),
2331 cConfig->
canvas->GetShowENCBuoyLabels());
2332 Write(_T (
"canvasENCShowLightDescriptions" ),
2333 cConfig->
canvas->GetShowENCLightDesc());
2334 Write(_T (
"canvasENCShowLights" ), cConfig->
canvas->GetShowENCLights());
2335 Write(_T (
"canvasENCShowVisibleSectorLights" ),
2336 cConfig->
canvas->GetShowVisibleSectors());
2337 Write(_T (
"canvasENCShowAnchorInfo" ),
2338 cConfig->
canvas->GetShowENCAnchor());
2339 Write(_T (
"canvasENCShowDataQuality" ),
2340 cConfig->
canvas->GetShowENCDataQual());
2341 Write(_T (
"canvasCourseUp" ),
2342 cConfig->
canvas->GetUpMode() == COURSE_UP_MODE);
2343 Write(_T (
"canvasHeadUp" ), cConfig->
canvas->GetUpMode() == HEAD_UP_MODE);
2344 Write(_T (
"canvasLookahead" ), cConfig->
canvas->GetLookahead());
2346 int width = cConfig->
canvas->GetSize().x;
2354 Write(_T (
"canvasSizeX" ), width);
2355 Write(_T (
"canvasSizeY" ), cConfig->
canvas->GetSize().y);
2359void MyConfig::UpdateSettings() {
2367 SetPath(_T (
"/Settings" ));
2369 Write(_T (
"LastAppliedTemplate" ), g_lastAppliedTemplateGUID);
2370 Write(_T (
"CompatOS" ), g_compatOS);
2371 Write(_T (
"CompatOsVersion" ), g_compatOsVersion);
2372 Write(_T (
"ConfigVersionString" ), g_config_version_string);
2373 if (wxIsEmpty(g_CmdSoundString)) g_CmdSoundString = wxString(OCPN_SOUND_CMD);
2374 Write(_T(
"CmdSoundString" ), g_CmdSoundString);
2375 Write(_T (
"NavMessageShown" ), n_NavMessageShown);
2376 Write(_T (
"InlandEcdis" ), g_bInlandEcdis);
2378 Write(_T (
"AndroidVersionCode" ), g_AndroidVersionCode);
2380 Write(_T (
"UIexpert" ), g_bUIexpert);
2381 Write(_T(
"SpaceDropMark" ), g_bSpaceDropMark);
2385 Write(_T (
"ShowStatusBar" ), g_bShowStatusBar);
2387 Write(_T (
"ShowMenuBar" ), g_bShowMenuBar);
2389 Write(_T (
"DefaultFontSize" ), g_default_font_size);
2390 Write(_T (
"DefaultFontFacename" ), g_default_font_facename);
2392 Write(_T (
"Fullscreen" ), g_bFullscreen);
2393 Write(_T (
"ShowCompassWindow" ), g_bShowCompassWin);
2394 Write(_T (
"SetSystemTime" ), s_bSetSystemTime);
2395 Write(_T (
"ShowGrid" ), g_bDisplayGrid);
2396 Write(_T (
"PlayShipsBells" ), g_bPlayShipsBells);
2397 Write(_T (
"SoundDeviceIndex" ), g_iSoundDeviceIndex);
2398 Write(_T (
"FullscreenToolbar" ), g_bFullscreenToolbar);
2399 Write(_T (
"TransparentToolbar" ), g_bTransparentToolbar);
2400 Write(_T (
"PermanentMOBIcon" ), g_bPermanentMOBIcon);
2401 Write(_T (
"ShowLayers" ), g_bShowLayers);
2402 Write(_T (
"AutoAnchorDrop" ), g_bAutoAnchorMark);
2403 Write(_T (
"ShowChartOutlines" ), g_bShowOutlines);
2404 Write(_T (
"ShowActiveRouteTotal" ), g_bShowRouteTotal);
2405 Write(_T (
"ShowActiveRouteHighway" ), g_bShowActiveRouteHighway);
2406 Write(_T (
"SDMMFormat" ), g_iSDMMFormat);
2407 Write(_T (
"MostRecentGPSUploadConnection" ), g_uploadConnection);
2408 Write(_T (
"ShowChartBar" ), g_bShowChartBar);
2410 Write(_T (
"GUIScaleFactor" ), g_GUIScaleFactor);
2411 Write(_T (
"ChartObjectScaleFactor" ), g_ChartScaleFactor);
2412 Write(_T (
"ShipScaleFactor" ), g_ShipScaleFactor);
2413 Write(_T (
"ENCSoundingScaleFactor" ), g_ENCSoundingScaleFactor);
2414 Write(_T (
"ENCTextScaleFactor" ), g_ENCTextScaleFactor);
2415 Write(_T (
"ObjQueryAppendFilesExt" ), g_ObjQFileExt);
2418 Write(_T(
"CatalogCustomURL"), g_catalog_custom_url);
2419 Write(_T(
"CatalogChannel"), g_catalog_channel);
2421 Write(
"NetmaskBits", g_netmask_bits);
2422 Write(_T (
"FilterNMEA_Avg" ), g_bfilter_cogsog);
2423 Write(_T (
"FilterNMEA_Sec" ), g_COGFilterSec);
2425 Write(_T (
"TrackContinuous" ), g_btrackContinuous);
2427 Write(_T (
"ShowTrue" ), g_bShowTrue);
2428 Write(_T (
"ShowMag" ), g_bShowMag);
2429 Write(_T (
"UserMagVariation" ), wxString::Format(_T(
"%.2f"), g_UserVar));
2431 Write(_T (
"CM93DetailFactor" ), g_cm93_zoom_factor);
2432 Write(_T (
"CM93DetailZoomPosX" ), g_detailslider_dialog_x);
2433 Write(_T (
"CM93DetailZoomPosY" ), g_detailslider_dialog_y);
2434 Write(_T (
"ShowCM93DetailSlider" ), g_bShowDetailSlider);
2436 Write(_T (
"SkewToNorthUp" ), g_bskew_comp);
2437 if (!g_bdisable_opengl) {
2439 Write(_T (
"OpenGL" ), g_bopengl);
2441 Write(_T (
"SoftwareGL" ), g_bSoftwareGL);
2443 Write(_T (
"ZoomDetailFactor" ), g_chart_zoom_modifier_raster);
2444 Write(_T (
"ZoomDetailFactorVector" ), g_chart_zoom_modifier_vector);
2446 Write(_T (
"FogOnOverzoom" ), g_fog_overzoom);
2447 Write(_T (
"OverzoomVectorScale" ), g_oz_vector_scale);
2448 Write(_T (
"OverzoomEmphasisBase" ), g_overzoom_emphasis_base);
2449 Write(_T (
"PlusMinusZoomFactor" ), g_plus_minus_zoom_factor);
2450 Write(
"MouseZoomSensitivity",
2452 Write(_T (
"ShowMUIZoomButtons" ), g_bShowMuiZoomButtons);
2456 Write(_T (
"UseAcceleratedPanning" ), g_GLOptions.m_bUseAcceleratedPanning);
2458 Write(_T (
"GPUTextureCompression" ), g_GLOptions.m_bTextureCompression);
2459 Write(_T (
"GPUTextureCompressionCaching" ),
2460 g_GLOptions.m_bTextureCompressionCaching);
2461 Write(_T (
"GPUTextureDimension" ), g_GLOptions.m_iTextureDimension);
2462 Write(_T (
"GPUTextureMemSize" ), g_GLOptions.m_iTextureMemorySize);
2463 Write(_T (
"PolygonSmoothing" ), g_GLOptions.m_GLPolygonSmoothing);
2464 Write(_T (
"LineSmoothing" ), g_GLOptions.m_GLLineSmoothing);
2466 Write(_T (
"SmoothPanZoom" ), g_bsmoothpanzoom);
2468 Write(_T (
"CourseUpMode" ), g_bCourseUp);
2469 if (!g_bInlandEcdis)
Write(_T (
"LookAheadMode" ), g_bLookAhead);
2470 Write(_T (
"TenHzUpdate" ), g_btenhertz);
2472 Write(_T (
"COGUPAvgSeconds" ), g_COGAvgSec);
2473 Write(_T (
"UseMagAPB" ), g_bMagneticAPB);
2475 Write(_T (
"OwnshipCOGPredictorMinutes" ), g_ownship_predictor_minutes);
2476 Write(_T (
"OwnshipCOGPredictorStyle" ), g_cog_predictor_style);
2477 Write(_T (
"OwnshipCOGPredictorColor" ), g_cog_predictor_color);
2478 Write(_T (
"OwnshipCOGPredictorEndmarker" ), g_cog_predictor_endmarker);
2479 Write(_T (
"OwnshipCOGPredictorWidth" ), g_cog_predictor_width);
2480 Write(_T (
"OwnshipHDTPredictorStyle" ), g_ownship_HDTpredictor_style);
2481 Write(_T (
"OwnshipHDTPredictorColor" ), g_ownship_HDTpredictor_color);
2482 Write(_T (
"OwnshipHDTPredictorEndmarker" ),
2483 g_ownship_HDTpredictor_endmarker);
2484 Write(_T (
"OwnShipMMSINumber" ), g_OwnShipmmsi);
2485 Write(_T (
"OwnshipHDTPredictorWidth" ), g_ownship_HDTpredictor_width);
2486 Write(_T (
"OwnshipHDTPredictorMiles" ), g_ownship_HDTpredictor_miles);
2488 Write(_T (
"OwnShipIconType" ), g_OwnShipIconType);
2489 Write(_T (
"OwnShipLength" ), g_n_ownship_length_meters);
2490 Write(_T (
"OwnShipWidth" ), g_n_ownship_beam_meters);
2491 Write(_T (
"OwnShipGPSOffsetX" ), g_n_gps_antenna_offset_x);
2492 Write(_T (
"OwnShipGPSOffsetY" ), g_n_gps_antenna_offset_y);
2493 Write(_T (
"OwnShipMinSize" ), g_n_ownship_min_mm);
2494 Write(_T (
"OwnShipSogCogCalc" ), g_own_ship_sog_cog_calc);
2495 Write(_T (
"OwnShipSogCogCalcDampSec"), g_own_ship_sog_cog_calc_damp_sec);
2496 Write(_T (
"ShowDirectRouteLine"), g_bShowShipToActive);
2497 Write(_T (
"DirectRouteLineStyle"), g_shipToActiveStyle);
2498 Write(_T (
"DirectRouteLineColor" ), g_shipToActiveColor);
2503 Write(_T (
"RouteArrivalCircleRadius" ),
2504 wxString::Format(_T(
"%.2f"), g_n_arrival_circle_radius));
2506 Write(_T (
"ChartQuilting" ), g_bQuiltEnable);
2508 Write(_T (
"PreserveScaleOnX" ), g_bPreserveScaleOnX);
2510 Write(_T (
"StartWithTrackActive" ), g_bTrackCarryOver);
2511 Write(_T (
"AutomaticDailyTracks" ), g_bTrackDaily);
2512 Write(_T (
"TrackRotateAt" ), g_track_rotate_time);
2513 Write(_T (
"TrackRotateTimeType" ), g_track_rotate_time_type);
2514 Write(_T (
"HighlightTracks" ), g_bHighliteTracks);
2516 Write(_T (
"DateTimeFormat" ), g_datetime_format);
2517 Write(_T (
"InitialStackIndex" ), g_restore_stackindex);
2518 Write(_T (
"InitialdBIndex" ), g_restore_dbindex);
2520 Write(_T(
"NMEAAPBPrecision" ), g_NMEAAPBPrecision);
2522 Write(_T(
"TalkerIdText"), g_TalkerIdText);
2523 Write(_T(
"ShowTrackPointTime"), g_bShowTrackPointTime);
2525 Write(_T (
"AnchorWatch1GUID" ), g_AW1GUID);
2526 Write(_T (
"AnchorWatch2GUID" ), g_AW2GUID);
2528 Write(_T (
"ToolbarX" ), g_maintoolbar_x);
2529 Write(_T (
"ToolbarY" ), g_maintoolbar_y);
2532 Write(_T (
"iENCToolbarX" ), g_iENCToolbarPosX);
2533 Write(_T (
"iENCToolbarY" ), g_iENCToolbarPosY);
2535 if (!g_bInlandEcdis) {
2536 Write(_T (
"GlobalToolbarConfig" ), g_toolbarConfig);
2537 Write(_T (
"DistanceFormat" ), g_iDistanceFormat);
2538 Write(_T (
"SpeedFormat" ), g_iSpeedFormat);
2539 Write(_T (
"WindSpeedFormat" ), g_iWindSpeedFormat);
2540 Write(_T (
"ShowDepthUnits" ), g_bShowDepthUnits);
2541 Write(_T (
"TemperatureFormat" ), g_iTempFormat);
2543 Write(_T (
"GPSIdent" ), g_GPS_Ident);
2544 Write(
"ActiveRoute", g_active_route);
2545 Write(
"PersistActiveRoute", g_persist_active_route);
2546 Write(_T (
"UseGarminHostUpload" ), g_bGarminHostUpload);
2548 Write(_T (
"MobileTouch" ), g_btouch);
2550 Write(_T (
"EnableRolloverBlock" ), g_bRollover);
2552 Write(_T (
"AutoHideToolbar" ), g_bAutoHideToolbar);
2553 Write(_T (
"AutoHideToolbarSecs" ), g_nAutoHideToolbar);
2556 for (
const auto &mm : g_config_display_size_mm) {
2557 st0.Append(wxString::Format(_T (
"%zu," ), mm));
2560 Write(_T (
"DisplaySizeMM" ), st0);
2561 Write(_T (
"DisplaySizeManual" ), g_config_display_size_manual);
2563 Write(_T (
"SelectionRadiusMM" ), g_selection_radius_mm);
2564 Write(_T (
"SelectionRadiusTouchMM" ), g_selection_radius_touch_mm);
2566 st0.Printf(_T (
"%g" ), g_PlanSpeed);
2567 Write(_T (
"PlanSpeed" ), st0);
2569 if (g_bLayersLoaded) {
2570 wxString vis, invis, visnames, invisnames;
2571 LayerList::iterator it;
2573 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
2575 if (lay->IsVisibleOnChart())
2576 vis += (lay->m_LayerName) + _T(
";");
2578 invis += (lay->m_LayerName) + _T(
";");
2580 if (lay->HasVisibleNames() == wxCHK_CHECKED) {
2581 visnames += (lay->m_LayerName) + _T(
";");
2582 }
else if (lay->HasVisibleNames() == wxCHK_UNCHECKED) {
2583 invisnames += (lay->m_LayerName) + _T(
";");
2586 Write(_T (
"VisibleLayers" ), vis);
2587 Write(_T (
"InvisibleLayers" ), invis);
2588 Write(_T (
"VisNameInLayers" ), visnames);
2589 Write(_T (
"InvisNameInLayers" ), invisnames);
2591 Write(_T (
"Locale" ), g_locale);
2592 Write(_T (
"LocaleOverride" ), g_localeOverride);
2594 Write(_T (
"KeepNavobjBackups" ), g_navobjbackups);
2595 Write(_T (
"LegacyInputCOMPortFilterBehaviour" ),
2596 g_b_legacy_input_filter_behaviour);
2597 Write(_T(
"AdvanceRouteWaypointOnArrivalOnly" ),
2598 g_bAdvanceRouteWaypointOnArrivalOnly);
2599 Write(
"EnableRootMenuDebug", g_enable_root_menu_debug);
2602 Write(_T(
"LiveETA" ), g_bShowLiveETA);
2603 Write(_T(
"DefaultBoatSpeed" ), g_defaultBoatSpeed);
2607 SetPath(_T (
"/Settings/ObjectFilter" ));
2610 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
2612 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
2614 wxString st1(_T (
"viz" ));
2616 strncpy(name, pOLE->OBJLName, 6);
2618 st1.Append(wxString(name, wxConvUTF8));
2619 Write(st1, pOLE->nViz);
2625 SetPath(_T (
"/Settings/GlobalState" ));
2642 st1.Printf(_T (
"%10.4f, %10.4f" ), gLat, gLon);
2643 Write(_T (
"OwnShipLatLon" ), st1);
2646 SetPath(_T (
"/Settings/GlobalState" ));
2647 if (!g_bInlandEcdis)
2648 Write(_T (
"nColorScheme" ), (
int)gFrame->GetColorScheme());
2650 Write(_T (
"FrameWinX" ), g_nframewin_x);
2651 Write(_T (
"FrameWinY" ), g_nframewin_y);
2652 Write(_T (
"FrameWinPosX" ), g_nframewin_posx);
2653 Write(_T (
"FrameWinPosY" ), g_nframewin_posy);
2654 Write(_T (
"FrameMax" ), g_bframemax);
2656 Write(_T (
"ClientPosX" ), g_lastClientRectx);
2657 Write(_T (
"ClientPosY" ), g_lastClientRecty);
2658 Write(_T (
"ClientSzX" ), g_lastClientRectw);
2659 Write(_T (
"ClientSzY" ), g_lastClientRecth);
2661 Write(_T (
"S52_DEPTH_UNIT_SHOW" ), g_nDepthUnitDisplay);
2663 Write(_T(
"RoutePropSizeX" ), g_route_prop_sx);
2664 Write(_T(
"RoutePropSizeY" ), g_route_prop_sy);
2665 Write(_T(
"RoutePropPosX" ), g_route_prop_x);
2666 Write(_T(
"RoutePropPosY" ), g_route_prop_y);
2669 SetPath(_T (
"/Settings/Audio" ));
2670 Write(_T (
"AISAlertSoundFile" ), g_AIS_sound_file);
2671 Write(_T (
"DSCAlertSoundFile" ), g_DSC_sound_file);
2672 Write(_T (
"SARTAlertSoundFile" ), g_SART_sound_file);
2673 Write(_T (
"AnchorAlarmSoundFile" ), g_anchorwatch_sound_file);
2675 Write(_T (
"bAIS_GCPA_AlertAudio" ), g_bAIS_GCPA_Alert_Audio);
2676 Write(_T (
"bAIS_SART_AlertAudio" ), g_bAIS_SART_Alert_Audio);
2677 Write(_T (
"bAIS_DSC_AlertAudio" ), g_bAIS_DSC_Alert_Audio);
2678 Write(_T (
"bAnchorAlertAudio" ), g_bAnchor_Alert_Audio);
2681 SetPath(_T (
"/Settings/AIS" ));
2683 Write(_T (
"bNoCPAMax" ), g_bCPAMax);
2684 Write(_T (
"NoCPAMaxNMi" ), g_CPAMax_NM);
2685 Write(_T (
"bCPAWarn" ), g_bCPAWarn);
2686 Write(_T (
"CPAWarnNMi" ), g_CPAWarn_NM);
2687 Write(_T (
"bTCPAMax" ), g_bTCPA_Max);
2688 Write(_T (
"TCPAMaxMinutes" ), g_TCPA_Max);
2689 Write(_T (
"bMarkLostTargets" ), g_bMarkLost);
2690 Write(_T (
"MarkLost_Minutes" ), g_MarkLost_Mins);
2691 Write(_T (
"bRemoveLostTargets" ), g_bRemoveLost);
2692 Write(_T (
"RemoveLost_Minutes" ), g_RemoveLost_Mins);
2693 Write(_T (
"bShowCOGArrows" ), g_bShowCOG);
2694 Write(_T (
"bSyncCogPredictors" ), g_bSyncCogPredictors);
2695 Write(_T (
"CogArrowMinutes" ), g_ShowCOG_Mins);
2696 Write(_T (
"bShowTargetTracks" ), g_bAISShowTracks);
2697 Write(_T (
"TargetTracksMinutes" ), g_AISShowTracks_Mins);
2699 Write(_T (
"bHideMooredTargets" ), g_bHideMoored);
2700 Write(_T (
"MooredTargetMaxSpeedKnots" ), g_ShowMoored_Kts);
2702 Write(_T (
"bAISAlertDialog" ), g_bAIS_CPA_Alert);
2703 Write(_T (
"bAISAlertAudio" ), g_bAIS_CPA_Alert_Audio);
2705 Write(_T (
"AISAlertAudioFile" ), g_sAIS_Alert_Sound_File);
2706 Write(_T (
"bAISAlertSuppressMoored" ), g_bAIS_CPA_Alert_Suppress_Moored);
2707 Write(_T (
"bShowAreaNotices" ), g_bShowAreaNotices);
2708 Write(_T (
"bDrawAISSize" ), g_bDrawAISSize);
2709 Write(_T (
"bDrawAISRealtime" ), g_bDrawAISRealtime);
2710 Write(_T (
"AISRealtimeMinSpeedKnots" ), g_AIS_RealtPred_Kts);
2711 Write(_T (
"bShowAISName" ), g_bShowAISName);
2712 Write(_T (
"ShowAISTargetNameScale" ), g_Show_Target_Name_Scale);
2713 Write(_T (
"bWplIsAprsPositionReport" ), g_bWplUsePosition);
2714 Write(_T (
"WplSelAction" ), g_WplAction);
2715 Write(_T (
"AISCOGPredictorWidth" ), g_ais_cog_predictor_width);
2716 Write(_T (
"bShowScaledTargets" ), g_bAllowShowScaled);
2717 Write(_T (
"AISScaledNumber" ), g_ShowScaled_Num);
2718 Write(_T (
"AISScaledNumberWeightSOG" ), g_ScaledNumWeightSOG);
2719 Write(_T (
"AISScaledNumberWeightCPA" ), g_ScaledNumWeightCPA);
2720 Write(_T (
"AISScaledNumberWeightTCPA" ), g_ScaledNumWeightTCPA);
2721 Write(_T (
"AISScaledNumberWeightRange" ), g_ScaledNumWeightRange);
2722 Write(_T (
"AISScaledNumberWeightSizeOfTarget" ), g_ScaledNumWeightSizeOfT);
2723 Write(_T (
"AISScaledSizeMinimal" ), g_ScaledSizeMinimal);
2724 Write(_T (
"AISShowScaled"), g_bShowScaled);
2726 Write(_T (
"AlertDialogSizeX" ), g_ais_alert_dialog_sx);
2727 Write(_T (
"AlertDialogSizeY" ), g_ais_alert_dialog_sy);
2728 Write(_T (
"AlertDialogPosX" ), g_ais_alert_dialog_x);
2729 Write(_T (
"AlertDialogPosY" ), g_ais_alert_dialog_y);
2730 Write(_T (
"QueryDialogPosX" ), g_ais_query_dialog_x);
2731 Write(_T (
"QueryDialogPosY" ), g_ais_query_dialog_y);
2732 Write(_T (
"AISTargetListPerspective" ), g_AisTargetList_perspective);
2733 Write(_T (
"AISTargetListRange" ), g_AisTargetList_range);
2734 Write(_T (
"AISTargetListSortColumn" ), g_AisTargetList_sortColumn);
2735 Write(_T (
"bAISTargetListSortReverse" ), g_bAisTargetList_sortReverse);
2736 Write(_T (
"AISTargetListColumnSpec" ), g_AisTargetList_column_spec);
2737 Write(_T (
"AISTargetListColumnOrder"), g_AisTargetList_column_order);
2739 Write(_T (
"S57QueryDialogSizeX" ), g_S57_dialog_sx);
2740 Write(_T (
"S57QueryDialogSizeY" ), g_S57_dialog_sy);
2741 Write(_T (
"S57QueryExtraDialogSizeX" ), g_S57_extradialog_sx);
2742 Write(_T (
"S57QueryExtraDialogSizeY" ), g_S57_extradialog_sy);
2744 Write(_T (
"bAISRolloverShowClass" ), g_bAISRolloverShowClass);
2745 Write(_T (
"bAISRolloverShowCOG" ), g_bAISRolloverShowCOG);
2746 Write(_T (
"bAISRolloverShowCPA" ), g_bAISRolloverShowCPA);
2748 Write(_T (
"bAISAlertAckTimeout" ), g_bAIS_ACK_Timeout);
2749 Write(_T (
"AlertAckTimeoutMinutes" ), g_AckTimeout_Mins);
2751 SetPath(_T (
"/Settings/GlobalState" ));
2753 Write(_T (
"bShowS57Text" ), ps52plib->GetShowS57Text());
2754 Write(_T (
"bShowS57ImportantTextOnly" ),
2755 ps52plib->GetShowS57ImportantTextOnly());
2756 if (!g_bInlandEcdis)
2757 Write(_T (
"nDisplayCategory" ), (
long)ps52plib->GetDisplayCategory());
2758 Write(_T (
"nSymbolStyle" ), (
int)ps52plib->m_nSymbolStyle);
2759 Write(_T (
"nBoundaryStyle" ), (
int)ps52plib->m_nBoundaryStyle);
2761 Write(_T (
"bShowSoundg" ), ps52plib->m_bShowSoundg);
2762 Write(_T (
"bShowMeta" ), ps52plib->m_bShowMeta);
2763 Write(_T (
"bUseSCAMIN" ), ps52plib->m_bUseSCAMIN);
2764 Write(_T (
"bUseSUPER_SCAMIN" ), ps52plib->m_bUseSUPER_SCAMIN);
2765 Write(_T (
"bShowAtonText" ), ps52plib->m_bShowAtonText);
2766 Write(_T (
"bShowLightDescription" ), ps52plib->m_bShowLdisText);
2767 Write(_T (
"bExtendLightSectors" ), ps52plib->m_bExtendLightSectors);
2768 Write(_T (
"bDeClutterText" ), ps52plib->m_bDeClutterText);
2769 Write(_T (
"bShowNationalText" ), ps52plib->m_bShowNationalTexts);
2771 Write(_T (
"S52_MAR_SAFETY_CONTOUR" ),
2772 S52_getMarinerParam(S52_MAR_SAFETY_CONTOUR));
2773 Write(_T (
"S52_MAR_SHALLOW_CONTOUR" ),
2774 S52_getMarinerParam(S52_MAR_SHALLOW_CONTOUR));
2775 Write(_T (
"S52_MAR_DEEP_CONTOUR" ),
2776 S52_getMarinerParam(S52_MAR_DEEP_CONTOUR));
2777 Write(_T (
"S52_MAR_TWO_SHADES" ), S52_getMarinerParam(S52_MAR_TWO_SHADES));
2778 Write(_T (
"S52_DEPTH_UNIT_SHOW" ), ps52plib->m_nDepthUnitDisplay);
2779 Write(_T (
"ENCSoundingScaleFactor" ), g_ENCSoundingScaleFactor);
2780 Write(_T (
"ENCTextScaleFactor" ), g_ENCTextScaleFactor);
2782 SetPath(_T (
"/Directories" ));
2783 Write(_T (
"S57DataLocation" ), _T(
""));
2786 SetPath(_T (
"/Directories" ));
2787 Write(_T (
"InitChartDir" ), *pInit_Chart_Dir);
2788 Write(_T (
"GPXIODir" ), g_gpx_path);
2789 Write(_T (
"TCDataDir" ), g_TCData_Dir);
2790 Write(_T (
"BasemapDir" ), g_Platform->NormalizePath(gWorldMapLocation));
2791 Write(_T (
"BaseShapefileDir" ),
2792 g_Platform->NormalizePath(gWorldShapefileLocation));
2793 Write(_T (
"pluginInstallDir" ), g_Platform->NormalizePath(g_winPluginDir));
2795 SetPath(_T (
"/Settings/NMEADataSource" ));
2796 wxString connectionconfigs;
2797 for (
size_t i = 0; i < TheConnectionParams().size(); i++) {
2798 if (i > 0) connectionconfigs.Append(_T(
"|"));
2799 connectionconfigs.Append(TheConnectionParams()[i]->Serialize());
2801 Write(_T (
"DataConnections" ), connectionconfigs);
2806 SetPath(_T (
"/Settings/AuxFontKeys" ));
2809 for (
unsigned int i = 0; i < keyArray.GetCount(); i++) {
2811 key.Printf(_T(
"Key%i"), i);
2812 wxString keyval = keyArray[i];
2818 font_path = (_T (
"/Settings/X11Fonts" ));
2822 font_path = (_T (
"/Settings/GTKFonts" ));
2826 font_path = (_T (
"/Settings/MSWFonts" ));
2830 font_path = (_T (
"/Settings/MacFonts" ));
2834 font_path = (_T (
"/Settings/QTFonts" ));
2837 DeleteGroup(font_path);
2843 for (
int i = 0; i < nFonts; i++) {
2844 wxString cfstring(FontMgr::Get().GetConfigString(i));
2846 Write(cfstring, valstring);
2850 DeleteGroup(_T (
"/TideCurrentDataSources" ));
2851 SetPath(_T (
"/TideCurrentDataSources" ));
2852 unsigned int id = 0;
2853 for (
auto val : TideCurrentDataSet) {
2855 key.Printf(_T(
"tcds%d"),
id);
2856 Write(key, wxString(val));
2860 SetPath(_T (
"/Settings/Others" ));
2863 Write(_T (
"ShowRadarRings" ),
2864 (
bool)(g_iNavAidRadarRingsNumberVisible > 0));
2865 Write(_T (
"RadarRingsNumberVisible" ), g_iNavAidRadarRingsNumberVisible);
2866 Write(_T (
"RadarRingsStep" ), g_fNavAidRadarRingsStep);
2867 Write(_T (
"RadarRingsStepUnits" ), g_pNavAidRadarRingsStepUnits);
2868 Write(_T (
"RadarRingsColour" ),
2869 g_colourOwnshipRangeRingsColour.GetAsString(wxC2S_HTML_SYNTAX));
2870 Write(_T(
"WaypointUseScaMin" ), g_bUseWptScaMin);
2871 Write(_T(
"WaypointScaMinValue" ), g_iWpt_ScaMin);
2872 Write(_T(
"WaypointUseScaMinOverrule" ), g_bOverruleScaMin);
2873 Write(_T(
"WaypointsShowName"), g_bShowWptName);
2874 Write(_T(
"UserIconsFirst"), g_bUserIconsFirst);
2877 Write(_T (
"WaypointRangeRingsNumber" ), g_iWaypointRangeRingsNumber);
2878 Write(_T (
"WaypointRangeRingsStep" ), g_fWaypointRangeRingsStep);
2879 Write(_T (
"WaypointRangeRingsStepUnits" ), g_iWaypointRangeRingsStepUnits);
2880 Write(_T (
"WaypointRangeRingsColour" ),
2881 g_colourWaypointRangeRingsColour.GetAsString(wxC2S_HTML_SYNTAX));
2883 Write(_T (
"ConfirmObjectDeletion" ), g_bConfirmObjectDelete);
2886 Write(_T (
"WaypointPreventDragging" ), g_bWayPointPreventDragging);
2888 Write(_T (
"EnableZoomToCursor" ), g_bEnableZoomToCursor);
2890 Write(_T (
"TrackIntervalSeconds" ), g_TrackIntervalSeconds);
2891 Write(_T (
"TrackDeltaDistance" ), g_TrackDeltaDistance);
2892 Write(_T (
"TrackPrecision" ), g_nTrackPrecision);
2894 Write(_T (
"RouteLineWidth" ), g_route_line_width);
2895 Write(_T (
"TrackLineWidth" ), g_track_line_width);
2896 Write(_T (
"TrackLineColour" ),
2897 g_colourTrackLineColour.GetAsString(wxC2S_HTML_SYNTAX));
2898 Write(_T (
"DefaultWPIcon" ), g_default_wp_icon);
2899 Write(_T (
"DefaultRPIcon" ), g_default_routepoint_icon);
2901 DeleteGroup(_T (
"/MmsiProperties" ));
2902 SetPath(_T (
"/MmsiProperties" ));
2903 for (
unsigned int i = 0; i < g_MMSI_Props_Array.GetCount(); i++) {
2905 p.Printf(_T(
"Props%d"), i);
2906 Write(p, g_MMSI_Props_Array[i]->Serialize());
2909 SaveCanvasConfigs();
2912 SendMessageToAllPlugins(
"GLOBAL_SETTINGS_UPDATED", wxEmptyString);
2915void MyConfig::UpdateNavObjOnly() {
2919 pNavObjectSet->CreateAllGPXObjects();
2920 pNavObjectSet->SaveFile(m_sNavObjSetFile);
2922 delete pNavObjectSet;
2925void MyConfig::UpdateNavObj(
bool bRecreate) {
2929 pNavObjectSet->CreateAllGPXObjects();
2930 pNavObjectSet->SaveFile(m_sNavObjSetFile);
2932 delete pNavObjectSet;
2934 if (m_pNavObjectChangesSet->m_changes_file)
2935 fclose(m_pNavObjectChangesSet->m_changes_file);
2937 if (::wxFileExists(m_sNavObjSetChangesFile)) {
2939 wxRemoveFile(m_sNavObjSetChangesFile);
2943 m_pNavObjectChangesSet->Init(m_sNavObjSetChangesFile);
2945 m_pNavObjectChangesSet->reset();
2946 if (m_pNavObjectChangesSet->load_file(m_sNavObjSetChangesFile.fn_str())
2947 .status != pugi::xml_parse_status::status_ok) {
2948 wxLogMessage(
"Error while loading " + m_sNavObjSetChangesFile +
2949 ", ignoring contents of the file.");
2950 m_pNavObjectChangesSet->reset();
2955static wxFileName exportFileName(wxWindow *parent,
2956 const wxString suggestedName) {
2959 wxString validName{suggestedName};
2962 validName.Replace(_T(
"/"), _T(
"-"));
2963 validName.Replace(_T(
":"), _T(
"_"));
2966 if (!validName.EndsWith(
".gpx")) {
2967 wxFileName fn(validName);
2970 validName = fn.GetFullName();
2973 int response = g_Platform->DoFileSelectorDialog(
2974 parent, &path, _(
"Export GPX file"), g_gpx_path, validName, wxT(
"*.gpx"));
2976 if (response == wxID_OK) {
2977 wxFileName fn(path);
2978 g_gpx_path = fn.GetPath();
2979 fn.SetExt(_T(
"gpx"));
2982 if (wxFileExists(fn.GetFullPath())) {
2984 OCPNMessageBox(NULL, _(
"Overwrite existing file?"), _T(
"Confirm"),
2985 wxICON_QUESTION | wxYES_NO | wxCANCEL);
2986 if (answer != wxID_YES)
return ret;
2994bool MyConfig::IsChangesFileDirty() {
2995 return m_pNavObjectChangesSet->IsDirty();
2998bool ExportGPXRoutes(wxWindow *parent, RouteList *pRoutes,
2999 const wxString suggestedName) {
3000 wxFileName fn = exportFileName(parent, suggestedName);
3003 pgpx->AddGPXRoutesList(pRoutes);
3006 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
3008 pgpx->SaveFile(fns);
3009 AndroidSecureCopyFile(fns, fn.GetFullPath());
3011 pgpx->SaveFile(fn.GetFullPath());
3022bool ExportGPXTracks(wxWindow *parent, std::vector<Track *> *pTracks,
3023 const wxString suggestedName) {
3024 wxFileName fn = exportFileName(parent, suggestedName);
3027 pgpx->AddGPXTracksList(pTracks);
3029 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
3031 pgpx->SaveFile(fns);
3032 AndroidSecureCopyFile(fns, fn.GetFullPath());
3034 pgpx->SaveFile(fn.GetFullPath());
3043bool ExportGPXWaypoints(wxWindow *parent, RoutePointList *pRoutePoints,
3044 const wxString suggestedName) {
3045 wxFileName fn = exportFileName(parent, suggestedName);
3048 pgpx->AddGPXPointsList(pRoutePoints);
3051 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
3053 pgpx->SaveFile(fns);
3054 AndroidSecureCopyFile(fns, fn.GetFullPath());
3056 pgpx->SaveFile(fn.GetFullPath());
3066void ExportGPX(wxWindow *parent,
bool bviz_only,
bool blayer) {
3067 wxFileName fn = exportFileName(parent, _T(
"userobjects.gpx"));
3069 ::wxBeginBusyCursor();
3073 wxGenericProgressDialog *pprog =
nullptr;
3074 int count = pWayPointMan->GetWaypointList()->GetCount();
3075 int progStep = count / 32;
3077 pprog =
new wxGenericProgressDialog(
3078 _(
"Export GPX file"), _T(
"0/0"), count, NULL,
3079 wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME |
3080 wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME);
3081 pprog->SetSize(400, wxDefaultCoord);
3088 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
3091 if (pprog && !(ic % progStep)) {
3093 msg.Printf(_T(
"%d/%d"), ic, count);
3094 pprog->Update(ic, msg);
3098 pr = node->GetData();
3102 if (bviz_only && !pr->m_bIsVisible) b_add =
false;
3104 if (pr->m_bIsInLayer && !blayer) b_add =
false;
3106 if (pr->IsShared() || !WptIsInRouteList(pr)) pgpx->AddGPXWaypoint(pr);
3109 node = node->GetNext();
3112 wxRouteListNode *node1 = pRouteList->GetFirst();
3114 Route *pRoute = node1->GetData();
3118 if (bviz_only && !pRoute->IsVisible()) b_add =
false;
3122 if (b_add) pgpx->AddGPXRoute(pRoute);
3124 node1 = node1->GetNext();
3127 for (
Track *pTrack : g_TrackList) {
3130 if (bviz_only && !pTrack->IsVisible()) b_add =
false;
3132 if (pTrack->m_bIsInLayer && !blayer) b_add =
false;
3134 if (b_add) pgpx->AddGPXTrack(pTrack);
3141 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
3143 pgpx->SaveFile(fns);
3144 AndroidSecureCopyFile(fns, fn.GetFullPath());
3146 pgpx->SaveFile(fn.GetFullPath());
3150 ::wxEndBusyCursor();
3156void UI_ImportGPX(wxWindow *parent,
bool islayer, wxString dirpath,
3157 bool isdirectory,
bool isPersistent) {
3158 int response = wxID_CANCEL;
3159 wxArrayString file_array;
3162 if (!islayer || dirpath.IsSameAs(_T(
""))) {
3167 wxFileDialog *popenDialog =
3168 new wxFileDialog(NULL, _(
"Import GPX file"), g_gpx_path, wxT(
""),
3169 wxT(
"GPX files (*.gpx)|*.gpx|All files (*.*)|*.*"),
3170 wxFD_OPEN | wxFD_MULTIPLE);
3172 if (g_bresponsive && parent)
3173 popenDialog = g_Platform->AdjustFileDialogFont(parent, popenDialog);
3175 popenDialog->Centre();
3178 if (parent) parent->HideWithEffect(wxSHOW_EFFECT_BLEND);
3181 response = popenDialog->ShowModal();
3184 if (parent) parent->ShowWithEffect(wxSHOW_EFFECT_BLEND);
3187 if (response == wxID_OK) {
3188 popenDialog->GetPaths(file_array);
3191 if (file_array.GetCount()) {
3192 wxFileName fn(file_array[0]);
3193 g_gpx_path = fn.GetPath();
3199 response = g_Platform->DoFileSelectorDialog(
3200 NULL, &path, _(
"Import GPX file"), g_gpx_path, _T(
""), wxT(
"*.gpx"));
3202 file_array.Add(path);
3203 wxFileName fn(path);
3204 g_gpx_path = fn.GetPath();
3210 if (wxDir::GetAllFiles(dirpath, &file_array, wxT(
"*.gpx")))
3213 file_array.Add(dirpath);
3218 if (response == wxID_OK) {
3221 l->m_LayerID = ++g_LayerIdx;
3222 l->m_LayerFileName = file_array[0];
3223 if (file_array.GetCount() <= 1)
3224 wxFileName::SplitPath(file_array[0], NULL, NULL, &(l->m_LayerName),
3227 if (dirpath.IsSameAs(_T(
"")))
3228 wxFileName::SplitPath(g_gpx_path, NULL, NULL, &(l->m_LayerName), NULL,
3231 wxFileName::SplitPath(dirpath, NULL, NULL, &(l->m_LayerName), NULL,
3235 bool bLayerViz = g_bShowLayers;
3236 if (g_VisibleLayers.Contains(l->m_LayerName)) bLayerViz =
true;
3237 if (g_InvisibleLayers.Contains(l->m_LayerName)) bLayerViz =
false;
3238 l->m_bIsVisibleOnChart = bLayerViz;
3241 l->m_bHasVisibleNames = wxCHK_CHECKED;
3244 laymsg.Printf(wxT(
"New layer %d: %s"), l->m_LayerID,
3245 l->m_LayerName.c_str());
3246 wxLogMessage(laymsg);
3248 pLayerList->Insert(l);
3251 for (
unsigned int i = 0; i < file_array.GetCount(); i++) {
3252 wxString path = file_array[i];
3254 if (::wxFileExists(path)) {
3256 if (pSet->load_file(path.fn_str()).status !=
3257 pugi::xml_parse_status::status_ok) {
3258 wxLogMessage(
"Error loading GPX file " + path);
3265 l->m_NoOfItems = pSet->LoadAllGPXObjectsAsLayer(
3266 l->m_LayerID, l->m_bIsVisibleOnChart, l->m_bHasVisibleNames);
3267 l->m_LayerType = isPersistent ? _(
"Persistent") : _(
"Temporary");
3272 wxString destf, f, name, ext;
3273 f = l->m_LayerFileName;
3274 wxFileName::SplitPath(f, NULL, NULL, &name, &ext);
3276 appendOSDirSlash(&destf);
3277 destf.Append(_T(
"layers"));
3278 appendOSDirSlash(&destf);
3279 if (!wxDirExists(destf)) {
3280 if (!wxMkdir(destf, wxS_DIR_DEFAULT))
3281 wxLogMessage(_T(
"Error creating layer directory"));
3284 destf << name << _T(
".") << ext;
3286 if (wxCopyFile(f, destf,
true))
3287 msg.Printf(_T(
"File: %s.%s also added to persistent layers"),
3290 msg.Printf(_T(
"Failed adding %s.%s to persistent layers"), name,
3296 pSet->LoadAllGPXObjects(
3302 wxString::Format(_T(
"%d ") + _(
"duplicate waypoints detected "
3303 "during import and ignored."),
3305 _(
"OpenCPN Info"), wxICON_INFORMATION | wxOK, 10);
3317void SwitchInlandEcdisMode(
bool Switch) {
3319 wxLogMessage(_T(
"Switch InlandEcdis mode On"));
3323 g_iDistanceFormat = 2;
3326 if (ps52plib) ps52plib->SetDisplayCategory(STANDARD);
3327 g_bDrawAISSize =
false;
3328 if (gFrame) gFrame->RequestNewToolbars(
true);
3330 wxLogMessage(_T(
"Switch InlandEcdis mode Off"));
3333 pConfig->SetPath(_T (
"/Settings" ));
3334 pConfig->Read(_T (
"GlobalToolbarConfig" ), &g_toolbarConfig);
3335 pConfig->Read(_T (
"DistanceFormat" ), &g_iDistanceFormat);
3336 pConfig->Read(_T (
"SpeedFormat" ), &g_iSpeedFormat);
3337 pConfig->Read(_T (
"ShowDepthUnits" ), &g_bShowDepthUnits, 1);
3339 pConfig->Read(_T (
"nDisplayCategory" ), &read_int,
3340 (
enum _DisCat)STANDARD);
3341 if (ps52plib) ps52plib->SetDisplayCategory((
enum _DisCat)read_int);
3342 pConfig->SetPath(_T (
"/Settings/AIS" ));
3343 pConfig->Read(_T (
"bDrawAISSize" ), &g_bDrawAISSize);
3344 pConfig->Read(_T (
"bDrawAISRealtime" ), &g_bDrawAISRealtime);
3346 if (gFrame) gFrame->RequestNewToolbars(
true);
3358wxString FormatGPXDateTime(wxDateTime dt) {
3360 return dt.Format(wxT(
"%Y-%m-%dT%H:%M:%SZ"));
3367bool LogMessageOnce(
const wxString &msg) {
3370 for (
unsigned int i = 0; i < pMessageOnceArray->GetCount(); i++) {
3371 if (msg.IsSameAs(pMessageOnceArray->Item(i)))
return false;
3375 pMessageOnceArray->Add(msg);
3386wxDateTime toUsrDateTime(
const wxDateTime ts,
const int format,
3388 if (!ts.IsValid()) {
3391 int effective_format = format;
3392 if (effective_format == GLOBAL_SETTINGS_INPUT) {
3393 if (::g_datetime_format ==
"UTC") {
3394 effective_format = UTCINPUT;
3395 }
else if (::g_datetime_format ==
"LMT") {
3396 effective_format = LMTINPUT;
3397 }
else if (::g_datetime_format ==
"Local Time") {
3398 effective_format = LTINPUT;
3401 effective_format = UTCINPUT;
3405 switch (effective_format) {
3407 if (std::isnan(lon)) {
3408 dt = wxInvalidDateTime;
3411 ts.Add(wxTimeSpan(wxTimeSpan(0, 0, wxLongLong(lon * 3600. / 15.))));
3426wxDateTime fromUsrDateTime(
const wxDateTime ts,
const int format,
3428 if (!ts.IsValid()) {
3431 int effective_format = format;
3432 if (effective_format == GLOBAL_SETTINGS_INPUT) {
3433 if (::g_datetime_format ==
"UTC") {
3434 effective_format = UTCINPUT;
3435 }
else if (::g_datetime_format ==
"LMT") {
3436 effective_format = LMTINPUT;
3437 }
else if (::g_datetime_format ==
"Local Time") {
3438 effective_format = LTINPUT;
3441 effective_format = UTCINPUT;
3445 switch (effective_format) {
3447 if (std::isnan(lon)) {
3448 dt = wxInvalidDateTime;
3450 dt = ts.Subtract(wxTimeSpan(0, 0, wxLongLong(lon * 3600. / 15.)));
3467double fromUsrDistance(
double usr_distance,
int unit) {
3469 if (
unit == -1)
unit = g_iDistanceFormat;
3475 ret = usr_distance / 1.15078;
3478 ret = usr_distance / 1.852;
3481 ret = usr_distance / 1852;
3484 ret = usr_distance / 6076.12;
3492double fromUsrSpeed(
double usr_speed,
int unit) {
3494 if (
unit == -1)
unit = g_iSpeedFormat;
3500 ret = usr_speed / 1.15078;
3503 ret = usr_speed / 1.852;
3506 ret = usr_speed / 0.514444444;
3514double fromUsrWindSpeed(
double usr_wspeed,
int unit) {
3516 if (
unit == -1)
unit = g_iWindSpeedFormat;
3522 ret = usr_wspeed / 0.514444444;
3525 ret = usr_wspeed / 1.15078;
3528 ret = usr_wspeed / 1.852;
3537double fromUsrTemp(
double usr_temp,
int unit) {
3539 if (
unit == -1)
unit = g_iTempFormat;
3545 ret = (usr_temp - 32) * 5.0 / 9.0;
3548 ret = usr_temp - 273.15;
3554wxString formatAngle(
double angle) {
3556 if (g_bShowMag && g_bShowTrue) {
3557 out.Printf(wxT(
"%03.0f %cT (%.0f %cM)"), angle, 0x00B0, toMagnetic(angle),
3559 }
else if (g_bShowTrue) {
3560 out.Printf(wxT(
"%03.0f %cT"), angle, 0x00B0);
3562 out.Printf(wxT(
"%03.0f %cM"), toMagnetic(angle), 0x00B0);
3568void AlphaBlending(
ocpnDC &dc,
int x,
int y,
int size_x,
int size_y,
3569 float radius, wxColour color,
unsigned char transparency) {
3570 wxDC *pdc = dc.GetDC();
3573 wxBitmap obm(size_x, size_y);
3575 mdc1.SelectObject(obm);
3576 mdc1.Blit(0, 0, size_x, size_y, pdc, x, y);
3577 mdc1.SelectObject(wxNullBitmap);
3578 wxImage oim = obm.ConvertToImage();
3581 wxBitmap olbm(size_x, size_y);
3582 wxMemoryDC oldc(olbm);
3583 if (!oldc.IsOk())
return;
3585 oldc.SetBackground(*wxBLACK_BRUSH);
3586 oldc.SetBrush(*wxWHITE_BRUSH);
3589 if (radius > 0.0) oldc.DrawRoundedRectangle(0, 0, size_x, size_y, radius);
3591 wxImage dest = olbm.ConvertToImage();
3592 unsigned char *dest_data =
3593 (
unsigned char *)malloc(size_x * size_y * 3 *
sizeof(
unsigned char));
3594 unsigned char *bg = oim.GetData();
3595 unsigned char *box = dest.GetData();
3596 unsigned char *d = dest_data;
3603 float alpha = 1.0 - (float)transparency / 255.0;
3604 int sb = size_x * size_y;
3605 for (
int i = 0; i < sb; i++) {
3607 if (*box == 0 && radius > 0.0) a = 1.0;
3608 int r = ((*bg++) * a) + (1.0 - a) * color.Red();
3611 int g = ((*bg++) * a) + (1.0 - a) * color.Green();
3614 int b = ((*bg++) * a) + (1.0 - a) * color.Blue();
3619 dest.SetData(dest_data);
3623 dc.DrawBitmap(dbm, x, y,
false);
3627 dc.CalcBoundingBox(x, y);
3628 dc.CalcBoundingBox(x + size_x, y + size_y);
3633 float radMod = wxMax(radius, 2.0);
3634 wxColour c(color.Red(), color.Green(), color.Blue(), transparency);
3635 dc.SetBrush(wxBrush(c));
3636 dc.SetPen(wxPen(c, 1));
3637 dc.DrawRoundedRectangle(x, y, size_x, size_y, radMod);
3639 glDisable(GL_BLEND);
3645void DimeControl(wxWindow *ctrl) {
3651 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) {
3659 if (wxSystemSettings::GetColour(wxSystemColour::wxSYS_COLOUR_WINDOW).Red() <
3666 if (NULL == ctrl)
return;
3668 wxColour col, window_back_color, gridline, uitext, udkrd, ctrl_back_color,
3670 col = GetGlobalColor(_T(
"DILG0"));
3671 window_back_color = GetGlobalColor(_T(
"DILG1"));
3672 ctrl_back_color = GetGlobalColor(_T(
"DILG1"));
3673 text_color = GetGlobalColor(_T(
"DILG3"));
3674 uitext = GetGlobalColor(_T(
"UITX1"));
3675 udkrd = GetGlobalColor(_T(
"UDKRD"));
3676 gridline = GetGlobalColor(_T(
"GREY2"));
3678 DimeControl(ctrl, col, window_back_color, ctrl_back_color, text_color, uitext,
3682void DimeControl(wxWindow *ctrl, wxColour col, wxColour window_back_color,
3683 wxColour ctrl_back_color, wxColour text_color, wxColour uitext,
3684 wxColour udkrd, wxColour gridline) {
3690 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) {
3695 ColorScheme cs = global_color_scheme;
3699 (cs == GLOBAL_COLOR_SCHEME_DUSK || cs == GLOBAL_COLOR_SCHEME_NIGHT);
3701 static int depth = 0;
3707 window_back_color = wxNullColour;
3709 window_back_color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
3711 col = wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX);
3712 uitext = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
3715 ctrl->SetBackgroundColour(window_back_color);
3716 if (darkMode) ctrl->SetForegroundColour(text_color);
3719 wxWindowList kids = ctrl->GetChildren();
3720 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
3721 wxWindowListNode *node = kids.Item(i);
3722 wxWindow *win = node->GetData();
3724 if (
dynamic_cast<wxListBox *
>(win) ||
dynamic_cast<wxListCtrl *
>(win) ||
3725 dynamic_cast<wxTextCtrl *
>(win) ||
3726 dynamic_cast<wxTimePickerCtrl *
>(win)) {
3727 win->SetBackgroundColour(col);
3728 }
else if (
dynamic_cast<wxStaticText *
>(win) ||
3729 dynamic_cast<wxCheckBox *
>(win) ||
3730 dynamic_cast<wxRadioButton *
>(win)) {
3731 win->SetForegroundColour(uitext);
3738 else if (
dynamic_cast<wxBitmapComboBox *
>(win) ||
3739 dynamic_cast<wxChoice *
>(win) ||
dynamic_cast<wxComboBox *
>(win) ||
3740 dynamic_cast<wxTreeCtrl *
>(win)) {
3741 win->SetBackgroundColour(col);
3744 else if (
dynamic_cast<wxScrolledWindow *
>(win) ||
3745 dynamic_cast<wxGenericDirCtrl *
>(win) ||
3746 dynamic_cast<wxListbook *
>(win) ||
dynamic_cast<wxButton *
>(win) ||
3747 dynamic_cast<wxToggleButton *
>(win)) {
3748 win->SetBackgroundColour(window_back_color);
3751 else if (
dynamic_cast<wxNotebook *
>(win)) {
3752 win->SetBackgroundColour(window_back_color);
3753 win->SetForegroundColour(text_color);
3757 else if (
dynamic_cast<wxHtmlWindow *
>(win)) {
3758 if (cs != GLOBAL_COLOR_SCHEME_DAY && cs != GLOBAL_COLOR_SCHEME_RGB)
3759 win->SetBackgroundColour(ctrl_back_color);
3761 win->SetBackgroundColour(wxNullColour);
3764 else if (
dynamic_cast<wxGrid *
>(win)) {
3765 dynamic_cast<wxGrid *
>(win)->SetDefaultCellBackgroundColour(
3767 dynamic_cast<wxGrid *
>(win)->SetDefaultCellTextColour(uitext);
3768 dynamic_cast<wxGrid *
>(win)->SetLabelBackgroundColour(col);
3769 dynamic_cast<wxGrid *
>(win)->SetLabelTextColour(uitext);
3770 dynamic_cast<wxGrid *
>(win)->SetGridLineColour(gridline);
3773 if (win->GetChildren().GetCount() > 0) {
3776 DimeControl(w, col, window_back_color, ctrl_back_color, text_color,
3777 uitext, udkrd, gridline);
3783#define LUMIMOSITY_NIGHT (-0.8)
3784#define LUMIMOSITY_DUSK (-0.5)
3786wxColor GetDimedColor(
const wxColor &c) {
3787 switch (global_color_scheme) {
3788 case ColorScheme::GLOBAL_COLOR_SCHEME_NIGHT:
3790 wxMax(0, wxMin(c.Red() + c.Red() * LUMIMOSITY_NIGHT, 255)),
3791 wxMax(0, wxMin(c.Green() + c.Green() * LUMIMOSITY_NIGHT, 255)),
3792 wxMax(0, wxMin(c.Blue() + c.Blue() * LUMIMOSITY_NIGHT, 255))));
3793 case ColorScheme::GLOBAL_COLOR_SCHEME_DUSK:
3795 wxColor(wxMax(0, wxMin(c.Red() + c.Red() * LUMIMOSITY_DUSK, 255)),
3796 wxMax(0, wxMin(c.Green() + c.Green() * LUMIMOSITY_DUSK, 255)),
3797 wxMax(0, wxMin(c.Blue() + c.Blue() * LUMIMOSITY_DUSK, 255))));
bool g_bresponsive
Flag to control adaptive UI scaling.
Global state for AIS decoder.
Represents an individual component within a ChartGroup.
Represents a user-defined collection of logically related charts.
wxString GetFullConfigDesc(int i) const
Gets description of font at index i.
bool AddAuxKey(wxString key)
Adds new plugin-defined font configuration key.
void LoadFontNative(wxString *pConfigString, wxString *pNativeDesc)
Loads font settings from a string descriptor.
static wxString GetFontConfigKey(const wxString &description)
Creates configuration key from UI element name by combining locale with hash.
int GetNumFonts(void) const
Gets the total number of font configurations currently loaded.
wxArrayString & GetAuxKeyArray()
Gets array of plugin-defined font configuration keys.
Wrapper for global variable, supports notification events when value changes.
Represents a layer of chart objects in OpenCPN.
static int config_to_ui(double value)
Convert configuration 1.02..3.0 value to slider scale 1..100.
static double ui_to_config(int slider_pos)
Convert a slider scale 1-100 value to configuration value 1.02..3.0.
Represents a waypoint or mark within the navigation system.
Represents a navigational route in the navigation system.
bool m_bIsInLayer
Flag indicating whether this route belongs to a layer.
Represents a single point in a track.
Represents a track, which is a series of connected track points.
ViewPort - Core geographic projection and coordinate transformation engine.
double view_scale_ppm
Requested view scale in physical pixels per meter (ppm), before applying projections.
double rotation
Rotation angle of the viewport in radians.
double clon
Center longitude of the viewport in degrees.
double clat
Center latitude of the viewport in degrees.
Encapsulates persistent canvas configuration.
double iLat
Latitude of the center of the chart, in degrees.
bool bShowOutlines
Display chart outlines.
wxSize canvasSize
Canvas dimensions.
bool bShowDepthUnits
Display depth unit indicators.
double iLon
Longitude of the center of the chart, in degrees.
double iRotation
Initial rotation angle in radians.
bool bCourseUp
Orient display to course up.
bool bQuilt
Enable chart quilting.
bool bFollow
Enable vessel following mode.
double iScale
Initial chart scale factor.
bool bShowENCText
Display ENC text elements.
bool bShowAIS
Display AIS targets.
bool bShowGrid
Display coordinate grid.
ChartCanvas * canvas
Pointer to associated chart canvas.
bool bShowCurrents
Display current information.
bool bShowTides
Display tide information.
bool bLookahead
Enable lookahead mode.
bool bHeadUp
Orient display to heading up.
bool bAttenAIS
Enable AIS target attenuation.
Device context class that can use either wxDC or OpenGL for drawing.
Global variables reflecting command line options and arguments.
NavmsgFilter Read(const std::string &name)
Read filter with given name from disk.
bool Write(const NavmsgFilter &filter, const std::string &name)
Write contents for given filter to disk.
PlugIn Object Definition/API.
Tools to send data to plugins.