47#include <wx/bmpcbox.h>
49#include "wx/dirctrl.h"
50#include <wx/filename.h>
51#include <wx/graphics.h>
53#include <wx/listbook.h>
54#include <wx/listimpl.cpp>
55#include <wx/progdlg.h>
56#include <wx/sstream.h>
58#include <wx/timectrl.h>
59#include <wx/tokenzr.h>
61#include "o_sound/o_sound.h"
69#include "model/geodesic.h"
74#include "model/nav_object_database.h"
105#include "snd_config.h"
108#include "user_colors.h"
115#include "androidUTIL.h"
119static bool g_bLayersLoaded;
126static const long long lNaN = 0xfff8000000000000;
127#define NAN (*(double *)&lNaN)
132wxArrayString *pMessageOnceArray;
134void InitGlobals() { pMessageOnceArray =
new wxArrayString(); }
136void DeinitGlobals() {
137 delete pMessageOnceArray;
138 pMessageOnceArray =
nullptr;
145wxString GetLayerName(
int id) {
146 wxString name(
"unknown layer");
147 if (
id <= 0)
return (name);
148 LayerList::iterator it;
150 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
152 if (lay->m_LayerID ==
id)
return (lay->m_LayerName);
158void appendOSDirSlash(wxString *pString);
165MyConfig::MyConfig(
const wxString &LocalFileName)
166 : wxFileConfig(
"",
"", LocalFileName,
"", wxCONFIG_USE_LOCAL_FILE) {}
168MyConfig::~MyConfig() {}
170unsigned MyConfig::ReadUnsigned(
const wxString &key,
unsigned default_val) {
172 unsigned long value = 0;
173 if (!
Read(key, &s))
return default_val;
175 value = std::stoul(s.ToStdString());
176 }
catch (std::logic_error &) {
179 if (value < 0 || value > std::numeric_limits<unsigned>::max())
181 return static_cast<unsigned>(value);
184int MyConfig::LoadMyConfig() {
185 int display_width, display_height;
191 g_TalkerIdText =
"EC";
192 g_maxWPNameLength = 6;
193 g_NMEAAPBPrecision = 3;
196 g_GLOptions.m_bUseAcceleratedPanning =
true;
197 g_GLOptions.m_GLPolygonSmoothing =
true;
198 g_GLOptions.m_GLLineSmoothing =
true;
199 g_GLOptions.m_iTextureDimension = 512;
200 g_GLOptions.m_iTextureMemorySize = 128;
202 g_GLOptions.m_iTextureMemorySize =
203 wxMax(128, g_GLOptions.m_iTextureMemorySize);
204 g_GLOptions.m_bTextureCompressionCaching =
205 g_GLOptions.m_bTextureCompression;
209 g_maintoolbar_orient = wxTB_HORIZONTAL;
210 g_iENCToolbarPosX = -1;
211 g_iENCToolbarPosY = -1;
212 g_restore_dbindex = -1;
213 g_ChartNotRenderScaleFactor = 1.5;
214 g_detailslider_dialog_x = 200L;
215 g_detailslider_dialog_y = 200L;
216 g_SENC_LOD_pixels = 2;
217 g_SkewCompUpdatePeriod = 10;
219 g_bShowStatusBar = 1;
220 g_bShowCompassWin = 1;
221 g_iSoundDeviceIndex = -1;
222 g_bFullscreenToolbar = 1;
223 g_bTransparentToolbar = 0;
225 g_bShowDepthUnits = 1;
226 g_bShowActiveRouteHighway = 1;
228 g_defaultBoatSpeed = 6.0;
229 g_ownship_predictor_minutes = 5;
230 g_cog_predictor_style = 105;
231 g_cog_predictor_color =
"rgb(255,0,0)";
232 g_cog_predictor_endmarker = 1;
233 g_ownship_HDTpredictor_style = 105;
234 g_ownship_HDTpredictor_color =
"rgb(255,0,0)";
235 g_ownship_HDTpredictor_endmarker = 1;
236 g_ownship_HDTpredictor_width = 0;
237 g_cog_predictor_width = 3;
238 g_ownship_HDTpredictor_miles = 1;
239 g_n_ownship_min_mm = 2;
240 g_bFullScreenQuilt = 1;
241 g_track_rotate_time_type = TIME_TYPE_COMPUTER;
242 g_bHighliteTracks = 1;
243 g_bPreserveScaleOnX = 1;
245 g_benableAISNameCache =
true;
246 g_n_arrival_circle_radius = 0.05;
247 g_plus_minus_zoom_factor = 2.0;
248 g_mouse_zoom_sensitivity = 1.5;
251 g_AISShowTracks_Mins = 20;
252 g_AISShowTracks_Limit = 300.0;
253 g_ShowScaled_Num = 10;
254 g_ScaledNumWeightSOG = 50;
255 g_ScaledNumWeightCPA = 60;
256 g_ScaledNumWeightTCPA = 25;
257 g_ScaledSizeMinimal = 50;
258 g_ScaledNumWeightRange = 75;
259 g_ScaledNumWeightSizeOfT = 25;
260 g_Show_Target_Name_Scale = 250000;
261 g_bWplUsePosition = 0;
263 g_ais_cog_predictor_width = 3;
264 g_ais_alert_dialog_sx = 200;
265 g_ais_alert_dialog_sy = 200;
266 g_ais_alert_dialog_x = 200;
267 g_ais_alert_dialog_y = 200;
268 g_ais_query_dialog_x = 200;
269 g_ais_query_dialog_y = 200;
270 g_AisTargetList_range = 40;
271 g_AisTargetList_sortColumn = 2;
272 g_S57_dialog_sx = 400;
273 g_S57_dialog_sy = 400;
274 g_S57_extradialog_sx = 400;
275 g_S57_extradialog_sy = 400;
284 g_iNavAidRadarRingsNumberVisible = 0;
285 g_bNavAidRadarRingsShown =
false;
286 g_fNavAidRadarRingsStep = 1.0;
287 g_pNavAidRadarRingsStepUnits = 0;
288 g_colourOwnshipRangeRingsColour = *wxRED;
289 g_iWaypointRangeRingsNumber = 0;
290 g_fWaypointRangeRingsStep = 1.0;
291 g_iWaypointRangeRingsStepUnits = 0;
293 g_bConfirmObjectDelete =
true;
295 g_TrackIntervalSeconds = 60.0;
296 g_TrackDeltaDistance = 0.10;
297 g_route_line_width = 2;
298 g_track_line_width = 2;
299 g_colourTrackLineColour = wxColour(243, 229, 47);
302 g_default_wp_icon =
"triangle";
303 g_default_routepoint_icon =
"diamond";
307 g_ObjQFileExt =
"txt,rtf,png,html,gif,tif,jpg";
310 int ret_Val = LoadMyConfigRaw();
315 g_Platform->GetChartScaleFactorExp(g_ChartScaleFactor);
316 g_ShipScaleFactorExp =
317 g_Platform->GetChartScaleFactorExp(g_ShipScaleFactor);
318 g_MarkScaleFactorExp =
319 g_Platform->GetMarkScaleFactorExp(g_ChartScaleFactor);
321 g_COGFilterSec = wxMin(g_COGFilterSec, kMaxCogsogFilterSeconds);
322 g_COGFilterSec = wxMax(g_COGFilterSec, 1);
323 g_SOGFilterSec = g_COGFilterSec;
325 if (!g_bShowTrue && !g_bShowMag) g_bShowTrue =
true;
329 if (g_bInlandEcdis) g_bLookAhead = 1;
331 if (g_bdisable_opengl) g_bopengl =
false;
335 g_GLOptions.m_iTextureMemorySize =
336 wxMax(128, g_GLOptions.m_iTextureMemorySize);
337 g_GLOptions.m_bTextureCompressionCaching =
338 g_GLOptions.m_bTextureCompression;
342 g_chart_zoom_modifier_raster = wxMin(g_chart_zoom_modifier_raster, 5);
343 g_chart_zoom_modifier_raster = wxMax(g_chart_zoom_modifier_raster, -5);
344 g_chart_zoom_modifier_vector = wxMin(g_chart_zoom_modifier_vector, 5);
345 g_chart_zoom_modifier_vector = wxMax(g_chart_zoom_modifier_vector, -5);
346 g_cm93_zoom_factor = wxMin(g_cm93_zoom_factor, CM93_ZOOM_FACTOR_MAX_RANGE);
348 wxMax(g_cm93_zoom_factor, (-CM93_ZOOM_FACTOR_MAX_RANGE));
350 if ((g_detailslider_dialog_x < 0) ||
351 (g_detailslider_dialog_x > display_width))
352 g_detailslider_dialog_x = 5;
353 if ((g_detailslider_dialog_y < 0) ||
354 (g_detailslider_dialog_y > display_height))
355 g_detailslider_dialog_y = 5;
357 g_defaultBoatSpeedUserUnit = toUsrSpeed(g_defaultBoatSpeed, -1);
358 g_n_ownship_min_mm = wxMax(g_n_ownship_min_mm, 2);
360 if (g_navobjbackups > 99) g_navobjbackups = 99;
361 if (g_navobjbackups < 0) g_navobjbackups = 0;
362 g_n_arrival_circle_radius = wxClip(g_n_arrival_circle_radius, 0.001, 0.6);
364 g_selection_radius_mm = wxMax(g_selection_radius_mm, 0.5);
365 g_selection_radius_touch_mm = wxMax(g_selection_radius_touch_mm, 1.0);
367 g_Show_Target_Name_Scale = wxMax(5000, g_Show_Target_Name_Scale);
369 if ((g_ais_alert_dialog_x < 0) || (g_ais_alert_dialog_x > display_width))
370 g_ais_alert_dialog_x = 5;
371 if ((g_ais_alert_dialog_y < 0) || (g_ais_alert_dialog_y > display_height))
372 g_ais_alert_dialog_y = 5;
373 if ((g_ais_query_dialog_x < 0) || (g_ais_query_dialog_x > display_width))
374 g_ais_query_dialog_x = 5;
375 if ((g_ais_query_dialog_y < 0) || (g_ais_query_dialog_y > display_height))
376 g_ais_query_dialog_y = 5;
378 SwitchInlandEcdisMode(g_bInlandEcdis);
380 global_color_scheme =
381 GLOBAL_COLOR_SCHEME_DUSK;
390int MyConfig::LoadMyConfigRaw(
bool bAsTemplate) {
394 int display_width, display_height;
399 SetPath(
"/Settings");
400 Read(
"ActiveRoute", &g_active_route);
401 Read(
"PersistActiveRoute", &g_persist_active_route);
403 Read(
"LastAppliedTemplate", &g_lastAppliedTemplateGUID);
404 Read(
"CompatOS", &g_compatOS);
405 Read(
"CompatOsVersion", &g_compatOsVersion);
408 Read(
"ConfigVersionString", &g_config_version_string);
409 Read(
"CmdSoundString", &g_CmdSoundString, wxString(OCPN_SOUND_CMD));
410 if (wxIsEmpty(g_CmdSoundString)) g_CmdSoundString = wxString(OCPN_SOUND_CMD);
411 Read(
"NavMessageShown", &n_NavMessageShown);
413 Read(
"AndroidVersionCode", &g_AndroidVersionCode);
415 Read(
"UIexpert", &g_bUIexpert);
417 Read(
"UIStyle", &g_uiStyle);
419 Read(
"NCacheLimit", &g_nCacheLimit);
425 Read(
"SpaceDropMark", &g_bSpaceDropMark);
428 Read(
"MEMCacheLimit", &mem_limit);
430 g_memCacheLimit = mem_limit * 1024;
432 Read(
"UseModernUI5", &g_useMUI);
434 Read(
"NCPUCount", &g_nCPUCount);
436 Read(
"DebugGDAL", &g_bGDAL_Debug);
437 Read(
"DebugNMEA", &g_nNMEADebug);
438 Read(
"AnchorWatchDefault", &g_nAWDefault);
439 Read(
"AnchorWatchMax", &g_nAWMax);
440 Read(
"GPSDogTimeout", &gps_watchdog_timeout_ticks);
441 Read(
"DebugCM93", &g_bDebugCM93);
444 Read(
"DebugBSBImg", &g_BSBImgDebug);
445 Read(
"DebugGPSD", &g_bDebugGPSD);
446 Read(
"MaxZoomScale", &g_maxzoomin);
447 g_maxzoomin = wxMax(g_maxzoomin, 50);
449 Read(
"DefaultFontSize", &g_default_font_size);
452 Read(
"UseGreenShipIcon", &g_bUseGreenShip);
454 Read(
"AutoHideToolbar", &g_bAutoHideToolbar);
455 Read(
"AutoHideToolbarSecs", &g_nAutoHideToolbar);
457 Read(
"UseSimplifiedScalebar", &g_bsimplifiedScalebar);
459 Read(
"ShowCurrent", &g_bShowCurrent);
462 Read(
"DisplaySizeMM", &size_mm);
464 Read(
"SelectionRadiusMM", &g_selection_radius_mm);
465 Read(
"SelectionRadiusTouchMM", &g_selection_radius_touch_mm);
469 wxStringTokenizer tokenizer(size_mm,
",");
470 while (tokenizer.HasMoreTokens()) {
471 wxString token = tokenizer.GetNextToken();
474 size = std::stoi(token.ToStdString());
475 }
catch (std::invalid_argument &e) {
478 if (size > 100 && size < 2000) {
484 Read(
"DisplaySizeManual", &g_config_display_size_manual);
487 Read(
"GUIScaleFactor", &g_GUIScaleFactor);
489 Read(
"ChartObjectScaleFactor", &g_ChartScaleFactor);
490 Read(
"ShipScaleFactor", &g_ShipScaleFactor);
491 Read(
"ENCSoundingScaleFactor", &g_ENCSoundingScaleFactor);
492 Read(
"ENCTextScaleFactor", &g_ENCTextScaleFactor);
493 Read(
"ObjQueryAppendFilesExt", &g_ObjQFileExt);
496 Read(
"CatalogCustomURL", &g_catalog_custom_url);
497 Read(
"CatalogChannel", &g_catalog_channel);
499 Read(
"NetmaskBits", &g_netmask_bits);
503 Read(
"FilterNMEA_Avg", &g_bfilter_cogsog);
504 Read(
"FilterNMEA_Sec", &g_COGFilterSec);
505 Read(
"GPSIdent", &g_GPS_Ident);
506 Read(
"UseGarminHostUpload", &g_bGarminHostUpload);
507 Read(
"UseNMEA_GLL", &g_bUseGLL);
508 Read(
"UseMagAPB", &g_bMagneticAPB);
509 Read(
"TrackContinuous", &g_btrackContinuous,
false);
510 Read(
"FilterTrackDropLargeJump", &g_trackFilterMax, 1000);
513 Read(
"ShowTrue", &g_bShowTrue);
514 Read(
"ShowMag", &g_bShowMag);
517 Read(
"UserMagVariation", &umv);
518 if (umv.Len()) umv.ToDouble(&g_UserVar);
520 Read(
"ScreenBrightness", &g_nbrightness);
522 Read(
"MemFootprintTargetMB", &g_MemFootMB);
524 Read(
"WindowsComPortMax", &g_nCOMPortCheck);
526 Read(
"ChartQuilting", &g_bQuiltEnable);
527 Read(
"ChartQuiltingInitial", &g_bQuiltStart);
529 Read(
"CourseUpMode", &g_bCourseUp);
531 Read(
"LookAheadMode", &g_bLookAhead);
532 Read(
"SkewToNorthUp", &g_bskew_comp);
533 Read(
"TenHzUpdate", &g_btenhertz, 0);
534 Read(
"DeclutterAnchorage", &g_declutter_anchorage, 0);
536 Read(
"NMEAAPBPrecision", &g_NMEAAPBPrecision);
538 Read(
"TalkerIdText", &g_TalkerIdText);
539 Read(
"MaxWaypointNameLength", &g_maxWPNameLength);
540 Read(
"MbtilesMaxLayers", &g_mbtilesMaxLayers);
542 Read(
"ShowTrackPointTime", &g_bShowTrackPointTime,
true);
546 Read(
"OpenGLExpert", &g_bGLexpert,
false);
547 Read(
"UseAcceleratedPanning", &g_GLOptions.m_bUseAcceleratedPanning,
true);
548 Read(
"GPUTextureCompression", &g_GLOptions.m_bTextureCompression);
549 Read(
"GPUTextureCompressionCaching",
550 &g_GLOptions.m_bTextureCompressionCaching);
551 Read(
"PolygonSmoothing", &g_GLOptions.m_GLPolygonSmoothing);
552 Read(
"LineSmoothing", &g_GLOptions.m_GLLineSmoothing);
553 Read(
"GPUTextureDimension", &g_GLOptions.m_iTextureDimension);
554 Read(
"GPUTextureMemSize", &g_GLOptions.m_iTextureMemorySize);
555 Read(
"DebugOpenGL", &g_bDebugOGL);
556 Read(
"OpenGL", &g_bopengl);
557 Read(
"OpenGLFinishNeeded", &g_b_needFinish);
558 Read(
"SoftwareGL", &g_bSoftwareGL);
564 Read(
"ToolbarX", &g_maintoolbar_x);
565 Read(
"ToolbarY", &g_maintoolbar_y);
566 Read(
"ToolbarOrient", &g_maintoolbar_orient);
567 Read(
"GlobalToolbarConfig", &g_toolbarConfig);
569 Read(
"iENCToolbarX", &g_iENCToolbarPosX);
570 Read(
"iENCToolbarY", &g_iENCToolbarPosY);
572 Read(
"AnchorWatch1GUID", &g_AW1GUID);
573 Read(
"AnchorWatch2GUID", &g_AW2GUID);
575 Read(
"InitialStackIndex", &g_restore_stackindex);
576 Read(
"InitialdBIndex", &g_restore_dbindex);
578 Read(
"ChartNotRenderScaleFactor", &g_ChartNotRenderScaleFactor);
580 Read(
"MobileTouch", &g_btouch);
585 g_bresponsive =
true;
587 g_bresponsive =
false;
592 Read(
"ZoomDetailFactor", &g_chart_zoom_modifier_raster);
593 Read(
"ZoomDetailFactorVector", &g_chart_zoom_modifier_vector);
594 Read(
"PlusMinusZoomFactor", &g_plus_minus_zoom_factor, 2.0);
595 Read(
"MouseZoomSensitivity", &g_mouse_zoom_sensitivity, 1.3);
596 g_mouse_zoom_sensitivity_ui =
598 Read(
"CM93DetailFactor", &g_cm93_zoom_factor);
599 Read(
"TileBasemapZoomFactor", &g_tile_basemap_zoom_factor);
601 Read(
"CM93DetailZoomPosX", &g_detailslider_dialog_x);
602 Read(
"CM93DetailZoomPosY", &g_detailslider_dialog_y);
603 Read(
"ShowCM93DetailSlider", &g_bShowDetailSlider);
605 Read(
"SENC_LOD_Pixels", &g_SENC_LOD_pixels);
607 Read(
"SkewCompUpdatePeriod", &g_SkewCompUpdatePeriod);
609 Read(
"SetSystemTime", &s_bSetSystemTime);
610 Read(
"EnableKioskStartup", &g_kiosk_startup);
611 Read(
"DisableNotifications", &g_disableNotifications, 0);
612 Read(
"ShowStatusBar", &g_bShowStatusBar);
614 Read(
"ShowMenuBar", &g_bShowMenuBar);
616 Read(
"Fullscreen", &g_bFullscreen);
617 Read(
"ShowCompassWindow", &g_bShowCompassWin);
619 Read(
"PlayShipsBells", &g_bPlayShipsBells);
620 Read(
"SoundDeviceIndex", &g_iSoundDeviceIndex);
621 Read(
"FullscreenToolbar", &g_bFullscreenToolbar);
622 Read(
"PermanentMOBIcon", &g_bPermanentMOBIcon);
623 Read(
"ShowLayers", &g_bShowLayers);
624 Read(
"ShowDepthUnits", &g_bShowDepthUnits);
625 Read(
"AutoAnchorDrop", &g_bAutoAnchorMark);
626 Read(
"ShowChartOutlines", &g_bShowOutlines);
627 Read(
"ShowActiveRouteHighway", &g_bShowActiveRouteHighway);
628 Read(
"ShowActiveRouteTotal", &g_bShowRouteTotal);
629 Read(
"MostRecentGPSUploadConnection", &g_uploadConnection);
630 Read(
"ShowChartBar", &g_bShowChartBar);
635 Read(
"DistanceFormat",
640 Read(
"WindSpeedFormat",
641 &g_iWindSpeedFormat);
646 Read(
"LiveETA", &g_bShowLiveETA);
647 Read(
"DefaultBoatSpeed", &g_defaultBoatSpeed);
649 Read(
"OwnshipCOGPredictorMinutes", &g_ownship_predictor_minutes);
650 Read(
"OwnshipCOGPredictorStyle", &g_cog_predictor_style);
651 Read(
"OwnshipCOGPredictorColor", &g_cog_predictor_color);
652 Read(
"OwnshipCOGPredictorEndmarker", &g_cog_predictor_endmarker);
653 Read(
"OwnshipCOGPredictorWidth", &g_cog_predictor_width);
654 Read(
"OwnshipHDTPredictorStyle", &g_ownship_HDTpredictor_style);
655 Read(
"OwnshipHDTPredictorColor", &g_ownship_HDTpredictor_color);
656 Read(
"OwnshipHDTPredictorEndmarker", &g_ownship_HDTpredictor_endmarker);
657 Read(
"OwnshipHDTPredictorWidth", &g_ownship_HDTpredictor_width);
658 Read(
"OwnshipHDTPredictorMiles", &g_ownship_HDTpredictor_miles);
660 Read(
"OwnShipMMSINumber", &mmsi);
662 Read(
"OwnShipIconType", &g_OwnShipIconType);
663 Read(
"OwnShipLength", &g_n_ownship_length_meters);
664 Read(
"OwnShipWidth", &g_n_ownship_beam_meters);
665 Read(
"OwnShipGPSOffsetX", &g_n_gps_antenna_offset_x);
666 Read(
"OwnShipGPSOffsetY", &g_n_gps_antenna_offset_y);
667 Read(
"OwnShipMinSize", &g_n_ownship_min_mm);
668 Read(
"ShowDirectRouteLine", &g_bShowShipToActive);
669 Read(
"DirectRouteLineStyle", &g_shipToActiveStyle);
670 Read(
"DirectRouteLineColor", &g_shipToActiveColor);
673 Read(
"RouteArrivalCircleRadius", &racr);
674 if (racr.Len()) racr.ToDouble(&g_n_arrival_circle_radius);
676 Read(
"FullScreenQuilt", &g_bFullScreenQuilt);
678 Read(
"StartWithTrackActive", &g_bTrackCarryOver);
679 Read(
"AutomaticDailyTracks", &g_bTrackDaily);
680 Read(
"TrackRotateAt", &g_track_rotate_time);
681 Read(
"TrackRotateTimeType", &g_track_rotate_time_type);
682 Read(
"HighlightTracks", &g_bHighliteTracks);
687 Read(
"PlanSpeed", &stps);
688 if (!stps.IsEmpty()) stps.ToDouble(&g_PlanSpeed);
690 Read(
"VisibleLayers", &g_VisibleLayers);
691 Read(
"InvisibleLayers", &g_InvisibleLayers);
692 Read(
"VisNameInLayers", &g_VisiNameinLayers);
693 Read(
"InvisNameInLayers", &g_InVisiNameinLayers);
695 Read(
"PreserveScaleOnX", &g_bPreserveScaleOnX);
697 Read(
"ShowMUIZoomButtons", &g_bShowMuiZoomButtons);
699 Read(
"Locale", &g_locale);
700 Read(
"LocaleOverride", &g_localeOverride);
703 Read(
"KeepNavobjBackups", &g_navobjbackups);
707 Read(
"LegacyInputCOMPortFilterBehaviour", &g_b_legacy_input_filter_behaviour);
710 Read(
"AdvanceRouteWaypointOnArrivalOnly",
711 &g_bAdvanceRouteWaypointOnArrivalOnly);
712 Read(
"EnableRootMenuDebug", &g_enable_root_menu_debug);
714 Read(
"EnableRotateKeys", &g_benable_rotate);
715 Read(
"EmailCrashReport", &g_bEmailCrashReport);
717 g_benableAISNameCache =
true;
718 Read(
"EnableAISNameCache", &g_benableAISNameCache);
720 Read(
"EnableUDPNullHeader", &g_benableUDPNullHeader);
722 SetPath(
"/Settings/GlobalState");
724 Read(
"FrameWinX", &g_nframewin_x);
725 Read(
"FrameWinY", &g_nframewin_y);
726 Read(
"FrameWinPosX", &g_nframewin_posx);
727 Read(
"FrameWinPosY", &g_nframewin_posy);
728 Read(
"FrameMax", &g_bframemax);
730 Read(
"ClientPosX", &g_lastClientRectx);
731 Read(
"ClientPosY", &g_lastClientRecty);
732 Read(
"ClientSzX", &g_lastClientRectw);
733 Read(
"ClientSzY", &g_lastClientRecth);
735 Read(
"RoutePropSizeX", &g_route_prop_sx);
736 Read(
"RoutePropSizeY", &g_route_prop_sy);
737 Read(
"RoutePropPosX", &g_route_prop_x);
738 Read(
"RoutePropPosY", &g_route_prop_y);
740 Read(
"AllowArbitrarySystemPlugins", &g_allow_arb_system_plugin);
743 Read(
"S52_DEPTH_UNIT_SHOW", &read_int);
745 read_int = wxMax(read_int, 0);
746 read_int = wxMin(read_int, 2);
751 SetPath(
"/Settings/Audio");
754 wxString sound_dir = g_Platform->GetSharedDataDir();
755 sound_dir.Append(
"sounds");
756 sound_dir.Append(wxFileName::GetPathSeparator());
758 g_AIS_sound_file = sound_dir +
"beep_ssl.wav";
759 g_DSC_sound_file = sound_dir +
"phonering1.wav";
760 g_SART_sound_file = sound_dir +
"beep3.wav";
761 g_anchorwatch_sound_file = sound_dir +
"beep1.wav";
763 Read(
"AISAlertSoundFile", &g_AIS_sound_file);
764 Read(
"DSCAlertSoundFile", &g_DSC_sound_file);
765 Read(
"SARTAlertSoundFile", &g_SART_sound_file);
766 Read(
"AnchorAlarmSoundFile", &g_anchorwatch_sound_file);
768 Read(
"bAIS_GCPA_AlertAudio", &g_bAIS_GCPA_Alert_Audio);
769 Read(
"bAIS_SART_AlertAudio", &g_bAIS_SART_Alert_Audio);
770 Read(
"bAIS_DSC_AlertAudio", &g_bAIS_DSC_Alert_Audio);
771 Read(
"bAnchorAlertAudio", &g_bAnchor_Alert_Audio);
775 SetPath(
"/Settings/AIS");
777 g_bUseOnlyConfirmedAISName =
false;
778 Read(
"UseOnlyConfirmedAISName", &g_bUseOnlyConfirmedAISName);
780 Read(
"bNoCPAMax", &g_bCPAMax);
782 Read(
"NoCPAMaxNMi", &s);
783 s.ToDouble(&g_CPAMax_NM);
785 Read(
"bCPAWarn", &g_bCPAWarn);
787 Read(
"CPAWarnNMi", &s);
788 s.ToDouble(&g_CPAWarn_NM);
790 Read(
"bTCPAMax", &g_bTCPA_Max);
792 Read(
"TCPAMaxMinutes", &s);
793 s.ToDouble(&g_TCPA_Max);
795 Read(
"bMarkLostTargets", &g_bMarkLost);
797 Read(
"MarkLost_Minutes", &s);
798 s.ToDouble(&g_MarkLost_Mins);
800 Read(
"bRemoveLostTargets", &g_bRemoveLost);
802 Read(
"RemoveLost_Minutes", &s);
803 s.ToDouble(&g_RemoveLost_Mins);
805 Read(
"bShowCOGArrows", &g_bShowCOG);
807 Read(
"bSyncCogPredictors", &g_bSyncCogPredictors);
809 Read(
"CogArrowMinutes", &s);
810 s.ToDouble(&g_ShowCOG_Mins);
812 Read(
"bShowTargetTracks", &g_bAISShowTracks);
814 if (
Read(
"TargetTracksLimit", &s)) {
815 s.ToDouble(&g_AISShowTracks_Limit);
816 g_AISShowTracks_Limit = wxMax(300.0, g_AISShowTracks_Limit);
818 if (
Read(
"TargetTracksMinutes", &s)) {
819 s.ToDouble(&g_AISShowTracks_Mins);
820 g_AISShowTracks_Mins = wxMax(1.0, g_AISShowTracks_Mins);
821 g_AISShowTracks_Mins = wxMin(g_AISShowTracks_Limit, g_AISShowTracks_Mins);
824 Read(
"bHideMooredTargets", &g_bHideMoored);
825 if (
Read(
"MooredTargetMaxSpeedKnots", &s)) s.ToDouble(&g_ShowMoored_Kts);
827 g_SOGminCOG_kts = 0.2;
828 if (
Read(
"SOGMinimumForCOGDisplay", &s)) s.ToDouble(&g_SOGminCOG_kts);
830 Read(
"bShowScaledTargets", &g_bAllowShowScaled);
831 Read(
"AISScaledNumber", &g_ShowScaled_Num);
832 Read(
"AISScaledNumberWeightSOG", &g_ScaledNumWeightSOG);
833 Read(
"AISScaledNumberWeightCPA", &g_ScaledNumWeightCPA);
834 Read(
"AISScaledNumberWeightTCPA", &g_ScaledNumWeightTCPA);
835 Read(
"AISScaledNumberWeightRange", &g_ScaledNumWeightRange);
836 Read(
"AISScaledNumberWeightSizeOfTarget", &g_ScaledNumWeightSizeOfT);
837 Read(
"AISScaledSizeMinimal", &g_ScaledSizeMinimal);
838 Read(
"AISShowScaled", &g_bShowScaled);
840 Read(
"bShowAreaNotices", &g_bShowAreaNotices);
841 Read(
"bDrawAISSize", &g_bDrawAISSize);
842 Read(
"bDrawAISRealtime", &g_bDrawAISRealtime);
843 Read(
"bShowAISName", &g_bShowAISName);
844 Read(
"AISRealtimeMinSpeedKnots", &g_AIS_RealtPred_Kts, 0.7);
845 Read(
"bAISAlertDialog", &g_bAIS_CPA_Alert);
846 Read(
"ShowAISTargetNameScale", &g_Show_Target_Name_Scale);
847 Read(
"bWplIsAprsPositionReport", &g_bWplUsePosition);
848 Read(
"WplSelAction", &g_WplAction);
849 Read(
"AISCOGPredictorWidth", &g_ais_cog_predictor_width);
851 Read(
"bAISAlertAudio", &g_bAIS_CPA_Alert_Audio);
852 Read(
"AISAlertAudioFile", &g_sAIS_Alert_Sound_File);
853 Read(
"bAISAlertSuppressMoored", &g_bAIS_CPA_Alert_Suppress_Moored);
855 Read(
"bAISAlertAckTimeout", &g_bAIS_ACK_Timeout);
856 if (
Read(
"AlertAckTimeoutMinutes", &s)) s.ToDouble(&g_AckTimeout_Mins);
858 Read(
"AlertDialogSizeX", &g_ais_alert_dialog_sx);
859 Read(
"AlertDialogSizeY", &g_ais_alert_dialog_sy);
860 Read(
"AlertDialogPosX", &g_ais_alert_dialog_x);
861 Read(
"AlertDialogPosY", &g_ais_alert_dialog_y);
862 Read(
"QueryDialogPosX", &g_ais_query_dialog_x);
863 Read(
"QueryDialogPosY", &g_ais_query_dialog_y);
865 Read(
"AISTargetListPerspective", &g_AisTargetList_perspective);
866 Read(
"AISTargetListRange", &g_AisTargetList_range);
867 Read(
"AISTargetListSortColumn", &g_AisTargetList_sortColumn);
868 Read(
"bAISTargetListSortReverse", &g_bAisTargetList_sortReverse);
869 Read(
"AISTargetListColumnSpec", &g_AisTargetList_column_spec);
870 Read(
"AISTargetListColumnOrder", &g_AisTargetList_column_order);
872 Read(
"bAISRolloverShowClass", &g_bAISRolloverShowClass);
873 Read(
"bAISRolloverShowCOG", &g_bAISRolloverShowCOG);
874 Read(
"bAISRolloverShowCPA", &g_bAISRolloverShowCPA);
875 Read(
"AISAlertDelay", &g_AIS_alert_delay);
877 Read(
"S57QueryDialogSizeX", &g_S57_dialog_sx);
878 Read(
"S57QueryDialogSizeY", &g_S57_dialog_sy);
879 Read(
"S57QueryExtraDialogSizeX", &g_S57_extradialog_sx);
880 Read(
"S57QueryExtraDialogSizeY", &g_S57_extradialog_sy);
882 wxString strpres(
"PresentationLibraryData");
884 SetPath(
"/Directories");
885 Read(strpres, &valpres);
886 if (!valpres.IsEmpty()) g_UserPresLibData = valpres;
888 wxString strs(
"SENCFileLocation");
889 SetPath(
"/Directories");
892 if (!vals.IsEmpty()) g_SENCPrefix = vals;
894 SetPath(
"/Directories");
896 Read(
"InitChartDir", &vald);
898 wxString dirnamed(vald);
899 if (!dirnamed.IsEmpty()) {
900 if (pInit_Chart_Dir->IsEmpty())
902 pInit_Chart_Dir->Clear();
903 pInit_Chart_Dir->Append(vald);
907 Read(
"GPXIODir", &g_gpx_path);
908 Read(
"TCDataDir", &g_TCData_Dir);
909 Read(
"BasemapDir", &gWorldMapLocation);
910 Read(
"BaseShapefileDir", &gWorldShapefileLocation);
912 wxLogMessage(
"winPluginDir, read from ini file: %s",
915 SetPath(
"/Settings/GlobalState");
917 if (
Read(
"nColorScheme", &read_int))
918 global_color_scheme = (ColorScheme)read_int;
921 SetPath(
"/Settings/NMEADataSource");
923 TheConnectionParams().clear();
924 wxString connectionconfigs;
925 Read(
"DataConnections", &connectionconfigs);
926 if (!connectionconfigs.IsEmpty()) {
927 wxArrayString confs = wxStringTokenize(connectionconfigs,
"|");
928 for (
size_t i = 0; i < confs.Count(); i++) {
931 wxLogMessage(
"Skipped invalid DataStream config");
935 TheConnectionParams().push_back(prm);
940 SetPath(
"/Settings/GlobalState");
943 double st_lat, st_lon;
944 if (
Read(
"VPLatLon", &st)) {
945 sscanf(st.mb_str(wxConvUTF8),
"%lf,%lf", &st_lat, &st_lon);
948 if (fabs(st_lon) < 360.) {
949 while (st_lon < -180.) st_lon += 360.;
951 while (st_lon > 180.) st_lon -= 360.;
956 if (fabs(st_lat) < 90.0)
vLat = st_lat;
958 s.Printf(
"Setting Viewpoint Lat/Lon %g, %g",
vLat,
vLon);
962 double st_view_scale, st_rotation;
963 if (
Read(wxString(
"VPScale"), &st)) {
964 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_view_scale);
966 st_view_scale = fmax(st_view_scale, .001 / 32);
967 st_view_scale = fmin(st_view_scale, 4);
970 if (
Read(wxString(
"VPRotation"), &st)) {
971 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_rotation);
973 st_rotation = fmin(st_rotation, 360);
974 st_rotation = fmax(st_rotation, 0);
979 if (
Read(
"OwnShipLatLon", &sll)) {
980 sscanf(sll.mb_str(wxConvUTF8),
"%lf,%lf", &lat, &lon);
983 if (fabs(lon) < 360.) {
984 while (lon < -180.) lon += 360.;
986 while (lon > 180.) lon -= 360.;
991 if (fabs(lat) < 90.0)
gLat = lat;
993 s.Printf(
"Setting Ownship Lat/Lon %g, %g",
gLat,
gLon);
1000 SetPath(
"/Settings/AuxFontKeys");
1005 bool bContk = GetFirstEntry(strk, dummyk);
1006 bool bNewKey =
false;
1009 bNewKey = FontMgr::Get().
AddAuxKey(kval);
1010 if (!bAsTemplate && !bNewKey) {
1014 bContk = GetNextEntry(strk, dummyk);
1018 SetPath(
"/Settings/X11Fonts");
1022 SetPath(
"/Settings/GTKFonts");
1026 SetPath(
"/Settings/MSWFonts");
1030 SetPath(
"/Settings/MacFonts");
1034 SetPath(
"/Settings/QTFonts");
1040 wxArrayString deleteList;
1042 bool bCont = GetFirstEntry(str, dummy);
1046 if (str.StartsWith(
"Font")) {
1049 deleteList.Add(str);
1050 wxString oldKey = pval.BeforeFirst(_T(
':'));
1054 if (pval.IsEmpty() || pval.StartsWith(
":")) {
1055 deleteList.Add(str);
1059 bCont = GetNextEntry(str, dummy);
1062 for (
unsigned int i = 0; i < deleteList.Count(); i++) {
1063 DeleteEntry(deleteList[i]);
1068 SetPath(
"/TideCurrentDataSources");
1069 if (GetNumberOfEntries()) {
1070 TideCurrentDataSet.clear();
1073 bool bCont = GetFirstEntry(str, dummy);
1080 if (std::find(TideCurrentDataSet.begin(), TideCurrentDataSet.end(),
1081 val.ToStdString()) == TideCurrentDataSet.end()) {
1082 TideCurrentDataSet.push_back(val.ToStdString());
1084 bCont = GetNextEntry(str, dummy);
1094 SetPath(
"/Settings/Others");
1097 Read(
"RadarRingsNumberVisible", &val);
1098 if (val.Length() > 0) g_iNavAidRadarRingsNumberVisible = atoi(val.mb_str());
1099 g_bNavAidRadarRingsShown = g_iNavAidRadarRingsNumberVisible > 0;
1101 Read(
"RadarRingsStep", &val);
1102 if (val.Length() > 0) g_fNavAidRadarRingsStep = atof(val.mb_str());
1104 Read(
"RadarRingsStepUnits", &g_pNavAidRadarRingsStepUnits);
1106 wxString l_wxsOwnshipRangeRingsColour;
1107 Read(
"RadarRingsColour", &l_wxsOwnshipRangeRingsColour);
1108 if (l_wxsOwnshipRangeRingsColour.Length())
1109 g_colourOwnshipRangeRingsColour.Set(l_wxsOwnshipRangeRingsColour);
1112 Read(
"WaypointRangeRingsNumber", &val);
1113 if (val.Length() > 0) g_iWaypointRangeRingsNumber = atoi(val.mb_str());
1115 Read(
"WaypointRangeRingsStep", &val);
1116 if (val.Length() > 0) g_fWaypointRangeRingsStep = atof(val.mb_str());
1118 Read(
"WaypointRangeRingsStepUnits", &g_iWaypointRangeRingsStepUnits);
1120 wxString l_wxsWaypointRangeRingsColour;
1121 Read(
"WaypointRangeRingsColour", &l_wxsWaypointRangeRingsColour);
1124 if (!
Read(
"WaypointUseScaMin", &g_bUseWptScaMin)) g_bUseWptScaMin =
false;
1125 if (!
Read(
"WaypointScaMinValue", &g_iWpt_ScaMin)) g_iWpt_ScaMin = 2147483646;
1126 if (!
Read(
"WaypointScaMaxValue", &g_iWpt_ScaMax)) g_iWpt_ScaMax = 0;
1127 if (!
Read(
"WaypointUseScaMinOverrule", &g_bOverruleScaMin))
1128 g_bOverruleScaMin =
false;
1129 if (!
Read(
"WaypointsShowName", &g_bShowWptName)) g_bShowWptName =
true;
1130 if (!
Read(
"UserIconsFirst", &g_bUserIconsFirst)) g_bUserIconsFirst =
true;
1133 bool b300RadarRings =
true;
1134 if (
Read(
"ShowRadarRings", &b300RadarRings)) {
1135 if (!b300RadarRings) g_iNavAidRadarRingsNumberVisible = 0;
1138 Read(
"ConfirmObjectDeletion", &g_bConfirmObjectDelete);
1141 g_bWayPointPreventDragging =
false;
1142 Read(
"WaypointPreventDragging", &g_bWayPointPreventDragging);
1144 g_bEnableZoomToCursor =
false;
1145 Read(
"EnableZoomToCursor", &g_bEnableZoomToCursor);
1148 Read(
"TrackIntervalSeconds", &val);
1149 if (val.Length() > 0) {
1150 double tval = atof(val.mb_str());
1151 if (tval >= 2.) g_TrackIntervalSeconds = tval;
1155 Read(
"TrackDeltaDistance", &val);
1156 if (val.Length() > 0) {
1157 double tval = atof(val.mb_str());
1158 if (tval >= 0.05) g_TrackDeltaDistance = tval;
1161 Read(
"TrackPrecision", &g_nTrackPrecision);
1163 Read(
"RouteLineWidth", &g_route_line_width);
1164 Read(
"TrackLineWidth", &g_track_line_width);
1166 wxString l_wxsTrackLineColour;
1167 if (
Read(
"TrackLineColour", &l_wxsTrackLineColour))
1168 g_colourTrackLineColour.Set(l_wxsTrackLineColour);
1170 Read(
"TideCurrentWindowScale", &g_tcwin_scale);
1171 Read(
"DefaultWPIcon", &g_default_wp_icon);
1173 Read(
"DefaultRPIcon", &g_default_routepoint_icon);
1175 SetPath(
"/MmsiProperties");
1176 int iPMax = GetNumberOfEntries();
1181 bool bCont =
pConfig->GetFirstEntry(str, dummy);
1188 bCont =
pConfig->GetNextEntry(str, dummy);
1192 SetPath(
"/DataMonitor");
1193 g_dm_ok = ReadUnsigned(
"colors.ok", kUndefinedColor);
1194 g_dm_dropped = ReadUnsigned(
"colors.dropped", kUndefinedColor);
1195 g_dm_filtered = ReadUnsigned(
"colors.filtered", kUndefinedColor);
1196 g_dm_input = ReadUnsigned(
"colors.input", kUndefinedColor);
1197 g_dm_output = ReadUnsigned(
"colors.output", kUndefinedColor);
1198 g_dm_not_ok = ReadUnsigned(
"colors.not-ok", kUndefinedColor);
1203void MyConfig::LoadS57Config() {
1204 if (!ps52plib)
return;
1208 SetPath(
"/Settings/GlobalState");
1210 Read(
"bShowS57Text", &read_int, 1);
1211 ps52plib->SetShowS57Text(!(read_int == 0));
1213 Read(
"bShowS57ImportantTextOnly", &read_int, 0);
1214 ps52plib->SetShowS57ImportantTextOnly(!(read_int == 0));
1216 Read(
"bShowLightDescription", &read_int, 0);
1217 ps52plib->SetShowLdisText(!(read_int == 0));
1219 Read(
"bExtendLightSectors", &read_int, 0);
1220 ps52plib->SetExtendLightSectors(!(read_int == 0));
1222 Read(
"nDisplayCategory", &read_int, (
enum _DisCat)STANDARD);
1223 ps52plib->SetDisplayCategory((
enum _DisCat)read_int);
1225 Read(
"nSymbolStyle", &read_int, (
enum _LUPname)PAPER_CHART);
1226 ps52plib->m_nSymbolStyle = (LUPname)read_int;
1228 Read(
"nBoundaryStyle", &read_int, PLAIN_BOUNDARIES);
1229 ps52plib->m_nBoundaryStyle = (LUPname)read_int;
1231 Read(
"bShowSoundg", &read_int, 1);
1232 ps52plib->m_bShowSoundg = !(read_int == 0);
1234 Read(
"bShowMeta", &read_int, 0);
1235 ps52plib->m_bShowMeta = !(read_int == 0);
1237 Read(
"bUseSCAMIN", &read_int, 1);
1238 ps52plib->m_bUseSCAMIN = !(read_int == 0);
1240 Read(
"bUseSUPER_SCAMIN", &read_int, 0);
1241 ps52plib->m_bUseSUPER_SCAMIN = !(read_int == 0);
1243 Read(
"bShowAtonText", &read_int, 1);
1244 ps52plib->m_bShowAtonText = !(read_int == 0);
1246 Read(
"bDeClutterText", &read_int, 0);
1247 ps52plib->m_bDeClutterText = !(read_int == 0);
1249 Read(
"bShowNationalText", &read_int, 0);
1250 ps52plib->m_bShowNationalTexts = !(read_int == 0);
1252 Read(
"ENCSoundingScaleFactor", &read_int, 0);
1253 ps52plib->m_nSoundingFactor = read_int;
1255 Read(
"ENCTextScaleFactor", &read_int, 0);
1256 ps52plib->m_nTextFactor = read_int;
1258 if (
Read(
"S52_MAR_SAFETY_CONTOUR", &dval, 3.0)) {
1259 S52_setMarinerParam(S52_MAR_SAFETY_CONTOUR, dval);
1260 S52_setMarinerParam(S52_MAR_SAFETY_DEPTH,
1264 if (
Read(
"S52_MAR_SHALLOW_CONTOUR", &dval, 2.0))
1265 S52_setMarinerParam(S52_MAR_SHALLOW_CONTOUR, dval);
1267 if (
Read(
"S52_MAR_DEEP_CONTOUR", &dval, 6.0))
1268 S52_setMarinerParam(S52_MAR_DEEP_CONTOUR, dval);
1270 if (
Read(
"S52_MAR_TWO_SHADES", &dval, 0.0))
1271 S52_setMarinerParam(S52_MAR_TWO_SHADES, dval);
1273 ps52plib->UpdateMarinerParams();
1275 SetPath(
"/Settings/GlobalState");
1276 Read(
"S52_DEPTH_UNIT_SHOW", &read_int, 1);
1277 read_int = wxMax(read_int, 0);
1278 read_int = wxMin(read_int, 2);
1279 ps52plib->m_nDepthUnitDisplay = read_int;
1286 SetPath(
"/Settings/ObjectFilter");
1288 int iOBJMax = GetNumberOfEntries();
1296 bool bCont =
pConfig->GetFirstEntry(str, dummy);
1300 bool bNeedNew =
true;
1302 if (str.StartsWith(
"viz", &sObj)) {
1303 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
1305 pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
1306 if (!strncmp(pOLE->OBJLName, sObj.mb_str(), 6)) {
1314 pOLE = (OBJLElement *)calloc(
sizeof(OBJLElement), 1);
1315 memcpy(pOLE->OBJLName, sObj.mb_str(), OBJL_NAME_LEN);
1318 ps52plib->pOBJLArray->Add((
void *)pOLE);
1321 bCont =
pConfig->GetNextEntry(str, dummy);
1326bool MyConfig::LoadLayers(wxString &path) {
1327 wxArrayString file_array;
1331 if (dir.IsOpened()) {
1333 bool cont = dir.GetFirst(&filename);
1336 filename.Prepend(wxFileName::GetPathSeparator());
1337 filename.Prepend(path);
1338 wxFileName f(filename);
1340 if (f.GetExt().IsSameAs(
"gpx"))
1341 file_array.Add(filename);
1343 if (wxDir::Exists(filename)) {
1344 wxDir dir(filename);
1345 if (dir.IsOpened()) {
1346 nfiles = dir.GetAllFiles(filename, &file_array,
1352 if (file_array.GetCount()) {
1355 l->m_LayerFileName = file_array[0];
1356 if (file_array.GetCount() <= 1)
1357 wxFileName::SplitPath(file_array[0], NULL, NULL, &(l->m_LayerName),
1360 wxFileName::SplitPath(filename, NULL, NULL, &(l->m_LayerName), NULL,
1363 bool bLayerViz = g_bShowLayers;
1365 if (g_VisibleLayers.Contains(l->m_LayerName)) bLayerViz =
true;
1366 if (g_InvisibleLayers.Contains(l->m_LayerName)) bLayerViz =
false;
1368 l->m_bHasVisibleNames = wxCHK_UNDETERMINED;
1369 if (g_VisiNameinLayers.Contains(l->m_LayerName))
1370 l->m_bHasVisibleNames = wxCHK_CHECKED;
1371 if (g_InVisiNameinLayers.Contains(l->m_LayerName))
1372 l->m_bHasVisibleNames = wxCHK_UNCHECKED;
1374 l->m_bIsVisibleOnChart = bLayerViz;
1377 laymsg.Printf(
"New layer %d: %s", l->m_LayerID, l->m_LayerName.c_str());
1378 wxLogMessage(laymsg);
1380 pLayerList->insert(pLayerList->begin(), l);
1384 for (
unsigned int i = 0; i < file_array.GetCount(); i++) {
1385 wxString file_path = file_array[i];
1387 if (::wxFileExists(file_path)) {
1391 wxLogMessage(
"Error loading GPX file " + file_path);
1394 _(
"Error loading GPX file %s, %s at character %d"),
1395 file_path, result.description(), result.offset),
1396 _(
"Import GPX File"));
1399 long nItems = pSet->LoadAllGPXObjectsAsLayer(
1400 l->m_LayerID, bLayerViz, l->m_bHasVisibleNames);
1401 l->m_NoOfItems += nItems;
1402 l->m_LayerType = _(
"Persistent");
1405 objmsg.Printf(
"Loaded GPX file %s with %ld items.",
1406 file_path.c_str(), nItems);
1407 wxLogMessage(objmsg);
1414 cont = dir.GetNext(&filename);
1417 g_bLayersLoaded =
true;
1422bool MyConfig::LoadChartDirArray(ArrayOfCDI &ChartDirArray) {
1424 SetPath(
"/ChartDirectories");
1425 int iDirMax = GetNumberOfEntries();
1427 ChartDirArray.Empty();
1430 int nAdjustChartDirs = 0;
1432 bool bCont =
pConfig->GetFirstEntry(str, dummy);
1436 wxString dirname(val);
1437 if (!dirname.IsEmpty()) {
1452 if (dirname.Find(
"SampleCharts") ==
1458 wxString new_dir = dirname.Mid(dirname.Find(
"SampleCharts"));
1459 new_dir.Prepend(g_Platform->GetSharedDataDir());
1464 cdi.fullpath = dirname.BeforeFirst(
'^');
1465 cdi.magic_number = dirname.AfterFirst(
'^');
1467 ChartDirArray.Add(cdi);
1471 bCont =
pConfig->GetNextEntry(str, dummy);
1474 if (nAdjustChartDirs)
pConfig->UpdateChartDirs(ChartDirArray);
1480bool MyConfig::UpdateChartDirs(ArrayOfCDI &dir_array) {
1484 SetPath(
"/ChartDirectories");
1485 int iDirMax = GetNumberOfEntries();
1489 for (
int i = 0; i < iDirMax; i++) {
1490 GetFirstEntry(key, dummy);
1491 DeleteEntry(key,
false);
1495 iDirMax = dir_array.GetCount();
1497 for (
int iDir = 0; iDir < iDirMax; iDir++) {
1500 wxString dirn = cdi.fullpath;
1502 dirn.Append(cdi.magic_number);
1504 str_buf.Printf(
"ChartDir%d", iDir + 1);
1506 Write(str_buf, dirn);
1518void MyConfig::CreateConfigGroups(ChartGroupArray *pGroupArray) {
1519 if (!pGroupArray)
return;
1522 Write(
"GroupCount", (
int)pGroupArray->GetCount());
1524 for (
unsigned int i = 0; i < pGroupArray->GetCount(); i++) {
1527 s.Printf(
"Group%d", i + 1);
1528 s.Prepend(
"/Groups/");
1531 Write(
"GroupName", pGroup->m_group_name);
1532 Write(
"GroupItemCount", (
int)pGroup->m_element_array.size());
1534 for (
unsigned int j = 0; j < pGroup->m_element_array.size(); j++) {
1536 sg.Printf(
"Group%d/Item%d", i + 1, j);
1537 sg.Prepend(
"/Groups/");
1539 Write(
"IncludeItem", pGroup->m_element_array[j].m_element_name);
1542 wxArrayString u = pGroup->m_element_array[j].m_missing_name_array;
1544 for (
unsigned int k = 0; k < u.GetCount(); k++) {
1548 Write(
"ExcludeItems", t);
1554void MyConfig::DestroyConfigGroups() {
1555 DeleteGroup(
"/Groups");
1558void MyConfig::LoadConfigGroups(ChartGroupArray *pGroupArray) {
1560 unsigned int group_count;
1561 Read(
"GroupCount", (
int *)&group_count, 0);
1563 for (
unsigned int i = 0; i < group_count; i++) {
1566 s.Printf(
"Group%d", i + 1);
1567 s.Prepend(
"/Groups/");
1571 Read(
"GroupName", &t);
1572 pGroup->m_group_name = t;
1574 unsigned int item_count;
1575 Read(
"GroupItemCount", (
int *)&item_count);
1576 for (
unsigned int j = 0; j < item_count; j++) {
1578 sg.Printf(
"Group%d/Item%d", i + 1, j);
1579 sg.Prepend(
"/Groups/");
1583 Read(
"IncludeItem", &v);
1587 if (
Read(
"ExcludeItems", &u)) {
1589 wxStringTokenizer tk(u,
";");
1590 while (tk.HasMoreTokens()) {
1591 wxString token = tk.GetNextToken();
1592 pelement.m_missing_name_array.Add(token);
1596 pGroup->m_element_array.push_back(std::move(pelement));
1598 pGroupArray->Add(pGroup);
1602void MyConfig::LoadCanvasConfigs(
bool bApplyAsTemplate) {
1605 auto &config_array = ConfigMgr::Get().GetCanvasConfigArray();
1610 if (!HasEntry(
"CanvasConfig")) {
1612 pcc->LoadFromLegacyConfig(
this);
1613 config_array.Add(pcc);
1618 Read(
"CanvasConfig", (
int *)&g_canvasConfig, 0);
1621 if (config_array.GetCount() == 0) {
1622 s.Printf(
"/Canvas/CanvasConfig%d", 1);
1625 LoadConfigCanvas(pcca, bApplyAsTemplate);
1626 config_array.Add(pcca);
1628 s.Printf(
"/Canvas/CanvasConfig%d", 2);
1631 LoadConfigCanvas(pcca, bApplyAsTemplate);
1632 config_array.Add(pcca);
1635 s.Printf(
"/Canvas/CanvasConfig%d", 1);
1637 LoadConfigCanvas(pcca, bApplyAsTemplate);
1639 if (config_array.GetCount() > 1) {
1641 s.Printf(
"/Canvas/CanvasConfig%d", 2);
1643 LoadConfigCanvas(pcca, bApplyAsTemplate);
1645 s.Printf(
"/Canvas/CanvasConfig%d", 2);
1648 LoadConfigCanvas(pcca, bApplyAsTemplate);
1649 config_array.Add(pcca);
1654void MyConfig::LoadConfigCanvas(
canvasConfig *cConfig,
bool bApplyAsTemplate) {
1656 double st_lat, st_lon;
1658 if (!bApplyAsTemplate) {
1660 cConfig->
iLat = START_LAT;
1661 cConfig->
iLon = START_LON;
1663 if (
Read(
"canvasVPLatLon", &st)) {
1664 sscanf(st.mb_str(wxConvUTF8),
"%lf,%lf", &st_lat, &st_lon);
1667 if (fabs(st_lon) < 360.) {
1668 while (st_lon < -180.) st_lon += 360.;
1670 while (st_lon > 180.) st_lon -= 360.;
1672 cConfig->
iLon = st_lon;
1675 if (fabs(st_lat) < 90.0) cConfig->
iLat = st_lat;
1681 double st_view_scale;
1682 if (
Read(wxString(
"canvasVPScale"), &st)) {
1683 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_view_scale);
1685 st_view_scale = fmax(st_view_scale, .001 / 32);
1686 st_view_scale = fmin(st_view_scale, 4);
1687 cConfig->
iScale = st_view_scale;
1691 if (
Read(wxString(
"canvasVPRotation"), &st)) {
1692 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_rotation);
1694 st_rotation = fmin(st_rotation, 360);
1695 st_rotation = fmax(st_rotation, 0);
1696 cConfig->
iRotation = st_rotation * PI / 180.;
1699 Read(
"canvasInitialdBIndex", &cConfig->DBindex, 0);
1707 Read(
"ActiveChartGroup", &cConfig->GroupID, 0);
1710 if (cConfig->GroupID && bApplyAsTemplate) {
1711 if (cConfig->GroupID > (
int)
g_pGroupArray->GetCount()) cConfig->GroupID = 0;
1717 Read(
"canvasEnableBasemapTile", &cConfig->bEnableBasemapTile, 1);
1729 Read(
"canvasENCDisplayCategory", &cConfig->nENCDisplayCategory, STANDARD);
1730 Read(
"canvasENCShowDepths", &cConfig->bShowENCDepths, 1);
1731 Read(
"canvasENCShowBuoyLabels", &cConfig->bShowENCBuoyLabels, 1);
1732 Read(
"canvasENCShowLightDescriptions", &cConfig->bShowENCLightDescriptions,
1734 Read(
"canvasENCShowLights", &cConfig->bShowENCLights, 1);
1735 Read(
"canvasENCShowVisibleSectorLights",
1736 &cConfig->bShowENCVisibleSectorLights, 0);
1737 Read(
"canvasENCShowAnchorInfo", &cConfig->bShowENCAnchorInfo, 0);
1738 Read(
"canvasENCShowDataQuality", &cConfig->bShowENCDataQuality, 0);
1741 Read(
"canvasSizeX", &sx, 0);
1742 Read(
"canvasSizeY", &sy, 0);
1746void MyConfig::SaveCanvasConfigs() {
1747 auto &config_array = ConfigMgr::Get().GetCanvasConfigArray();
1750 Write(
"CanvasConfig", (
int)g_canvasConfig);
1755 switch (g_canvasConfig) {
1759 s.Printf(
"/Canvas/CanvasConfig%d", 1);
1762 if (config_array.GetCount() > 0) {
1763 pcc = config_array.Item(0);
1765 SaveConfigCanvas(pcc);
1772 if (config_array.GetCount() > 1) {
1773 s.Printf(
"/Canvas/CanvasConfig%d", 1);
1775 pcc = config_array.Item(0);
1777 SaveConfigCanvas(pcc);
1780 s.Printf(
"/Canvas/CanvasConfig%d", 2);
1782 pcc = config_array.Item(1);
1784 SaveConfigCanvas(pcc);
1791void MyConfig::SaveConfigCanvas(
canvasConfig *cConfig) {
1798 st1.Printf(
"%10.4f,%10.4f", vp.
clat, vp.
clon);
1799 Write(
"canvasVPLatLon", st1);
1801 Write(
"canvasVPScale", st1);
1802 st1.Printf(
"%i", ((
int)(vp.
rotation * 180 / PI)) % 360);
1803 Write(
"canvasVPRotation", st1);
1806 int restore_dbindex = 0;
1808 if (pcs) restore_dbindex = pcs->GetCurrentEntrydbIndex();
1809 if (cConfig->
canvas->GetQuiltMode())
1810 restore_dbindex = cConfig->
canvas->GetQuiltReferenceChartIndex();
1811 Write(
"canvasInitialdBIndex", restore_dbindex);
1813 Write(
"canvasbFollow", cConfig->
canvas->m_bFollow);
1814 Write(
"ActiveChartGroup", cConfig->
canvas->m_groupIndex);
1816 Write(
"canvasQuilt", cConfig->
canvas->GetQuiltMode());
1817 Write(
"canvasShowGrid", cConfig->
canvas->GetShowGrid());
1818 Write(
"canvasShowOutlines", cConfig->
canvas->GetShowOutlines());
1819 Write(
"canvasShowDepthUnits", cConfig->
canvas->GetShowDepthUnits());
1821 Write(
"canvasShowAIS", cConfig->
canvas->GetShowAIS());
1822 Write(
"canvasAttenAIS", cConfig->
canvas->GetAttenAIS());
1824 Write(
"canvasShowTides", cConfig->
canvas->GetbShowTide());
1825 Write(
"canvasShowCurrents", cConfig->
canvas->GetbShowCurrent());
1827 Write(
"canvasEnableBasemapTile", cConfig->
canvas->GetbEnableBasemapTile());
1830 Write(
"canvasShowENCText", cConfig->
canvas->GetShowENCText());
1831 Write(
"canvasENCDisplayCategory", cConfig->
canvas->GetENCDisplayCategory());
1832 Write(
"canvasENCShowDepths", cConfig->
canvas->GetShowENCDepth());
1833 Write(
"canvasENCShowBuoyLabels", cConfig->
canvas->GetShowENCBuoyLabels());
1834 Write(
"canvasENCShowLightDescriptions",
1835 cConfig->
canvas->GetShowENCLightDesc());
1836 Write(
"canvasENCShowLights", cConfig->
canvas->GetShowENCLights());
1837 Write(
"canvasENCShowVisibleSectorLights",
1838 cConfig->
canvas->GetShowVisibleSectors());
1839 Write(
"canvasENCShowAnchorInfo", cConfig->
canvas->GetShowENCAnchor());
1840 Write(
"canvasENCShowDataQuality", cConfig->
canvas->GetShowENCDataQual());
1841 Write(
"canvasCourseUp", cConfig->
canvas->GetUpMode() == COURSE_UP_MODE);
1842 Write(
"canvasHeadUp", cConfig->
canvas->GetUpMode() == HEAD_UP_MODE);
1843 Write(
"canvasLookahead", cConfig->
canvas->GetLookahead());
1845 int width = cConfig->
canvas->GetSize().x;
1853 Write(
"canvasSizeX", width);
1854 Write(
"canvasSizeY", cConfig->
canvas->GetSize().y);
1858void MyConfig::UpdateSettings() {
1866 SetPath(
"/Settings");
1868 Write(
"LastAppliedTemplate", g_lastAppliedTemplateGUID);
1869 Write(
"CompatOS", g_compatOS);
1870 Write(
"CompatOsVersion", g_compatOsVersion);
1871 Write(
"ConfigVersionString", g_config_version_string);
1872 if (wxIsEmpty(g_CmdSoundString)) g_CmdSoundString = wxString(OCPN_SOUND_CMD);
1873 Write(
"CmdSoundString", g_CmdSoundString);
1874 Write(
"NavMessageShown", n_NavMessageShown);
1875 Write(
"InlandEcdis", g_bInlandEcdis);
1877 Write(
"AndroidVersionCode", g_AndroidVersionCode);
1879 Write(
"UIexpert", g_bUIexpert);
1880 Write(
"SpaceDropMark", g_bSpaceDropMark);
1884 Write(
"ShowStatusBar", g_bShowStatusBar);
1886 Write(
"ShowMenuBar", g_bShowMenuBar);
1888 Write(
"DefaultFontSize", g_default_font_size);
1891 Write(
"Fullscreen", g_bFullscreen);
1892 Write(
"ShowCompassWindow", g_bShowCompassWin);
1893 Write(
"SetSystemTime", s_bSetSystemTime);
1895 Write(
"PlayShipsBells", g_bPlayShipsBells);
1896 Write(
"SoundDeviceIndex", g_iSoundDeviceIndex);
1897 Write(
"FullscreenToolbar", g_bFullscreenToolbar);
1898 Write(
"TransparentToolbar", g_bTransparentToolbar);
1899 Write(
"PermanentMOBIcon", g_bPermanentMOBIcon);
1900 Write(
"ShowLayers", g_bShowLayers);
1901 Write(
"AutoAnchorDrop", g_bAutoAnchorMark);
1902 Write(
"ShowChartOutlines", g_bShowOutlines);
1903 Write(
"ShowActiveRouteTotal", g_bShowRouteTotal);
1904 Write(
"ShowActiveRouteHighway", g_bShowActiveRouteHighway);
1905 Write(
"SDMMFormat", g_iSDMMFormat);
1906 Write(
"MostRecentGPSUploadConnection", g_uploadConnection);
1907 Write(
"ShowChartBar", g_bShowChartBar);
1909 Write(
"GUIScaleFactor", g_GUIScaleFactor);
1910 Write(
"ChartObjectScaleFactor", g_ChartScaleFactor);
1911 Write(
"ShipScaleFactor", g_ShipScaleFactor);
1912 Write(
"ENCSoundingScaleFactor", g_ENCSoundingScaleFactor);
1913 Write(
"ENCTextScaleFactor", g_ENCTextScaleFactor);
1914 Write(
"ObjQueryAppendFilesExt", g_ObjQFileExt);
1917 Write(
"CatalogCustomURL", g_catalog_custom_url);
1918 Write(
"CatalogChannel", g_catalog_channel);
1920 Write(
"NetmaskBits", g_netmask_bits);
1921 Write(
"FilterNMEA_Avg", g_bfilter_cogsog);
1922 Write(
"FilterNMEA_Sec", g_COGFilterSec);
1924 Write(
"TrackContinuous", g_btrackContinuous);
1926 Write(
"ShowTrue", g_bShowTrue);
1927 Write(
"ShowMag", g_bShowMag);
1928 Write(
"UserMagVariation", wxString::Format(
"%.2f", g_UserVar));
1930 Write(
"CM93DetailFactor", g_cm93_zoom_factor);
1931 Write(
"CM93DetailZoomPosX", g_detailslider_dialog_x);
1932 Write(
"CM93DetailZoomPosY", g_detailslider_dialog_y);
1933 Write(
"ShowCM93DetailSlider", g_bShowDetailSlider);
1935 Write(
"SkewToNorthUp", g_bskew_comp);
1936 if (!g_bdisable_opengl) {
1938 Write(
"OpenGL", g_bopengl);
1940 Write(
"SoftwareGL", g_bSoftwareGL);
1942 Write(
"ZoomDetailFactor", g_chart_zoom_modifier_raster);
1943 Write(
"ZoomDetailFactorVector", g_chart_zoom_modifier_vector);
1945 Write(
"FogOnOverzoom", g_fog_overzoom);
1946 Write(
"OverzoomVectorScale", g_oz_vector_scale);
1947 Write(
"OverzoomEmphasisBase", g_overzoom_emphasis_base);
1948 Write(
"PlusMinusZoomFactor", g_plus_minus_zoom_factor);
1949 Write(
"MouseZoomSensitivity",
1951 Write(
"ShowMUIZoomButtons", g_bShowMuiZoomButtons);
1955 Write(
"UseAcceleratedPanning", g_GLOptions.m_bUseAcceleratedPanning);
1957 Write(
"GPUTextureCompression", g_GLOptions.m_bTextureCompression);
1958 Write(
"GPUTextureCompressionCaching",
1959 g_GLOptions.m_bTextureCompressionCaching);
1960 Write(
"GPUTextureDimension", g_GLOptions.m_iTextureDimension);
1961 Write(
"GPUTextureMemSize", g_GLOptions.m_iTextureMemorySize);
1962 Write(
"PolygonSmoothing", g_GLOptions.m_GLPolygonSmoothing);
1963 Write(
"LineSmoothing", g_GLOptions.m_GLLineSmoothing);
1967 Write(
"CourseUpMode", g_bCourseUp);
1968 if (!g_bInlandEcdis)
Write(
"LookAheadMode", g_bLookAhead);
1969 Write(
"TenHzUpdate", g_btenhertz);
1972 Write(
"UseMagAPB", g_bMagneticAPB);
1974 Write(
"OwnshipCOGPredictorMinutes", g_ownship_predictor_minutes);
1975 Write(
"OwnshipCOGPredictorStyle", g_cog_predictor_style);
1976 Write(
"OwnshipCOGPredictorColor", g_cog_predictor_color);
1977 Write(
"OwnshipCOGPredictorEndmarker", g_cog_predictor_endmarker);
1978 Write(
"OwnshipCOGPredictorWidth", g_cog_predictor_width);
1979 Write(
"OwnshipHDTPredictorStyle", g_ownship_HDTpredictor_style);
1980 Write(
"OwnshipHDTPredictorColor", g_ownship_HDTpredictor_color);
1981 Write(
"OwnshipHDTPredictorEndmarker", g_ownship_HDTpredictor_endmarker);
1983 Write(
"OwnshipHDTPredictorWidth", g_ownship_HDTpredictor_width);
1984 Write(
"OwnshipHDTPredictorMiles", g_ownship_HDTpredictor_miles);
1986 Write(
"OwnShipIconType", g_OwnShipIconType);
1987 Write(
"OwnShipLength", g_n_ownship_length_meters);
1988 Write(
"OwnShipWidth", g_n_ownship_beam_meters);
1989 Write(
"OwnShipGPSOffsetX", g_n_gps_antenna_offset_x);
1990 Write(
"OwnShipGPSOffsetY", g_n_gps_antenna_offset_y);
1991 Write(
"OwnShipMinSize", g_n_ownship_min_mm);
1992 Write(
"ShowDirectRouteLine", g_bShowShipToActive);
1993 Write(
"DirectRouteLineStyle", g_shipToActiveStyle);
1994 Write(
"DirectRouteLineColor", g_shipToActiveColor);
1999 Write(
"RouteArrivalCircleRadius",
2000 wxString::Format(
"%.2f", g_n_arrival_circle_radius));
2002 Write(
"ChartQuilting", g_bQuiltEnable);
2004 Write(
"PreserveScaleOnX", g_bPreserveScaleOnX);
2006 Write(
"StartWithTrackActive", g_bTrackCarryOver);
2007 Write(
"AutomaticDailyTracks", g_bTrackDaily);
2008 Write(
"TrackRotateAt", g_track_rotate_time);
2009 Write(
"TrackRotateTimeType", g_track_rotate_time_type);
2010 Write(
"HighlightTracks", g_bHighliteTracks);
2013 Write(
"InitialStackIndex", g_restore_stackindex);
2014 Write(
"InitialdBIndex", g_restore_dbindex);
2016 Write(
"NMEAAPBPrecision", g_NMEAAPBPrecision);
2018 Write(
"TalkerIdText", g_TalkerIdText);
2019 Write(
"ShowTrackPointTime", g_bShowTrackPointTime);
2021 Write(
"AnchorWatch1GUID", g_AW1GUID);
2022 Write(
"AnchorWatch2GUID", g_AW2GUID);
2024 Write(
"ToolbarX", g_maintoolbar_x);
2025 Write(
"ToolbarY", g_maintoolbar_y);
2028 Write(
"iENCToolbarX", g_iENCToolbarPosX);
2029 Write(
"iENCToolbarY", g_iENCToolbarPosY);
2031 if (!g_bInlandEcdis) {
2032 Write(
"GlobalToolbarConfig", g_toolbarConfig);
2035 Write(
"WindSpeedFormat", g_iWindSpeedFormat);
2036 Write(
"ShowDepthUnits", g_bShowDepthUnits);
2040 Write(
"GPSIdent", g_GPS_Ident);
2041 Write(
"ActiveRoute", g_active_route);
2042 Write(
"PersistActiveRoute", g_persist_active_route);
2045 Write(
"UseGarminHostUpload", g_bGarminHostUpload);
2047 Write(
"MobileTouch", g_btouch);
2048 Write(
"ResponsiveGraphics", g_bresponsive);
2051 Write(
"AutoHideToolbar", g_bAutoHideToolbar);
2052 Write(
"AutoHideToolbarSecs", g_nAutoHideToolbar);
2056 st0.Append(wxString::Format(
"%zu,", mm));
2059 Write(
"DisplaySizeMM", st0);
2060 Write(
"DisplaySizeManual", g_config_display_size_manual);
2062 Write(
"SelectionRadiusMM", g_selection_radius_mm);
2063 Write(
"SelectionRadiusTouchMM", g_selection_radius_touch_mm);
2065 st0.Printf(
"%g", g_PlanSpeed);
2066 Write(
"PlanSpeed", st0);
2068 if (g_bLayersLoaded) {
2069 wxString vis, invis, visnames, invisnames;
2070 LayerList::iterator it;
2072 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
2074 if (lay->IsVisibleOnChart())
2075 vis += (lay->m_LayerName) +
";";
2077 invis += (lay->m_LayerName) +
";";
2079 if (lay->HasVisibleNames() == wxCHK_CHECKED) {
2080 visnames += (lay->m_LayerName) +
";";
2081 }
else if (lay->HasVisibleNames() == wxCHK_UNCHECKED) {
2082 invisnames += (lay->m_LayerName) +
";";
2085 Write(
"VisibleLayers", vis);
2086 Write(
"InvisibleLayers", invis);
2087 Write(
"VisNameInLayers", visnames);
2088 Write(
"InvisNameInLayers", invisnames);
2090 Write(
"Locale", g_locale);
2091 Write(
"LocaleOverride", g_localeOverride);
2093 Write(
"KeepNavobjBackups", g_navobjbackups);
2094 Write(
"LegacyInputCOMPortFilterBehaviour", g_b_legacy_input_filter_behaviour);
2095 Write(
"AdvanceRouteWaypointOnArrivalOnly",
2096 g_bAdvanceRouteWaypointOnArrivalOnly);
2097 Write(
"EnableRootMenuDebug", g_enable_root_menu_debug);
2100 Write(
"LiveETA", g_bShowLiveETA);
2101 Write(
"DefaultBoatSpeed", g_defaultBoatSpeed);
2105 SetPath(
"/Settings/ObjectFilter");
2108 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
2110 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
2112 wxString st1(
"viz");
2114 strncpy(name, pOLE->OBJLName, 6);
2116 st1.Append(wxString(name, wxConvUTF8));
2117 Write(st1, pOLE->nViz);
2123 SetPath(
"/Settings/GlobalState");
2140 st1.Printf(
"%10.4f, %10.4f",
gLat,
gLon);
2141 Write(
"OwnShipLatLon", st1);
2144 SetPath(
"/Settings/GlobalState");
2145 if (!g_bInlandEcdis)
2146 Write(
"nColorScheme", (
int)user_colors::GetColorScheme());
2148 Write(
"FrameWinX", g_nframewin_x);
2149 Write(
"FrameWinY", g_nframewin_y);
2150 Write(
"FrameWinPosX", g_nframewin_posx);
2151 Write(
"FrameWinPosY", g_nframewin_posy);
2152 Write(
"FrameMax", g_bframemax);
2154 Write(
"ClientPosX", g_lastClientRectx);
2155 Write(
"ClientPosY", g_lastClientRecty);
2156 Write(
"ClientSzX", g_lastClientRectw);
2157 Write(
"ClientSzY", g_lastClientRecth);
2161 Write(
"RoutePropSizeX", g_route_prop_sx);
2162 Write(
"RoutePropSizeY", g_route_prop_sy);
2163 Write(
"RoutePropPosX", g_route_prop_x);
2164 Write(
"RoutePropPosY", g_route_prop_y);
2167 SetPath(
"/Settings/Audio");
2168 Write(
"AISAlertSoundFile", g_AIS_sound_file);
2169 Write(
"DSCAlertSoundFile", g_DSC_sound_file);
2170 Write(
"SARTAlertSoundFile", g_SART_sound_file);
2171 Write(
"AnchorAlarmSoundFile", g_anchorwatch_sound_file);
2173 Write(
"bAIS_GCPA_AlertAudio", g_bAIS_GCPA_Alert_Audio);
2174 Write(
"bAIS_SART_AlertAudio", g_bAIS_SART_Alert_Audio);
2175 Write(
"bAIS_DSC_AlertAudio", g_bAIS_DSC_Alert_Audio);
2176 Write(
"bAnchorAlertAudio", g_bAnchor_Alert_Audio);
2179 SetPath(
"/Settings/AIS");
2181 Write(
"bNoCPAMax", g_bCPAMax);
2182 Write(
"NoCPAMaxNMi", g_CPAMax_NM);
2183 Write(
"bCPAWarn", g_bCPAWarn);
2184 Write(
"CPAWarnNMi", g_CPAWarn_NM);
2185 Write(
"bTCPAMax", g_bTCPA_Max);
2186 Write(
"TCPAMaxMinutes", g_TCPA_Max);
2187 Write(
"bMarkLostTargets", g_bMarkLost);
2188 Write(
"MarkLost_Minutes", g_MarkLost_Mins);
2189 Write(
"bRemoveLostTargets", g_bRemoveLost);
2190 Write(
"RemoveLost_Minutes", g_RemoveLost_Mins);
2191 Write(
"bShowCOGArrows", g_bShowCOG);
2192 Write(
"bSyncCogPredictors", g_bSyncCogPredictors);
2193 Write(
"CogArrowMinutes", g_ShowCOG_Mins);
2194 Write(
"bShowTargetTracks", g_bAISShowTracks);
2195 Write(
"TargetTracksMinutes", g_AISShowTracks_Mins);
2197 Write(
"bHideMooredTargets", g_bHideMoored);
2198 Write(
"MooredTargetMaxSpeedKnots", g_ShowMoored_Kts);
2200 Write(
"bAISAlertDialog", g_bAIS_CPA_Alert);
2201 Write(
"bAISAlertAudio", g_bAIS_CPA_Alert_Audio);
2203 Write(
"AISAlertAudioFile", g_sAIS_Alert_Sound_File);
2204 Write(
"bAISAlertSuppressMoored", g_bAIS_CPA_Alert_Suppress_Moored);
2205 Write(
"bShowAreaNotices", g_bShowAreaNotices);
2206 Write(
"bDrawAISSize", g_bDrawAISSize);
2207 Write(
"bDrawAISRealtime", g_bDrawAISRealtime);
2208 Write(
"AISRealtimeMinSpeedKnots", g_AIS_RealtPred_Kts);
2209 Write(
"bShowAISName", g_bShowAISName);
2210 Write(
"ShowAISTargetNameScale", g_Show_Target_Name_Scale);
2211 Write(
"bWplIsAprsPositionReport", g_bWplUsePosition);
2212 Write(
"WplSelAction", g_WplAction);
2213 Write(
"AISCOGPredictorWidth", g_ais_cog_predictor_width);
2214 Write(
"bShowScaledTargets", g_bAllowShowScaled);
2215 Write(
"AISScaledNumber", g_ShowScaled_Num);
2216 Write(
"AISScaledNumberWeightSOG", g_ScaledNumWeightSOG);
2217 Write(
"AISScaledNumberWeightCPA", g_ScaledNumWeightCPA);
2218 Write(
"AISScaledNumberWeightTCPA", g_ScaledNumWeightTCPA);
2219 Write(
"AISScaledNumberWeightRange", g_ScaledNumWeightRange);
2220 Write(
"AISScaledNumberWeightSizeOfTarget", g_ScaledNumWeightSizeOfT);
2221 Write(
"AISScaledSizeMinimal", g_ScaledSizeMinimal);
2222 Write(
"AISShowScaled", g_bShowScaled);
2224 Write(
"AlertDialogSizeX", g_ais_alert_dialog_sx);
2225 Write(
"AlertDialogSizeY", g_ais_alert_dialog_sy);
2226 Write(
"AlertDialogPosX", g_ais_alert_dialog_x);
2227 Write(
"AlertDialogPosY", g_ais_alert_dialog_y);
2228 Write(
"QueryDialogPosX", g_ais_query_dialog_x);
2229 Write(
"QueryDialogPosY", g_ais_query_dialog_y);
2230 Write(
"AISTargetListPerspective", g_AisTargetList_perspective);
2231 Write(
"AISTargetListRange", g_AisTargetList_range);
2232 Write(
"AISTargetListSortColumn", g_AisTargetList_sortColumn);
2233 Write(
"bAISTargetListSortReverse", g_bAisTargetList_sortReverse);
2234 Write(
"AISTargetListColumnSpec", g_AisTargetList_column_spec);
2235 Write(
"AISTargetListColumnOrder", g_AisTargetList_column_order);
2237 Write(
"S57QueryDialogSizeX", g_S57_dialog_sx);
2238 Write(
"S57QueryDialogSizeY", g_S57_dialog_sy);
2239 Write(
"S57QueryExtraDialogSizeX", g_S57_extradialog_sx);
2240 Write(
"S57QueryExtraDialogSizeY", g_S57_extradialog_sy);
2242 Write(
"bAISRolloverShowClass", g_bAISRolloverShowClass);
2243 Write(
"bAISRolloverShowCOG", g_bAISRolloverShowCOG);
2244 Write(
"bAISRolloverShowCPA", g_bAISRolloverShowCPA);
2246 Write(
"bAISAlertAckTimeout", g_bAIS_ACK_Timeout);
2247 Write(
"AlertAckTimeoutMinutes", g_AckTimeout_Mins);
2249 SetPath(
"/Settings/GlobalState");
2251 Write(
"bShowS57Text", ps52plib->GetShowS57Text());
2252 Write(
"bShowS57ImportantTextOnly", ps52plib->GetShowS57ImportantTextOnly());
2253 if (!g_bInlandEcdis)
2254 Write(
"nDisplayCategory", (
long)ps52plib->GetDisplayCategory());
2255 Write(
"nSymbolStyle", (
int)ps52plib->m_nSymbolStyle);
2256 Write(
"nBoundaryStyle", (
int)ps52plib->m_nBoundaryStyle);
2258 Write(
"bShowSoundg", ps52plib->m_bShowSoundg);
2259 Write(
"bShowMeta", ps52plib->m_bShowMeta);
2260 Write(
"bUseSCAMIN", ps52plib->m_bUseSCAMIN);
2261 Write(
"bUseSUPER_SCAMIN", ps52plib->m_bUseSUPER_SCAMIN);
2262 Write(
"bShowAtonText", ps52plib->m_bShowAtonText);
2263 Write(
"bShowLightDescription", ps52plib->m_bShowLdisText);
2264 Write(
"bExtendLightSectors", ps52plib->m_bExtendLightSectors);
2265 Write(
"bDeClutterText", ps52plib->m_bDeClutterText);
2266 Write(
"bShowNationalText", ps52plib->m_bShowNationalTexts);
2268 Write(
"S52_MAR_SAFETY_CONTOUR",
2269 S52_getMarinerParam(S52_MAR_SAFETY_CONTOUR));
2270 Write(
"S52_MAR_SHALLOW_CONTOUR",
2271 S52_getMarinerParam(S52_MAR_SHALLOW_CONTOUR));
2272 Write(
"S52_MAR_DEEP_CONTOUR", S52_getMarinerParam(S52_MAR_DEEP_CONTOUR));
2273 Write(
"S52_MAR_TWO_SHADES", S52_getMarinerParam(S52_MAR_TWO_SHADES));
2274 Write(
"S52_DEPTH_UNIT_SHOW", ps52plib->m_nDepthUnitDisplay);
2275 Write(
"ENCSoundingScaleFactor", g_ENCSoundingScaleFactor);
2276 Write(
"ENCTextScaleFactor", g_ENCTextScaleFactor);
2278 SetPath(
"/Directories");
2279 Write(
"S57DataLocation",
"");
2282 SetPath(
"/Directories");
2283 Write(
"InitChartDir", *pInit_Chart_Dir);
2284 Write(
"GPXIODir", g_gpx_path);
2285 Write(
"TCDataDir", g_TCData_Dir);
2286 Write(
"BasemapDir", g_Platform->NormalizePath(gWorldMapLocation));
2287 if (gWorldShapefileLocation.Length())
2288 Write(
"BaseShapefileDir",
2289 g_Platform->NormalizePath(gWorldShapefileLocation));
2292 SetPath(
"/Settings/NMEADataSource");
2293 wxString connectionconfigs;
2294 for (
size_t i = 0; i < TheConnectionParams().size(); i++) {
2295 if (i > 0) connectionconfigs.Append(
"|");
2296 connectionconfigs.Append(TheConnectionParams()[i]->Serialize());
2298 Write(
"DataConnections", connectionconfigs);
2303 SetPath(
"/Settings/AuxFontKeys");
2306 for (
unsigned int i = 0; i < keyArray.GetCount(); i++) {
2308 key.Printf(
"Key%i", i);
2309 wxString keyval = keyArray[i];
2315 font_path = (
"/Settings/X11Fonts");
2319 font_path = (
"/Settings/GTKFonts");
2323 font_path = (
"/Settings/MSWFonts");
2327 font_path = (
"/Settings/MacFonts");
2331 font_path = (
"/Settings/QTFonts");
2334 if (HasEntry(font_path)) DeleteGroup(font_path);
2340 for (
int i = 0; i < nFonts; i++) {
2341 wxString cfstring(FontMgr::Get().GetConfigString(i));
2343 Write(cfstring, valstring);
2347 if (HasGroup(
"/TideCurrentDataSources"))
2348 DeleteGroup(
"/TideCurrentDataSources");
2349 SetPath(
"/TideCurrentDataSources");
2350 unsigned int id = 0;
2351 for (
auto val : TideCurrentDataSet) {
2353 key.Printf(
"tcds%d",
id);
2354 Write(key, wxString(val));
2358 SetPath(
"/Settings/Others");
2361 Write(
"ShowRadarRings",
2362 (
bool)(g_iNavAidRadarRingsNumberVisible > 0));
2363 Write(
"RadarRingsNumberVisible", g_iNavAidRadarRingsNumberVisible);
2364 Write(
"RadarRingsStep", g_fNavAidRadarRingsStep);
2365 Write(
"RadarRingsStepUnits", g_pNavAidRadarRingsStepUnits);
2366 Write(
"RadarRingsColour",
2367 g_colourOwnshipRangeRingsColour.GetAsString(wxC2S_HTML_SYNTAX));
2368 Write(
"WaypointUseScaMin", g_bUseWptScaMin);
2369 Write(
"WaypointScaMinValue", g_iWpt_ScaMin);
2370 Write(
"WaypointScaMaxValue", g_iWpt_ScaMax);
2371 Write(
"WaypointUseScaMinOverrule", g_bOverruleScaMin);
2372 Write(
"WaypointsShowName", g_bShowWptName);
2373 Write(
"UserIconsFirst", g_bUserIconsFirst);
2376 Write(
"WaypointRangeRingsNumber", g_iWaypointRangeRingsNumber);
2377 Write(
"WaypointRangeRingsStep", g_fWaypointRangeRingsStep);
2378 Write(
"WaypointRangeRingsStepUnits", g_iWaypointRangeRingsStepUnits);
2379 Write(
"WaypointRangeRingsColour",
2382 Write(
"ConfirmObjectDeletion", g_bConfirmObjectDelete);
2385 Write(
"WaypointPreventDragging", g_bWayPointPreventDragging);
2387 Write(
"EnableZoomToCursor", g_bEnableZoomToCursor);
2389 Write(
"TrackIntervalSeconds", g_TrackIntervalSeconds);
2390 Write(
"TrackDeltaDistance", g_TrackDeltaDistance);
2391 Write(
"TrackPrecision", g_nTrackPrecision);
2393 Write(
"RouteLineWidth", g_route_line_width);
2394 Write(
"TrackLineWidth", g_track_line_width);
2395 Write(
"TrackLineColour",
2396 g_colourTrackLineColour.GetAsString(wxC2S_HTML_SYNTAX));
2397 Write(
"DefaultWPIcon", g_default_wp_icon);
2399 Write(
"DefaultRPIcon", g_default_routepoint_icon);
2401 DeleteGroup(
"/MmsiProperties");
2402 SetPath(
"/MmsiProperties");
2405 p.Printf(
"Props%d", i);
2408 SetPath(
"/DataMonitor");
2409 Write(
"colors.ok", g_dm_ok);
2410 Write(
"colors.dropped", g_dm_dropped);
2411 Write(
"colors.filtered", g_dm_filtered);
2412 Write(
"colors.input", g_dm_input);
2413 Write(
"colors.output", g_dm_output);
2414 Write(
"colors.not-ok", g_dm_not_ok);
2416 SaveCanvasConfigs();
2419 SendMessageToAllPlugins(
"GLOBAL_SETTINGS_UPDATED",
"{\"updated\":\"1\"}");
2423 if (top_frame::Get()) top_frame::Get()->SendGlJsonConfigMsg();
2428static wxFileName exportFileName(wxWindow *parent,
2429 const wxString suggestedName) {
2432 wxString valid_name = SanitizeFileName(suggestedName);
2435 if (!valid_name.EndsWith(
".gpx")) {
2436 wxFileName fn(valid_name);
2439 valid_name = fn.GetFullName();
2442 int response = g_Platform->DoFileSelectorDialog(
2443 parent, &path, _(
"Export GPX file"), g_gpx_path, valid_name,
"*.gpx");
2445 if (response == wxID_OK) {
2446 wxFileName fn(path);
2447 g_gpx_path = fn.GetPath();
2448 if (!fn.GetExt().StartsWith(
"gpx")) fn.SetExt(
"gpx");
2450#if defined(__WXMSW__) || defined(__WXGTK__)
2451 if (wxFileExists(fn.GetFullPath())) {
2452 int answer = OCPNMessageBox(NULL, _(
"Overwrite existing file?"),
2453 "Confirm", wxICON_QUESTION | wxYES_NO);
2454 if (answer != wxID_YES)
return ret;
2462int BackupDatabase(wxWindow *parent) {
2463 bool backupResult =
false;
2464 wxDateTime tm = wxDateTime::Now();
2465 wxString proposedName = tm.Format(
"navobj-%Y-%m-%d_%H_%M");
2466 wxString acceptedName;
2469 g_Platform->DoFileSelectorDialog(parent, &acceptedName, _(
"Backup"),
2470 wxStandardPaths::Get().GetDocumentsDir(),
2471 proposedName,
"*.bkp")) {
2472 wxFileName fileName(acceptedName);
2473 if (fileName.IsOk()) {
2474#if defined(__WXMSW__) || defined(__WXGTK__)
2475 if (fileName.FileExists()) {
2476 if (wxID_YES != OCPNMessageBox(NULL, _(
"Overwrite existing file?"),
2477 "Confirm", wxICON_QUESTION | wxYES_NO)) {
2484 wxString secureFileName = androidGetCacheDir() +
2485 wxFileName::GetPathSeparator() +
2486 fileName.GetFullName();
2487 backupResult = NavObj_dB::GetInstance().Backup(secureFileName);
2488 AndroidSecureCopyFile(secureFileName, fileName.GetFullPath());
2490 backupResult = NavObj_dB::GetInstance().Backup(fileName.GetFullPath());
2493 return backupResult ? wxID_YES : wxID_NO;
2498bool ExportGPXRoutes(wxWindow *parent, RouteList *pRoutes,
2499 const wxString suggestedName) {
2501 wxFileName fn = exportFileName(parent, suggestedName);
2504 pgpx->AddGPXRoutesList(pRoutes);
2505 pgpx->SaveFile(fn.GetFullPath());
2511 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
2512 suggestedName +
".gpx";
2514 pgpx->AddGPXRoutesList(pRoutes);
2515 pgpx->SaveFile(fns);
2520 int response = g_Platform->DoFileSelectorDialog(
2521 parent, &path, _(
"Export GPX file"), g_gpx_path, suggestedName +
".gpx",
2527 wxCopyFile(fns, path);
2535bool ExportGPXTracks(wxWindow *parent, std::vector<Track *> *pTracks,
2536 const wxString suggestedName) {
2538 wxFileName fn = exportFileName(parent, suggestedName);
2541 pgpx->AddGPXTracksList(pTracks);
2542 pgpx->SaveFile(fn.GetFullPath());
2548 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
2549 suggestedName +
".gpx";
2551 pgpx->AddGPXTracksList(pTracks);
2552 pgpx->SaveFile(fns);
2557 int response = g_Platform->DoFileSelectorDialog(
2558 parent, &path, _(
"Export GPX file"), g_gpx_path, suggestedName +
".gpx",
2564 wxCopyFile(fns, path);
2571bool ExportGPXWaypoints(wxWindow *parent, RoutePointList *pRoutePoints,
2572 const wxString suggestedName) {
2574 wxFileName fn = exportFileName(parent, suggestedName);
2577 pgpx->AddGPXPointsList(pRoutePoints);
2578 pgpx->SaveFile(fn.GetFullPath());
2584 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
2585 suggestedName +
".gpx";
2587 pgpx->AddGPXPointsList(pRoutePoints);
2588 pgpx->SaveFile(fns);
2593 int response = g_Platform->DoFileSelectorDialog(
2594 parent, &path, _(
"Export GPX file"), g_gpx_path, suggestedName +
".gpx",
2600 wxCopyFile(fns, path);
2608void ExportGPX(wxWindow *parent,
bool bviz_only,
bool blayer) {
2613 wxFileName fn = exportFileName(parent,
"userobjects.gpx");
2614 if (!fn.IsOk())
return;
2615 fns = fn.GetFullPath();
2619 androidGetCacheDir() + wxFileName::GetPathSeparator() +
"userobjects.gpx";
2622 ::wxBeginBusyCursor();
2624 wxGenericProgressDialog *pprog =
nullptr;
2625 int count = pWayPointMan->GetWaypointList()->size();
2626 int progStep = count / 32;
2628 pprog =
new wxGenericProgressDialog(
2629 _(
"Export GPX file"),
"0/0", count, NULL,
2630 wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
2631 wxPD_REMAINING_TIME);
2632 pprog->SetSize(400, wxDefaultCoord);
2639 for (
RoutePoint *pr : *pWayPointMan->GetWaypointList()) {
2640 if (pprog && !(ic % progStep)) {
2642 msg.Printf(
"%d/%d", ic, count);
2643 pprog->Update(ic, msg);
2648 if (bviz_only && !pr->m_bIsVisible) b_add =
false;
2650 if (pr->m_bIsInLayer && !blayer) b_add =
false;
2652 if (pr->IsShared() || !WptIsInRouteList(pr)) pgpx->AddGPXWaypoint(pr);
2658 if (bviz_only && !pRoute->IsVisible()) b_add =
false;
2659 if (pRoute->m_bIsInLayer && !blayer) b_add =
false;
2661 if (b_add) pgpx->AddGPXRoute(pRoute);
2667 if (bviz_only && !pTrack->IsVisible()) b_add =
false;
2669 if (pTrack->m_bIsInLayer && !blayer) b_add =
false;
2671 if (b_add) pgpx->AddGPXTrack(pTrack);
2674 pgpx->SaveFile(fns);
2680 g_Platform->DoFileSelectorDialog(parent, &path, _(
"Export GPX file"),
2681 g_gpx_path,
"userobjects.gpx",
"*.gpx");
2685 wxCopyFile(fns, path);
2689 ::wxEndBusyCursor();
2693void UI_ImportGPX(wxWindow *parent,
bool islayer, wxString dirpath,
2694 bool isdirectory,
bool isPersistent) {
2695 int response = wxID_CANCEL;
2696 wxArrayString file_array;
2698 if (!islayer || dirpath.IsSameAs(
"")) {
2703 wxFileDialog *popenDialog =
2704 new wxFileDialog(NULL, _(
"Import GPX file"), g_gpx_path,
"",
2705 "GPX files (*.gpx)|*.gpx|All files (*.*)|*.*",
2706 wxFD_OPEN | wxFD_MULTIPLE);
2708 if (g_bresponsive && parent)
2709 popenDialog = g_Platform->AdjustFileDialogFont(parent, popenDialog);
2711 popenDialog->Centre();
2714 if (parent) parent->HideWithEffect(wxSHOW_EFFECT_BLEND);
2717 response = popenDialog->ShowModal();
2720 if (parent) parent->ShowWithEffect(wxSHOW_EFFECT_BLEND);
2723 if (response == wxID_OK) {
2724 popenDialog->GetPaths(file_array);
2727 if (file_array.GetCount()) {
2728 wxFileName fn(file_array[0]);
2729 g_gpx_path = fn.GetPath();
2735 response = g_Platform->DoFileSelectorDialog(
2736 NULL, &path, _(
"Import GPX file"), g_gpx_path,
"",
"*.gpx");
2738 wxFileName fn(path);
2739 g_gpx_path = fn.GetPath();
2740 if (path.IsEmpty()) {
2741 PrepareImportAndroid(islayer, isPersistent);
2744 file_array.Add(path);
2749 if (wxDir::GetAllFiles(dirpath, &file_array,
"*.gpx")) response = wxID_OK;
2751 file_array.Add(dirpath);
2756 if (response == wxID_OK) {
2757 ImportFileArray(file_array, islayer, isPersistent, dirpath);
2761void ImportFileArray(
const wxArrayString &file_array,
bool islayer,
2762 bool isPersistent, wxString dirpath) {
2768 l->m_LayerFileName = file_array[0];
2769 if (file_array.GetCount() <= 1)
2770 wxFileName::SplitPath(file_array[0], NULL, NULL, &(l->m_LayerName), NULL,
2773 if (dirpath.IsSameAs(
""))
2774 wxFileName::SplitPath(g_gpx_path, NULL, NULL, &(l->m_LayerName), NULL,
2777 wxFileName::SplitPath(dirpath, NULL, NULL, &(l->m_LayerName), NULL,
2781 bool bLayerViz = g_bShowLayers;
2782 if (g_VisibleLayers.Contains(l->m_LayerName)) bLayerViz =
true;
2783 if (g_InvisibleLayers.Contains(l->m_LayerName)) bLayerViz =
false;
2784 l->m_bIsVisibleOnChart = bLayerViz;
2787 l->m_bHasVisibleNames = wxCHK_CHECKED;
2790 laymsg.Printf(
"New layer %d: %s", l->m_LayerID, l->m_LayerName.c_str());
2791 wxLogMessage(laymsg);
2793 pLayerList->insert(pLayerList->begin(), l);
2796 for (
unsigned int i = 0; i < file_array.GetCount(); i++) {
2797 wxString path = file_array[i];
2799 if (::wxFileExists(path)) {
2803 wxLogMessage(
"Error loading GPX file " + path);
2805 wxString::Format(_(
"Error loading GPX file %s, %s at character %d"),
2806 path, result.description(), result.offset),
2807 _(
"Import GPX File"));
2814 l->m_NoOfItems = pSet->LoadAllGPXObjectsAsLayer(
2815 l->m_LayerID, l->m_bIsVisibleOnChart, l->m_bHasVisibleNames);
2816 l->m_LayerType = isPersistent ? _(
"Persistent") : _(
"Temporary");
2821 wxString destf, f, name, ext;
2822 f = l->m_LayerFileName;
2823 wxFileName::SplitPath(f, NULL, NULL, &name, &ext);
2825 appendOSDirSlash(&destf);
2826 destf.Append(
"layers");
2827 appendOSDirSlash(&destf);
2828 if (!wxDirExists(destf)) {
2829 if (!wxMkdir(destf, wxS_DIR_DEFAULT))
2830 wxLogMessage(
"Error creating layer directory");
2833 destf << name <<
"." << ext;
2835 if (wxCopyFile(f, destf,
true))
2836 msg.Printf(
"File: %s.%s also added to persistent layers", name,
2839 msg.Printf(
"Failed adding %s.%s to persistent layers", name, ext);
2844 pSet->LoadAllGPXObjects(
2851 wxString::Format(
"%d " + _(
"duplicate waypoints detected "
2852 "during import and ignored."),
2854 _(
"OpenCPN Info"), wxICON_INFORMATION | wxOK, 10);
2866void SwitchInlandEcdisMode(
bool Switch) {
2868 wxLogMessage(
"Switch InlandEcdis mode On");
2875 if (ps52plib) ps52plib->SetDisplayCategory(STANDARD);
2876 g_bDrawAISSize =
false;
2877 if (top_frame::Get()) top_frame::Get()->RequestNewToolbars(
true);
2879 wxLogMessage(
"Switch InlandEcdis mode Off");
2882 pConfig->SetPath(
"/Settings");
2883 pConfig->Read(
"GlobalToolbarConfig", &g_toolbarConfig);
2886 pConfig->Read(
"ShowDepthUnits", &g_bShowDepthUnits, 1);
2889 pConfig->Read(
"nDisplayCategory", &read_int, (
enum _DisCat)STANDARD);
2890 if (ps52plib) ps52plib->SetDisplayCategory((
enum _DisCat)read_int);
2891 pConfig->SetPath(
"/Settings/AIS");
2892 pConfig->Read(
"bDrawAISSize", &g_bDrawAISSize);
2893 pConfig->Read(
"bDrawAISRealtime", &g_bDrawAISRealtime);
2895 if (top_frame::Get()) top_frame::Get()->RequestNewToolbars(
true);
2907wxString FormatGPXDateTime(wxDateTime dt) {
2909 return dt.Format(
"%Y-%m-%dT%H:%M:%SZ");
2916bool LogMessageOnce(
const wxString &msg) {
2919 for (
unsigned int i = 0; i < navutil::pMessageOnceArray->GetCount(); i++) {
2920 if (msg.IsSameAs(navutil::pMessageOnceArray->Item(i)))
return false;
2924 navutil::pMessageOnceArray->Add(msg);
2937 if (!ts.IsValid()) {
2940 int effective_format = format;
2954 switch (effective_format) {
2956 if (std::isnan(lon)) {
2957 dt = wxInvalidDateTime;
2960 ts.Add(wxTimeSpan(wxTimeSpan(0, 0, wxLongLong(lon * 3600. / 15.))));
2977 if (!ts.IsValid()) {
2980 int effective_format = format;
2994 switch (effective_format) {
2996 if (std::isnan(lon)) {
2997 dt = wxInvalidDateTime;
2999 dt = ts.Subtract(wxTimeSpan(0, 0, wxLongLong(lon * 3600. / 15.)));
3016double fromUsrSpeed(
double usr_speed,
int unit) {
3024 ret = usr_speed / 1.15078;
3027 ret = usr_speed / 1.852;
3030 ret = usr_speed / 0.514444444;
3038double fromUsrWindSpeed(
double usr_wspeed,
int unit) {
3040 if (
unit == -1)
unit = g_iWindSpeedFormat;
3046 ret = usr_wspeed / 0.514444444;
3049 ret = usr_wspeed / 1.15078;
3052 ret = usr_wspeed / 1.852;
3061double fromUsrTemp(
double usr_temp,
int unit) {
3069 ret = (usr_temp - 32) * 5.0 / 9.0;
3072 ret = usr_temp - 273.15;
3078wxString formatAngle(
double angle) {
3080 if (g_bShowMag && g_bShowTrue) {
3081 out.Printf(
"%03.0f %cT (%.0f %cM)", angle, 0x00B0, toMagnetic(angle),
3083 }
else if (g_bShowTrue) {
3084 out.Printf(
"%03.0f %cT", angle, 0x00B0);
3086 out.Printf(
"%03.0f %cM", toMagnetic(angle), 0x00B0);
3092void AlphaBlending(
ocpnDC &dc,
int x,
int y,
int size_x,
int size_y,
3093 float radius, wxColour color,
unsigned char transparency) {
3094 wxDC *pdc = dc.GetDC();
3097 wxBitmap obm(size_x, size_y);
3099 mdc1.SelectObject(obm);
3100 mdc1.Blit(0, 0, size_x, size_y, pdc, x, y);
3101 mdc1.SelectObject(wxNullBitmap);
3102 wxImage oim = obm.ConvertToImage();
3105 wxBitmap olbm(size_x, size_y);
3106 wxMemoryDC oldc(olbm);
3107 if (!oldc.IsOk())
return;
3109 oldc.SetBackground(*wxBLACK_BRUSH);
3110 oldc.SetBrush(*wxWHITE_BRUSH);
3113 if (radius > 0.0) oldc.DrawRoundedRectangle(0, 0, size_x, size_y, radius);
3115 wxImage dest = olbm.ConvertToImage();
3116 unsigned char *dest_data =
3117 (
unsigned char *)malloc(size_x * size_y * 3 *
sizeof(
unsigned char));
3118 unsigned char *bg = oim.GetData();
3119 unsigned char *box = dest.GetData();
3120 unsigned char *d = dest_data;
3127 float alpha = 1.0 - (float)transparency / 255.0;
3128 int sb = size_x * size_y;
3129 for (
int i = 0; i < sb; i++) {
3131 if (*box == 0 && radius > 0.0) a = 1.0;
3132 int r = ((*bg++) * a) + (1.0 - a) * color.Red();
3135 int g = ((*bg++) * a) + (1.0 - a) * color.Green();
3138 int b = ((*bg++) * a) + (1.0 - a) * color.Blue();
3143 dest.SetData(dest_data);
3147 dc.DrawBitmap(dbm, x, y,
false);
3151 dc.CalcBoundingBox(x, y);
3152 dc.CalcBoundingBox(x + size_x, y + size_y);
3157 float radMod = wxMax(radius, 2.0);
3158 wxColour c(color.Red(), color.Green(), color.Blue(), transparency);
3159 dc.SetBrush(wxBrush(c));
3160 dc.SetPen(wxPen(c, 1));
3161 dc.DrawRoundedRectangle(x, y, size_x, size_y, radMod);
3163 glDisable(GL_BLEND);
3169void DimeControl(wxWindow *ctrl) {
3175 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) {
3183 if (wxSystemSettings::GetColour(wxSystemColour::wxSYS_COLOUR_WINDOW).Red() <
3190 if (NULL == ctrl)
return;
3192 wxColour col, window_back_color, gridline, uitext, udkrd, ctrl_back_color,
3194 col = GetGlobalColor(
"DILG0");
3195 window_back_color = GetGlobalColor(
"DILG1");
3196 ctrl_back_color = GetGlobalColor(
"DILG1");
3197 text_color = GetGlobalColor(
"DILG3");
3198 uitext = GetGlobalColor(
"UITX1");
3199 udkrd = GetGlobalColor(
"UDKRD");
3200 gridline = GetGlobalColor(
"GREY2");
3202 DimeControl(ctrl, col, window_back_color, ctrl_back_color, text_color, uitext,
3206void DimeControl(wxWindow *ctrl, wxColour col, wxColour window_back_color,
3207 wxColour ctrl_back_color, wxColour text_color, wxColour uitext,
3208 wxColour udkrd, wxColour gridline) {
3214 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) {
3219 ColorScheme cs = global_color_scheme;
3223 (cs == GLOBAL_COLOR_SCHEME_DUSK || cs == GLOBAL_COLOR_SCHEME_NIGHT);
3225 static int depth = 0;
3231 window_back_color = wxNullColour;
3233 window_back_color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
3235 col = wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX);
3236 uitext = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
3239 ctrl->SetBackgroundColour(window_back_color);
3240 if (darkMode) ctrl->SetForegroundColour(text_color);
3243 wxWindowList kids = ctrl->GetChildren();
3244 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
3245 wxWindowListNode *node = kids.Item(i);
3246 wxWindow *win = node->GetData();
3248 if (
dynamic_cast<wxListBox *
>(win) ||
dynamic_cast<wxListCtrl *
>(win) ||
3249 dynamic_cast<wxTextCtrl *
>(win) ||
3250 dynamic_cast<wxTimePickerCtrl *
>(win)) {
3251 win->SetBackgroundColour(col);
3252 }
else if (
dynamic_cast<wxStaticText *
>(win) ||
3253 dynamic_cast<wxCheckBox *
>(win) ||
3254 dynamic_cast<wxRadioButton *
>(win)) {
3255 win->SetForegroundColour(uitext);
3262 else if (
dynamic_cast<wxBitmapComboBox *
>(win) ||
3263 dynamic_cast<wxChoice *
>(win) ||
dynamic_cast<wxComboBox *
>(win) ||
3264 dynamic_cast<wxTreeCtrl *
>(win)) {
3265 win->SetBackgroundColour(col);
3268 else if (
dynamic_cast<wxScrolledWindow *
>(win) ||
3269 dynamic_cast<wxGenericDirCtrl *
>(win) ||
3270 dynamic_cast<wxListbook *
>(win) ||
dynamic_cast<wxButton *
>(win) ||
3271 dynamic_cast<wxToggleButton *
>(win)) {
3272 win->SetBackgroundColour(window_back_color);
3275 else if (
dynamic_cast<wxNotebook *
>(win)) {
3276 win->SetBackgroundColour(window_back_color);
3277 win->SetForegroundColour(text_color);
3281 else if (
dynamic_cast<wxHtmlWindow *
>(win)) {
3282 if (cs != GLOBAL_COLOR_SCHEME_DAY && cs != GLOBAL_COLOR_SCHEME_RGB)
3283 win->SetBackgroundColour(ctrl_back_color);
3285 win->SetBackgroundColour(wxNullColour);
3288 else if (
dynamic_cast<wxGrid *
>(win)) {
3289 dynamic_cast<wxGrid *
>(win)->SetDefaultCellBackgroundColour(
3291 dynamic_cast<wxGrid *
>(win)->SetDefaultCellTextColour(uitext);
3292 dynamic_cast<wxGrid *
>(win)->SetLabelBackgroundColour(col);
3293 dynamic_cast<wxGrid *
>(win)->SetLabelTextColour(uitext);
3294 dynamic_cast<wxGrid *
>(win)->SetGridLineColour(gridline);
3297 if (win->GetChildren().GetCount() > 0) {
3300 DimeControl(w, col, window_back_color, ctrl_back_color, text_color,
3301 uitext, udkrd, gridline);
ArrayOfMmsiProperties g_MMSI_Props_Array
Global instance.
unsigned g_OwnShipmmsi
Global instance.
Class AisDecoder and helpers.
Global state for AIS decoder.
Chart canvas configuration state
General chart base definitions.
Charts database management
ChartGroupArray * g_pGroupArray
Global instance.
Generic Chart canvas base.
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.
Represents a layer of chart objects in OpenCPN.
Process incoming AIS messages.
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.
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.
Class cm93chart and helpers – CM93 chart state.
Global variables reflecting command line options and arguments.
Config file user configuration interface.
wxString g_datetime_format
Date/time format to use when formatting date/time strings.
bool g_always_send_rmb_rmc
Always send RMB and RMC n0183 messages even if there is no active route.
bool g_bsmoothpanzoom
Controls how the chart panning and zooming smoothing is done during user interactions.
int g_iTempFormat
User-selected temperature unit format for display and input.
int g_nDepthUnitDisplay
User-selected depth (below surface) unit format for display and input.
wxString g_default_font_facename
Default font size for user interface elements such as menus, dialogs, etc.
wxString g_winPluginDir
Base plugin directory on Windows.
wxString g_dm_logfile
Last Data Monitor log file.
bool g_bRollover
enable/disable mouse rollover GUI effects
int g_COGAvgSec
COG average period for Course Up Mode (sec)
int g_iSpeedFormat
User-selected speed unit format for display and input.
int g_iHeightFormat
User-selected height (vertical, above reference datum) unit format for display and input.
std::vector< size_t > g_config_display_size_mm
Size of pysical screen in millimeters.
int g_iDistanceFormat
User-selected distance (horizontal) unit format for display and input.
bool g_bDisplayGrid
Should lat/lon grid be displayed ?
Global variables stored in configuration file.
Extern C linked utilities.
std::vector< OCPN_MonitorInfo > g_monitor_info
Information about the monitors connected to the system.
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.
OpenGL chart rendering canvas.
size_t g_current_monitor
Current monitor displaying main application frame.
double vLat
Virtual lat from chcanv popup.
double vLon
Virtual lon from chcanv popup.
Miscellaneous globals primarely used by gui layer, not persisted in configuration file.
GUI constant definitions.
Multiplexer class and helpers.
MySQL based storage for routes, tracks, etc.
MyConfig * pConfig
Global instance.
wxDateTime toUsrDateTime(const wxDateTime ts, const int format, const double lon)
Converts a timestamp from UTC to the user's preferred time format.
wxDateTime fromUsrDateTime(const wxDateTime ts, const int format, const double lon)
Converts a timestamp from a user's preferred time format to UTC.
MyConfig * pConfig
Global instance.
Navigation Utility Functions without GUI dependencies.
Global variables Listen()/Notify() wrapper.
PlugIn Object Definition/API.
Layer to use wxDC or opengl.
double gLat
Vessel's current latitude in decimal degrees.
double gLon
Vessel's current longitude in decimal degrees.
Position, course, speed, etc.
Tools to send data to plugins.
wxColour g_colourWaypointRangeRingsColour
Global instance.
int g_LayerIdx
Global instance.
#define LMTINPUT
Format date/time using the remote location LMT time.
#define GLOBAL_SETTINGS_INPUT
Format date/time according to global OpenCPN settings.
#define UTCINPUT
Format date/time in UTC.
#define LTINPUT
Format date/time using timezone configured in the operating system./*#end#*/.
RouteList * pRouteList
Global instance.
float g_ChartScaleFactorExp
Global instance.
Selected route, segment, waypoint, etc.
Abstract gFrame/MyFrame interface.
std::vector< Track * > g_TrackList
Global instance.
Recorded track abstraction.