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>
62#include "o_sound/o_sound.h"
70#include "model/geodesic.h"
75#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");
723 Read(
"EnableHiconColorScheme", &g_hicon_colors, 0);
725 Read(
"FrameWinX", &g_nframewin_x);
726 Read(
"FrameWinY", &g_nframewin_y);
727 Read(
"FrameWinPosX", &g_nframewin_posx);
728 Read(
"FrameWinPosY", &g_nframewin_posy);
729 Read(
"FrameMax", &g_bframemax);
731 Read(
"ClientPosX", &g_lastClientRectx);
732 Read(
"ClientPosY", &g_lastClientRecty);
733 Read(
"ClientSzX", &g_lastClientRectw);
734 Read(
"ClientSzY", &g_lastClientRecth);
736 Read(
"RoutePropSizeX", &g_route_prop_sx);
737 Read(
"RoutePropSizeY", &g_route_prop_sy);
738 Read(
"RoutePropPosX", &g_route_prop_x);
739 Read(
"RoutePropPosY", &g_route_prop_y);
741 Read(
"AllowArbitrarySystemPlugins", &g_allow_arb_system_plugin);
744 Read(
"S52_DEPTH_UNIT_SHOW", &read_int);
746 read_int = wxMax(read_int, 0);
747 read_int = wxMin(read_int, 2);
752 SetPath(
"/Settings/Audio");
755 wxString sound_dir = g_Platform->GetSharedDataDir();
756 sound_dir.Append(
"sounds");
757 sound_dir.Append(wxFileName::GetPathSeparator());
759 g_AIS_sound_file = sound_dir +
"beep_ssl.wav";
760 g_DSC_sound_file = sound_dir +
"phonering1.wav";
761 g_SART_sound_file = sound_dir +
"beep3.wav";
762 g_anchorwatch_sound_file = sound_dir +
"beep1.wav";
764 Read(
"AISAlertSoundFile", &g_AIS_sound_file);
765 Read(
"DSCAlertSoundFile", &g_DSC_sound_file);
766 Read(
"SARTAlertSoundFile", &g_SART_sound_file);
767 Read(
"AnchorAlarmSoundFile", &g_anchorwatch_sound_file);
769 Read(
"bAIS_GCPA_AlertAudio", &g_bAIS_GCPA_Alert_Audio);
770 Read(
"bAIS_SART_AlertAudio", &g_bAIS_SART_Alert_Audio);
771 Read(
"bAIS_DSC_AlertAudio", &g_bAIS_DSC_Alert_Audio);
772 Read(
"bAnchorAlertAudio", &g_bAnchor_Alert_Audio);
776 SetPath(
"/Settings/AIS");
778 g_bUseOnlyConfirmedAISName =
false;
779 Read(
"UseOnlyConfirmedAISName", &g_bUseOnlyConfirmedAISName);
781 Read(
"bNoCPAMax", &g_bCPAMax);
783 Read(
"NoCPAMaxNMi", &s);
784 s.ToDouble(&g_CPAMax_NM);
786 Read(
"bCPAWarn", &g_bCPAWarn);
788 Read(
"CPAWarnNMi", &s);
789 s.ToDouble(&g_CPAWarn_NM);
791 Read(
"bTCPAMax", &g_bTCPA_Max);
793 Read(
"TCPAMaxMinutes", &s);
794 s.ToDouble(&g_TCPA_Max);
796 Read(
"bMarkLostTargets", &g_bMarkLost);
798 Read(
"MarkLost_Minutes", &s);
799 s.ToDouble(&g_MarkLost_Mins);
801 Read(
"bRemoveLostTargets", &g_bRemoveLost);
803 Read(
"RemoveLost_Minutes", &s);
804 s.ToDouble(&g_RemoveLost_Mins);
806 Read(
"bShowCOGArrows", &g_bShowCOG);
808 Read(
"bSyncCogPredictors", &g_bSyncCogPredictors);
810 Read(
"CogArrowMinutes", &s);
811 s.ToDouble(&g_ShowCOG_Mins);
813 Read(
"bShowTargetTracks", &g_bAISShowTracks);
815 if (
Read(
"TargetTracksLimit", &s)) {
816 s.ToDouble(&g_AISShowTracks_Limit);
817 g_AISShowTracks_Limit = wxMax(300.0, g_AISShowTracks_Limit);
819 if (
Read(
"TargetTracksMinutes", &s)) {
820 s.ToDouble(&g_AISShowTracks_Mins);
821 g_AISShowTracks_Mins = wxMax(1.0, g_AISShowTracks_Mins);
822 g_AISShowTracks_Mins = wxMin(g_AISShowTracks_Limit, g_AISShowTracks_Mins);
825 Read(
"bHideMooredTargets", &g_bHideMoored);
826 if (
Read(
"MooredTargetMaxSpeedKnots", &s)) s.ToDouble(&g_ShowMoored_Kts);
828 g_SOGminCOG_kts = 0.2;
829 if (
Read(
"SOGMinimumForCOGDisplay", &s)) s.ToDouble(&g_SOGminCOG_kts);
831 Read(
"bShowScaledTargets", &g_bAllowShowScaled);
832 Read(
"AISScaledNumber", &g_ShowScaled_Num);
833 Read(
"AISScaledNumberWeightSOG", &g_ScaledNumWeightSOG);
834 Read(
"AISScaledNumberWeightCPA", &g_ScaledNumWeightCPA);
835 Read(
"AISScaledNumberWeightTCPA", &g_ScaledNumWeightTCPA);
836 Read(
"AISScaledNumberWeightRange", &g_ScaledNumWeightRange);
837 Read(
"AISScaledNumberWeightSizeOfTarget", &g_ScaledNumWeightSizeOfT);
838 Read(
"AISScaledSizeMinimal", &g_ScaledSizeMinimal);
839 Read(
"AISShowScaled", &g_bShowScaled);
841 Read(
"bShowAreaNotices", &g_bShowAreaNotices);
842 Read(
"bDrawAISSize", &g_bDrawAISSize);
843 Read(
"bDrawAISRealtime", &g_bDrawAISRealtime);
844 Read(
"bShowAISName", &g_bShowAISName);
845 Read(
"AISRealtimeMinSpeedKnots", &g_AIS_RealtPred_Kts, 0.7);
846 Read(
"bAISAlertDialog", &g_bAIS_CPA_Alert);
847 Read(
"ShowAISTargetNameScale", &g_Show_Target_Name_Scale);
848 Read(
"bWplIsAprsPositionReport", &g_bWplUsePosition);
849 Read(
"WplSelAction", &g_WplAction);
850 Read(
"AISCOGPredictorWidth", &g_ais_cog_predictor_width);
852 Read(
"bAISAlertAudio", &g_bAIS_CPA_Alert_Audio);
853 Read(
"AISAlertAudioFile", &g_sAIS_Alert_Sound_File);
854 Read(
"bAISAlertSuppressMoored", &g_bAIS_CPA_Alert_Suppress_Moored);
856 Read(
"bAISAlertAckTimeout", &g_bAIS_ACK_Timeout);
857 if (
Read(
"AlertAckTimeoutMinutes", &s)) s.ToDouble(&g_AckTimeout_Mins);
859 Read(
"AlertDialogSizeX", &g_ais_alert_dialog_sx);
860 Read(
"AlertDialogSizeY", &g_ais_alert_dialog_sy);
861 Read(
"AlertDialogPosX", &g_ais_alert_dialog_x);
862 Read(
"AlertDialogPosY", &g_ais_alert_dialog_y);
863 Read(
"QueryDialogPosX", &g_ais_query_dialog_x);
864 Read(
"QueryDialogPosY", &g_ais_query_dialog_y);
866 Read(
"AISTargetListPerspective", &g_AisTargetList_perspective);
867 Read(
"AISTargetListRange", &g_AisTargetList_range);
868 Read(
"AISTargetListSortColumn", &g_AisTargetList_sortColumn);
869 Read(
"bAISTargetListSortReverse", &g_bAisTargetList_sortReverse);
870 Read(
"AISTargetListColumnSpec", &g_AisTargetList_column_spec);
871 Read(
"AISTargetListColumnOrder", &g_AisTargetList_column_order);
873 Read(
"bAISRolloverShowClass", &g_bAISRolloverShowClass);
874 Read(
"bAISRolloverShowCOG", &g_bAISRolloverShowCOG);
875 Read(
"bAISRolloverShowCPA", &g_bAISRolloverShowCPA);
876 Read(
"AISAlertDelay", &g_AIS_alert_delay);
878 Read(
"S57QueryDialogSizeX", &g_S57_dialog_sx);
879 Read(
"S57QueryDialogSizeY", &g_S57_dialog_sy);
880 Read(
"S57QueryExtraDialogSizeX", &g_S57_extradialog_sx);
881 Read(
"S57QueryExtraDialogSizeY", &g_S57_extradialog_sy);
883 wxString strpres(
"PresentationLibraryData");
885 SetPath(
"/Directories");
886 Read(strpres, &valpres);
887 if (!valpres.IsEmpty()) g_UserPresLibData = valpres;
889 wxString strs(
"SENCFileLocation");
890 SetPath(
"/Directories");
893 if (!vals.IsEmpty()) g_SENCPrefix = vals;
895 SetPath(
"/Directories");
897 Read(
"InitChartDir", &vald);
899 wxString dirnamed(vald);
900 if (!dirnamed.IsEmpty()) {
901 if (pInit_Chart_Dir->IsEmpty())
903 pInit_Chart_Dir->Clear();
904 pInit_Chart_Dir->Append(vald);
908 Read(
"GPXIODir", &g_gpx_path);
909 Read(
"TCDataDir", &g_TCData_Dir);
910 Read(
"BasemapDir", &gWorldMapLocation);
911 Read(
"BaseShapefileDir", &gWorldShapefileLocation);
913 wxLogMessage(
"winPluginDir, read from ini file: %s",
916 SetPath(
"/Settings/GlobalState");
918 Read(
"EnableHiconColorScheme", &g_hicon_colors,
false);
920 if (
Read(
"nColorScheme", &read_int)) {
921 global_color_scheme = (ColorScheme)read_int;
925 if (g_hicon_colors) {
926 if ((global_color_scheme != GLOBAL_COLOR_SCHEME_DAY_HICON) &&
927 (global_color_scheme != GLOBAL_COLOR_SCHEME_NIGHT_HICON))
928 global_color_scheme = GLOBAL_COLOR_SCHEME_DAY_HICON;
930 if ((global_color_scheme != GLOBAL_COLOR_SCHEME_DAY) &&
931 (global_color_scheme != GLOBAL_COLOR_SCHEME_NIGHT) &&
932 (global_color_scheme != GLOBAL_COLOR_SCHEME_DUSK))
933 global_color_scheme = GLOBAL_COLOR_SCHEME_DAY;
938 SetPath(
"/Settings/NMEADataSource");
941 wxString connectionconfigs;
942 Read(
"DataConnections", &connectionconfigs);
943 if (!connectionconfigs.IsEmpty()) {
944 wxArrayString confs = wxStringTokenize(connectionconfigs,
"|");
945 for (
size_t i = 0; i < confs.Count(); i++) {
947 if (!prm->is_valid) {
948 wxLogMessage(
"Skipped invalid DataStream config");
957 SetPath(
"/Settings/GlobalState");
960 double st_lat, st_lon;
961 if (
Read(
"VPLatLon", &st)) {
962 sscanf(st.mb_str(wxConvUTF8),
"%lf,%lf", &st_lat, &st_lon);
965 if (fabs(st_lon) < 360.) {
966 while (st_lon < -180.) st_lon += 360.;
968 while (st_lon > 180.) st_lon -= 360.;
973 if (fabs(st_lat) < 90.0)
vLat = st_lat;
975 s.Printf(
"Setting Viewpoint Lat/Lon %g, %g",
vLat,
vLon);
979 double st_view_scale, st_rotation;
980 if (
Read(wxString(
"VPScale"), &st)) {
981 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_view_scale);
983 st_view_scale = fmax(st_view_scale, .001 / 32);
984 st_view_scale = fmin(st_view_scale, 4);
987 if (
Read(wxString(
"VPRotation"), &st)) {
988 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_rotation);
990 st_rotation = fmin(st_rotation, 360);
991 st_rotation = fmax(st_rotation, 0);
996 if (
Read(
"OwnShipLatLon", &sll)) {
997 sscanf(sll.mb_str(wxConvUTF8),
"%lf,%lf", &lat, &lon);
1000 if (fabs(lon) < 360.) {
1001 while (lon < -180.) lon += 360.;
1003 while (lon > 180.) lon -= 360.;
1008 if (fabs(lat) < 90.0)
gLat = lat;
1010 s.Printf(
"Setting Ownship Lat/Lon %g, %g",
gLat,
gLon);
1017 SetPath(
"/Settings/AuxFontKeys");
1022 bool bContk = GetFirstEntry(strk, dummyk);
1023 bool bNewKey =
false;
1026 bNewKey = FontMgr::Get().
AddAuxKey(kval);
1027 if (!bAsTemplate && !bNewKey) {
1031 bContk = GetNextEntry(strk, dummyk);
1035 SetPath(
"/Settings/X11Fonts");
1039 SetPath(
"/Settings/GTKFonts");
1043 SetPath(
"/Settings/MSWFonts");
1047 SetPath(
"/Settings/MacFonts");
1051 SetPath(
"/Settings/QTFonts");
1057 wxArrayString deleteList;
1059 bool bCont = GetFirstEntry(str, dummy);
1063 if (str.StartsWith(
"Font")) {
1066 deleteList.Add(str);
1067 wxString oldKey = pval.BeforeFirst(_T(
':'));
1071 if (pval.IsEmpty() || pval.StartsWith(
":")) {
1072 deleteList.Add(str);
1076 bCont = GetNextEntry(str, dummy);
1079 for (
unsigned int i = 0; i < deleteList.Count(); i++) {
1080 DeleteEntry(deleteList[i]);
1085 SetPath(
"/TideCurrentDataSources");
1086 if (GetNumberOfEntries()) {
1087 TideCurrentDataSet.clear();
1090 bool bCont = GetFirstEntry(str, dummy);
1097 if (std::find(TideCurrentDataSet.begin(), TideCurrentDataSet.end(),
1098 val.ToStdString()) == TideCurrentDataSet.end()) {
1099 TideCurrentDataSet.push_back(val.ToStdString());
1101 bCont = GetNextEntry(str, dummy);
1111 SetPath(
"/Settings/Others");
1114 Read(
"RadarRingsNumberVisible", &val);
1115 if (val.Length() > 0) g_iNavAidRadarRingsNumberVisible = atoi(val.mb_str());
1116 g_bNavAidRadarRingsShown = g_iNavAidRadarRingsNumberVisible > 0;
1118 Read(
"RadarRingsStep", &val);
1119 if (val.Length() > 0) g_fNavAidRadarRingsStep = atof(val.mb_str());
1121 Read(
"RadarRingsStepUnits", &g_pNavAidRadarRingsStepUnits);
1123 wxString l_wxsOwnshipRangeRingsColour;
1124 Read(
"RadarRingsColour", &l_wxsOwnshipRangeRingsColour);
1125 if (l_wxsOwnshipRangeRingsColour.Length())
1126 g_colourOwnshipRangeRingsColour.Set(l_wxsOwnshipRangeRingsColour);
1129 Read(
"WaypointRangeRingsNumber", &val);
1130 if (val.Length() > 0) g_iWaypointRangeRingsNumber = atoi(val.mb_str());
1132 Read(
"WaypointRangeRingsStep", &val);
1133 if (val.Length() > 0) g_fWaypointRangeRingsStep = atof(val.mb_str());
1135 Read(
"WaypointRangeRingsStepUnits", &g_iWaypointRangeRingsStepUnits);
1137 wxString l_wxsWaypointRangeRingsColour;
1138 Read(
"WaypointRangeRingsColour", &l_wxsWaypointRangeRingsColour);
1141 if (!
Read(
"WaypointUseScaMin", &g_bUseWptScaMin)) g_bUseWptScaMin =
false;
1142 if (!
Read(
"WaypointScaMinValue", &g_iWpt_ScaMin)) g_iWpt_ScaMin = 2147483646;
1143 if (!
Read(
"WaypointScaMaxValue", &g_iWpt_ScaMax)) g_iWpt_ScaMax = 0;
1144 if (!
Read(
"WaypointUseScaMinOverrule", &g_bOverruleScaMin))
1145 g_bOverruleScaMin =
false;
1146 if (!
Read(
"WaypointsShowName", &g_bShowWptName)) g_bShowWptName =
true;
1147 if (!
Read(
"UserIconsFirst", &g_bUserIconsFirst)) g_bUserIconsFirst =
true;
1150 bool b300RadarRings =
true;
1151 if (
Read(
"ShowRadarRings", &b300RadarRings)) {
1152 if (!b300RadarRings) g_iNavAidRadarRingsNumberVisible = 0;
1155 Read(
"ConfirmObjectDeletion", &g_bConfirmObjectDelete);
1158 g_bWayPointPreventDragging =
false;
1159 Read(
"WaypointPreventDragging", &g_bWayPointPreventDragging);
1161 g_bEnableZoomToCursor =
false;
1162 Read(
"EnableZoomToCursor", &g_bEnableZoomToCursor);
1165 Read(
"TrackIntervalSeconds", &val);
1166 if (val.Length() > 0) {
1167 double tval = atof(val.mb_str());
1168 if (tval >= 2.) g_TrackIntervalSeconds = tval;
1172 Read(
"TrackDeltaDistance", &val);
1173 if (val.Length() > 0) {
1174 double tval = atof(val.mb_str());
1175 if (tval >= 0.05) g_TrackDeltaDistance = tval;
1178 Read(
"TrackPrecision", &g_nTrackPrecision);
1180 Read(
"RouteLineWidth", &g_route_line_width);
1181 Read(
"TrackLineWidth", &g_track_line_width);
1183 wxString l_wxsTrackLineColour;
1184 if (
Read(
"TrackLineColour", &l_wxsTrackLineColour))
1185 g_colourTrackLineColour.Set(l_wxsTrackLineColour);
1187 Read(
"TideCurrentWindowScale", &g_tcwin_scale);
1188 Read(
"DefaultWPIcon", &g_default_wp_icon);
1190 Read(
"DefaultRPIcon", &g_default_routepoint_icon);
1192 SetPath(
"/MmsiProperties");
1193 int iPMax = GetNumberOfEntries();
1198 bool bCont =
pConfig->GetFirstEntry(str, dummy);
1205 bCont =
pConfig->GetNextEntry(str, dummy);
1209 SetPath(
"/DataMonitor");
1210 g_dm_ok = ReadUnsigned(
"colors.ok", kUndefinedColor);
1211 g_dm_dropped = ReadUnsigned(
"colors.dropped", kUndefinedColor);
1212 g_dm_filtered = ReadUnsigned(
"colors.filtered", kUndefinedColor);
1213 g_dm_input = ReadUnsigned(
"colors.input", kUndefinedColor);
1214 g_dm_output = ReadUnsigned(
"colors.output", kUndefinedColor);
1215 g_dm_not_ok = ReadUnsigned(
"colors.not-ok", kUndefinedColor);
1220void MyConfig::LoadS57Config() {
1221 if (!ps52plib)
return;
1225 SetPath(
"/Settings/GlobalState");
1227 Read(
"bShowS57Text", &read_int, 1);
1228 ps52plib->SetShowS57Text(!(read_int == 0));
1230 Read(
"bShowS57ImportantTextOnly", &read_int, 0);
1231 ps52plib->SetShowS57ImportantTextOnly(!(read_int == 0));
1233 Read(
"bShowLightDescription", &read_int, 0);
1234 ps52plib->SetShowLdisText(!(read_int == 0));
1236 Read(
"bExtendLightSectors", &read_int, 0);
1237 ps52plib->SetExtendLightSectors(!(read_int == 0));
1239 Read(
"nDisplayCategory", &read_int, (
enum _DisCat)STANDARD);
1240 ps52plib->SetDisplayCategory((
enum _DisCat)read_int);
1242 Read(
"nSymbolStyle", &read_int, (
enum _LUPname)PAPER_CHART);
1243 ps52plib->m_nSymbolStyle = (LUPname)read_int;
1245 Read(
"nBoundaryStyle", &read_int, PLAIN_BOUNDARIES);
1246 ps52plib->m_nBoundaryStyle = (LUPname)read_int;
1248 Read(
"bShowSoundg", &read_int, 1);
1249 ps52plib->m_bShowSoundg = !(read_int == 0);
1251 Read(
"bShowMeta", &read_int, 0);
1252 ps52plib->m_bShowMeta = !(read_int == 0);
1254 Read(
"bUseSCAMIN", &read_int, 1);
1255 ps52plib->m_bUseSCAMIN = !(read_int == 0);
1257 Read(
"bUseSUPER_SCAMIN", &read_int, 0);
1258 ps52plib->m_bUseSUPER_SCAMIN = !(read_int == 0);
1260 Read(
"bShowAtonText", &read_int, 1);
1261 ps52plib->m_bShowAtonText = !(read_int == 0);
1263 Read(
"bDeClutterText", &read_int, 0);
1264 ps52plib->m_bDeClutterText = !(read_int == 0);
1266 Read(
"bShowNationalText", &read_int, 0);
1267 ps52plib->m_bShowNationalTexts = !(read_int == 0);
1269 Read(
"ENCSoundingScaleFactor", &read_int, 0);
1270 ps52plib->m_nSoundingFactor = read_int;
1272 Read(
"ENCTextScaleFactor", &read_int, 0);
1273 ps52plib->m_nTextFactor = read_int;
1275 if (
Read(
"S52_MAR_SAFETY_CONTOUR", &dval, 3.0)) {
1276 S52_setMarinerParam(S52_MAR_SAFETY_CONTOUR, dval);
1277 S52_setMarinerParam(S52_MAR_SAFETY_DEPTH,
1281 if (
Read(
"S52_MAR_SHALLOW_CONTOUR", &dval, 2.0))
1282 S52_setMarinerParam(S52_MAR_SHALLOW_CONTOUR, dval);
1284 if (
Read(
"S52_MAR_DEEP_CONTOUR", &dval, 6.0))
1285 S52_setMarinerParam(S52_MAR_DEEP_CONTOUR, dval);
1287 if (
Read(
"S52_MAR_TWO_SHADES", &dval, 0.0))
1288 S52_setMarinerParam(S52_MAR_TWO_SHADES, dval);
1290 ps52plib->UpdateMarinerParams();
1292 SetPath(
"/Settings/GlobalState");
1293 Read(
"S52_DEPTH_UNIT_SHOW", &read_int, 1);
1294 read_int = wxMax(read_int, 0);
1295 read_int = wxMin(read_int, 2);
1296 ps52plib->m_nDepthUnitDisplay = read_int;
1303 SetPath(
"/Settings/ObjectFilter");
1305 int iOBJMax = GetNumberOfEntries();
1313 bool bCont =
pConfig->GetFirstEntry(str, dummy);
1317 bool bNeedNew =
true;
1319 if (str.StartsWith(
"viz", &sObj)) {
1320 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
1322 pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
1323 if (!strncmp(pOLE->OBJLName, sObj.mb_str(), 6)) {
1331 pOLE = (OBJLElement *)calloc(
sizeof(OBJLElement), 1);
1332 memcpy(pOLE->OBJLName, sObj.mb_str(), OBJL_NAME_LEN);
1335 ps52plib->pOBJLArray->Add((
void *)pOLE);
1338 bCont =
pConfig->GetNextEntry(str, dummy);
1343bool MyConfig::LoadLayers(wxString &path) {
1344 wxArrayString file_array;
1348 if (dir.IsOpened()) {
1350 bool cont = dir.GetFirst(&filename);
1353 filename.Prepend(wxFileName::GetPathSeparator());
1354 filename.Prepend(path);
1355 wxFileName f(filename);
1357 if (f.GetExt().IsSameAs(
"gpx"))
1358 file_array.Add(filename);
1360 if (wxDir::Exists(filename)) {
1361 wxDir dir(filename);
1362 if (dir.IsOpened()) {
1363 nfiles = dir.GetAllFiles(filename, &file_array,
1369 if (file_array.GetCount()) {
1372 l->m_LayerFileName = file_array[0];
1373 if (file_array.GetCount() <= 1)
1374 wxFileName::SplitPath(file_array[0], NULL, NULL, &(l->m_LayerName),
1377 wxFileName::SplitPath(filename, NULL, NULL, &(l->m_LayerName), NULL,
1380 bool bLayerViz = g_bShowLayers;
1382 if (g_VisibleLayers.Contains(l->m_LayerName)) bLayerViz =
true;
1383 if (g_InvisibleLayers.Contains(l->m_LayerName)) bLayerViz =
false;
1385 l->m_bHasVisibleNames = wxCHK_UNDETERMINED;
1386 if (g_VisiNameinLayers.Contains(l->m_LayerName))
1387 l->m_bHasVisibleNames = wxCHK_CHECKED;
1388 if (g_InVisiNameinLayers.Contains(l->m_LayerName))
1389 l->m_bHasVisibleNames = wxCHK_UNCHECKED;
1391 l->m_bIsVisibleOnChart = bLayerViz;
1394 laymsg.Printf(
"New layer %d: %s", l->m_LayerID, l->m_LayerName.c_str());
1395 wxLogMessage(laymsg);
1397 pLayerList->insert(pLayerList->begin(), l);
1401 for (
unsigned int i = 0; i < file_array.GetCount(); i++) {
1402 wxString file_path = file_array[i];
1404 if (::wxFileExists(file_path)) {
1408 wxLogMessage(
"Error loading GPX file " + file_path);
1411 _(
"Error loading GPX file %s, %s at character %d"),
1412 file_path, result.description(), result.offset),
1413 _(
"Import GPX File"));
1416 long nItems = pSet->LoadAllGPXObjectsAsLayer(
1417 l->m_LayerID, bLayerViz, l->m_bHasVisibleNames);
1418 l->m_NoOfItems += nItems;
1419 l->m_LayerType = _(
"Persistent");
1422 objmsg.Printf(
"Loaded GPX file %s with %ld items.",
1423 file_path.c_str(), nItems);
1424 wxLogMessage(objmsg);
1431 cont = dir.GetNext(&filename);
1434 g_bLayersLoaded =
true;
1439bool MyConfig::LoadChartDirArray(ArrayOfCDI &ChartDirArray) {
1441 SetPath(
"/ChartDirectories");
1442 int iDirMax = GetNumberOfEntries();
1444 ChartDirArray.Empty();
1447 int nAdjustChartDirs = 0;
1449 bool bCont =
pConfig->GetFirstEntry(str, dummy);
1453 wxString dirname(val);
1454 if (!dirname.IsEmpty()) {
1469 if (dirname.Find(
"SampleCharts") ==
1475 wxString new_dir = dirname.Mid(dirname.Find(
"SampleCharts"));
1476 new_dir.Prepend(g_Platform->GetSharedDataDir());
1481 cdi.fullpath = dirname.BeforeFirst(
'^');
1482 cdi.magic_number = dirname.AfterFirst(
'^');
1484 ChartDirArray.Add(cdi);
1488 bCont =
pConfig->GetNextEntry(str, dummy);
1491 if (nAdjustChartDirs)
pConfig->UpdateChartDirs(ChartDirArray);
1497bool MyConfig::UpdateChartDirs(ArrayOfCDI &dir_array) {
1501 SetPath(
"/ChartDirectories");
1502 int iDirMax = GetNumberOfEntries();
1506 for (
int i = 0; i < iDirMax; i++) {
1507 GetFirstEntry(key, dummy);
1508 DeleteEntry(key,
false);
1512 iDirMax = dir_array.GetCount();
1514 for (
int iDir = 0; iDir < iDirMax; iDir++) {
1517 wxString dirn = cdi.fullpath;
1519 dirn.Append(cdi.magic_number);
1521 str_buf.Printf(
"ChartDir%d", iDir + 1);
1523 Write(str_buf, dirn);
1535void MyConfig::CreateConfigGroups(ChartGroupArray *pGroupArray) {
1536 if (!pGroupArray)
return;
1539 Write(
"GroupCount", (
int)pGroupArray->GetCount());
1541 for (
unsigned int i = 0; i < pGroupArray->GetCount(); i++) {
1544 s.Printf(
"Group%d", i + 1);
1545 s.Prepend(
"/Groups/");
1548 Write(
"GroupName", pGroup->m_group_name);
1549 Write(
"GroupItemCount", (
int)pGroup->m_element_array.size());
1551 for (
unsigned int j = 0; j < pGroup->m_element_array.size(); j++) {
1553 sg.Printf(
"Group%d/Item%d", i + 1, j);
1554 sg.Prepend(
"/Groups/");
1556 Write(
"IncludeItem", pGroup->m_element_array[j].m_element_name);
1559 wxArrayString u = pGroup->m_element_array[j].m_missing_name_array;
1561 for (
unsigned int k = 0; k < u.GetCount(); k++) {
1565 Write(
"ExcludeItems", t);
1571void MyConfig::DestroyConfigGroups() {
1572 DeleteGroup(
"/Groups");
1575void MyConfig::LoadConfigGroups(ChartGroupArray *pGroupArray) {
1577 unsigned int group_count;
1578 Read(
"GroupCount", (
int *)&group_count, 0);
1580 for (
unsigned int i = 0; i < group_count; i++) {
1583 s.Printf(
"Group%d", i + 1);
1584 s.Prepend(
"/Groups/");
1588 Read(
"GroupName", &t);
1589 pGroup->m_group_name = t;
1591 unsigned int item_count;
1592 Read(
"GroupItemCount", (
int *)&item_count);
1593 for (
unsigned int j = 0; j < item_count; j++) {
1595 sg.Printf(
"Group%d/Item%d", i + 1, j);
1596 sg.Prepend(
"/Groups/");
1600 Read(
"IncludeItem", &v);
1604 if (
Read(
"ExcludeItems", &u)) {
1606 wxStringTokenizer tk(u,
";");
1607 while (tk.HasMoreTokens()) {
1608 wxString token = tk.GetNextToken();
1609 pelement.m_missing_name_array.Add(token);
1613 pGroup->m_element_array.push_back(std::move(pelement));
1615 pGroupArray->Add(pGroup);
1619void MyConfig::LoadCanvasConfigs(
bool bApplyAsTemplate) {
1622 auto &config_array = ConfigMgr::Get().GetCanvasConfigArray();
1627 if (!HasEntry(
"CanvasConfig")) {
1629 pcc->LoadFromLegacyConfig(
this);
1630 config_array.Add(pcc);
1635 Read(
"CanvasConfig", (
int *)&g_canvasConfig, 0);
1638 if (config_array.GetCount() == 0) {
1639 s.Printf(
"/Canvas/CanvasConfig%d", 1);
1642 LoadConfigCanvas(pcca, bApplyAsTemplate);
1643 config_array.Add(pcca);
1645 s.Printf(
"/Canvas/CanvasConfig%d", 2);
1648 LoadConfigCanvas(pcca, bApplyAsTemplate);
1649 config_array.Add(pcca);
1652 s.Printf(
"/Canvas/CanvasConfig%d", 1);
1654 LoadConfigCanvas(pcca, bApplyAsTemplate);
1656 if (config_array.GetCount() > 1) {
1658 s.Printf(
"/Canvas/CanvasConfig%d", 2);
1660 LoadConfigCanvas(pcca, bApplyAsTemplate);
1662 s.Printf(
"/Canvas/CanvasConfig%d", 2);
1665 LoadConfigCanvas(pcca, bApplyAsTemplate);
1666 config_array.Add(pcca);
1671void MyConfig::LoadConfigCanvas(
canvasConfig *cConfig,
bool bApplyAsTemplate) {
1673 double st_lat, st_lon;
1675 if (!bApplyAsTemplate) {
1677 cConfig->
iLat = START_LAT;
1678 cConfig->
iLon = START_LON;
1680 if (
Read(
"canvasVPLatLon", &st)) {
1681 sscanf(st.mb_str(wxConvUTF8),
"%lf,%lf", &st_lat, &st_lon);
1684 if (fabs(st_lon) < 360.) {
1685 while (st_lon < -180.) st_lon += 360.;
1687 while (st_lon > 180.) st_lon -= 360.;
1689 cConfig->
iLon = st_lon;
1692 if (fabs(st_lat) < 90.0) cConfig->
iLat = st_lat;
1698 double st_view_scale;
1699 if (
Read(wxString(
"canvasVPScale"), &st)) {
1700 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_view_scale);
1702 st_view_scale = fmax(st_view_scale, .001 / 32);
1703 st_view_scale = fmin(st_view_scale, 4);
1704 cConfig->
iScale = st_view_scale;
1708 if (
Read(wxString(
"canvasVPRotation"), &st)) {
1709 sscanf(st.mb_str(wxConvUTF8),
"%lf", &st_rotation);
1711 st_rotation = fmin(st_rotation, 360);
1712 st_rotation = fmax(st_rotation, 0);
1713 cConfig->
iRotation = st_rotation * PI / 180.;
1716 Read(
"canvasInitialdBIndex", &cConfig->DBindex, 0);
1724 Read(
"ActiveChartGroup", &cConfig->GroupID, 0);
1727 if (cConfig->GroupID && bApplyAsTemplate) {
1728 if (cConfig->GroupID > (
int)
g_pGroupArray->GetCount()) cConfig->GroupID = 0;
1734 Read(
"canvasEnableBasemapTile", &cConfig->bEnableBasemapTile, 1);
1746 Read(
"canvasENCDisplayCategory", &cConfig->nENCDisplayCategory, STANDARD);
1747 Read(
"canvasENCShowDepths", &cConfig->bShowENCDepths, 1);
1748 Read(
"canvasENCShowBuoyLabels", &cConfig->bShowENCBuoyLabels, 1);
1749 Read(
"canvasENCShowLightDescriptions", &cConfig->bShowENCLightDescriptions,
1751 Read(
"canvasENCShowLights", &cConfig->bShowENCLights, 1);
1752 Read(
"canvasENCShowVisibleSectorLights",
1753 &cConfig->bShowENCVisibleSectorLights, 0);
1754 Read(
"canvasENCShowAnchorInfo", &cConfig->bShowENCAnchorInfo, 0);
1755 Read(
"canvasENCShowDataQuality", &cConfig->bShowENCDataQuality, 0);
1758 Read(
"canvasSizeX", &sx, 0);
1759 Read(
"canvasSizeY", &sy, 0);
1763void MyConfig::SaveCanvasConfigs() {
1764 auto &config_array = ConfigMgr::Get().GetCanvasConfigArray();
1767 Write(
"CanvasConfig", (
int)g_canvasConfig);
1772 switch (g_canvasConfig) {
1776 s.Printf(
"/Canvas/CanvasConfig%d", 1);
1779 if (config_array.GetCount() > 0) {
1780 pcc = config_array.Item(0);
1782 SaveConfigCanvas(pcc);
1789 if (config_array.GetCount() > 1) {
1790 s.Printf(
"/Canvas/CanvasConfig%d", 1);
1792 pcc = config_array.Item(0);
1794 SaveConfigCanvas(pcc);
1797 s.Printf(
"/Canvas/CanvasConfig%d", 2);
1799 pcc = config_array.Item(1);
1801 SaveConfigCanvas(pcc);
1808void MyConfig::SaveConfigCanvas(
canvasConfig *cConfig) {
1815 st1.Printf(
"%10.4f,%10.4f", vp.
clat, vp.
clon);
1816 Write(
"canvasVPLatLon", st1);
1818 Write(
"canvasVPScale", st1);
1819 st1.Printf(
"%i", ((
int)(vp.
rotation * 180 / PI)) % 360);
1820 Write(
"canvasVPRotation", st1);
1823 int restore_dbindex = 0;
1825 if (pcs) restore_dbindex = pcs->GetCurrentEntrydbIndex();
1826 if (cConfig->
canvas->GetQuiltMode())
1827 restore_dbindex = cConfig->
canvas->GetQuiltReferenceChartIndex();
1828 Write(
"canvasInitialdBIndex", restore_dbindex);
1830 Write(
"canvasbFollow", cConfig->
canvas->m_bFollow);
1831 Write(
"ActiveChartGroup", cConfig->
canvas->m_groupIndex);
1833 Write(
"canvasQuilt", cConfig->
canvas->GetQuiltMode());
1834 Write(
"canvasShowGrid", cConfig->
canvas->GetShowGrid());
1835 Write(
"canvasShowOutlines", cConfig->
canvas->GetShowOutlines());
1836 Write(
"canvasShowDepthUnits", cConfig->
canvas->GetShowDepthUnits());
1838 Write(
"canvasShowAIS", cConfig->
canvas->GetShowAIS());
1839 Write(
"canvasAttenAIS", cConfig->
canvas->GetAttenAIS());
1841 Write(
"canvasShowTides", cConfig->
canvas->GetbShowTide());
1842 Write(
"canvasShowCurrents", cConfig->
canvas->GetbShowCurrent());
1844 Write(
"canvasEnableBasemapTile", cConfig->
canvas->GetbEnableBasemapTile());
1847 Write(
"canvasShowENCText", cConfig->
canvas->GetShowENCText());
1848 Write(
"canvasENCDisplayCategory", cConfig->
canvas->GetENCDisplayCategory());
1849 Write(
"canvasENCShowDepths", cConfig->
canvas->GetShowENCDepth());
1850 Write(
"canvasENCShowBuoyLabels", cConfig->
canvas->GetShowENCBuoyLabels());
1851 Write(
"canvasENCShowLightDescriptions",
1852 cConfig->
canvas->GetShowENCLightDesc());
1853 Write(
"canvasENCShowLights", cConfig->
canvas->GetShowENCLights());
1854 Write(
"canvasENCShowVisibleSectorLights",
1855 cConfig->
canvas->GetShowVisibleSectors());
1856 Write(
"canvasENCShowAnchorInfo", cConfig->
canvas->GetShowENCAnchor());
1857 Write(
"canvasENCShowDataQuality", cConfig->
canvas->GetShowENCDataQual());
1858 Write(
"canvasCourseUp", cConfig->
canvas->GetUpMode() == COURSE_UP_MODE);
1859 Write(
"canvasHeadUp", cConfig->
canvas->GetUpMode() == HEAD_UP_MODE);
1860 Write(
"canvasLookahead", cConfig->
canvas->GetLookahead());
1862 int width = cConfig->
canvas->GetSize().x;
1870 Write(
"canvasSizeX", width);
1871 Write(
"canvasSizeY", cConfig->
canvas->GetSize().y);
1875void MyConfig::UpdateSettings() {
1883 SetPath(
"/Settings");
1885 Write(
"LastAppliedTemplate", g_lastAppliedTemplateGUID);
1886 Write(
"CompatOS", g_compatOS);
1887 Write(
"CompatOsVersion", g_compatOsVersion);
1888 Write(
"ConfigVersionString", g_config_version_string);
1889 if (wxIsEmpty(g_CmdSoundString)) g_CmdSoundString = wxString(OCPN_SOUND_CMD);
1890 Write(
"CmdSoundString", g_CmdSoundString);
1891 Write(
"NavMessageShown", n_NavMessageShown);
1892 Write(
"InlandEcdis", g_bInlandEcdis);
1894 Write(
"AndroidVersionCode", g_AndroidVersionCode);
1896 Write(
"UIexpert", g_bUIexpert);
1897 Write(
"SpaceDropMark", g_bSpaceDropMark);
1901 Write(
"ShowStatusBar", g_bShowStatusBar);
1903 Write(
"ShowMenuBar", g_bShowMenuBar);
1905 Write(
"DefaultFontSize", g_default_font_size);
1908 Write(
"Fullscreen", g_bFullscreen);
1909 Write(
"ShowCompassWindow", g_bShowCompassWin);
1910 Write(
"SetSystemTime", s_bSetSystemTime);
1912 Write(
"PlayShipsBells", g_bPlayShipsBells);
1913 Write(
"SoundDeviceIndex", g_iSoundDeviceIndex);
1914 Write(
"FullscreenToolbar", g_bFullscreenToolbar);
1915 Write(
"TransparentToolbar", g_bTransparentToolbar);
1916 Write(
"PermanentMOBIcon", g_bPermanentMOBIcon);
1917 Write(
"ShowLayers", g_bShowLayers);
1918 Write(
"AutoAnchorDrop", g_bAutoAnchorMark);
1919 Write(
"ShowChartOutlines", g_bShowOutlines);
1920 Write(
"ShowActiveRouteTotal", g_bShowRouteTotal);
1921 Write(
"ShowActiveRouteHighway", g_bShowActiveRouteHighway);
1922 Write(
"SDMMFormat", g_iSDMMFormat);
1923 Write(
"MostRecentGPSUploadConnection", g_uploadConnection);
1924 Write(
"ShowChartBar", g_bShowChartBar);
1926 Write(
"GUIScaleFactor", g_GUIScaleFactor);
1927 Write(
"ChartObjectScaleFactor", g_ChartScaleFactor);
1928 Write(
"ShipScaleFactor", g_ShipScaleFactor);
1929 Write(
"ENCSoundingScaleFactor", g_ENCSoundingScaleFactor);
1930 Write(
"ENCTextScaleFactor", g_ENCTextScaleFactor);
1931 Write(
"ObjQueryAppendFilesExt", g_ObjQFileExt);
1934 Write(
"CatalogCustomURL", g_catalog_custom_url);
1935 Write(
"CatalogChannel", g_catalog_channel);
1937 Write(
"NetmaskBits", g_netmask_bits);
1938 Write(
"FilterNMEA_Avg", g_bfilter_cogsog);
1939 Write(
"FilterNMEA_Sec", g_COGFilterSec);
1941 Write(
"TrackContinuous", g_btrackContinuous);
1943 Write(
"ShowTrue", g_bShowTrue);
1944 Write(
"ShowMag", g_bShowMag);
1945 Write(
"UserMagVariation", wxString::Format(
"%.2f", g_UserVar));
1947 Write(
"CM93DetailFactor", g_cm93_zoom_factor);
1948 Write(
"CM93DetailZoomPosX", g_detailslider_dialog_x);
1949 Write(
"CM93DetailZoomPosY", g_detailslider_dialog_y);
1950 Write(
"ShowCM93DetailSlider", g_bShowDetailSlider);
1952 Write(
"SkewToNorthUp", g_bskew_comp);
1953 if (!g_bdisable_opengl) {
1955 Write(
"OpenGL", g_bopengl);
1957 Write(
"SoftwareGL", g_bSoftwareGL);
1959 Write(
"ZoomDetailFactor", g_chart_zoom_modifier_raster);
1960 Write(
"ZoomDetailFactorVector", g_chart_zoom_modifier_vector);
1962 Write(
"FogOnOverzoom", g_fog_overzoom);
1963 Write(
"OverzoomVectorScale", g_oz_vector_scale);
1964 Write(
"OverzoomEmphasisBase", g_overzoom_emphasis_base);
1965 Write(
"PlusMinusZoomFactor", g_plus_minus_zoom_factor);
1966 Write(
"MouseZoomSensitivity",
1968 Write(
"ShowMUIZoomButtons", g_bShowMuiZoomButtons);
1972 Write(
"UseAcceleratedPanning", g_GLOptions.m_bUseAcceleratedPanning);
1974 Write(
"GPUTextureCompression", g_GLOptions.m_bTextureCompression);
1975 Write(
"GPUTextureCompressionCaching",
1976 g_GLOptions.m_bTextureCompressionCaching);
1977 Write(
"GPUTextureDimension", g_GLOptions.m_iTextureDimension);
1978 Write(
"GPUTextureMemSize", g_GLOptions.m_iTextureMemorySize);
1979 Write(
"PolygonSmoothing", g_GLOptions.m_GLPolygonSmoothing);
1980 Write(
"LineSmoothing", g_GLOptions.m_GLLineSmoothing);
1984 Write(
"CourseUpMode", g_bCourseUp);
1985 if (!g_bInlandEcdis)
Write(
"LookAheadMode", g_bLookAhead);
1986 Write(
"TenHzUpdate", g_btenhertz);
1989 Write(
"UseMagAPB", g_bMagneticAPB);
1991 Write(
"OwnshipCOGPredictorMinutes", g_ownship_predictor_minutes);
1992 Write(
"OwnshipCOGPredictorStyle", g_cog_predictor_style);
1993 Write(
"OwnshipCOGPredictorColor", g_cog_predictor_color);
1994 Write(
"OwnshipCOGPredictorEndmarker", g_cog_predictor_endmarker);
1995 Write(
"OwnshipCOGPredictorWidth", g_cog_predictor_width);
1996 Write(
"OwnshipHDTPredictorStyle", g_ownship_HDTpredictor_style);
1997 Write(
"OwnshipHDTPredictorColor", g_ownship_HDTpredictor_color);
1998 Write(
"OwnshipHDTPredictorEndmarker", g_ownship_HDTpredictor_endmarker);
2000 Write(
"OwnshipHDTPredictorWidth", g_ownship_HDTpredictor_width);
2001 Write(
"OwnshipHDTPredictorMiles", g_ownship_HDTpredictor_miles);
2003 Write(
"OwnShipIconType", g_OwnShipIconType);
2004 Write(
"OwnShipLength", g_n_ownship_length_meters);
2005 Write(
"OwnShipWidth", g_n_ownship_beam_meters);
2006 Write(
"OwnShipGPSOffsetX", g_n_gps_antenna_offset_x);
2007 Write(
"OwnShipGPSOffsetY", g_n_gps_antenna_offset_y);
2008 Write(
"OwnShipMinSize", g_n_ownship_min_mm);
2009 Write(
"ShowDirectRouteLine", g_bShowShipToActive);
2010 Write(
"DirectRouteLineStyle", g_shipToActiveStyle);
2011 Write(
"DirectRouteLineColor", g_shipToActiveColor);
2016 Write(
"RouteArrivalCircleRadius",
2017 wxString::Format(
"%.2f", g_n_arrival_circle_radius));
2019 Write(
"ChartQuilting", g_bQuiltEnable);
2021 Write(
"PreserveScaleOnX", g_bPreserveScaleOnX);
2023 Write(
"StartWithTrackActive", g_bTrackCarryOver);
2024 Write(
"AutomaticDailyTracks", g_bTrackDaily);
2025 Write(
"TrackRotateAt", g_track_rotate_time);
2026 Write(
"TrackRotateTimeType", g_track_rotate_time_type);
2027 Write(
"HighlightTracks", g_bHighliteTracks);
2030 Write(
"InitialStackIndex", g_restore_stackindex);
2031 Write(
"InitialdBIndex", g_restore_dbindex);
2033 Write(
"NMEAAPBPrecision", g_NMEAAPBPrecision);
2035 Write(
"TalkerIdText", g_TalkerIdText);
2036 Write(
"ShowTrackPointTime", g_bShowTrackPointTime);
2038 Write(
"AnchorWatch1GUID", g_AW1GUID);
2039 Write(
"AnchorWatch2GUID", g_AW2GUID);
2041 Write(
"ToolbarX", g_maintoolbar_x);
2042 Write(
"ToolbarY", g_maintoolbar_y);
2045 Write(
"iENCToolbarX", g_iENCToolbarPosX);
2046 Write(
"iENCToolbarY", g_iENCToolbarPosY);
2048 if (!g_bInlandEcdis) {
2049 Write(
"GlobalToolbarConfig", g_toolbarConfig);
2052 Write(
"WindSpeedFormat", g_iWindSpeedFormat);
2053 Write(
"ShowDepthUnits", g_bShowDepthUnits);
2057 Write(
"GPSIdent", g_GPS_Ident);
2058 Write(
"ActiveRoute", g_active_route);
2059 Write(
"PersistActiveRoute", g_persist_active_route);
2062 Write(
"UseGarminHostUpload", g_bGarminHostUpload);
2064 Write(
"MobileTouch", g_btouch);
2065 Write(
"ResponsiveGraphics", g_bresponsive);
2068 Write(
"AutoHideToolbar", g_bAutoHideToolbar);
2069 Write(
"AutoHideToolbarSecs", g_nAutoHideToolbar);
2073 st0.Append(wxString::Format(
"%zu,", mm));
2076 Write(
"DisplaySizeMM", st0);
2077 Write(
"DisplaySizeManual", g_config_display_size_manual);
2079 Write(
"SelectionRadiusMM", g_selection_radius_mm);
2080 Write(
"SelectionRadiusTouchMM", g_selection_radius_touch_mm);
2082 st0.Printf(
"%g", g_PlanSpeed);
2083 Write(
"PlanSpeed", st0);
2085 if (g_bLayersLoaded) {
2086 wxString vis, invis, visnames, invisnames;
2087 LayerList::iterator it;
2089 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
2091 if (lay->IsVisibleOnChart())
2092 vis += (lay->m_LayerName) +
";";
2094 invis += (lay->m_LayerName) +
";";
2096 if (lay->HasVisibleNames() == wxCHK_CHECKED) {
2097 visnames += (lay->m_LayerName) +
";";
2098 }
else if (lay->HasVisibleNames() == wxCHK_UNCHECKED) {
2099 invisnames += (lay->m_LayerName) +
";";
2102 Write(
"VisibleLayers", vis);
2103 Write(
"InvisibleLayers", invis);
2104 Write(
"VisNameInLayers", visnames);
2105 Write(
"InvisNameInLayers", invisnames);
2107 Write(
"Locale", g_locale);
2108 Write(
"LocaleOverride", g_localeOverride);
2110 Write(
"KeepNavobjBackups", g_navobjbackups);
2111 Write(
"LegacyInputCOMPortFilterBehaviour", g_b_legacy_input_filter_behaviour);
2112 Write(
"AdvanceRouteWaypointOnArrivalOnly",
2113 g_bAdvanceRouteWaypointOnArrivalOnly);
2114 Write(
"EnableRootMenuDebug", g_enable_root_menu_debug);
2117 Write(
"LiveETA", g_bShowLiveETA);
2118 Write(
"DefaultBoatSpeed", g_defaultBoatSpeed);
2122 SetPath(
"/Settings/ObjectFilter");
2125 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
2127 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
2129 wxString st1(
"viz");
2131 strncpy(name, pOLE->OBJLName, 6);
2133 st1.Append(wxString(name, wxConvUTF8));
2134 Write(st1, pOLE->nViz);
2140 SetPath(
"/Settings/GlobalState");
2157 st1.Printf(
"%10.4f, %10.4f",
gLat,
gLon);
2158 Write(
"OwnShipLatLon", st1);
2161 SetPath(
"/Settings/GlobalState");
2162 if (!g_bInlandEcdis)
2163 Write(
"nColorScheme", (
int)user_colors::GetColorScheme());
2165 Write(
"EnableHiconColorScheme", g_hicon_colors);
2167 Write(
"FrameWinX", g_nframewin_x);
2168 Write(
"FrameWinY", g_nframewin_y);
2169 Write(
"FrameWinPosX", g_nframewin_posx);
2170 Write(
"FrameWinPosY", g_nframewin_posy);
2171 Write(
"FrameMax", g_bframemax);
2173 Write(
"ClientPosX", g_lastClientRectx);
2174 Write(
"ClientPosY", g_lastClientRecty);
2175 Write(
"ClientSzX", g_lastClientRectw);
2176 Write(
"ClientSzY", g_lastClientRecth);
2180 Write(
"RoutePropSizeX", g_route_prop_sx);
2181 Write(
"RoutePropSizeY", g_route_prop_sy);
2182 Write(
"RoutePropPosX", g_route_prop_x);
2183 Write(
"RoutePropPosY", g_route_prop_y);
2186 SetPath(
"/Settings/Audio");
2187 Write(
"AISAlertSoundFile", g_AIS_sound_file);
2188 Write(
"DSCAlertSoundFile", g_DSC_sound_file);
2189 Write(
"SARTAlertSoundFile", g_SART_sound_file);
2190 Write(
"AnchorAlarmSoundFile", g_anchorwatch_sound_file);
2192 Write(
"bAIS_GCPA_AlertAudio", g_bAIS_GCPA_Alert_Audio);
2193 Write(
"bAIS_SART_AlertAudio", g_bAIS_SART_Alert_Audio);
2194 Write(
"bAIS_DSC_AlertAudio", g_bAIS_DSC_Alert_Audio);
2195 Write(
"bAnchorAlertAudio", g_bAnchor_Alert_Audio);
2198 SetPath(
"/Settings/AIS");
2200 Write(
"bNoCPAMax", g_bCPAMax);
2201 Write(
"NoCPAMaxNMi", g_CPAMax_NM);
2202 Write(
"bCPAWarn", g_bCPAWarn);
2203 Write(
"CPAWarnNMi", g_CPAWarn_NM);
2204 Write(
"bTCPAMax", g_bTCPA_Max);
2205 Write(
"TCPAMaxMinutes", g_TCPA_Max);
2206 Write(
"bMarkLostTargets", g_bMarkLost);
2207 Write(
"MarkLost_Minutes", g_MarkLost_Mins);
2208 Write(
"bRemoveLostTargets", g_bRemoveLost);
2209 Write(
"RemoveLost_Minutes", g_RemoveLost_Mins);
2210 Write(
"bShowCOGArrows", g_bShowCOG);
2211 Write(
"bSyncCogPredictors", g_bSyncCogPredictors);
2212 Write(
"CogArrowMinutes", g_ShowCOG_Mins);
2213 Write(
"bShowTargetTracks", g_bAISShowTracks);
2214 Write(
"TargetTracksMinutes", g_AISShowTracks_Mins);
2216 Write(
"bHideMooredTargets", g_bHideMoored);
2217 Write(
"MooredTargetMaxSpeedKnots", g_ShowMoored_Kts);
2219 Write(
"bAISAlertDialog", g_bAIS_CPA_Alert);
2220 Write(
"bAISAlertAudio", g_bAIS_CPA_Alert_Audio);
2222 Write(
"AISAlertAudioFile", g_sAIS_Alert_Sound_File);
2223 Write(
"bAISAlertSuppressMoored", g_bAIS_CPA_Alert_Suppress_Moored);
2224 Write(
"bShowAreaNotices", g_bShowAreaNotices);
2225 Write(
"bDrawAISSize", g_bDrawAISSize);
2226 Write(
"bDrawAISRealtime", g_bDrawAISRealtime);
2227 Write(
"AISRealtimeMinSpeedKnots", g_AIS_RealtPred_Kts);
2228 Write(
"bShowAISName", g_bShowAISName);
2229 Write(
"ShowAISTargetNameScale", g_Show_Target_Name_Scale);
2230 Write(
"bWplIsAprsPositionReport", g_bWplUsePosition);
2231 Write(
"WplSelAction", g_WplAction);
2232 Write(
"AISCOGPredictorWidth", g_ais_cog_predictor_width);
2233 Write(
"bShowScaledTargets", g_bAllowShowScaled);
2234 Write(
"AISScaledNumber", g_ShowScaled_Num);
2235 Write(
"AISScaledNumberWeightSOG", g_ScaledNumWeightSOG);
2236 Write(
"AISScaledNumberWeightCPA", g_ScaledNumWeightCPA);
2237 Write(
"AISScaledNumberWeightTCPA", g_ScaledNumWeightTCPA);
2238 Write(
"AISScaledNumberWeightRange", g_ScaledNumWeightRange);
2239 Write(
"AISScaledNumberWeightSizeOfTarget", g_ScaledNumWeightSizeOfT);
2240 Write(
"AISScaledSizeMinimal", g_ScaledSizeMinimal);
2241 Write(
"AISShowScaled", g_bShowScaled);
2243 Write(
"AlertDialogSizeX", g_ais_alert_dialog_sx);
2244 Write(
"AlertDialogSizeY", g_ais_alert_dialog_sy);
2245 Write(
"AlertDialogPosX", g_ais_alert_dialog_x);
2246 Write(
"AlertDialogPosY", g_ais_alert_dialog_y);
2247 Write(
"QueryDialogPosX", g_ais_query_dialog_x);
2248 Write(
"QueryDialogPosY", g_ais_query_dialog_y);
2249 Write(
"AISTargetListPerspective", g_AisTargetList_perspective);
2250 Write(
"AISTargetListRange", g_AisTargetList_range);
2251 Write(
"AISTargetListSortColumn", g_AisTargetList_sortColumn);
2252 Write(
"bAISTargetListSortReverse", g_bAisTargetList_sortReverse);
2253 Write(
"AISTargetListColumnSpec", g_AisTargetList_column_spec);
2254 Write(
"AISTargetListColumnOrder", g_AisTargetList_column_order);
2256 Write(
"S57QueryDialogSizeX", g_S57_dialog_sx);
2257 Write(
"S57QueryDialogSizeY", g_S57_dialog_sy);
2258 Write(
"S57QueryExtraDialogSizeX", g_S57_extradialog_sx);
2259 Write(
"S57QueryExtraDialogSizeY", g_S57_extradialog_sy);
2261 Write(
"bAISRolloverShowClass", g_bAISRolloverShowClass);
2262 Write(
"bAISRolloverShowCOG", g_bAISRolloverShowCOG);
2263 Write(
"bAISRolloverShowCPA", g_bAISRolloverShowCPA);
2265 Write(
"bAISAlertAckTimeout", g_bAIS_ACK_Timeout);
2266 Write(
"AlertAckTimeoutMinutes", g_AckTimeout_Mins);
2268 SetPath(
"/Settings/GlobalState");
2270 Write(
"bShowS57Text", ps52plib->GetShowS57Text());
2271 Write(
"bShowS57ImportantTextOnly", ps52plib->GetShowS57ImportantTextOnly());
2272 if (!g_bInlandEcdis)
2273 Write(
"nDisplayCategory", (
long)ps52plib->GetDisplayCategory());
2274 Write(
"nSymbolStyle", (
int)ps52plib->m_nSymbolStyle);
2275 Write(
"nBoundaryStyle", (
int)ps52plib->m_nBoundaryStyle);
2277 Write(
"bShowSoundg", ps52plib->m_bShowSoundg);
2278 Write(
"bShowMeta", ps52plib->m_bShowMeta);
2279 Write(
"bUseSCAMIN", ps52plib->m_bUseSCAMIN);
2280 Write(
"bUseSUPER_SCAMIN", ps52plib->m_bUseSUPER_SCAMIN);
2281 Write(
"bShowAtonText", ps52plib->m_bShowAtonText);
2282 Write(
"bShowLightDescription", ps52plib->m_bShowLdisText);
2283 Write(
"bExtendLightSectors", ps52plib->m_bExtendLightSectors);
2284 Write(
"bDeClutterText", ps52plib->m_bDeClutterText);
2285 Write(
"bShowNationalText", ps52plib->m_bShowNationalTexts);
2287 Write(
"S52_MAR_SAFETY_CONTOUR",
2288 S52_getMarinerParam(S52_MAR_SAFETY_CONTOUR));
2289 Write(
"S52_MAR_SHALLOW_CONTOUR",
2290 S52_getMarinerParam(S52_MAR_SHALLOW_CONTOUR));
2291 Write(
"S52_MAR_DEEP_CONTOUR", S52_getMarinerParam(S52_MAR_DEEP_CONTOUR));
2292 Write(
"S52_MAR_TWO_SHADES", S52_getMarinerParam(S52_MAR_TWO_SHADES));
2293 Write(
"S52_DEPTH_UNIT_SHOW", ps52plib->m_nDepthUnitDisplay);
2294 Write(
"ENCSoundingScaleFactor", g_ENCSoundingScaleFactor);
2295 Write(
"ENCTextScaleFactor", g_ENCTextScaleFactor);
2297 SetPath(
"/Directories");
2298 Write(
"S57DataLocation",
"");
2301 SetPath(
"/Directories");
2302 Write(
"InitChartDir", *pInit_Chart_Dir);
2303 Write(
"GPXIODir", g_gpx_path);
2304 Write(
"TCDataDir", g_TCData_Dir);
2305 Write(
"BasemapDir", g_Platform->NormalizePath(gWorldMapLocation));
2306 if (gWorldShapefileLocation.Length())
2307 Write(
"BaseShapefileDir",
2308 g_Platform->NormalizePath(gWorldShapefileLocation));
2311 SetPath(
"/Settings/NMEADataSource");
2312 wxString connectionconfigs;
2314 if (i > 0) connectionconfigs.Append(
"|");
2317 Write(
"DataConnections", connectionconfigs);
2322 SetPath(
"/Settings/AuxFontKeys");
2325 for (
unsigned int i = 0; i < keyArray.GetCount(); i++) {
2327 key.Printf(
"Key%i", i);
2328 wxString keyval = keyArray[i];
2334 font_path = (
"/Settings/X11Fonts");
2338 font_path = (
"/Settings/GTKFonts");
2342 font_path = (
"/Settings/MSWFonts");
2346 font_path = (
"/Settings/MacFonts");
2350 font_path = (
"/Settings/QTFonts");
2353 if (HasEntry(font_path)) DeleteGroup(font_path);
2359 for (
int i = 0; i < nFonts; i++) {
2360 wxString cfstring(FontMgr::Get().GetConfigString(i));
2362 Write(cfstring, valstring);
2366 if (HasGroup(
"/TideCurrentDataSources"))
2367 DeleteGroup(
"/TideCurrentDataSources");
2368 SetPath(
"/TideCurrentDataSources");
2369 unsigned int id = 0;
2370 for (
auto val : TideCurrentDataSet) {
2372 key.Printf(
"tcds%d",
id);
2373 Write(key, wxString(val));
2377 SetPath(
"/Settings/Others");
2380 Write(
"ShowRadarRings",
2381 (
bool)(g_iNavAidRadarRingsNumberVisible > 0));
2382 Write(
"RadarRingsNumberVisible", g_iNavAidRadarRingsNumberVisible);
2383 Write(
"RadarRingsStep", g_fNavAidRadarRingsStep);
2384 Write(
"RadarRingsStepUnits", g_pNavAidRadarRingsStepUnits);
2385 Write(
"RadarRingsColour",
2386 g_colourOwnshipRangeRingsColour.GetAsString(wxC2S_HTML_SYNTAX));
2387 Write(
"WaypointUseScaMin", g_bUseWptScaMin);
2388 Write(
"WaypointScaMinValue", g_iWpt_ScaMin);
2389 Write(
"WaypointScaMaxValue", g_iWpt_ScaMax);
2390 Write(
"WaypointUseScaMinOverrule", g_bOverruleScaMin);
2391 Write(
"WaypointsShowName", g_bShowWptName);
2392 Write(
"UserIconsFirst", g_bUserIconsFirst);
2395 Write(
"WaypointRangeRingsNumber", g_iWaypointRangeRingsNumber);
2396 Write(
"WaypointRangeRingsStep", g_fWaypointRangeRingsStep);
2397 Write(
"WaypointRangeRingsStepUnits", g_iWaypointRangeRingsStepUnits);
2398 Write(
"WaypointRangeRingsColour",
2401 Write(
"ConfirmObjectDeletion", g_bConfirmObjectDelete);
2404 Write(
"WaypointPreventDragging", g_bWayPointPreventDragging);
2406 Write(
"EnableZoomToCursor", g_bEnableZoomToCursor);
2408 Write(
"TrackIntervalSeconds", g_TrackIntervalSeconds);
2409 Write(
"TrackDeltaDistance", g_TrackDeltaDistance);
2410 Write(
"TrackPrecision", g_nTrackPrecision);
2412 Write(
"RouteLineWidth", g_route_line_width);
2413 Write(
"TrackLineWidth", g_track_line_width);
2414 Write(
"TrackLineColour",
2415 g_colourTrackLineColour.GetAsString(wxC2S_HTML_SYNTAX));
2416 Write(
"DefaultWPIcon", g_default_wp_icon);
2418 Write(
"DefaultRPIcon", g_default_routepoint_icon);
2420 DeleteGroup(
"/MmsiProperties");
2421 SetPath(
"/MmsiProperties");
2424 p.Printf(
"Props%d", i);
2427 SetPath(
"/DataMonitor");
2428 Write(
"colors.ok", g_dm_ok);
2429 Write(
"colors.dropped", g_dm_dropped);
2430 Write(
"colors.filtered", g_dm_filtered);
2431 Write(
"colors.input", g_dm_input);
2432 Write(
"colors.output", g_dm_output);
2433 Write(
"colors.not-ok", g_dm_not_ok);
2435 SaveCanvasConfigs();
2438 SendMessageToAllPlugins(
"GLOBAL_SETTINGS_UPDATED",
"{\"updated\":\"1\"}");
2442 if (top_frame::Get()) top_frame::Get()->SendGlJsonConfigMsg();
2447static wxFileName exportFileName(wxWindow *parent,
2448 const wxString suggestedName) {
2451 wxString valid_name = SanitizeFileName(suggestedName);
2454 if (!valid_name.EndsWith(
".gpx")) {
2455 wxFileName fn(valid_name);
2458 valid_name = fn.GetFullName();
2461 int response = g_Platform->DoFileSelectorDialog(
2462 parent, &path, _(
"Export GPX file"), g_gpx_path, valid_name,
"*.gpx");
2464 if (response == wxID_OK) {
2465 wxFileName fn(path);
2466 g_gpx_path = fn.GetPath();
2467 if (!fn.GetExt().StartsWith(
"gpx")) fn.SetExt(
"gpx");
2469#if defined(__WXMSW__) || defined(__WXGTK__)
2470 if (wxFileExists(fn.GetFullPath())) {
2471 int answer = OCPNMessageBox(NULL, _(
"Overwrite existing file?"),
2472 "Confirm", wxICON_QUESTION | wxYES_NO);
2473 if (answer != wxID_YES)
return ret;
2481int BackupDatabase(wxWindow *parent) {
2482 bool backupResult =
false;
2483 wxDateTime tm = wxDateTime::Now();
2484 wxString proposedName = tm.Format(
"navobj-%Y-%m-%d_%H_%M");
2485 wxString acceptedName;
2488 g_Platform->DoFileSelectorDialog(parent, &acceptedName, _(
"Backup"),
2489 wxStandardPaths::Get().GetDocumentsDir(),
2490 proposedName,
"*.bkp")) {
2491 wxFileName fileName(acceptedName);
2492 if (fileName.IsOk()) {
2493#if defined(__WXMSW__) || defined(__WXGTK__)
2494 if (fileName.FileExists()) {
2495 if (wxID_YES != OCPNMessageBox(NULL, _(
"Overwrite existing file?"),
2496 "Confirm", wxICON_QUESTION | wxYES_NO)) {
2503 wxString secureFileName = androidGetCacheDir() +
2504 wxFileName::GetPathSeparator() +
2505 fileName.GetFullName();
2506 backupResult = NavObj_dB::GetInstance().Backup(secureFileName);
2507 AndroidSecureCopyFile(secureFileName, fileName.GetFullPath());
2509 backupResult = NavObj_dB::GetInstance().Backup(fileName.GetFullPath());
2512 return backupResult ? wxID_YES : wxID_NO;
2517bool ExportGPXRoutes(wxWindow *parent, RouteList *pRoutes,
2518 const wxString suggestedName) {
2520 wxFileName fn = exportFileName(parent, suggestedName);
2523 pgpx->AddGPXRoutesList(pRoutes);
2524 pgpx->SaveFile(fn.GetFullPath());
2530 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
2531 suggestedName +
".gpx";
2533 pgpx->AddGPXRoutesList(pRoutes);
2534 pgpx->SaveFile(fns);
2537 AndroidExportSAF(parent, suggestedName +
".gpx");
2544bool ExportGPXTracks(wxWindow *parent, std::vector<Track *> *pTracks,
2545 const wxString suggestedName) {
2547 wxFileName fn = exportFileName(parent, suggestedName);
2550 pgpx->AddGPXTracksList(pTracks);
2551 pgpx->SaveFile(fn.GetFullPath());
2557 wxString fns = androidGetCacheDir() + wxFileName::GetPathSeparator() +
2558 suggestedName +
".gpx";
2560 pgpx->AddGPXTracksList(pTracks);
2561 pgpx->SaveFile(fns);
2564 AndroidExportSAF(parent, suggestedName +
".gpx");
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);
2591 AndroidExportSAF(parent, suggestedName +
".gpx");
2598void ExportGPX(wxWindow *parent,
bool bviz_only,
bool blayer) {
2603 wxFileName fn = exportFileName(parent,
"userobjects.gpx");
2604 if (!fn.IsOk())
return;
2605 fns = fn.GetFullPath();
2609 androidGetCacheDir() + wxFileName::GetPathSeparator() +
"userobjects.gpx";
2612 ::wxBeginBusyCursor();
2614 wxGenericProgressDialog *pprog =
nullptr;
2615 int count = pWayPointMan->GetWaypointList()->size();
2616 int progStep = count / 32;
2618 pprog =
new wxGenericProgressDialog(
2619 _(
"Export GPX file"),
"0/0", count, NULL,
2620 wxPD_APP_MODAL | wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
2621 wxPD_REMAINING_TIME);
2622 pprog->SetSize(400, wxDefaultCoord);
2629 for (
RoutePoint *pr : *pWayPointMan->GetWaypointList()) {
2630 if (pprog && !(ic % progStep)) {
2632 msg.Printf(
"%d/%d", ic, count);
2633 pprog->Update(ic, msg);
2638 if (bviz_only && !pr->m_bIsVisible) b_add =
false;
2640 if (pr->m_bIsInLayer && !blayer) b_add =
false;
2642 if (pr->IsShared() || !WptIsInRouteList(pr)) pgpx->AddGPXWaypoint(pr);
2648 if (bviz_only && !pRoute->IsVisible()) b_add =
false;
2649 if (pRoute->m_bIsInLayer && !blayer) b_add =
false;
2651 if (b_add) pgpx->AddGPXRoute(pRoute);
2657 if (bviz_only && !pTrack->IsVisible()) b_add =
false;
2659 if (pTrack->m_bIsInLayer && !blayer) b_add =
false;
2661 if (b_add) pgpx->AddGPXTrack(pTrack);
2664 pgpx->SaveFile(fns);
2667 AndroidExportSAF(parent,
"userobjects.gpx");
2672 ::wxEndBusyCursor();
2676void UI_ImportGPX(wxWindow *parent,
bool islayer, wxString dirpath,
2677 bool isdirectory,
bool isPersistent) {
2678 int response = wxID_CANCEL;
2679 wxArrayString file_array;
2681 if (!islayer || dirpath.IsSameAs(
"")) {
2686 wxFileDialog *popenDialog =
2687 new wxFileDialog(NULL, _(
"Import GPX file"), g_gpx_path,
"",
2688 "GPX files (*.gpx)|*.gpx|All files (*.*)|*.*",
2689 wxFD_OPEN | wxFD_MULTIPLE);
2691 if (g_bresponsive && parent)
2692 popenDialog = g_Platform->AdjustFileDialogFont(parent, popenDialog);
2694 popenDialog->Centre();
2697 if (parent) parent->HideWithEffect(wxSHOW_EFFECT_BLEND);
2700 response = popenDialog->ShowModal();
2703 if (parent) parent->ShowWithEffect(wxSHOW_EFFECT_BLEND);
2706 if (response == wxID_OK) {
2707 popenDialog->GetPaths(file_array);
2710 if (file_array.GetCount()) {
2711 wxFileName fn(file_array[0]);
2712 g_gpx_path = fn.GetPath();
2717 if (!androidCheckSAFPermission(
"primary:Documents")) {
2718 AndroidDoSAFPermissions();
2723 response = g_Platform->DoFileSelectorDialog(
2724 NULL, &path, _(
"Import GPX file"), g_gpx_path,
"",
"*.gpx");
2726 wxFileName fn(path);
2727 if (path.IsEmpty()) {
2728 PrepareImportAndroid(islayer, isPersistent);
2731 file_array.Add(path);
2736 if (wxDir::GetAllFiles(dirpath, &file_array,
"*.gpx")) response = wxID_OK;
2738 file_array.Add(dirpath);
2743 if (response == wxID_OK) {
2744 ImportFileArray(file_array, islayer, isPersistent, dirpath);
2748void ImportFileArray(
const wxArrayString &file_array,
bool islayer,
2749 bool isPersistent, wxString dirpath) {
2755 l->m_LayerFileName = file_array[0];
2756 if (file_array.GetCount() <= 1)
2757 wxFileName::SplitPath(file_array[0], NULL, NULL, &(l->m_LayerName), NULL,
2760 if (dirpath.IsSameAs(
""))
2761 wxFileName::SplitPath(g_gpx_path, NULL, NULL, &(l->m_LayerName), NULL,
2764 wxFileName::SplitPath(dirpath, NULL, NULL, &(l->m_LayerName), NULL,
2768 bool bLayerViz = g_bShowLayers;
2769 if (g_VisibleLayers.Contains(l->m_LayerName)) bLayerViz =
true;
2770 if (g_InvisibleLayers.Contains(l->m_LayerName)) bLayerViz =
false;
2771 l->m_bIsVisibleOnChart = bLayerViz;
2774 l->m_bHasVisibleNames = wxCHK_CHECKED;
2777 laymsg.Printf(
"New layer %d: %s", l->m_LayerID, l->m_LayerName.c_str());
2778 wxLogMessage(laymsg);
2780 pLayerList->insert(pLayerList->begin(), l);
2783 for (
unsigned int i = 0; i < file_array.GetCount(); i++) {
2784 wxString path = file_array[i];
2786 if (::wxFileExists(path)) {
2790 wxLogMessage(
"Error loading GPX file " + path);
2792 wxString::Format(_(
"Error loading GPX file %s, %s at character %d"),
2793 path, result.description(), result.offset),
2794 _(
"Import GPX File"));
2801 l->m_NoOfItems = pSet->LoadAllGPXObjectsAsLayer(
2802 l->m_LayerID, l->m_bIsVisibleOnChart, l->m_bHasVisibleNames);
2803 l->m_LayerType = isPersistent ? _(
"Persistent") : _(
"Temporary");
2808 wxString destf, f, name, ext;
2809 f = l->m_LayerFileName;
2810 wxFileName::SplitPath(f, NULL, NULL, &name, &ext);
2812 appendOSDirSlash(&destf);
2813 destf.Append(
"layers");
2814 appendOSDirSlash(&destf);
2815 if (!wxDirExists(destf)) {
2816 if (!wxMkdir(destf, wxS_DIR_DEFAULT))
2817 wxLogMessage(
"Error creating layer directory");
2820 destf << name <<
"." << ext;
2822 if (wxCopyFile(f, destf,
true))
2823 msg.Printf(
"File: %s.%s also added to persistent layers", name,
2826 msg.Printf(
"Failed adding %s.%s to persistent layers", name, ext);
2831 pSet->LoadAllGPXObjects(
2838 wxString::Format(
"%d " + _(
"duplicate waypoints detected "
2839 "during import and ignored."),
2841 _(
"OpenCPN Info"), wxICON_INFORMATION | wxOK, 10);
2853void SwitchInlandEcdisMode(
bool Switch) {
2855 wxLogMessage(
"Switch InlandEcdis mode On");
2862 if (ps52plib) ps52plib->SetDisplayCategory(STANDARD);
2863 g_bDrawAISSize =
false;
2864 if (top_frame::Get()) top_frame::Get()->RequestNewToolbars(
true);
2866 wxLogMessage(
"Switch InlandEcdis mode Off");
2869 pConfig->SetPath(
"/Settings");
2870 pConfig->Read(
"GlobalToolbarConfig", &g_toolbarConfig);
2873 pConfig->Read(
"ShowDepthUnits", &g_bShowDepthUnits, 1);
2876 pConfig->Read(
"nDisplayCategory", &read_int, (
enum _DisCat)STANDARD);
2877 if (ps52plib) ps52plib->SetDisplayCategory((
enum _DisCat)read_int);
2878 pConfig->SetPath(
"/Settings/AIS");
2879 pConfig->Read(
"bDrawAISSize", &g_bDrawAISSize);
2880 pConfig->Read(
"bDrawAISRealtime", &g_bDrawAISRealtime);
2882 if (top_frame::Get()) top_frame::Get()->RequestNewToolbars(
true);
2894wxString FormatGPXDateTime(wxDateTime dt) {
2896 return dt.Format(
"%Y-%m-%dT%H:%M:%SZ");
2903bool LogMessageOnce(
const wxString &msg) {
2906 for (
unsigned int i = 0; i < navutil::pMessageOnceArray->GetCount(); i++) {
2907 if (msg.IsSameAs(navutil::pMessageOnceArray->Item(i)))
return false;
2911 navutil::pMessageOnceArray->Add(msg);
2924 if (!ts.IsValid()) {
2927 int effective_format = format;
2941 switch (effective_format) {
2943 if (std::isnan(lon)) {
2944 dt = wxInvalidDateTime;
2947 ts.Add(wxTimeSpan(wxTimeSpan(0, 0, wxLongLong(lon * 3600. / 15.))));
2964 if (!ts.IsValid()) {
2967 int effective_format = format;
2981 switch (effective_format) {
2983 if (std::isnan(lon)) {
2984 dt = wxInvalidDateTime;
2986 dt = ts.Subtract(wxTimeSpan(0, 0, wxLongLong(lon * 3600. / 15.)));
3003double fromUsrSpeed(
double usr_speed,
int unit) {
3011 ret = usr_speed / 1.15078;
3014 ret = usr_speed / 1.852;
3017 ret = usr_speed / 0.514444444;
3025double fromUsrWindSpeed(
double usr_wspeed,
int unit) {
3027 if (
unit == -1)
unit = g_iWindSpeedFormat;
3033 ret = usr_wspeed / 0.514444444;
3036 ret = usr_wspeed / 1.15078;
3039 ret = usr_wspeed / 1.852;
3048double fromUsrTemp(
double usr_temp,
int unit) {
3056 ret = (usr_temp - 32) * 5.0 / 9.0;
3059 ret = usr_temp - 273.15;
3065wxString formatAngle(
double angle) {
3067 if (g_bShowMag && g_bShowTrue) {
3068 out.Printf(
"%03.0f %cT (%.0f %cM)", angle, 0x00B0, toMagnetic(angle),
3070 }
else if (g_bShowTrue) {
3071 out.Printf(
"%03.0f %cT", angle, 0x00B0);
3073 out.Printf(
"%03.0f %cM", toMagnetic(angle), 0x00B0);
3079void AlphaBlending(
ocpnDC &dc,
int x,
int y,
int size_x,
int size_y,
3080 float radius, wxColour color,
unsigned char transparency) {
3081 wxDC *pdc = dc.GetDC();
3084 wxBitmap obm(size_x, size_y);
3086 mdc1.SelectObject(obm);
3087 mdc1.Blit(0, 0, size_x, size_y, pdc, x, y);
3088 mdc1.SelectObject(wxNullBitmap);
3089 wxImage oim = obm.ConvertToImage();
3092 wxBitmap olbm(size_x, size_y);
3093 wxMemoryDC oldc(olbm);
3094 if (!oldc.IsOk())
return;
3096 oldc.SetBackground(*wxBLACK_BRUSH);
3097 oldc.SetBrush(*wxWHITE_BRUSH);
3100 if (radius > 0.0) oldc.DrawRoundedRectangle(0, 0, size_x, size_y, radius);
3102 wxImage dest = olbm.ConvertToImage();
3103 unsigned char *dest_data =
3104 (
unsigned char *)malloc(size_x * size_y * 3 *
sizeof(
unsigned char));
3105 unsigned char *bg = oim.GetData();
3106 unsigned char *box = dest.GetData();
3107 unsigned char *d = dest_data;
3114 float alpha = 1.0 - (float)transparency / 255.0;
3115 int sb = size_x * size_y;
3116 for (
int i = 0; i < sb; i++) {
3118 if (*box == 0 && radius > 0.0) a = 1.0;
3119 int r = ((*bg++) * a) + (1.0 - a) * color.Red();
3122 int g = ((*bg++) * a) + (1.0 - a) * color.Green();
3125 int b = ((*bg++) * a) + (1.0 - a) * color.Blue();
3130 dest.SetData(dest_data);
3134 dc.DrawBitmap(dbm, x, y,
false);
3138 dc.CalcBoundingBox(x, y);
3139 dc.CalcBoundingBox(x + size_x, y + size_y);
3144 float radMod = wxMax(radius, 2.0);
3145 wxColour c(color.Red(), color.Green(), color.Blue(), transparency);
3146 dc.SetBrush(wxBrush(c));
3147 dc.SetPen(wxPen(c, 1));
3148 dc.DrawRoundedRectangle(x, y, size_x, size_y, radMod);
3150 glDisable(GL_BLEND);
3156void DimeControl(wxWindow *ctrl) {
3162 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) {
3165#elif defined(__WXQT__)
3167#elif defined(__WXGTK__)
3171 if (wxSystemSettings::GetColour(wxSystemColour::wxSYS_COLOUR_WINDOW).Red() <
3178 if (NULL == ctrl)
return;
3180 wxColour col, window_back_color, gridline, uitext, udkrd, ctrl_back_color,
3182 col = GetGlobalColor(
"DILG0");
3183 window_back_color = GetGlobalColor(
"DILG1");
3184 ctrl_back_color = GetGlobalColor(
"DILG1");
3185 text_color = GetGlobalColor(
"DILG3");
3186 uitext = GetGlobalColor(
"UITX1");
3187 udkrd = GetGlobalColor(
"UDKRD");
3188 gridline = GetGlobalColor(
"GREY2");
3190 DimeControl(ctrl, col, window_back_color, ctrl_back_color, text_color, uitext,
3194void DimeControl(wxWindow *ctrl, wxColour col, wxColour window_back_color,
3195 wxColour ctrl_back_color, wxColour text_color, wxColour uitext,
3196 wxColour udkrd, wxColour gridline) {
3202 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) {
3207 ColorScheme cs = global_color_scheme;
3211 (cs == GLOBAL_COLOR_SCHEME_DUSK || cs == GLOBAL_COLOR_SCHEME_NIGHT);
3213 static int depth = 0;
3219 window_back_color = wxNullColour;
3221 window_back_color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
3223 col = wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX);
3224 uitext = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
3227 ctrl->SetBackgroundColour(window_back_color);
3228 if (darkMode) ctrl->SetForegroundColour(text_color);
3231 wxWindowList kids = ctrl->GetChildren();
3232 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
3233 wxWindowListNode *node = kids.Item(i);
3234 wxWindow *win = node->GetData();
3236 if (
dynamic_cast<wxListBox *
>(win) ||
dynamic_cast<wxListCtrl *
>(win) ||
3237 dynamic_cast<wxTextCtrl *
>(win) ||
3238 dynamic_cast<wxTimePickerCtrl *
>(win)) {
3239 win->SetBackgroundColour(col);
3240 }
else if (
dynamic_cast<wxStaticText *
>(win) ||
3241 dynamic_cast<wxCheckBox *
>(win) ||
3242 dynamic_cast<wxRadioButton *
>(win)) {
3243 win->SetForegroundColour(uitext);
3250 else if (
dynamic_cast<wxBitmapComboBox *
>(win) ||
3251 dynamic_cast<wxChoice *
>(win) ||
dynamic_cast<wxComboBox *
>(win) ||
3252 dynamic_cast<wxTreeCtrl *
>(win)) {
3253 win->SetBackgroundColour(col);
3256 else if (
dynamic_cast<wxScrolledWindow *
>(win) ||
3257 dynamic_cast<wxGenericDirCtrl *
>(win) ||
3258 dynamic_cast<wxListbook *
>(win) ||
dynamic_cast<wxButton *
>(win) ||
3259 dynamic_cast<wxToggleButton *
>(win)) {
3260 win->SetBackgroundColour(window_back_color);
3263 else if (
dynamic_cast<wxNotebook *
>(win)) {
3264 win->SetBackgroundColour(window_back_color);
3265 win->SetForegroundColour(text_color);
3269 else if (
dynamic_cast<wxHtmlWindow *
>(win)) {
3270 if (cs != GLOBAL_COLOR_SCHEME_DAY && cs != GLOBAL_COLOR_SCHEME_RGB)
3271 win->SetBackgroundColour(ctrl_back_color);
3273 win->SetBackgroundColour(wxNullColour);
3276 else if (
dynamic_cast<wxGrid *
>(win)) {
3277 dynamic_cast<wxGrid *
>(win)->SetDefaultCellBackgroundColour(
3279 dynamic_cast<wxGrid *
>(win)->SetDefaultCellTextColour(uitext);
3280 dynamic_cast<wxGrid *
>(win)->SetLabelBackgroundColour(col);
3281 dynamic_cast<wxGrid *
>(win)->SetLabelTextColour(uitext);
3282 dynamic_cast<wxGrid *
>(win)->SetGridLineColour(gridline);
3285 if (win->GetChildren().GetCount() > 0) {
3288 DimeControl(w, col, window_back_color, ctrl_back_color, text_color,
3289 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.
Connection data container close to a POD struct.
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.
std::vector< ConnectionParams * > & TheConnectionParams()
Return global list of connections.
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.
Global variables Listen()/Notify() wrapper.
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.
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.