27#include "ocpn-nlohmann/json.hpp"
56#include "androidUTIL.h"
65#define GLOBAL_SETTINGS_INPUT 3
68#define DISPLAY_FORMAT 2
69#define TIMESTAMP_FORMAT 3
75bool TrackPropDlg::instanceFlag =
false;
77TrackPropDlg* TrackPropDlg::getInstance(wxWindow* parent, wxWindowID
id,
78 const wxString& title,
79 const wxPoint& pos,
const wxSize& size,
82 single =
new TrackPropDlg(parent,
id, title, pos, size, style);
90TrackPropDlg::TrackPropDlg(wxWindow* parent, wxWindowID
id,
91 const wxString& title,
const wxPoint& pos,
92 const wxSize& size,
long style)
93 : DIALOG_PARENT(parent, id, title, pos, size, style) {
97 SetWindowStyleFlag(style);
99 m_scrolledWindowLinks = NULL;
100 m_tDescription = NULL;
106 CreateControlsCompact();
116 m_sdbBtmBtnsSizerCancel->Connect(
117 wxEVT_COMMAND_BUTTON_CLICKED,
118 wxCommandEventHandler(TrackPropDlg::OnCancelBtnClick), NULL,
this);
119 m_sdbBtmBtnsSizerOK->Connect(
120 wxEVT_COMMAND_BUTTON_CLICKED,
121 wxCommandEventHandler(TrackPropDlg::OnOKBtnClick), NULL,
this);
122 if (m_sdbBtmBtnsSizerPrint)
123 m_sdbBtmBtnsSizerPrint->Connect(
124 wxEVT_COMMAND_BUTTON_CLICKED,
125 wxCommandEventHandler(TrackPropDlg::OnPrintBtnClick), NULL,
this);
126 m_sdbBtmBtnsSizerSplit->Connect(
127 wxEVT_COMMAND_BUTTON_CLICKED,
128 wxCommandEventHandler(TrackPropDlg::OnSplitBtnClick), NULL,
this);
129 m_sdbBtmBtnsSizerExtend->Connect(
130 wxEVT_COMMAND_BUTTON_CLICKED,
131 wxCommandEventHandler(TrackPropDlg::OnExtendBtnClick), NULL,
this);
132 m_sdbBtmBtnsSizerToRoute->Connect(
133 wxEVT_COMMAND_BUTTON_CLICKED,
134 wxCommandEventHandler(TrackPropDlg::OnToRouteBtnClick), NULL,
this);
135 if (m_sdbBtmBtnsSizerExport)
136 m_sdbBtmBtnsSizerExport->Connect(
137 wxEVT_COMMAND_BUTTON_CLICKED,
138 wxCommandEventHandler(TrackPropDlg::OnExportBtnClick), NULL,
this);
139 m_lcPoints->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
140 wxListEventHandler(TrackPropDlg::OnTrackPropListClick),
142 Connect(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
143 wxListEventHandler(TrackPropDlg::OnTrackPropRightClick), NULL,
this);
144 Connect(wxEVT_COMMAND_MENU_SELECTED,
145 wxCommandEventHandler(TrackPropDlg::OnTrackPropMenuSelected), NULL,
149 Connect(wxEVT_ACTIVATE, wxActivateEventHandler(TrackPropDlg::OnActivate),
154 m_buttonAddLink->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
155 wxCommandEventHandler(TrackPropDlg::OnAddLink),
157 m_toggleBtnEdit->Connect(
158 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
159 wxCommandEventHandler(TrackPropDlg::OnEditLinkToggle), NULL,
this);
163 m_rbShowTimeUTC->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED,
164 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ),
167 m_rbShowTimePC->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED,
168 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ),
170 if (m_rbShowTimeLocal)
171 m_rbShowTimeLocal->Connect(
172 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
173 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
175 if (m_rbShowTimeGlobalSettings)
176 m_rbShowTimeGlobalSettings->Connect(
177 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
178 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
180 m_pMyLinkList = NULL;
183TrackPropDlg::~TrackPropDlg() {
185 m_sdbBtmBtnsSizerCancel->Disconnect(
186 wxEVT_COMMAND_BUTTON_CLICKED,
187 wxCommandEventHandler(TrackPropDlg::OnCancelBtnClick), NULL,
this);
188 m_sdbBtmBtnsSizerOK->Disconnect(
189 wxEVT_COMMAND_BUTTON_CLICKED,
190 wxCommandEventHandler(TrackPropDlg::OnOKBtnClick), NULL,
this);
191 if (m_sdbBtmBtnsSizerPrint)
192 m_sdbBtmBtnsSizerPrint->Disconnect(
193 wxEVT_COMMAND_BUTTON_CLICKED,
194 wxCommandEventHandler(TrackPropDlg::OnPrintBtnClick), NULL,
this);
195 m_sdbBtmBtnsSizerSplit->Disconnect(
196 wxEVT_COMMAND_BUTTON_CLICKED,
197 wxCommandEventHandler(TrackPropDlg::OnSplitBtnClick), NULL,
this);
198 m_sdbBtmBtnsSizerExtend->Disconnect(
199 wxEVT_COMMAND_BUTTON_CLICKED,
200 wxCommandEventHandler(TrackPropDlg::OnExtendBtnClick), NULL,
this);
201 m_sdbBtmBtnsSizerToRoute->Disconnect(
202 wxEVT_COMMAND_BUTTON_CLICKED,
203 wxCommandEventHandler(TrackPropDlg::OnToRouteBtnClick), NULL,
this);
204 if (m_sdbBtmBtnsSizerExport)
205 m_sdbBtmBtnsSizerExport->Disconnect(
206 wxEVT_COMMAND_BUTTON_CLICKED,
207 wxCommandEventHandler(TrackPropDlg::OnExportBtnClick), NULL,
this);
208 m_lcPoints->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
209 wxListEventHandler(TrackPropDlg::OnTrackPropListClick),
211 Disconnect(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
212 wxListEventHandler(TrackPropDlg::OnTrackPropRightClick), NULL,
214 Disconnect(wxEVT_COMMAND_MENU_SELECTED,
215 wxCommandEventHandler(TrackPropDlg::OnTrackPropMenuSelected), NULL,
218 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
219 wxCommandEventHandler(TrackPropDlg::OnDeleteLink));
220 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
221 wxCommandEventHandler(TrackPropDlg::OnEditLink));
222 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
223 wxCommandEventHandler(TrackPropDlg::OnAddLink));
226 m_buttonAddLink->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED,
227 wxCommandEventHandler(TrackPropDlg::OnAddLink),
229 m_toggleBtnEdit->Disconnect(
230 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
231 wxCommandEventHandler(TrackPropDlg::OnEditLinkToggle), NULL,
this);
235 m_rbShowTimeUTC->Disconnect(
236 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
237 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
240 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
241 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
244 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
245 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
248 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
249 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
251 instanceFlag =
false;
254static wxString getDatetimeTimezoneSelector(
int selection) {
268void TrackPropDlg::OnActivate(wxActivateEvent& event) {
269 auto pWin =
dynamic_cast<DIALOG_PARENT*
>(
event.GetEventObject());
270 long int style = pWin->GetWindowStyle();
271 if (event.GetActive())
272 pWin->SetWindowStyle(style | wxSTAY_ON_TOP);
274 pWin->SetWindowStyle(style ^ wxSTAY_ON_TOP);
277void TrackPropDlg::RecalculateSize() {
281 esize.x = GetCharWidth() * 110;
282 esize.y = GetCharHeight() * 40;
284 wxSize dsize = GetParent()->GetClientSize();
285 esize.y = wxMin(esize.y, dsize.y - (2 * GetCharHeight()));
286 esize.x = wxMin(esize.x, dsize.x - (2 * GetCharHeight()));
287 SetClientSize(esize);
289 wxSize fsize = GetSize();
290 fsize.y = wxMin(fsize.y, dsize.y - (2 * GetCharHeight()));
291 fsize.x = wxMin(fsize.x, dsize.x - (2 * GetCharHeight()));
295 int sy = GetCharHeight() * m_lcPoints->GetItemCount();
298 m_lcPoints->SetSize(wxSize(GetClientSize().x - 40, sy));
300 if (m_lcPoints->GetItemCount()) Layout();
306static void addColumns(wxListCtrl* lctrl,
int dx) {
307 lctrl->InsertColumn(0, _(
"Leg"), wxLIST_FORMAT_LEFT, dx * 6);
308 lctrl->InsertColumn(1, _(
"Distance"), wxLIST_FORMAT_LEFT, dx * 11);
309 lctrl->InsertColumn(2, _(
"Bearing"), wxLIST_FORMAT_LEFT, dx * 8);
311 lctrl->InsertColumn(3, _(
"Latitude"), wxLIST_FORMAT_LEFT, dx * 15);
312 lctrl->InsertColumn(4, _(
"Longitude"), wxLIST_FORMAT_LEFT, dx * 15);
315 lctrl->InsertColumn(5, _(
"Timestamp"), wxLIST_FORMAT_LEFT, dx * 26);
316 lctrl->InsertColumn(6, _(
"Speed"), wxLIST_FORMAT_CENTER, dx * 8);
318 lctrl->SetMinSize(wxSize(-1, 50));
321void TrackPropDlg::CreateControlsCompact() {
322 wxBoxSizer* itemBoxSizer1 =
new wxBoxSizer(wxVERTICAL);
323 SetSizer(itemBoxSizer1);
325 itemDialog1 =
new wxScrolledWindow(
this, wxID_ANY, wxDefaultPosition,
326 wxSize(-1, -1), wxVSCROLL);
327 itemDialog1->SetScrollRate(0, 1);
333 wxString wqs = getFontQtStylesheet(qFont);
334 wxCharBuffer sbuf = wqs.ToUTF8();
335 QString qsb = QString(sbuf.data());
337 QString qsbq = getQtStyleSheet();
339 itemDialog1->GetHandle()->setStyleSheet(qsb +
343 itemBoxSizer1->Add(itemDialog1, 1, wxEXPAND | wxALL, 0);
345 wxBoxSizer* itemBoxSizer2 =
new wxBoxSizer(wxVERTICAL);
346 itemDialog1->SetSizer(itemBoxSizer2);
348 wxStaticText* itemStaticText4 =
new wxStaticText(
349 itemDialog1, wxID_STATIC, _(
"Name"), wxDefaultPosition, wxDefaultSize, 0);
350 itemBoxSizer2->Add(itemStaticText4, 0,
351 wxALIGN_LEFT | wxLEFT | wxRIGHT | wxTOP, 5);
353 m_tName =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
355 itemBoxSizer2->Add(m_tName, 0, wxALIGN_LEFT | wxLEFT | wxRIGHT | wxBOTTOM, 5);
357 wxStaticText* itemStaticText7 =
358 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Depart From"),
359 wxDefaultPosition, wxDefaultSize, 0);
360 itemBoxSizer2->Add(itemStaticText7, 0,
361 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
364 m_tFrom =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
366 itemBoxSizer2->Add(m_tFrom, 0,
367 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
368 wxLEFT | wxRIGHT | wxBOTTOM,
371 wxStaticText* itemStaticText8 =
372 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Destination"),
373 wxDefaultPosition, wxDefaultSize, 0);
374 itemBoxSizer2->Add(itemStaticText8, 0,
375 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
378 m_tTo =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
380 itemBoxSizer2->Add(m_tTo, 0,
381 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
382 wxLEFT | wxRIGHT | wxBOTTOM,
385 m_cbShow =
new wxCheckBox(itemDialog1, wxID_ANY, _(
"Show on chart"),
386 wxDefaultPosition, wxDefaultSize, 0);
387 itemBoxSizer2->Add(m_cbShow, 0, wxALL, 5);
389 wxFlexGridSizer* itemFlexGridSizer6a =
new wxFlexGridSizer(4, 2, 0, 0);
390 itemFlexGridSizer6a->AddGrowableCol(1, 0);
392 itemBoxSizer2->Add(itemFlexGridSizer6a, 0, wxEXPAND | wxALIGN_LEFT | wxALL,
395 wxStaticText* itemStaticText11 =
396 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Total distance"),
397 wxDefaultPosition, wxDefaultSize, 0);
398 itemFlexGridSizer6a->Add(
400 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
402 m_tTotDistance =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
403 wxSize(-1, -1), wxTE_READONLY);
404 itemFlexGridSizer6a->Add(m_tTotDistance, 0,
405 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
406 wxLEFT | wxRIGHT | wxBOTTOM,
409 m_stAvgSpeed =
new wxStaticText(itemDialog1, wxID_STATIC, _(
"Avg. speed"),
410 wxDefaultPosition, wxDefaultSize, 0);
411 itemFlexGridSizer6a->Add(
413 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
415 m_tAvgSpeed =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
416 wxSize(150, -1), wxTE_PROCESS_ENTER);
417 itemFlexGridSizer6a->Add(
419 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
422 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Time Enroute"),
423 wxDefaultPosition, wxDefaultSize, 0);
424 itemFlexGridSizer6a->Add(
426 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
428 m_tTimeEnroute =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
429 wxSize(-1, -1), wxTE_READONLY);
430 itemFlexGridSizer6a->Add(m_tTimeEnroute, 0,
431 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
432 wxLEFT | wxRIGHT | wxBOTTOM,
449 wxString pDispTimeZone[] = {_(
"UTC"), _(
"Local Time"), _(
"LMT@Location"),
450 _(
"Honor Global Settings")};
452 wxStaticText* itemStaticText12b =
453 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Time shown as"),
454 wxDefaultPosition, wxDefaultSize, 0);
455 itemBoxSizer2->Add(itemStaticText12b, 0, wxEXPAND | wxALL, 5);
458 new wxRadioButton(itemDialog1, wxID_ANY, _(
"UTC"), wxDefaultPosition,
459 wxDefaultSize, wxRB_GROUP);
462 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
464 m_rbShowTimePC =
new wxRadioButton(itemDialog1, wxID_ANY, _(
"Local Time"));
467 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
470 new wxRadioButton(itemDialog1, wxID_ANY, _(
"LMT@Location"));
473 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
476 new wxRadioButton(itemDialog1, wxID_ANY, _(
"Honor Global Settings"));
479 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
481 wxFlexGridSizer* itemFlexGridSizer6b =
new wxFlexGridSizer(3, 2, 0, 0);
482 itemBoxSizer2->Add(itemFlexGridSizer6b, 0, wxEXPAND | wxALIGN_LEFT | wxALL,
485 wxStaticText* m_staticText1 =
486 new wxStaticText(itemDialog1, wxID_ANY, _(
"Color") +
":",
487 wxDefaultPosition, wxDefaultSize, 0);
488 itemFlexGridSizer6b->Add(m_staticText1, 0, wxALIGN_CENTER_VERTICAL | wxALL,
491 wxString m_chColorChoices[] = {
492 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
493 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
494 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
495 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
497 int m_chColorNChoices =
sizeof(m_chColorChoices) /
sizeof(wxString);
499 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxSize(250, -1),
500 m_chColorNChoices, m_chColorChoices, 0);
501 m_cColor->SetSelection(0);
502 itemFlexGridSizer6b->Add(m_cColor, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
504 wxStaticText* staticTextStyle =
505 new wxStaticText(itemDialog1, wxID_ANY, _(
"Style") +
":",
506 wxDefaultPosition, wxDefaultSize, 0);
507 itemFlexGridSizer6b->Add(staticTextStyle, 0, wxALIGN_CENTER_VERTICAL | wxALL,
510 wxString m_chStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
511 _(
"Long dash"), _(
"Short dash")};
512 int m_chStyleNChoices =
sizeof(m_chStyleChoices) /
sizeof(wxString);
514 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxDefaultSize,
515 m_chStyleNChoices, m_chStyleChoices, 0);
516 m_cStyle->SetSelection(0);
517 itemFlexGridSizer6b->Add(m_cStyle, 0,
518 wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 5);
521 staticTextStyle->Hide();
525 m_stWidth =
new wxStaticText(itemDialog1, wxID_ANY, _(
"Width") +
":",
526 wxDefaultPosition, wxDefaultSize, 0);
527 itemFlexGridSizer6b->Add(m_stWidth, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
529 wxString m_chWidthChoices[] = {_(
"Default"), _(
"1 pixel"), _(
"2 pixels"),
530 _(
"3 pixels"), _(
"4 pixels"), _(
"5 pixels"),
531 _(
"6 pixels"), _(
"7 pixels"), _(
"8 pixels"),
532 _(
"9 pixels"), _(
"10 pixels")};
533 int m_chWidthNChoices =
sizeof(m_chWidthChoices) /
sizeof(wxString);
535 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxSize(150, -1),
536 m_chWidthNChoices, m_chWidthChoices, 0);
537 m_cWidth->SetSelection(0);
538 itemFlexGridSizer6b->Add(m_cWidth, 0,
539 wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 5);
541 wxStaticBox* itemStaticBoxSizer14Static =
542 new wxStaticBox(itemDialog1, wxID_ANY, _(
"Waypoints"));
543 wxStaticBoxSizer* m_pListSizer =
544 new wxStaticBoxSizer(itemStaticBoxSizer14Static, wxVERTICAL);
545 itemBoxSizer2->Add(m_pListSizer, 1, wxEXPAND | wxALL, 1);
547 wxScrolledWindow* itemlistWin =
548 new wxScrolledWindow(itemDialog1, wxID_ANY, wxDefaultPosition,
549 wxDefaultSize, wxHSCROLL | wxVSCROLL);
550 itemlistWin->SetScrollRate(2, 2);
552 m_pListSizer->Add(itemlistWin, 0, wxEXPAND | wxALL, 6);
554 long flags = wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_EDIT_LABELS;
556 flags |= wxLC_VIRTUAL;
560 wxSize(100, 500), flags);
561 addColumns(m_lcPoints, GetCharWidth());
566 m_lcPoints->GetHandle()->setStyleSheet(getQtStyleSheet());
571 wxBoxSizer* itemBoxSizerBottom =
new wxBoxSizer(wxVERTICAL);
572 itemBoxSizer1->Add(itemBoxSizerBottom, 0, wxALIGN_LEFT | wxALL | wxEXPAND, 5);
576 wxFlexGridSizer* itemBoxSizerAux =
new wxFlexGridSizer(0, n_col, 0, 0);
577 itemBoxSizerAux->SetFlexibleDirection(wxBOTH);
578 itemBoxSizerAux->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
580 itemBoxSizerBottom->Add(itemBoxSizerAux, 1, wxALIGN_LEFT | wxALL, 5);
584 m_sdbBtmBtnsSizerPrint =
new wxButton(
this, wxID_ANY, _(
"Print"),
585 wxDefaultPosition, wxDefaultSize, 0);
586 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerPrint, 0,
587 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
588 m_sdbBtmBtnsSizerPrint->Enable(
true);
590 m_sdbBtmBtnsSizerPrint = NULL;
593 m_sdbBtmBtnsSizerSplit =
new wxButton(
this, wxID_ANY, _(
"Split"),
594 wxDefaultPosition, wxDefaultSize, 0);
595 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerSplit, 0,
596 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
597 m_sdbBtmBtnsSizerSplit->Enable(
false);
599 m_sdbBtmBtnsSizerExtend =
new wxButton(
this, wxID_ANY, _(
"Extend"),
600 wxDefaultPosition, wxDefaultSize, 0);
601 m_sdbBtmBtnsSizerExtend->SetToolTip(
602 _(
"Extends this track by connecting it to another track.\n"
603 "Disabled when the track is active, the track is in a layer, or no "
604 "suitable track to connect to exists.\n"
605 "A suitable track is one that is visible, is different from this "
606 "track, and has its last point's timestamp earlier than or equal to "
607 "this track's first point's timestamp."));
608 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExtend, 0,
609 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
611 m_sdbBtmBtnsSizerToRoute =
new wxButton(
this, wxID_ANY, _(
"To route"),
612 wxDefaultPosition, wxDefaultSize, 0);
613 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerToRoute, 0,
614 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
616 m_sdbBtmBtnsSizerExport = NULL;
622 wxBoxSizer* itemBoxSizer16 =
new wxBoxSizer(wxHORIZONTAL);
623 itemBoxSizerBottom->Add(itemBoxSizer16, 0, wxALIGN_RIGHT | wxALL, 5);
625 m_sdbBtmBtnsSizerCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"),
626 wxDefaultPosition, wxDefaultSize, 0);
627 itemBoxSizer16->Add(m_sdbBtmBtnsSizerCancel, 0,
628 wxALIGN_RIGHT | wxALIGN_BOTTOM | wxALL, 5);
630 m_sdbBtmBtnsSizerOK =
631 new wxButton(
this, wxID_OK, _(
"OK"), wxDefaultPosition, wxDefaultSize, 0);
632 itemBoxSizer16->Add(m_sdbBtmBtnsSizerOK, 0,
633 wxALIGN_RIGHT | wxALIGN_BOTTOM | wxALL, 5);
634 m_sdbBtmBtnsSizerOK->SetDefault();
636 int char_size = GetCharWidth();
641 SetSizeHints(-1, -1, width - 100, height - 100);
644void TrackPropDlg::CreateControls() {
645 wxBoxSizer* bSizerMain;
646 bSizerMain =
new wxBoxSizer(wxVERTICAL);
647 SetSizer(bSizerMain);
650 new wxNotebook(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0);
652 bSizerMain->Add(m_notebook1, 1, wxEXPAND | wxALL, 5);
655 new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize);
656 m_notebook1->AddPage(m_panel0, _(
"Basic"),
true);
658 wxBoxSizer* bSizer0 =
new wxBoxSizer(wxVERTICAL);
659 m_panel0->SetSizer(bSizer0);
661 wxBoxSizer* bSizer1 =
new wxBoxSizer(wxVERTICAL);
662 bSizer0->Add(bSizer1, 1, wxEXPAND | wxALL, 5);
664 m_panelBasic =
new wxScrolledWindow(m_panel0, wxID_ANY, wxDefaultPosition,
666 wxHSCROLL | wxVSCROLL | wxTAB_TRAVERSAL);
672 wxString wqs = getFontQtStylesheet(qFont);
673 wxCharBuffer sbuf = wqs.ToUTF8();
674 QString qsb = QString(sbuf.data());
676 QString qsbq = getQtStyleSheet();
678 m_panelBasic->GetHandle()->setStyleSheet(qsb +
687 wxBoxSizer* bSizerBasic =
new wxBoxSizer(wxVERTICAL);
688 m_panelBasic->SetSizer(bSizerBasic);
690 bSizer1->Add(m_panelBasic, 1, wxEXPAND | wxALL, 5);
692 wxBoxSizer* bSizerName;
693 bSizerName =
new wxBoxSizer(wxHORIZONTAL);
694 bSizerBasic->Add(bSizerName, 0, wxALL | wxEXPAND, 5);
696 m_stName =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Name"),
697 wxDefaultPosition, wxDefaultSize, 0);
699 bSizerName->Add(m_stName, 0, wxALL, 5);
701 m_tName =
new wxTextCtrl(m_panelBasic, wxID_ANY,
"", wxDefaultPosition,
703 bSizerName->Add(m_tName, 1, 0, 5);
705 wxBoxSizer* bSizerFromTo;
706 bSizerFromTo =
new wxBoxSizer(wxHORIZONTAL);
707 bSizerBasic->Add(bSizerFromTo, 0, wxALL | wxEXPAND, 5);
709 m_stFrom =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"From"),
710 wxDefaultPosition, wxDefaultSize, 0);
712 bSizerFromTo->Add(m_stFrom, 0, wxALL, 5);
714 m_tFrom =
new wxTextCtrl(m_panelBasic, wxID_ANY,
"", wxDefaultPosition,
716 bSizerFromTo->Add(m_tFrom, 1, 0, 5);
718 m_stTo =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"To"), wxDefaultPosition,
721 bSizerFromTo->Add(m_stTo, 0, wxALL, 5);
723 m_tTo =
new wxTextCtrl(m_panelBasic, wxID_ANY,
"", wxDefaultPosition,
725 bSizerFromTo->Add(m_tTo, 1, 0, 5);
727 wxStaticBoxSizer* sbSizerParams;
728 sbSizerParams =
new wxStaticBoxSizer(
729 new wxStaticBox(m_panelBasic, wxID_ANY, _(
"Display parameters")),
731 bSizerBasic->Add(sbSizerParams, 0, wxALL | wxEXPAND, 5);
733 m_cbShow =
new wxCheckBox(m_panelBasic, wxID_ANY, _(
"Show on chart"),
734 wxDefaultPosition, wxDefaultSize, 0);
735 sbSizerParams->Add(m_cbShow, 0, wxALL, 5);
737 m_stColor =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Color"),
738 wxDefaultPosition, wxDefaultSize, 0);
740 sbSizerParams->Add(m_stColor, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
742 wxString m_cColorChoices[] = {
743 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
744 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
745 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
746 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
748 int m_cColorNChoices =
sizeof(m_cColorChoices) /
sizeof(wxString);
749 m_cColor =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
750 wxDefaultSize, m_cColorNChoices, m_cColorChoices, 0);
751 m_cColor->SetSelection(0);
752 sbSizerParams->Add(m_cColor, 1, 0, 5);
754 m_stStyle =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Style"),
755 wxDefaultPosition, wxDefaultSize, 0);
757 sbSizerParams->Add(m_stStyle, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
759 wxString m_cStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
760 _(
"Long dash"), _(
"Short dash")};
761 int m_cStyleNChoices =
sizeof(m_cStyleChoices) /
sizeof(wxString);
762 m_cStyle =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
763 wxDefaultSize, m_cStyleNChoices, m_cStyleChoices, 0);
764 m_cStyle->SetSelection(0);
765 sbSizerParams->Add(m_cStyle, 1, 0, 5);
767 m_stWidth =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Width"),
768 wxDefaultPosition, wxDefaultSize, 0);
770 sbSizerParams->Add(m_stWidth, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
772 wxString m_cWidthChoices[] = {_(
"Default"), _(
"1 pixel"), _(
"2 pixels"),
773 _(
"3 pixels"), _(
"4 pixels"), _(
"5 pixels"),
774 _(
"6 pixels"), _(
"7 pixels"), _(
"8 pixels"),
775 _(
"9 pixels"), _(
"10 pixels")};
776 int m_cWidthNChoices =
sizeof(m_cWidthChoices) /
sizeof(wxString);
777 m_cWidth =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
778 wxDefaultSize, m_cWidthNChoices, m_cWidthChoices, 0);
779 m_cWidth->SetSelection(0);
780 sbSizerParams->Add(m_cWidth, 1, 0, 5);
782 wxStaticBoxSizer* sbSizerStats;
783 sbSizerStats =
new wxStaticBoxSizer(
784 new wxStaticBox(m_panelBasic, wxID_ANY, _(
"Statistics")), wxVERTICAL);
785 bSizerBasic->Add(sbSizerStats, 0, wxALL | wxEXPAND, 5);
787 wxBoxSizer* bSizerStats;
788 bSizerStats =
new wxBoxSizer(wxHORIZONTAL);
791 new wxStaticText(m_panelBasic, wxID_ANY, _(
"Total distance"),
792 wxDefaultPosition, wxDefaultSize, 0);
794 bSizerStats->Add(m_stTotDistance, 0, wxALL, 5);
796 m_tTotDistance =
new wxTextCtrl(m_panelBasic, wxID_ANY,
"", wxDefaultPosition,
797 wxDefaultSize, wxTE_READONLY);
798 bSizerStats->Add(m_tTotDistance, 1, 0, 5);
800 m_stAvgSpeed =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Avg. speed"),
801 wxDefaultPosition, wxDefaultSize, 0);
803 bSizerStats->Add(m_stAvgSpeed, 0, wxALL, 5);
805 m_tAvgSpeed =
new wxTextCtrl(m_panelBasic, wxID_ANY,
"", wxDefaultPosition,
806 wxDefaultSize, wxTE_READONLY);
807 bSizerStats->Add(m_tAvgSpeed, 1, 0, 5);
809 m_stTimeEnroute =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Time enroute"),
810 wxDefaultPosition, wxDefaultSize, 0);
812 bSizerStats->Add(m_stTimeEnroute, 0, wxALL, 5);
814 m_tTimeEnroute =
new wxTextCtrl(m_panelBasic, wxID_ANY,
"", wxDefaultPosition,
815 wxDefaultSize, wxTE_READONLY);
816 bSizerStats->Add(m_tTimeEnroute, 2, 0, 5);
818 sbSizerStats->Add(bSizerStats, 0, wxEXPAND, 5);
820 wxStaticBoxSizer* sbSizerPoints;
821 sbSizerPoints =
new wxStaticBoxSizer(
822 new wxStaticBox(m_panel0, wxID_ANY, _(
"Recorded points")), wxVERTICAL);
823 bSizer1->Add(sbSizerPoints, 1, wxALL | wxEXPAND, 5);
825 wxBoxSizer* bSizerShowTime;
826 bSizerShowTime =
new wxBoxSizer(wxHORIZONTAL);
828 m_stShowTime =
new wxStaticText(m_panel0, wxID_ANY, _(
"Time shown as"),
829 wxDefaultPosition, wxDefaultSize, 0);
831 bSizerShowTime->Add(m_stShowTime, 0, wxALL, 5);
833 m_rbShowTimeUTC =
new wxRadioButton(m_panel0, wxID_ANY, _(
"UTC"),
834 wxDefaultPosition, wxDefaultSize, 0);
835 bSizerShowTime->Add(m_rbShowTimeUTC, 0,
836 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
839 m_rbShowTimePC =
new wxRadioButton(m_panel0, wxID_ANY, _(
"Local Time"),
840 wxDefaultPosition, wxDefaultSize, 0);
842 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
846 new wxRadioButton(m_panel0, wxID_ANY, _(
"LMT@Track Start"),
847 wxDefaultPosition, wxDefaultSize, 0);
849 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
853 new wxRadioButton(m_panel0, wxID_ANY, _(
"Honor Global Settings"),
854 wxDefaultPosition, wxDefaultSize, 0);
856 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
861 sbSizerPoints->Add(bSizerShowTime, 0, wxEXPAND, 5);
863 long flags = wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_EDIT_LABELS;
865 flags |= wxLC_VIRTUAL;
869 wxDefaultSize, flags);
870 addColumns(m_lcPoints, GetCharWidth());
872 sbSizerPoints->Add(m_lcPoints, 1, wxALL | wxEXPAND, 5);
875 m_lcPoints->GetHandle()->setStyleSheet(getQtStyleSheet());
889 m_panelAdvanced =
new wxScrolledWindow(
890 m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
892 wxBoxSizer* bSizerAdvanced;
893 bSizerAdvanced =
new wxBoxSizer(wxVERTICAL);
896 new wxStaticText(m_panelAdvanced, wxID_ANY, _(
"Description"),
897 wxDefaultPosition, wxDefaultSize, 0);
899 bSizerAdvanced->Add(m_stDescription, 0, wxALL, 5);
902 new wxTextCtrl(m_panelAdvanced, wxID_ANY,
"", wxDefaultPosition,
903 wxDefaultSize, wxTE_MULTILINE);
904 bSizerAdvanced->Add(m_tDescription, 1, wxALL | wxEXPAND, 5);
906 sbSizerLinks =
new wxStaticBoxSizer(
907 new wxStaticBox(m_panelAdvanced, wxID_ANY, _(
"Links")), wxVERTICAL);
909 m_scrolledWindowLinks =
910 new wxScrolledWindow(m_panelAdvanced, wxID_ANY, wxDefaultPosition,
911 wxDefaultSize, wxHSCROLL | wxVSCROLL);
912 m_scrolledWindowLinks->SetScrollRate(5, 5);
913 bSizerLinks =
new wxBoxSizer(wxVERTICAL);
916 new wxHyperlinkCtrl(m_scrolledWindowLinks, wxID_ANY, _(
"wxFB Website"),
917 "http://www.wxformbuilder.org", wxDefaultPosition,
918 wxDefaultSize, wxHL_DEFAULT_STYLE);
919 m_menuLink =
new wxMenu();
920 m_menuItemEdit =
new wxMenuItem(m_menuLink, ID_TRK_MENU_EDIT,
921 wxString(_(
"Edit")),
"", wxITEM_NORMAL);
922 m_menuLink->Append(m_menuItemEdit);
924 m_menuItemAdd =
new wxMenuItem(m_menuLink, ID_TRK_MENU_ADD,
925 wxString(_(
"Add new")),
"", wxITEM_NORMAL);
926 m_menuLink->Append(m_menuItemAdd);
928 m_menuItemDelete =
new wxMenuItem(m_menuLink, ID_TRK_MENU_DELETE,
929 wxString(_(
"Delete")),
"", wxITEM_NORMAL);
930 m_menuLink->Append(m_menuItemDelete);
932 m_hyperlink1->Connect(
934 wxMouseEventHandler(TrackPropDlg::m_hyperlink1OnContextMenu), NULL,
this);
936 bSizerLinks->Add(m_hyperlink1, 0, wxALL, 5);
938 m_scrolledWindowLinks->SetSizer(bSizerLinks);
939 m_scrolledWindowLinks->Layout();
940 bSizerLinks->Fit(m_scrolledWindowLinks);
941 sbSizerLinks->Add(m_scrolledWindowLinks, 1, wxEXPAND | wxALL, 5);
943 wxBoxSizer* bSizerLinkBtns;
944 bSizerLinkBtns =
new wxBoxSizer(wxHORIZONTAL);
947 new wxButton(m_panelAdvanced, wxID_ANY, _(
"Add"), wxDefaultPosition,
948 wxDefaultSize, wxBU_EXACTFIT);
949 bSizerLinkBtns->Add(m_buttonAddLink, 0, wxALL, 5);
951 m_toggleBtnEdit =
new wxToggleButton(m_panelAdvanced, wxID_ANY, _(
"Edit"),
952 wxDefaultPosition, wxDefaultSize, 0);
953 bSizerLinkBtns->Add(m_toggleBtnEdit, 0, wxALL, 5);
955 m_staticTextEditEnabled =
new wxStaticText(
956 m_panelAdvanced, wxID_ANY, _(
"Links are opened in the default browser."),
957 wxDefaultPosition, wxDefaultSize, 0);
959 bSizerLinkBtns->Add(m_staticTextEditEnabled, 0,
960 wxALIGN_CENTER_VERTICAL | wxALL, 5);
962 sbSizerLinks->Add(bSizerLinkBtns, 0, wxEXPAND, 5);
964 bSizerAdvanced->Add(sbSizerLinks, 1, wxEXPAND, 5);
966 m_panelAdvanced->SetSizer(bSizerAdvanced);
967 m_notebook1->AddPage(m_panelAdvanced, _(
"Advanced"),
false);
971 wxBoxSizer* itemBoxSizerBottom =
new wxBoxSizer(wxVERTICAL);
972 bSizerMain->Add(itemBoxSizerBottom, 0, wxALIGN_LEFT | wxALL | wxEXPAND, 5);
978 wxFlexGridSizer* itemBoxSizerAux =
new wxFlexGridSizer(0, n_col, 0, 0);
979 itemBoxSizerAux->SetFlexibleDirection(wxBOTH);
980 itemBoxSizerAux->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
982 itemBoxSizerBottom->Add(itemBoxSizerAux, 1, wxALIGN_LEFT | wxALL, 5);
986 m_sdbBtmBtnsSizerPrint =
new wxButton(
this, wxID_ANY, _(
"Print"),
987 wxDefaultPosition, wxDefaultSize, 0);
988 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerPrint, 0,
989 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
990 m_sdbBtmBtnsSizerPrint->Enable(
true);
992 m_sdbBtmBtnsSizerPrint = NULL;
995 m_sdbBtmBtnsSizerSplit =
new wxButton(
this, wxID_ANY, _(
"Split"),
996 wxDefaultPosition, wxDefaultSize, 0);
997 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerSplit, 0,
998 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
999 m_sdbBtmBtnsSizerSplit->Enable(
false);
1001 m_sdbBtmBtnsSizerExtend =
new wxButton(
this, wxID_ANY, _(
"Extend track"),
1002 wxDefaultPosition, wxDefaultSize, 0);
1003 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExtend, 0,
1004 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1006 m_sdbBtmBtnsSizerToRoute =
new wxButton(
this, wxID_ANY, _(
"To route"),
1007 wxDefaultPosition, wxDefaultSize, 0);
1008 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerToRoute, 0,
1009 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1011 m_sdbBtmBtnsSizerExport =
new wxButton(
this, wxID_ANY, _(
"Export"),
1012 wxDefaultPosition, wxDefaultSize, 0);
1013 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExport, 0,
1014 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1016 wxBoxSizer* itemBoxSizer16 =
new wxBoxSizer(wxHORIZONTAL);
1017 itemBoxSizerBottom->Add(itemBoxSizer16, 0, wxALIGN_RIGHT | wxALL, 5);
1019 m_sdbBtmBtnsSizerCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"),
1020 wxDefaultPosition, wxDefaultSize, 0);
1021 itemBoxSizer16->Add(m_sdbBtmBtnsSizerCancel, 0, wxALIGN_BOTTOM | wxALL, 5);
1023 m_sdbBtmBtnsSizerOK =
1024 new wxButton(
this, wxID_OK, _(
"OK"), wxDefaultPosition, wxDefaultSize, 0);
1025 itemBoxSizer16->Add(m_sdbBtmBtnsSizerOK, 0, wxALIGN_BOTTOM | wxALL, 5);
1026 m_sdbBtmBtnsSizerOK->SetDefault();
1030 ((wxWindowBase*)m_stName)->GetSize(&w1, &h);
1031 ((wxWindowBase*)m_stFrom)->GetSize(&w2, &h);
1032 ((wxWindowBase*)m_stName)->SetMinSize(wxSize(wxMax(w1, w2), h));
1033 ((wxWindowBase*)m_stFrom)->SetMinSize(wxSize(wxMax(w1, w2), h));
1035 m_panelBasic->SetScrollRate(5, 5);
1036 m_panelAdvanced->SetScrollRate(5, 5);
1039void TrackPropDlg::SetTrackAndUpdate(
Track* pt) {
1042 m_lcPoints->DeleteAllItems();
1044 if (m_pMyLinkList)
delete m_pMyLinkList;
1045 m_pMyLinkList =
new HyperlinkList();
1047 for (
Hyperlink* link : *m_pTrack->m_TrackHyperlinkList) {
1049 h->DescrText = link->DescrText;
1050 h->Link = link->Link;
1051 h->LType = link->LType;
1053 m_pMyLinkList->push_back(h);
1061void TrackPropDlg::InitializeList() {
1062 if (NULL == m_pTrack)
return;
1064 m_lcPoints->m_pTrack = m_pTrack;
1066 if (m_pTrack->GetnPoints()) {
1069 m_lcPoints->m_LMT_Offset = long((prp->m_lon) * 3600. / 15.);
1071 m_lcPoints->m_LMT_Offset = 0;
1074 if (m_lcPoints->IsVirtual())
1075 m_lcPoints->SetItemCount(m_pTrack->GetnPoints());
1078 for (
int in = 0; in < m_pTrack->GetnPoints(); in++) {
1082 m_lcPoints->InsertItem(item);
1083 for (
int j = 0; j < 7; j++) {
1085 item.SetText(m_lcPoints->OnGetItemText(in, j));
1086 m_lcPoints->SetItem(item);
1093 if (NULL == m_pTrack)
return false;
1095 ::wxBeginBusyCursor();
1097 if (m_scrolledWindowLinks) {
1098 wxWindowList kids = m_scrolledWindowLinks->GetChildren();
1099 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
1100 wxWindowListNode* node = kids.Item(i);
1101 wxWindow* win = node->GetData();
1103 auto link_win =
dynamic_cast<wxHyperlinkCtrl*
>(win);
1105 link_win->Disconnect(
1106 wxEVT_COMMAND_HYPERLINK,
1107 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick));
1108 link_win->Disconnect(
1110 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu));
1115 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->size();
1116 HyperlinkList* list = m_pTrack->m_TrackHyperlinkList;
1118 if (NbrOfLinks > 0) {
1119 for (
auto it = list->begin(); it != list->end(); ++it) {
1121 wxString Link = link->Link;
1122 wxString Descr = link->DescrText;
1124 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1125 m_scrolledWindowLinks, wxID_ANY, Descr, Link, wxDefaultPosition,
1126 wxDefaultSize, wxHL_DEFAULT_STYLE);
1127 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1128 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1130 if (!m_pTrack->m_bIsInLayer)
1133 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu), NULL,
1136 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1139 bSizerLinks->Fit(m_scrolledWindowLinks);
1142 m_tName->SetValue(m_pTrack->GetName());
1143 m_tFrom->SetValue(m_pTrack->m_TrackStartString);
1144 m_tTo->SetValue(m_pTrack->m_TrackEndString);
1145 if (m_tDescription) m_tDescription->SetValue(m_pTrack->m_TrackDescription);
1147 m_tTotDistance->SetValue(
"");
1148 m_tTimeEnroute->SetValue(
"");
1150 m_sdbBtmBtnsSizerSplit->Enable(
false);
1151 m_sdbBtmBtnsSizerExtend->Enable(
false);
1154 TrackPoint* last_point = m_pTrack->GetLastPoint();
1155 TrackPoint* first_point = m_pTrack->GetPoint(0);
1156 double trackLength = m_pTrack->Length();
1157 double total_seconds = 0.;
1159 wxString speed(
"--");
1161 if (last_point && first_point) {
1168 if (total_seconds != 0.) {
1169 m_avgspeed = trackLength / total_seconds * 3600;
1173 speed.Printf(
"%5.2f", toUsrSpeed(m_avgspeed));
1177 m_tAvgSpeed->SetValue(speed);
1181 slen.Printf(
"%5.2f " + getUsrDistanceUnit(),
toUsrDistance(trackLength));
1183 m_tTotDistance->SetValue(slen);
1187 wxTimeSpan time(0, 0, (
int)total_seconds, 0);
1189 if (total_seconds > 3600. * 24.)
1190 time_form = time.Format(
"%H:%M");
1191 else if (total_seconds > 0.)
1192 time_form = time.Format(
"%H:%M");
1195 m_tTimeEnroute->SetValue(time_form);
1197 m_cbShow->SetValue(m_pTrack->IsVisible());
1199 if (m_pTrack->m_Colour ==
"")
1200 m_cColor->Select(0);
1202 for (
unsigned int i = 0; i <
sizeof(::GpxxColorNames) /
sizeof(wxString);
1204 if (m_pTrack->m_Colour == ::GpxxColorNames[i]) {
1205 m_cColor->Select(i + 1);
1211 for (
unsigned int i = 0; i <
sizeof(::StyleValues) /
sizeof(
int); i++) {
1212 if (m_pTrack->m_style == ::StyleValues[i]) {
1213 m_cStyle->Select(i);
1218 for (
unsigned int i = 0; i <
sizeof(::WidthValues) /
sizeof(
int); i++) {
1219 if (m_pTrack->m_width == ::WidthValues[i]) {
1220 m_cWidth->Select(i);
1225 if (m_pTrack->m_bIsInLayer) {
1226 m_tName->SetEditable(
false);
1227 m_tFrom->SetEditable(
false);
1228 m_tTo->SetEditable(
false);
1229 if (m_tDescription) m_tDescription->SetEditable(
false);
1230 m_cbShow->Enable(
false);
1231 m_cColor->Enable(
false);
1232 m_cStyle->Enable(
false);
1233 m_cWidth->Enable(
false);
1234 m_sdbBtmBtnsSizerExtend->Enable(
false);
1235 m_sdbBtmBtnsSizerSplit->Enable(
false);
1236 SetTitle(wxString::Format(
"%s, %s: %d", _(
"Track properties"),
"Layer",
1237 m_pTrack->m_LayerID));
1239 m_tName->SetEditable(
true);
1240 m_tFrom->SetEditable(
true);
1241 m_tTo->SetEditable(
true);
1242 if (m_tDescription) m_tDescription->SetEditable(
true);
1243 m_cbShow->Enable(
true);
1244 m_cColor->Enable(
true);
1245 m_cStyle->Enable(
true);
1246 m_cWidth->Enable(
true);
1248 m_sdbBtmBtnsSizerExtend->Enable(IsThisTrackExtendable());
1250 SetTitle(_(
"Track properties"));
1253 ::wxEndBusyCursor();
1258bool TrackPropDlg::IsThisTrackExtendable() {
1259 m_pExtendTrack = NULL;
1260 m_pExtendPoint = NULL;
1265 TrackPoint* pLastPoint = m_pTrack->GetPoint(0);
1271 if (ptrack->IsVisible() && (ptrack->m_GUID != m_pTrack->m_GUID)) {
1272 TrackPoint* track_node = ptrack->GetLastPoint();
1276 if (!m_pExtendPoint ||
1278 m_pExtendPoint = track_node;
1279 m_pExtendTrack = ptrack;
1286 if (m_pExtendTrack) {
1287 return (!m_pExtendTrack->m_bIsInLayer);
1293void TrackPropDlg::OnExtendBtnClick(wxCommandEvent& event) {
1294 TrackPoint* pFirstPoint = m_pTrack->GetPoint(0);
1296 if (IsThisTrackExtendable()) {
1301 pSelect->DeleteAllSelectableTrackSegments(m_pExtendTrack);
1302 m_pExtendTrack->Clone(m_pTrack, begin, m_pTrack->GetnPoints(), _(
"_plus"));
1303 pSelect->AddAllSelectableTrackSegments(m_pExtendTrack);
1304 pSelect->DeleteAllSelectableTrackSegments(m_pTrack);
1305 NavObj_dB::GetInstance().DeleteTrack(m_pTrack);
1308 SetTrackAndUpdate(m_pExtendTrack);
1309 NavObj_dB::GetInstance().UpdateTrack(m_pTrack);
1318void TrackPropDlg::OnSplitBtnClick(wxCommandEvent& event) {
1319 m_sdbBtmBtnsSizerSplit->Enable(
false);
1321 if (m_pTrack->m_bIsInLayer) {
1325 if ((m_nSelected > 1) && (m_nSelected < m_pTrack->GetnPoints())) {
1328 pHead->Clone(m_pTrack, 0, m_nSelected - 1, _(
"_A"));
1329 pTail->Clone(m_pTrack, m_nSelected - 1, m_pTrack->GetnPoints(), _(
"_B"));
1332 NavObj_dB::GetInstance().InsertTrack(pHead);
1335 NavObj_dB::GetInstance().InsertTrack(pTail);
1337 NavObj_dB::GetInstance().DeleteTrack(m_pTrack);
1339 pSelect->DeleteAllSelectableTrackSegments(m_pTrack);
1341 pSelect->AddAllSelectableTrackSegments(pTail);
1342 pSelect->AddAllSelectableTrackSegments(pHead);
1344 SetTrackAndUpdate(pTail);
1353void TrackPropDlg::OnTrackPropCopyTxtClick(wxCommandEvent& event) {
1354 wxString tab(
"\t", wxConvUTF8);
1355 wxString eol(
"\n", wxConvUTF8);
1358 csvString << this->GetTitle() << eol << _(
"Name") << tab
1359 << m_pTrack->GetName() << eol << _(
"Depart From") << tab
1360 << m_pTrack->m_TrackStartString << eol << _(
"Destination") << tab
1361 << m_pTrack->m_TrackEndString << eol << _(
"Total distance") << tab
1362 << m_tTotDistance->GetValue() << eol << _(
"Speed") << tab
1363 << m_tAvgSpeed->GetValue() << eol
1364 << _(
"Departure Time") +
" " + _(
"(m/d/y h:m)") << tab
1366 << _(
"Time enroute") << tab << m_tTimeEnroute->GetValue() << eol
1371 noCols = m_lcPoints->GetColumnCount();
1372 noRows = m_lcPoints->GetItemCount();
1374 item.SetMask(wxLIST_MASK_TEXT);
1376 for (
int i = 0; i < noCols; i++) {
1377 m_lcPoints->GetColumn(i, item);
1378 csvString << item.GetText() << tab;
1382 for (
int j = 0; j < noRows; j++) {
1384 for (
int i = 0; i < noCols; i++) {
1386 m_lcPoints->GetItem(item);
1387 csvString << item.GetText() << tab;
1392 if (wxTheClipboard->Open()) {
1393 wxTextDataObject* data =
new wxTextDataObject;
1394 data->SetText(csvString);
1395 wxTheClipboard->SetData(data);
1396 wxTheClipboard->Close();
1400void TrackPropDlg::OnPrintBtnClick(wxCommandEvent& event) {
1401 static std::set<int> s_options;
1403 int result = dlg.ShowModal();
1405 if (result == wxID_OK) {
1406 dlg.GetSelected(s_options);
1409 printer.Initialize(wxPORTRAIT);
1410 printer.EnablePageNumbers(
true);
1411 printer.Print(
this, &printout);
1415void TrackPropDlg::OnTrackPropRightClick(wxListEvent& event) {
1418 wxMenuItem* copyItem =
1419 menu.Append(ID_RCLK_MENU_COPY_TEXT, _(
"&Copy all as text"));
1424void TrackPropDlg::OnTrackPropListClick(wxListEvent& event) {
1430 m_lcPoints->GetNextItem(itemno, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
1434 selected_no = itemno;
1436 m_pTrack->m_HighlightedTrackPoint = -1;
1439 TrackPoint* prp = m_pTrack->GetPoint(itemno);
1441 m_pTrack->m_HighlightedTrackPoint = itemno;
1443 if (!(m_pTrack->m_bIsInLayer) && !(m_pTrack ==
g_pActiveTrack)) {
1444 m_nSelected = selected_no + 1;
1445 m_sdbBtmBtnsSizerSplit->Enable(
true);
1447 top_frame::Get()->JumpToPosition(prp->m_lat, prp->m_lon);
1449 if (m_lcPoints) m_lcPoints->SetFocus();
1453 if (selected_no == 0 || selected_no == m_pTrack->GetnPoints() - 1)
1454 m_sdbBtmBtnsSizerSplit->Enable(
false);
1457void TrackPropDlg::OnTrackPropMenuSelected(wxCommandEvent& event) {
1458 switch (event.GetId()) {
1459 case ID_RCLK_MENU_COPY_TEXT:
1460 OnTrackPropCopyTxtClick(event);
1465void TrackPropDlg::OnToRouteBtnClick(wxCommandEvent& event) {
1471void TrackPropDlg::OnExportBtnClick(wxCommandEvent& event) {
1472 wxString suggested_name = _(
"track");
1473 std::vector<Track*> list = {m_pTrack};
1474 if (m_pTrack->GetName() !=
"") suggested_name = m_pTrack->GetName();
1475 ExportGPXTracks(
this, &list, suggested_name);
1478void TrackPropDlg::m_hyperlinkContextMenu(wxMouseEvent& event) {
1479 m_pEditedLink = (wxHyperlinkCtrl*)event.GetEventObject();
1481 wxEVT_COMMAND_MENU_SELECTED,
1482 (wxObjectEventFunction)(wxEventFunction)&TrackPropDlg::PopupMenuHandler);
1483 m_scrolledWindowLinks->PopupMenu(
1484 m_menuLink, m_pEditedLink->GetPosition().x + event.GetPosition().x,
1485 m_pEditedLink->GetPosition().y + event.GetPosition().y);
1488void TrackPropDlg::PopupMenuHandler(wxCommandEvent& event) {
1489 switch (event.GetId()) {
1490 case ID_TRK_MENU_ADD:
1493 case ID_TRK_MENU_EDIT:
1496 case ID_TRK_MENU_DELETE:
1497 OnDeleteLink(event);
1504void TrackPropDlg::OnDeleteLink(wxCommandEvent& event) {
1505 wxString findurl = m_pEditedLink->GetURL();
1506 wxString findlabel = m_pEditedLink->GetLabel();
1508 wxWindowList kids = m_scrolledWindowLinks->GetChildren();
1509 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
1510 wxWindowListNode* node = kids.Item(i);
1511 wxWindow* win = node->GetData();
1513 auto link_win =
dynamic_cast<wxHyperlinkCtrl*
>(win);
1515 link_win->Disconnect(
1516 wxEVT_COMMAND_HYPERLINK,
1517 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick));
1518 link_win->Disconnect(
1520 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu));
1525 HyperlinkList* list = m_pTrack->m_TrackHyperlinkList;
1526 auto nodeToDelete = list->end();
1527 for (
auto it = list->begin(); it != list->end(); it++) {
1529 wxString Link = link->Link;
1530 wxString Descr = link->DescrText;
1531 if (Link == findurl &&
1532 (Descr == findlabel || (Link == findlabel && Descr ==
"")))
1535 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1536 m_scrolledWindowLinks, wxID_ANY, Descr, Link, wxDefaultPosition,
1537 wxDefaultSize, wxHL_DEFAULT_STYLE);
1538 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1539 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1541 ctrl->Connect(wxEVT_RIGHT_DOWN,
1542 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu),
1545 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1548 if (nodeToDelete != list->end()) list->erase(nodeToDelete);
1549 m_scrolledWindowLinks->InvalidateBestSize();
1550 m_scrolledWindowLinks->Layout();
1551 sbSizerLinks->Layout();
1555void TrackPropDlg::OnEditLink(wxCommandEvent& event) {
1556 wxString findurl = m_pEditedLink->GetURL();
1557 wxString findlabel = m_pEditedLink->GetLabel();
1560 LinkPropDlg->m_textCtrlLinkDescription->SetValue(findlabel);
1561 LinkPropDlg->m_textCtrlLinkUrl->SetValue(findurl);
1562 DimeControl(LinkPropDlg);
1563 LinkPropDlg->ShowWindowModalThenDo([
this, LinkPropDlg, findurl,
1564 findlabel](
int retcode) {
1565 if (retcode == wxID_OK) {
1566 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->size();
1567 HyperlinkList* list = m_pTrack->m_TrackHyperlinkList;
1569 if (NbrOfLinks > 0) {
1570 for (
auto it = list->begin(); it != list->end(); it++) {
1572 wxString Link = link->Link;
1573 wxString Descr = link->DescrText;
1574 if (Link == findurl &&
1575 (Descr == findlabel || (Link == findlabel && Descr ==
""))) {
1576 link->Link = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1578 LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1579 wxHyperlinkCtrl* h =
1580 (wxHyperlinkCtrl*)m_scrolledWindowLinks->FindWindowByLabel(
1583 h->SetLabel(LinkPropDlg->m_textCtrlLinkDescription->GetValue());
1584 h->SetURL(LinkPropDlg->m_textCtrlLinkUrl->GetValue());
1590 m_scrolledWindowLinks->InvalidateBestSize();
1591 m_scrolledWindowLinks->Layout();
1592 sbSizerLinks->Layout();
1598void TrackPropDlg::OnAddLink(wxCommandEvent& event) {
1600 LinkPropDlg->m_textCtrlLinkDescription->SetValue(
"");
1601 LinkPropDlg->m_textCtrlLinkUrl->SetValue(
"");
1602 DimeControl(LinkPropDlg);
1603 LinkPropDlg->ShowWindowModalThenDo([
this, LinkPropDlg](
int retcode) {
1604 if (retcode == wxID_OK) {
1605 wxString desc = LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1606 if (desc ==
"") desc = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1607 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1608 m_scrolledWindowLinks, wxID_ANY, desc,
1609 LinkPropDlg->m_textCtrlLinkUrl->GetValue(), wxDefaultPosition,
1610 wxDefaultSize, wxHL_DEFAULT_STYLE);
1611 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1612 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1614 ctrl->Connect(wxEVT_RIGHT_DOWN,
1615 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu),
1618 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1619 bSizerLinks->Fit(m_scrolledWindowLinks);
1623 h->DescrText = LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1624 h->Link = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1626 m_pTrack->m_TrackHyperlinkList->push_back(h);
1631 m_scrolledWindowLinks->InvalidateBestSize();
1632 m_scrolledWindowLinks->Layout();
1633 sbSizerLinks->Layout();
1638void TrackPropDlg::OnEditLinkToggle(wxCommandEvent& event) {
1639 if (m_toggleBtnEdit->GetValue())
1640 m_staticTextEditEnabled->SetLabel(_(
"Links are opened for editing."));
1642 m_staticTextEditEnabled->SetLabel(
1643 _(
"Links are opened in the default browser."));
1647void TrackPropDlg::OnHyperLinkClick(wxHyperlinkEvent& event) {
1648 if (m_toggleBtnEdit->GetValue()) {
1649 m_pEditedLink = (wxHyperlinkCtrl*)event.GetEventObject();
1664 wxString cc =
event.GetURL();
1665 if (cc.Find(
"#") != wxNOT_FOUND) {
1666 wxRegKey RegKey(wxString(
"HKEY_CLASSES_ROOT\\HTTP\\shell\\open\\command"));
1667 if (RegKey.Exists()) {
1668 wxString command_line;
1669 RegKey.QueryValue(wxString(
""), command_line);
1672 command_line.Replace(wxString(
"\""), wxString(
""));
1675 int l = command_line.Find(
".exe");
1676 if (wxNOT_FOUND == l) l = command_line.Find(
".EXE");
1678 if (wxNOT_FOUND != l) {
1679 wxString cl = command_line.Mid(0, l + 4);
1690 wxString url =
event.GetURL();
1691 url.Replace(
" ",
"%20");
1692 ::wxLaunchDefaultBrowser(url);
1697void TrackPropDlg::OnShowTimeTZ(wxCommandEvent& event) {
1698 if (m_rbShowTimeUTC && m_rbShowTimeUTC->GetValue())
1707 throw std::logic_error(
"Unexpected time zone selection");
1708 m_lcPoints->DeleteAllItems();
1712bool TrackPropDlg::SaveChanges() {
1713 if (m_pTrack && !m_pTrack->m_bIsInLayer) {
1715 m_pTrack->SetName(m_tName->GetValue());
1716 m_pTrack->m_TrackStartString = m_tFrom->GetValue();
1717 m_pTrack->m_TrackEndString = m_tTo->GetValue();
1719 m_pTrack->m_TrackDescription = m_tDescription->GetValue();
1720 m_pTrack->SetVisible(m_cbShow->GetValue());
1721 if (m_cColor->GetSelection() == 0)
1722 m_pTrack->m_Colour =
"";
1724 m_pTrack->m_Colour = ::GpxxColorNames[m_cColor->GetSelection() - 1];
1725 m_pTrack->m_style = (wxPenStyle)::StyleValues[m_cStyle->GetSelection()];
1726 m_pTrack->m_width = ::WidthValues[m_cWidth->GetSelection()];
1728 NavObj_dB::GetInstance().UpdateDBTrackAttributes(m_pTrack);
1733 if (m_pTrack && m_pTrack->IsRunning()) {
1735 v[
"Changed"] =
true;
1736 v[
"Name"] = m_pTrack->GetName();
1737 v[
"GUID"] = m_pTrack->m_GUID;
1738 SendJsonMessageToAllPlugins(
"OCPN_TRK_ACTIVATED", v);
1744void TrackPropDlg::OnOKBtnClick(wxCommandEvent& event) {
1751 if (b_found_track) {
1753 m_pTrack->ClearHighlights();
1756 m_bStartNow =
false;
1762 top_frame::Get()->InvalidateAllGL();
1763 top_frame::Get()->RefreshAllCanvas(
false);
1768void TrackPropDlg::OnCancelBtnClick(wxCommandEvent& event) {
1772 if (b_found_track) m_pTrack->ClearHighlights();
1775 top_frame::Get()->InvalidateAllGL();
1776 top_frame::Get()->RefreshAllCanvas(
false);
1785OCPNTrackListCtrl::OCPNTrackListCtrl(wxWindow* parent, wxWindowID
id,
1786 const wxPoint& pos,
const wxSize& size,
1788 : wxListCtrl(parent, id, pos, size, style) {
1794OCPNTrackListCtrl::~OCPNTrackListCtrl() {}
1797 if (m_pTrack->GetnPoints()) {
1799 if (prp)
return prp->m_lon;
1804wxString OCPNTrackListCtrl::OnGetItemText(
long item,
long column)
const {
1807 if (item < 0 || item >= m_pTrack->GetnPoints())
return "";
1809 TrackPoint* this_point = m_pTrack->GetPoint(item);
1810 TrackPoint* prev_point = item > 0 ? m_pTrack->GetPoint(item - 1) : NULL;
1812 if (!this_point)
return "";
1814 double gt_brg, gt_leg_dist;
1820 slat = prev_point->m_lat;
1821 slon = prev_point->m_lon;
1829 ret.Printf(
"%ld", item);
1833 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat, slon,
1834 >_brg, >_leg_dist);
1836 ret.Printf(
"%6.2f " + getUsrDistanceUnit(),
toUsrDistance(gt_leg_dist));
1840 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat, slon,
1841 >_brg, >_leg_dist);
1842 ret.Printf(
"%03.0f %cT", gt_brg, 0x00B0);
1846 ret = toSDMM(1, this_point->m_lat, 1);
1850 ret = toSDMM(2, this_point->m_lon, 1);
1855 if (timestamp.IsValid()) {
1860 ret = ocpn::toUsrDateTimeFormat(timestamp.FromUTC(), opts);
1868 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat,
1869 slon, >_brg, >_leg_dist);
1876 if (seconds > 0.) speed = gt_leg_dist / seconds * 3600;
1878 ret.Printf(
"%5.2f", toUsrSpeed(speed));
1890int OCPNTrackListCtrl::OnGetItemColumnImage(
long item,
long column)
const {
Generic Chart canvas base.
int m_tz_selection
The timezone to use when formatting date/time.
double getStartPointLongitude() const
Return the longitude at the start point of the track.
static PrintDialog & GetInstance()
Get instance to handle the print process,.
Represents a single point in a track.
wxDateTime GetCreateTime(void)
Retrieves the creation timestamp of a track point as a wxDateTime object.
Input dialog with track print selection.
Printout a table with track selected information.
wxRadioButton * m_rbShowTimeLocal
Use Local Mean Time (LMT) at the location to format date/time.
wxRadioButton * m_rbShowTimePC
Use system timezone to format date/time, i.e.
wxRadioButton * m_rbShowTimeGlobalSettings
Honor OpenCPN global setting to format date/time.
Represents a track, which is a series of connected track points.
std::vector< OCPN_MonitorInfo > g_monitor_info
Information about the monitors connected to the system.
wxFont * GetOCPNScaledFont(wxString item, int default_size)
Retrieves a font from FontMgr, optionally scaled for physical readability.
General purpose GUI support.
size_t g_current_monitor
Current monitor displaying main application frame.
Miscellaneous globals primarely used by gui layer, not persisted in configuration file.
MySQL based storage for routes, tracks, etc.
MyConfig * pConfig
Global instance.
double toUsrDistance(double nm_distance, int unit)
Convert a distance from nautical miles (NMi) to user display units.
Navigation Utility Functions without GUI dependencies.
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.
PlugInManager and helper classes – Mostly gui parts (dialogs) and plugin API stuff.
Generic, styled prit dialog.
#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#*/.
RouteManagerDialog * pRouteManagerDialog
Global instance.
Select * pSelect
Global instance.
Selected route, segment, waypoint, etc.
Abstract gFrame/MyFrame interface.
ActiveTrack * g_pActiveTrack
global instance
std::vector< Track * > g_TrackList
Global instance.
Recorded track abstraction.
#define LMTINPUT
Format date/time using Local Mean Time (LMT) at a given point./*#end#*/.
#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#*/.
TrackPropDlg * pTrackPropDialog
Global instance.