54#include "androidUTIL.h"
63#define GLOBAL_SETTINGS_INPUT 3
66#define DISPLAY_FORMAT 2
67#define TIMESTAMP_FORMAT 3
73bool TrackPropDlg::instanceFlag =
false;
75TrackPropDlg* TrackPropDlg::getInstance(wxWindow* parent, wxWindowID
id,
76 const wxString& title,
77 const wxPoint& pos,
const wxSize& size,
80 single =
new TrackPropDlg(parent,
id, title, pos, size, style);
88TrackPropDlg::TrackPropDlg(wxWindow* parent, wxWindowID
id,
89 const wxString& title,
const wxPoint& pos,
90 const wxSize& size,
long style)
91 : DIALOG_PARENT(parent, id, title, pos, size, style) {
95 SetWindowStyleFlag(style);
97 m_scrolledWindowLinks = NULL;
98 m_tDescription = NULL;
104 CreateControlsCompact();
114 m_sdbBtmBtnsSizerCancel->Connect(
115 wxEVT_COMMAND_BUTTON_CLICKED,
116 wxCommandEventHandler(TrackPropDlg::OnCancelBtnClick), NULL,
this);
117 m_sdbBtmBtnsSizerOK->Connect(
118 wxEVT_COMMAND_BUTTON_CLICKED,
119 wxCommandEventHandler(TrackPropDlg::OnOKBtnClick), NULL,
this);
120 if (m_sdbBtmBtnsSizerPrint)
121 m_sdbBtmBtnsSizerPrint->Connect(
122 wxEVT_COMMAND_BUTTON_CLICKED,
123 wxCommandEventHandler(TrackPropDlg::OnPrintBtnClick), NULL,
this);
124 m_sdbBtmBtnsSizerSplit->Connect(
125 wxEVT_COMMAND_BUTTON_CLICKED,
126 wxCommandEventHandler(TrackPropDlg::OnSplitBtnClick), NULL,
this);
127 m_sdbBtmBtnsSizerExtend->Connect(
128 wxEVT_COMMAND_BUTTON_CLICKED,
129 wxCommandEventHandler(TrackPropDlg::OnExtendBtnClick), NULL,
this);
130 m_sdbBtmBtnsSizerToRoute->Connect(
131 wxEVT_COMMAND_BUTTON_CLICKED,
132 wxCommandEventHandler(TrackPropDlg::OnToRouteBtnClick), NULL,
this);
133 if (m_sdbBtmBtnsSizerExport)
134 m_sdbBtmBtnsSizerExport->Connect(
135 wxEVT_COMMAND_BUTTON_CLICKED,
136 wxCommandEventHandler(TrackPropDlg::OnExportBtnClick), NULL,
this);
137 m_lcPoints->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
138 wxListEventHandler(TrackPropDlg::OnTrackPropListClick),
140 Connect(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
141 wxListEventHandler(TrackPropDlg::OnTrackPropRightClick), NULL,
this);
142 Connect(wxEVT_COMMAND_MENU_SELECTED,
143 wxCommandEventHandler(TrackPropDlg::OnTrackPropMenuSelected), NULL,
147 Connect(wxEVT_ACTIVATE, wxActivateEventHandler(TrackPropDlg::OnActivate),
152 m_buttonAddLink->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
153 wxCommandEventHandler(TrackPropDlg::OnAddLink),
155 m_toggleBtnEdit->Connect(
156 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
157 wxCommandEventHandler(TrackPropDlg::OnEditLinkToggle), NULL,
this);
161 m_rbShowTimeUTC->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED,
162 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ),
165 m_rbShowTimePC->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED,
166 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ),
168 if (m_rbShowTimeLocal)
169 m_rbShowTimeLocal->Connect(
170 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
171 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
173 if (m_rbShowTimeGlobalSettings)
174 m_rbShowTimeGlobalSettings->Connect(
175 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
176 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
178 m_pMyLinkList = NULL;
181TrackPropDlg::~TrackPropDlg() {
183 m_sdbBtmBtnsSizerCancel->Disconnect(
184 wxEVT_COMMAND_BUTTON_CLICKED,
185 wxCommandEventHandler(TrackPropDlg::OnCancelBtnClick), NULL,
this);
186 m_sdbBtmBtnsSizerOK->Disconnect(
187 wxEVT_COMMAND_BUTTON_CLICKED,
188 wxCommandEventHandler(TrackPropDlg::OnOKBtnClick), NULL,
this);
189 if (m_sdbBtmBtnsSizerPrint)
190 m_sdbBtmBtnsSizerPrint->Disconnect(
191 wxEVT_COMMAND_BUTTON_CLICKED,
192 wxCommandEventHandler(TrackPropDlg::OnPrintBtnClick), NULL,
this);
193 m_sdbBtmBtnsSizerSplit->Disconnect(
194 wxEVT_COMMAND_BUTTON_CLICKED,
195 wxCommandEventHandler(TrackPropDlg::OnSplitBtnClick), NULL,
this);
196 m_sdbBtmBtnsSizerExtend->Disconnect(
197 wxEVT_COMMAND_BUTTON_CLICKED,
198 wxCommandEventHandler(TrackPropDlg::OnExtendBtnClick), NULL,
this);
199 m_sdbBtmBtnsSizerToRoute->Disconnect(
200 wxEVT_COMMAND_BUTTON_CLICKED,
201 wxCommandEventHandler(TrackPropDlg::OnToRouteBtnClick), NULL,
this);
202 if (m_sdbBtmBtnsSizerExport)
203 m_sdbBtmBtnsSizerExport->Disconnect(
204 wxEVT_COMMAND_BUTTON_CLICKED,
205 wxCommandEventHandler(TrackPropDlg::OnExportBtnClick), NULL,
this);
206 m_lcPoints->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
207 wxListEventHandler(TrackPropDlg::OnTrackPropListClick),
209 Disconnect(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
210 wxListEventHandler(TrackPropDlg::OnTrackPropRightClick), NULL,
212 Disconnect(wxEVT_COMMAND_MENU_SELECTED,
213 wxCommandEventHandler(TrackPropDlg::OnTrackPropMenuSelected), NULL,
216 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
217 wxCommandEventHandler(TrackPropDlg::OnDeleteLink));
218 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
219 wxCommandEventHandler(TrackPropDlg::OnEditLink));
220 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
221 wxCommandEventHandler(TrackPropDlg::OnAddLink));
224 m_buttonAddLink->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED,
225 wxCommandEventHandler(TrackPropDlg::OnAddLink),
227 m_toggleBtnEdit->Disconnect(
228 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
229 wxCommandEventHandler(TrackPropDlg::OnEditLinkToggle), NULL,
this);
233 m_rbShowTimeUTC->Disconnect(
234 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
235 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
238 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
239 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
242 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
243 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
246 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
247 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
249 instanceFlag =
false;
252static wxString getDatetimeTimezoneSelector(
int selection) {
266void TrackPropDlg::OnActivate(wxActivateEvent& event) {
267 auto pWin =
dynamic_cast<DIALOG_PARENT*
>(
event.GetEventObject());
268 long int style = pWin->GetWindowStyle();
269 if (event.GetActive())
270 pWin->SetWindowStyle(style | wxSTAY_ON_TOP);
272 pWin->SetWindowStyle(style ^ wxSTAY_ON_TOP);
275void TrackPropDlg::RecalculateSize() {
279 esize.x = GetCharWidth() * 110;
280 esize.y = GetCharHeight() * 40;
282 wxSize dsize = GetParent()->GetClientSize();
283 esize.y = wxMin(esize.y, dsize.y - (2 * GetCharHeight()));
284 esize.x = wxMin(esize.x, dsize.x - (2 * GetCharHeight()));
285 SetClientSize(esize);
287 wxSize fsize = GetSize();
288 fsize.y = wxMin(fsize.y, dsize.y - (2 * GetCharHeight()));
289 fsize.x = wxMin(fsize.x, dsize.x - (2 * GetCharHeight()));
293 int sy = GetCharHeight() * m_lcPoints->GetItemCount();
296 m_lcPoints->SetSize(wxSize(GetClientSize().x - 40, sy));
298 if (m_lcPoints->GetItemCount()) Layout();
304static void addColumns(wxListCtrl* lctrl,
int dx) {
305 lctrl->InsertColumn(0, _(
"Leg"), wxLIST_FORMAT_LEFT, dx * 6);
306 lctrl->InsertColumn(1, _(
"Distance"), wxLIST_FORMAT_LEFT, dx * 11);
307 lctrl->InsertColumn(2, _(
"Bearing"), wxLIST_FORMAT_LEFT, dx * 8);
309 lctrl->InsertColumn(3, _(
"Latitude"), wxLIST_FORMAT_LEFT, dx * 15);
310 lctrl->InsertColumn(4, _(
"Longitude"), wxLIST_FORMAT_LEFT, dx * 15);
313 lctrl->InsertColumn(5, _(
"Timestamp"), wxLIST_FORMAT_LEFT, dx * 26);
314 lctrl->InsertColumn(6, _(
"Speed"), wxLIST_FORMAT_CENTER, dx * 8);
316 lctrl->SetMinSize(wxSize(-1, 50));
319void TrackPropDlg::CreateControlsCompact() {
320 wxBoxSizer* itemBoxSizer1 =
new wxBoxSizer(wxVERTICAL);
321 SetSizer(itemBoxSizer1);
323 itemDialog1 =
new wxScrolledWindow(
this, wxID_ANY, wxDefaultPosition,
324 wxSize(-1, -1), wxVSCROLL);
325 itemDialog1->SetScrollRate(0, 1);
331 wxString wqs = getFontQtStylesheet(qFont);
332 wxCharBuffer sbuf = wqs.ToUTF8();
333 QString qsb = QString(sbuf.data());
335 QString qsbq = getQtStyleSheet();
337 itemDialog1->GetHandle()->setStyleSheet(qsb +
341 itemBoxSizer1->Add(itemDialog1, 1, wxEXPAND | wxALL, 0);
343 wxBoxSizer* itemBoxSizer2 =
new wxBoxSizer(wxVERTICAL);
344 itemDialog1->SetSizer(itemBoxSizer2);
346 wxStaticText* itemStaticText4 =
new wxStaticText(
347 itemDialog1, wxID_STATIC, _(
"Name"), wxDefaultPosition, wxDefaultSize, 0);
348 itemBoxSizer2->Add(itemStaticText4, 0,
349 wxALIGN_LEFT | wxLEFT | wxRIGHT | wxTOP, 5);
351 m_tName =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
353 itemBoxSizer2->Add(m_tName, 0, wxALIGN_LEFT | wxLEFT | wxRIGHT | wxBOTTOM, 5);
355 wxStaticText* itemStaticText7 =
356 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Depart From"),
357 wxDefaultPosition, wxDefaultSize, 0);
358 itemBoxSizer2->Add(itemStaticText7, 0,
359 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
362 m_tFrom =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
364 itemBoxSizer2->Add(m_tFrom, 0,
365 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
366 wxLEFT | wxRIGHT | wxBOTTOM,
369 wxStaticText* itemStaticText8 =
370 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Destination"),
371 wxDefaultPosition, wxDefaultSize, 0);
372 itemBoxSizer2->Add(itemStaticText8, 0,
373 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
376 m_tTo =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
378 itemBoxSizer2->Add(m_tTo, 0,
379 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
380 wxLEFT | wxRIGHT | wxBOTTOM,
383 m_cbShow =
new wxCheckBox(itemDialog1, wxID_ANY, _(
"Show on chart"),
384 wxDefaultPosition, wxDefaultSize, 0);
385 itemBoxSizer2->Add(m_cbShow, 0, wxALL, 5);
387 wxFlexGridSizer* itemFlexGridSizer6a =
new wxFlexGridSizer(4, 2, 0, 0);
388 itemFlexGridSizer6a->AddGrowableCol(1, 0);
390 itemBoxSizer2->Add(itemFlexGridSizer6a, 0, wxEXPAND | wxALIGN_LEFT | wxALL,
393 wxStaticText* itemStaticText11 =
394 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Total distance"),
395 wxDefaultPosition, wxDefaultSize, 0);
396 itemFlexGridSizer6a->Add(
398 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
400 m_tTotDistance =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
401 wxSize(-1, -1), wxTE_READONLY);
402 itemFlexGridSizer6a->Add(m_tTotDistance, 0,
403 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
404 wxLEFT | wxRIGHT | wxBOTTOM,
407 m_stAvgSpeed =
new wxStaticText(itemDialog1, wxID_STATIC, _(
"Avg. speed"),
408 wxDefaultPosition, wxDefaultSize, 0);
409 itemFlexGridSizer6a->Add(
411 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
413 m_tAvgSpeed =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
414 wxSize(150, -1), wxTE_PROCESS_ENTER);
415 itemFlexGridSizer6a->Add(
417 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
420 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Time Enroute"),
421 wxDefaultPosition, wxDefaultSize, 0);
422 itemFlexGridSizer6a->Add(
424 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
426 m_tTimeEnroute =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
427 wxSize(-1, -1), wxTE_READONLY);
428 itemFlexGridSizer6a->Add(m_tTimeEnroute, 0,
429 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
430 wxLEFT | wxRIGHT | wxBOTTOM,
447 wxString pDispTimeZone[] = {_(
"UTC"), _(
"Local Time"), _(
"LMT@Location"),
448 _(
"Honor Global Settings")};
450 wxStaticText* itemStaticText12b =
451 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Time shown as"),
452 wxDefaultPosition, wxDefaultSize, 0);
453 itemBoxSizer2->Add(itemStaticText12b, 0, wxEXPAND | wxALL, 5);
456 new wxRadioButton(itemDialog1, wxID_ANY, _(
"UTC"), wxDefaultPosition,
457 wxDefaultSize, wxRB_GROUP);
460 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
462 m_rbShowTimePC =
new wxRadioButton(itemDialog1, wxID_ANY, _(
"Local Time"));
465 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
468 new wxRadioButton(itemDialog1, wxID_ANY, _(
"LMT@Location"));
471 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
474 new wxRadioButton(itemDialog1, wxID_ANY, _(
"Honor Global Settings"));
477 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
479 wxFlexGridSizer* itemFlexGridSizer6b =
new wxFlexGridSizer(3, 2, 0, 0);
480 itemBoxSizer2->Add(itemFlexGridSizer6b, 0, wxEXPAND | wxALIGN_LEFT | wxALL,
483 wxStaticText* m_staticText1 =
484 new wxStaticText(itemDialog1, wxID_ANY, _(
"Color") +
":",
485 wxDefaultPosition, wxDefaultSize, 0);
486 itemFlexGridSizer6b->Add(m_staticText1, 0, wxALIGN_CENTER_VERTICAL | wxALL,
489 wxString m_chColorChoices[] = {
490 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
491 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
492 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
493 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
495 int m_chColorNChoices =
sizeof(m_chColorChoices) /
sizeof(wxString);
497 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxSize(250, -1),
498 m_chColorNChoices, m_chColorChoices, 0);
499 m_cColor->SetSelection(0);
500 itemFlexGridSizer6b->Add(m_cColor, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
502 wxStaticText* staticTextStyle =
503 new wxStaticText(itemDialog1, wxID_ANY, _(
"Style") +
":",
504 wxDefaultPosition, wxDefaultSize, 0);
505 itemFlexGridSizer6b->Add(staticTextStyle, 0, wxALIGN_CENTER_VERTICAL | wxALL,
508 wxString m_chStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
509 _(
"Long dash"), _(
"Short dash")};
510 int m_chStyleNChoices =
sizeof(m_chStyleChoices) /
sizeof(wxString);
512 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxDefaultSize,
513 m_chStyleNChoices, m_chStyleChoices, 0);
514 m_cStyle->SetSelection(0);
515 itemFlexGridSizer6b->Add(m_cStyle, 0,
516 wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 5);
519 staticTextStyle->Hide();
523 m_stWidth =
new wxStaticText(itemDialog1, wxID_ANY, _(
"Width") +
":",
524 wxDefaultPosition, wxDefaultSize, 0);
525 itemFlexGridSizer6b->Add(m_stWidth, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
527 wxString m_chWidthChoices[] = {_(
"Default"), _(
"1 pixel"), _(
"2 pixels"),
528 _(
"3 pixels"), _(
"4 pixels"), _(
"5 pixels"),
529 _(
"6 pixels"), _(
"7 pixels"), _(
"8 pixels"),
530 _(
"9 pixels"), _(
"10 pixels")};
531 int m_chWidthNChoices =
sizeof(m_chWidthChoices) /
sizeof(wxString);
533 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxSize(150, -1),
534 m_chWidthNChoices, m_chWidthChoices, 0);
535 m_cWidth->SetSelection(0);
536 itemFlexGridSizer6b->Add(m_cWidth, 0,
537 wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 5);
539 wxStaticBox* itemStaticBoxSizer14Static =
540 new wxStaticBox(itemDialog1, wxID_ANY, _(
"Waypoints"));
541 wxStaticBoxSizer* m_pListSizer =
542 new wxStaticBoxSizer(itemStaticBoxSizer14Static, wxVERTICAL);
543 itemBoxSizer2->Add(m_pListSizer, 1, wxEXPAND | wxALL, 1);
545 wxScrolledWindow* itemlistWin =
546 new wxScrolledWindow(itemDialog1, wxID_ANY, wxDefaultPosition,
547 wxDefaultSize, wxHSCROLL | wxVSCROLL);
548 itemlistWin->SetScrollRate(2, 2);
550 m_pListSizer->Add(itemlistWin, 0, wxEXPAND | wxALL, 6);
552 long flags = wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_EDIT_LABELS;
554 flags |= wxLC_VIRTUAL;
558 wxSize(100, 500), flags);
559 addColumns(m_lcPoints, GetCharWidth());
564 m_lcPoints->GetHandle()->setStyleSheet(getQtStyleSheet());
569 wxBoxSizer* itemBoxSizerBottom =
new wxBoxSizer(wxVERTICAL);
570 itemBoxSizer1->Add(itemBoxSizerBottom, 0, wxALIGN_LEFT | wxALL | wxEXPAND, 5);
574 wxFlexGridSizer* itemBoxSizerAux =
new wxFlexGridSizer(0, n_col, 0, 0);
575 itemBoxSizerAux->SetFlexibleDirection(wxBOTH);
576 itemBoxSizerAux->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
578 itemBoxSizerBottom->Add(itemBoxSizerAux, 1, wxALIGN_LEFT | wxALL, 5);
582 m_sdbBtmBtnsSizerPrint =
new wxButton(
this, wxID_ANY, _(
"Print"),
583 wxDefaultPosition, wxDefaultSize, 0);
584 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerPrint, 0,
585 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
586 m_sdbBtmBtnsSizerPrint->Enable(
true);
588 m_sdbBtmBtnsSizerPrint = NULL;
591 m_sdbBtmBtnsSizerSplit =
new wxButton(
this, wxID_ANY, _(
"Split"),
592 wxDefaultPosition, wxDefaultSize, 0);
593 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerSplit, 0,
594 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
595 m_sdbBtmBtnsSizerSplit->Enable(
false);
597 m_sdbBtmBtnsSizerExtend =
new wxButton(
this, wxID_ANY, _(
"Extend"),
598 wxDefaultPosition, wxDefaultSize, 0);
599 m_sdbBtmBtnsSizerExtend->SetToolTip(
600 _(
"Extends this track by connecting it to another track.\n"
601 "Disabled when the track is active, the track is in a layer, or no "
602 "suitable track to connect to exists.\n"
603 "A suitable track is one that is visible, is different from this "
604 "track, and has its last point's timestamp earlier than or equal to "
605 "this track's first point's timestamp."));
606 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExtend, 0,
607 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
609 m_sdbBtmBtnsSizerToRoute =
new wxButton(
this, wxID_ANY, _(
"To route"),
610 wxDefaultPosition, wxDefaultSize, 0);
611 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerToRoute, 0,
612 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
614 m_sdbBtmBtnsSizerExport = NULL;
620 wxBoxSizer* itemBoxSizer16 =
new wxBoxSizer(wxHORIZONTAL);
621 itemBoxSizerBottom->Add(itemBoxSizer16, 0, wxALIGN_RIGHT | wxALL, 5);
623 m_sdbBtmBtnsSizerCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"),
624 wxDefaultPosition, wxDefaultSize, 0);
625 itemBoxSizer16->Add(m_sdbBtmBtnsSizerCancel, 0,
626 wxALIGN_RIGHT | wxALIGN_BOTTOM | wxALL, 5);
628 m_sdbBtmBtnsSizerOK =
629 new wxButton(
this, wxID_OK, _(
"OK"), wxDefaultPosition, wxDefaultSize, 0);
630 itemBoxSizer16->Add(m_sdbBtmBtnsSizerOK, 0,
631 wxALIGN_RIGHT | wxALIGN_BOTTOM | wxALL, 5);
632 m_sdbBtmBtnsSizerOK->SetDefault();
634 int char_size = GetCharWidth();
639 SetSizeHints(-1, -1, width - 100, height - 100);
642void TrackPropDlg::CreateControls() {
643 wxBoxSizer* bSizerMain;
644 bSizerMain =
new wxBoxSizer(wxVERTICAL);
645 SetSizer(bSizerMain);
648 new wxNotebook(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0);
650 bSizerMain->Add(m_notebook1, 1, wxEXPAND | wxALL, 5);
653 new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize);
654 m_notebook1->AddPage(m_panel0, _(
"Basic"),
true);
656 wxBoxSizer* bSizer0 =
new wxBoxSizer(wxVERTICAL);
657 m_panel0->SetSizer(bSizer0);
659 wxBoxSizer* bSizer1 =
new wxBoxSizer(wxVERTICAL);
660 bSizer0->Add(bSizer1, 1, wxEXPAND | wxALL, 5);
662 m_panelBasic =
new wxScrolledWindow(m_panel0, wxID_ANY, wxDefaultPosition,
664 wxHSCROLL | wxVSCROLL | wxTAB_TRAVERSAL);
670 wxString wqs = getFontQtStylesheet(qFont);
671 wxCharBuffer sbuf = wqs.ToUTF8();
672 QString qsb = QString(sbuf.data());
674 QString qsbq = getQtStyleSheet();
676 m_panelBasic->GetHandle()->setStyleSheet(qsb +
685 wxBoxSizer* bSizerBasic =
new wxBoxSizer(wxVERTICAL);
686 m_panelBasic->SetSizer(bSizerBasic);
688 bSizer1->Add(m_panelBasic, 1, wxEXPAND | wxALL, 5);
690 wxBoxSizer* bSizerName;
691 bSizerName =
new wxBoxSizer(wxHORIZONTAL);
692 bSizerBasic->Add(bSizerName, 0, wxALL | wxEXPAND, 5);
694 m_stName =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Name"),
695 wxDefaultPosition, wxDefaultSize, 0);
697 bSizerName->Add(m_stName, 0, wxALL, 5);
699 m_tName =
new wxTextCtrl(m_panelBasic, wxID_ANY,
"", wxDefaultPosition,
701 bSizerName->Add(m_tName, 1, 0, 5);
703 wxBoxSizer* bSizerFromTo;
704 bSizerFromTo =
new wxBoxSizer(wxHORIZONTAL);
705 bSizerBasic->Add(bSizerFromTo, 0, wxALL | wxEXPAND, 5);
707 m_stFrom =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"From"),
708 wxDefaultPosition, wxDefaultSize, 0);
710 bSizerFromTo->Add(m_stFrom, 0, wxALL, 5);
712 m_tFrom =
new wxTextCtrl(m_panelBasic, wxID_ANY,
"", wxDefaultPosition,
714 bSizerFromTo->Add(m_tFrom, 1, 0, 5);
716 m_stTo =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"To"), wxDefaultPosition,
719 bSizerFromTo->Add(m_stTo, 0, wxALL, 5);
721 m_tTo =
new wxTextCtrl(m_panelBasic, wxID_ANY,
"", wxDefaultPosition,
723 bSizerFromTo->Add(m_tTo, 1, 0, 5);
725 wxStaticBoxSizer* sbSizerParams;
726 sbSizerParams =
new wxStaticBoxSizer(
727 new wxStaticBox(m_panelBasic, wxID_ANY, _(
"Display parameters")),
729 bSizerBasic->Add(sbSizerParams, 0, wxALL | wxEXPAND, 5);
731 m_cbShow =
new wxCheckBox(m_panelBasic, wxID_ANY, _(
"Show on chart"),
732 wxDefaultPosition, wxDefaultSize, 0);
733 sbSizerParams->Add(m_cbShow, 0, wxALL, 5);
735 m_stColor =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Color"),
736 wxDefaultPosition, wxDefaultSize, 0);
738 sbSizerParams->Add(m_stColor, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
740 wxString m_cColorChoices[] = {
741 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
742 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
743 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
744 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
746 int m_cColorNChoices =
sizeof(m_cColorChoices) /
sizeof(wxString);
747 m_cColor =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
748 wxDefaultSize, m_cColorNChoices, m_cColorChoices, 0);
749 m_cColor->SetSelection(0);
750 sbSizerParams->Add(m_cColor, 1, 0, 5);
752 m_stStyle =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Style"),
753 wxDefaultPosition, wxDefaultSize, 0);
755 sbSizerParams->Add(m_stStyle, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
757 wxString m_cStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
758 _(
"Long dash"), _(
"Short dash")};
759 int m_cStyleNChoices =
sizeof(m_cStyleChoices) /
sizeof(wxString);
760 m_cStyle =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
761 wxDefaultSize, m_cStyleNChoices, m_cStyleChoices, 0);
762 m_cStyle->SetSelection(0);
763 sbSizerParams->Add(m_cStyle, 1, 0, 5);
765 m_stWidth =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Width"),
766 wxDefaultPosition, wxDefaultSize, 0);
768 sbSizerParams->Add(m_stWidth, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
770 wxString m_cWidthChoices[] = {_(
"Default"), _(
"1 pixel"), _(
"2 pixels"),
771 _(
"3 pixels"), _(
"4 pixels"), _(
"5 pixels"),
772 _(
"6 pixels"), _(
"7 pixels"), _(
"8 pixels"),
773 _(
"9 pixels"), _(
"10 pixels")};
774 int m_cWidthNChoices =
sizeof(m_cWidthChoices) /
sizeof(wxString);
775 m_cWidth =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
776 wxDefaultSize, m_cWidthNChoices, m_cWidthChoices, 0);
777 m_cWidth->SetSelection(0);
778 sbSizerParams->Add(m_cWidth, 1, 0, 5);
780 wxStaticBoxSizer* sbSizerStats;
781 sbSizerStats =
new wxStaticBoxSizer(
782 new wxStaticBox(m_panelBasic, wxID_ANY, _(
"Statistics")), wxVERTICAL);
783 bSizerBasic->Add(sbSizerStats, 0, wxALL | wxEXPAND, 5);
785 wxBoxSizer* bSizerStats;
786 bSizerStats =
new wxBoxSizer(wxHORIZONTAL);
789 new wxStaticText(m_panelBasic, wxID_ANY, _(
"Total distance"),
790 wxDefaultPosition, wxDefaultSize, 0);
792 bSizerStats->Add(m_stTotDistance, 0, wxALL, 5);
794 m_tTotDistance =
new wxTextCtrl(m_panelBasic, wxID_ANY,
"", wxDefaultPosition,
795 wxDefaultSize, wxTE_READONLY);
796 bSizerStats->Add(m_tTotDistance, 1, 0, 5);
798 m_stAvgSpeed =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Avg. speed"),
799 wxDefaultPosition, wxDefaultSize, 0);
801 bSizerStats->Add(m_stAvgSpeed, 0, wxALL, 5);
803 m_tAvgSpeed =
new wxTextCtrl(m_panelBasic, wxID_ANY,
"", wxDefaultPosition,
804 wxDefaultSize, wxTE_READONLY);
805 bSizerStats->Add(m_tAvgSpeed, 1, 0, 5);
807 m_stTimeEnroute =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Time enroute"),
808 wxDefaultPosition, wxDefaultSize, 0);
810 bSizerStats->Add(m_stTimeEnroute, 0, wxALL, 5);
812 m_tTimeEnroute =
new wxTextCtrl(m_panelBasic, wxID_ANY,
"", wxDefaultPosition,
813 wxDefaultSize, wxTE_READONLY);
814 bSizerStats->Add(m_tTimeEnroute, 2, 0, 5);
816 sbSizerStats->Add(bSizerStats, 0, wxEXPAND, 5);
818 wxStaticBoxSizer* sbSizerPoints;
819 sbSizerPoints =
new wxStaticBoxSizer(
820 new wxStaticBox(m_panel0, wxID_ANY, _(
"Recorded points")), wxVERTICAL);
821 bSizer1->Add(sbSizerPoints, 1, wxALL | wxEXPAND, 5);
823 wxBoxSizer* bSizerShowTime;
824 bSizerShowTime =
new wxBoxSizer(wxHORIZONTAL);
826 m_stShowTime =
new wxStaticText(m_panel0, wxID_ANY, _(
"Time shown as"),
827 wxDefaultPosition, wxDefaultSize, 0);
829 bSizerShowTime->Add(m_stShowTime, 0, wxALL, 5);
831 m_rbShowTimeUTC =
new wxRadioButton(m_panel0, wxID_ANY, _(
"UTC"),
832 wxDefaultPosition, wxDefaultSize, 0);
833 bSizerShowTime->Add(m_rbShowTimeUTC, 0,
834 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
837 m_rbShowTimePC =
new wxRadioButton(m_panel0, wxID_ANY, _(
"Local Time"),
838 wxDefaultPosition, wxDefaultSize, 0);
840 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
844 new wxRadioButton(m_panel0, wxID_ANY, _(
"LMT@Track Start"),
845 wxDefaultPosition, wxDefaultSize, 0);
847 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
851 new wxRadioButton(m_panel0, wxID_ANY, _(
"Honor Global Settings"),
852 wxDefaultPosition, wxDefaultSize, 0);
854 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
859 sbSizerPoints->Add(bSizerShowTime, 0, wxEXPAND, 5);
861 long flags = wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_EDIT_LABELS;
863 flags |= wxLC_VIRTUAL;
867 wxDefaultSize, flags);
868 addColumns(m_lcPoints, GetCharWidth());
870 sbSizerPoints->Add(m_lcPoints, 1, wxALL | wxEXPAND, 5);
873 m_lcPoints->GetHandle()->setStyleSheet(getQtStyleSheet());
887 m_panelAdvanced =
new wxScrolledWindow(
888 m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
890 wxBoxSizer* bSizerAdvanced;
891 bSizerAdvanced =
new wxBoxSizer(wxVERTICAL);
894 new wxStaticText(m_panelAdvanced, wxID_ANY, _(
"Description"),
895 wxDefaultPosition, wxDefaultSize, 0);
897 bSizerAdvanced->Add(m_stDescription, 0, wxALL, 5);
900 new wxTextCtrl(m_panelAdvanced, wxID_ANY,
"", wxDefaultPosition,
901 wxDefaultSize, wxTE_MULTILINE);
902 bSizerAdvanced->Add(m_tDescription, 1, wxALL | wxEXPAND, 5);
904 sbSizerLinks =
new wxStaticBoxSizer(
905 new wxStaticBox(m_panelAdvanced, wxID_ANY, _(
"Links")), wxVERTICAL);
907 m_scrolledWindowLinks =
908 new wxScrolledWindow(m_panelAdvanced, wxID_ANY, wxDefaultPosition,
909 wxDefaultSize, wxHSCROLL | wxVSCROLL);
910 m_scrolledWindowLinks->SetScrollRate(5, 5);
911 bSizerLinks =
new wxBoxSizer(wxVERTICAL);
914 new wxHyperlinkCtrl(m_scrolledWindowLinks, wxID_ANY, _(
"wxFB Website"),
915 "http://www.wxformbuilder.org", wxDefaultPosition,
916 wxDefaultSize, wxHL_DEFAULT_STYLE);
917 m_menuLink =
new wxMenu();
918 m_menuItemEdit =
new wxMenuItem(m_menuLink, ID_TRK_MENU_EDIT,
919 wxString(_(
"Edit")),
"", wxITEM_NORMAL);
920 m_menuLink->Append(m_menuItemEdit);
922 m_menuItemAdd =
new wxMenuItem(m_menuLink, ID_TRK_MENU_ADD,
923 wxString(_(
"Add new")),
"", wxITEM_NORMAL);
924 m_menuLink->Append(m_menuItemAdd);
926 m_menuItemDelete =
new wxMenuItem(m_menuLink, ID_TRK_MENU_DELETE,
927 wxString(_(
"Delete")),
"", wxITEM_NORMAL);
928 m_menuLink->Append(m_menuItemDelete);
930 m_hyperlink1->Connect(
932 wxMouseEventHandler(TrackPropDlg::m_hyperlink1OnContextMenu), NULL,
this);
934 bSizerLinks->Add(m_hyperlink1, 0, wxALL, 5);
936 m_scrolledWindowLinks->SetSizer(bSizerLinks);
937 m_scrolledWindowLinks->Layout();
938 bSizerLinks->Fit(m_scrolledWindowLinks);
939 sbSizerLinks->Add(m_scrolledWindowLinks, 1, wxEXPAND | wxALL, 5);
941 wxBoxSizer* bSizerLinkBtns;
942 bSizerLinkBtns =
new wxBoxSizer(wxHORIZONTAL);
945 new wxButton(m_panelAdvanced, wxID_ANY, _(
"Add"), wxDefaultPosition,
946 wxDefaultSize, wxBU_EXACTFIT);
947 bSizerLinkBtns->Add(m_buttonAddLink, 0, wxALL, 5);
949 m_toggleBtnEdit =
new wxToggleButton(m_panelAdvanced, wxID_ANY, _(
"Edit"),
950 wxDefaultPosition, wxDefaultSize, 0);
951 bSizerLinkBtns->Add(m_toggleBtnEdit, 0, wxALL, 5);
953 m_staticTextEditEnabled =
new wxStaticText(
954 m_panelAdvanced, wxID_ANY, _(
"Links are opened in the default browser."),
955 wxDefaultPosition, wxDefaultSize, 0);
957 bSizerLinkBtns->Add(m_staticTextEditEnabled, 0,
958 wxALIGN_CENTER_VERTICAL | wxALL, 5);
960 sbSizerLinks->Add(bSizerLinkBtns, 0, wxEXPAND, 5);
962 bSizerAdvanced->Add(sbSizerLinks, 1, wxEXPAND, 5);
964 m_panelAdvanced->SetSizer(bSizerAdvanced);
965 m_notebook1->AddPage(m_panelAdvanced, _(
"Advanced"),
false);
969 wxBoxSizer* itemBoxSizerBottom =
new wxBoxSizer(wxVERTICAL);
970 bSizerMain->Add(itemBoxSizerBottom, 0, wxALIGN_LEFT | wxALL | wxEXPAND, 5);
976 wxFlexGridSizer* itemBoxSizerAux =
new wxFlexGridSizer(0, n_col, 0, 0);
977 itemBoxSizerAux->SetFlexibleDirection(wxBOTH);
978 itemBoxSizerAux->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
980 itemBoxSizerBottom->Add(itemBoxSizerAux, 1, wxALIGN_LEFT | wxALL, 5);
984 m_sdbBtmBtnsSizerPrint =
new wxButton(
this, wxID_ANY, _(
"Print"),
985 wxDefaultPosition, wxDefaultSize, 0);
986 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerPrint, 0,
987 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
988 m_sdbBtmBtnsSizerPrint->Enable(
true);
990 m_sdbBtmBtnsSizerPrint = NULL;
993 m_sdbBtmBtnsSizerSplit =
new wxButton(
this, wxID_ANY, _(
"Split"),
994 wxDefaultPosition, wxDefaultSize, 0);
995 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerSplit, 0,
996 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
997 m_sdbBtmBtnsSizerSplit->Enable(
false);
999 m_sdbBtmBtnsSizerExtend =
new wxButton(
this, wxID_ANY, _(
"Extend track"),
1000 wxDefaultPosition, wxDefaultSize, 0);
1001 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExtend, 0,
1002 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1004 m_sdbBtmBtnsSizerToRoute =
new wxButton(
this, wxID_ANY, _(
"To route"),
1005 wxDefaultPosition, wxDefaultSize, 0);
1006 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerToRoute, 0,
1007 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1009 m_sdbBtmBtnsSizerExport =
new wxButton(
this, wxID_ANY, _(
"Export"),
1010 wxDefaultPosition, wxDefaultSize, 0);
1011 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExport, 0,
1012 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1014 wxBoxSizer* itemBoxSizer16 =
new wxBoxSizer(wxHORIZONTAL);
1015 itemBoxSizerBottom->Add(itemBoxSizer16, 0, wxALIGN_RIGHT | wxALL, 5);
1017 m_sdbBtmBtnsSizerCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"),
1018 wxDefaultPosition, wxDefaultSize, 0);
1019 itemBoxSizer16->Add(m_sdbBtmBtnsSizerCancel, 0, wxALIGN_BOTTOM | wxALL, 5);
1021 m_sdbBtmBtnsSizerOK =
1022 new wxButton(
this, wxID_OK, _(
"OK"), wxDefaultPosition, wxDefaultSize, 0);
1023 itemBoxSizer16->Add(m_sdbBtmBtnsSizerOK, 0, wxALIGN_BOTTOM | wxALL, 5);
1024 m_sdbBtmBtnsSizerOK->SetDefault();
1028 ((wxWindowBase*)m_stName)->GetSize(&w1, &h);
1029 ((wxWindowBase*)m_stFrom)->GetSize(&w2, &h);
1030 ((wxWindowBase*)m_stName)->SetMinSize(wxSize(wxMax(w1, w2), h));
1031 ((wxWindowBase*)m_stFrom)->SetMinSize(wxSize(wxMax(w1, w2), h));
1033 m_panelBasic->SetScrollRate(5, 5);
1034 m_panelAdvanced->SetScrollRate(5, 5);
1037void TrackPropDlg::SetTrackAndUpdate(
Track* pt) {
1040 m_lcPoints->DeleteAllItems();
1042 if (m_pMyLinkList)
delete m_pMyLinkList;
1043 m_pMyLinkList =
new HyperlinkList();
1045 for (
Hyperlink* link : *m_pTrack->m_TrackHyperlinkList) {
1047 h->DescrText = link->DescrText;
1048 h->Link = link->Link;
1049 h->LType = link->LType;
1051 m_pMyLinkList->push_back(h);
1059void TrackPropDlg::InitializeList() {
1060 if (NULL == m_pTrack)
return;
1062 m_lcPoints->m_pTrack = m_pTrack;
1064 if (m_pTrack->GetnPoints()) {
1067 m_lcPoints->m_LMT_Offset = long((prp->m_lon) * 3600. / 15.);
1069 m_lcPoints->m_LMT_Offset = 0;
1072 if (m_lcPoints->IsVirtual())
1073 m_lcPoints->SetItemCount(m_pTrack->GetnPoints());
1076 for (
int in = 0; in < m_pTrack->GetnPoints(); in++) {
1080 m_lcPoints->InsertItem(item);
1081 for (
int j = 0; j < 7; j++) {
1083 item.SetText(m_lcPoints->OnGetItemText(in, j));
1084 m_lcPoints->SetItem(item);
1091 if (NULL == m_pTrack)
return false;
1093 ::wxBeginBusyCursor();
1095 if (m_scrolledWindowLinks) {
1096 wxWindowList kids = m_scrolledWindowLinks->GetChildren();
1097 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
1098 wxWindowListNode* node = kids.Item(i);
1099 wxWindow* win = node->GetData();
1101 auto link_win =
dynamic_cast<wxHyperlinkCtrl*
>(win);
1103 link_win->Disconnect(
1104 wxEVT_COMMAND_HYPERLINK,
1105 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick));
1106 link_win->Disconnect(
1108 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu));
1113 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->size();
1114 HyperlinkList* list = m_pTrack->m_TrackHyperlinkList;
1116 if (NbrOfLinks > 0) {
1117 for (
auto it = list->begin(); it != list->end(); ++it) {
1119 wxString Link = link->Link;
1120 wxString Descr = link->DescrText;
1122 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1123 m_scrolledWindowLinks, wxID_ANY, Descr, Link, wxDefaultPosition,
1124 wxDefaultSize, wxHL_DEFAULT_STYLE);
1125 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1126 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1128 if (!m_pTrack->m_bIsInLayer)
1131 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu), NULL,
1134 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1137 bSizerLinks->Fit(m_scrolledWindowLinks);
1140 m_tName->SetValue(m_pTrack->GetName());
1141 m_tFrom->SetValue(m_pTrack->m_TrackStartString);
1142 m_tTo->SetValue(m_pTrack->m_TrackEndString);
1143 if (m_tDescription) m_tDescription->SetValue(m_pTrack->m_TrackDescription);
1145 m_tTotDistance->SetValue(
"");
1146 m_tTimeEnroute->SetValue(
"");
1148 m_sdbBtmBtnsSizerSplit->Enable(
false);
1149 m_sdbBtmBtnsSizerExtend->Enable(
false);
1152 TrackPoint* last_point = m_pTrack->GetLastPoint();
1153 TrackPoint* first_point = m_pTrack->GetPoint(0);
1154 double trackLength = m_pTrack->Length();
1155 double total_seconds = 0.;
1157 wxString speed(
"--");
1159 if (last_point && first_point) {
1166 if (total_seconds != 0.) {
1167 m_avgspeed = trackLength / total_seconds * 3600;
1171 speed.Printf(
"%5.2f", toUsrSpeed(m_avgspeed));
1175 m_tAvgSpeed->SetValue(speed);
1179 slen.Printf(
"%5.2f " + getUsrDistanceUnit(),
toUsrDistance(trackLength));
1181 m_tTotDistance->SetValue(slen);
1185 wxTimeSpan time(0, 0, (
int)total_seconds, 0);
1187 if (total_seconds > 3600. * 24.)
1188 time_form = time.Format(
"%H:%M");
1189 else if (total_seconds > 0.)
1190 time_form = time.Format(
"%H:%M");
1193 m_tTimeEnroute->SetValue(time_form);
1195 m_cbShow->SetValue(m_pTrack->IsVisible());
1197 if (m_pTrack->m_Colour ==
"")
1198 m_cColor->Select(0);
1200 for (
unsigned int i = 0; i <
sizeof(::GpxxColorNames) /
sizeof(wxString);
1202 if (m_pTrack->m_Colour == ::GpxxColorNames[i]) {
1203 m_cColor->Select(i + 1);
1209 for (
unsigned int i = 0; i <
sizeof(::StyleValues) /
sizeof(
int); i++) {
1210 if (m_pTrack->m_style == ::StyleValues[i]) {
1211 m_cStyle->Select(i);
1216 for (
unsigned int i = 0; i <
sizeof(::WidthValues) /
sizeof(
int); i++) {
1217 if (m_pTrack->m_width == ::WidthValues[i]) {
1218 m_cWidth->Select(i);
1223 if (m_pTrack->m_bIsInLayer) {
1224 m_tName->SetEditable(
false);
1225 m_tFrom->SetEditable(
false);
1226 m_tTo->SetEditable(
false);
1227 if (m_tDescription) m_tDescription->SetEditable(
false);
1228 m_cbShow->Enable(
false);
1229 m_cColor->Enable(
false);
1230 m_cStyle->Enable(
false);
1231 m_cWidth->Enable(
false);
1232 m_sdbBtmBtnsSizerExtend->Enable(
false);
1233 m_sdbBtmBtnsSizerSplit->Enable(
false);
1234 SetTitle(wxString::Format(
"%s, %s: %d", _(
"Track properties"),
"Layer",
1235 m_pTrack->m_LayerID));
1237 m_tName->SetEditable(
true);
1238 m_tFrom->SetEditable(
true);
1239 m_tTo->SetEditable(
true);
1240 if (m_tDescription) m_tDescription->SetEditable(
true);
1241 m_cbShow->Enable(
true);
1242 m_cColor->Enable(
true);
1243 m_cStyle->Enable(
true);
1244 m_cWidth->Enable(
true);
1246 m_sdbBtmBtnsSizerExtend->Enable(IsThisTrackExtendable());
1248 SetTitle(_(
"Track properties"));
1251 ::wxEndBusyCursor();
1256bool TrackPropDlg::IsThisTrackExtendable() {
1257 m_pExtendTrack = NULL;
1258 m_pExtendPoint = NULL;
1263 TrackPoint* pLastPoint = m_pTrack->GetPoint(0);
1269 if (ptrack->IsVisible() && (ptrack->m_GUID != m_pTrack->m_GUID)) {
1270 TrackPoint* track_node = ptrack->GetLastPoint();
1274 if (!m_pExtendPoint ||
1276 m_pExtendPoint = track_node;
1277 m_pExtendTrack = ptrack;
1284 if (m_pExtendTrack) {
1285 return (!m_pExtendTrack->m_bIsInLayer);
1291void TrackPropDlg::OnExtendBtnClick(wxCommandEvent& event) {
1292 TrackPoint* pFirstPoint = m_pTrack->GetPoint(0);
1294 if (IsThisTrackExtendable()) {
1299 pSelect->DeleteAllSelectableTrackSegments(m_pExtendTrack);
1300 m_pExtendTrack->Clone(m_pTrack, begin, m_pTrack->GetnPoints(), _(
"_plus"));
1301 pSelect->AddAllSelectableTrackSegments(m_pExtendTrack);
1302 pSelect->DeleteAllSelectableTrackSegments(m_pTrack);
1303 NavObj_dB::GetInstance().DeleteTrack(m_pTrack);
1306 SetTrackAndUpdate(m_pExtendTrack);
1307 NavObj_dB::GetInstance().UpdateTrack(m_pTrack);
1316void TrackPropDlg::OnSplitBtnClick(wxCommandEvent& event) {
1317 m_sdbBtmBtnsSizerSplit->Enable(
false);
1319 if (m_pTrack->m_bIsInLayer) {
1323 if ((m_nSelected > 1) && (m_nSelected < m_pTrack->GetnPoints())) {
1326 pHead->Clone(m_pTrack, 0, m_nSelected - 1, _(
"_A"));
1327 pTail->Clone(m_pTrack, m_nSelected - 1, m_pTrack->GetnPoints(), _(
"_B"));
1330 NavObj_dB::GetInstance().InsertTrack(pHead);
1333 NavObj_dB::GetInstance().InsertTrack(pTail);
1335 NavObj_dB::GetInstance().DeleteTrack(m_pTrack);
1337 pSelect->DeleteAllSelectableTrackSegments(m_pTrack);
1339 pSelect->AddAllSelectableTrackSegments(pTail);
1340 pSelect->AddAllSelectableTrackSegments(pHead);
1342 SetTrackAndUpdate(pTail);
1351void TrackPropDlg::OnTrackPropCopyTxtClick(wxCommandEvent& event) {
1352 wxString tab(
"\t", wxConvUTF8);
1353 wxString eol(
"\n", wxConvUTF8);
1356 csvString << this->GetTitle() << eol << _(
"Name") << tab
1357 << m_pTrack->GetName() << eol << _(
"Depart From") << tab
1358 << m_pTrack->m_TrackStartString << eol << _(
"Destination") << tab
1359 << m_pTrack->m_TrackEndString << eol << _(
"Total distance") << tab
1360 << m_tTotDistance->GetValue() << eol << _(
"Speed") << tab
1361 << m_tAvgSpeed->GetValue() << eol
1362 << _(
"Departure Time") +
" " + _(
"(m/d/y h:m)") << tab
1364 << _(
"Time enroute") << tab << m_tTimeEnroute->GetValue() << eol
1369 noCols = m_lcPoints->GetColumnCount();
1370 noRows = m_lcPoints->GetItemCount();
1372 item.SetMask(wxLIST_MASK_TEXT);
1374 for (
int i = 0; i < noCols; i++) {
1375 m_lcPoints->GetColumn(i, item);
1376 csvString << item.GetText() << tab;
1380 for (
int j = 0; j < noRows; j++) {
1382 for (
int i = 0; i < noCols; i++) {
1384 m_lcPoints->GetItem(item);
1385 csvString << item.GetText() << tab;
1390 if (wxTheClipboard->Open()) {
1391 wxTextDataObject* data =
new wxTextDataObject;
1392 data->SetText(csvString);
1393 wxTheClipboard->SetData(data);
1394 wxTheClipboard->Close();
1398void TrackPropDlg::OnPrintBtnClick(wxCommandEvent& event) {
1399 static std::set<int> s_options;
1401 int result = dlg.ShowModal();
1403 if (result == wxID_OK) {
1404 dlg.GetSelected(s_options);
1407 printer.Initialize(wxPORTRAIT);
1408 printer.EnablePageNumbers(
true);
1409 printer.Print(
this, &printout);
1413void TrackPropDlg::OnTrackPropRightClick(wxListEvent& event) {
1416 wxMenuItem* copyItem =
1417 menu.Append(ID_RCLK_MENU_COPY_TEXT, _(
"&Copy all as text"));
1422void TrackPropDlg::OnTrackPropListClick(wxListEvent& event) {
1428 m_lcPoints->GetNextItem(itemno, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
1432 selected_no = itemno;
1434 m_pTrack->m_HighlightedTrackPoint = -1;
1437 TrackPoint* prp = m_pTrack->GetPoint(itemno);
1439 m_pTrack->m_HighlightedTrackPoint = itemno;
1441 if (!(m_pTrack->m_bIsInLayer) && !(m_pTrack ==
g_pActiveTrack)) {
1442 m_nSelected = selected_no + 1;
1443 m_sdbBtmBtnsSizerSplit->Enable(
true);
1445 top_frame::Get()->JumpToPosition(prp->m_lat, prp->m_lon);
1447 if (m_lcPoints) m_lcPoints->SetFocus();
1451 if (selected_no == 0 || selected_no == m_pTrack->GetnPoints() - 1)
1452 m_sdbBtmBtnsSizerSplit->Enable(
false);
1455void TrackPropDlg::OnTrackPropMenuSelected(wxCommandEvent& event) {
1456 switch (event.GetId()) {
1457 case ID_RCLK_MENU_COPY_TEXT:
1458 OnTrackPropCopyTxtClick(event);
1463void TrackPropDlg::OnToRouteBtnClick(wxCommandEvent& event) {
1469void TrackPropDlg::OnExportBtnClick(wxCommandEvent& event) {
1470 wxString suggested_name = _(
"track");
1471 std::vector<Track*> list = {m_pTrack};
1472 if (m_pTrack->GetName() !=
"") suggested_name = m_pTrack->GetName();
1473 ExportGPXTracks(
this, &list, suggested_name);
1476void TrackPropDlg::m_hyperlinkContextMenu(wxMouseEvent& event) {
1477 m_pEditedLink = (wxHyperlinkCtrl*)event.GetEventObject();
1479 wxEVT_COMMAND_MENU_SELECTED,
1480 (wxObjectEventFunction)(wxEventFunction)&TrackPropDlg::PopupMenuHandler);
1481 m_scrolledWindowLinks->PopupMenu(
1482 m_menuLink, m_pEditedLink->GetPosition().x + event.GetPosition().x,
1483 m_pEditedLink->GetPosition().y + event.GetPosition().y);
1486void TrackPropDlg::PopupMenuHandler(wxCommandEvent& event) {
1487 switch (event.GetId()) {
1488 case ID_TRK_MENU_ADD:
1491 case ID_TRK_MENU_EDIT:
1494 case ID_TRK_MENU_DELETE:
1495 OnDeleteLink(event);
1502void TrackPropDlg::OnDeleteLink(wxCommandEvent& event) {
1503 wxString findurl = m_pEditedLink->GetURL();
1504 wxString findlabel = m_pEditedLink->GetLabel();
1506 wxWindowList kids = m_scrolledWindowLinks->GetChildren();
1507 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
1508 wxWindowListNode* node = kids.Item(i);
1509 wxWindow* win = node->GetData();
1511 auto link_win =
dynamic_cast<wxHyperlinkCtrl*
>(win);
1513 link_win->Disconnect(
1514 wxEVT_COMMAND_HYPERLINK,
1515 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick));
1516 link_win->Disconnect(
1518 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu));
1523 HyperlinkList* list = m_pTrack->m_TrackHyperlinkList;
1524 auto nodeToDelete = list->end();
1525 for (
auto it = list->begin(); it != list->end(); it++) {
1527 wxString Link = link->Link;
1528 wxString Descr = link->DescrText;
1529 if (Link == findurl &&
1530 (Descr == findlabel || (Link == findlabel && Descr ==
"")))
1533 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1534 m_scrolledWindowLinks, wxID_ANY, Descr, Link, wxDefaultPosition,
1535 wxDefaultSize, wxHL_DEFAULT_STYLE);
1536 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1537 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1539 ctrl->Connect(wxEVT_RIGHT_DOWN,
1540 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu),
1543 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1546 if (nodeToDelete != list->end()) list->erase(nodeToDelete);
1547 m_scrolledWindowLinks->InvalidateBestSize();
1548 m_scrolledWindowLinks->Layout();
1549 sbSizerLinks->Layout();
1553void TrackPropDlg::OnEditLink(wxCommandEvent& event) {
1554 wxString findurl = m_pEditedLink->GetURL();
1555 wxString findlabel = m_pEditedLink->GetLabel();
1558 LinkPropDlg->m_textCtrlLinkDescription->SetValue(findlabel);
1559 LinkPropDlg->m_textCtrlLinkUrl->SetValue(findurl);
1560 DimeControl(LinkPropDlg);
1561 LinkPropDlg->ShowWindowModalThenDo([
this, LinkPropDlg, findurl,
1562 findlabel](
int retcode) {
1563 if (retcode == wxID_OK) {
1564 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->size();
1565 HyperlinkList* list = m_pTrack->m_TrackHyperlinkList;
1567 if (NbrOfLinks > 0) {
1568 for (
auto it = list->begin(); it != list->end(); it++) {
1570 wxString Link = link->Link;
1571 wxString Descr = link->DescrText;
1572 if (Link == findurl &&
1573 (Descr == findlabel || (Link == findlabel && Descr ==
""))) {
1574 link->Link = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1576 LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1577 wxHyperlinkCtrl* h =
1578 (wxHyperlinkCtrl*)m_scrolledWindowLinks->FindWindowByLabel(
1581 h->SetLabel(LinkPropDlg->m_textCtrlLinkDescription->GetValue());
1582 h->SetURL(LinkPropDlg->m_textCtrlLinkUrl->GetValue());
1588 m_scrolledWindowLinks->InvalidateBestSize();
1589 m_scrolledWindowLinks->Layout();
1590 sbSizerLinks->Layout();
1596void TrackPropDlg::OnAddLink(wxCommandEvent& event) {
1598 LinkPropDlg->m_textCtrlLinkDescription->SetValue(
"");
1599 LinkPropDlg->m_textCtrlLinkUrl->SetValue(
"");
1600 DimeControl(LinkPropDlg);
1601 LinkPropDlg->ShowWindowModalThenDo([
this, LinkPropDlg](
int retcode) {
1602 if (retcode == wxID_OK) {
1603 wxString desc = LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1604 if (desc ==
"") desc = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1605 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1606 m_scrolledWindowLinks, wxID_ANY, desc,
1607 LinkPropDlg->m_textCtrlLinkUrl->GetValue(), wxDefaultPosition,
1608 wxDefaultSize, wxHL_DEFAULT_STYLE);
1609 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1610 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1612 ctrl->Connect(wxEVT_RIGHT_DOWN,
1613 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu),
1616 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1617 bSizerLinks->Fit(m_scrolledWindowLinks);
1621 h->DescrText = LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1622 h->Link = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1624 m_pTrack->m_TrackHyperlinkList->push_back(h);
1629 m_scrolledWindowLinks->InvalidateBestSize();
1630 m_scrolledWindowLinks->Layout();
1631 sbSizerLinks->Layout();
1636void TrackPropDlg::OnEditLinkToggle(wxCommandEvent& event) {
1637 if (m_toggleBtnEdit->GetValue())
1638 m_staticTextEditEnabled->SetLabel(_(
"Links are opened for editing."));
1640 m_staticTextEditEnabled->SetLabel(
1641 _(
"Links are opened in the default browser."));
1645void TrackPropDlg::OnHyperLinkClick(wxHyperlinkEvent& event) {
1646 if (m_toggleBtnEdit->GetValue()) {
1647 m_pEditedLink = (wxHyperlinkCtrl*)event.GetEventObject();
1662 wxString cc =
event.GetURL();
1663 if (cc.Find(
"#") != wxNOT_FOUND) {
1664 wxRegKey RegKey(wxString(
"HKEY_CLASSES_ROOT\\HTTP\\shell\\open\\command"));
1665 if (RegKey.Exists()) {
1666 wxString command_line;
1667 RegKey.QueryValue(wxString(
""), command_line);
1670 command_line.Replace(wxString(
"\""), wxString(
""));
1673 int l = command_line.Find(
".exe");
1674 if (wxNOT_FOUND == l) l = command_line.Find(
".EXE");
1676 if (wxNOT_FOUND != l) {
1677 wxString cl = command_line.Mid(0, l + 4);
1688 wxString url =
event.GetURL();
1689 url.Replace(
" ",
"%20");
1690 ::wxLaunchDefaultBrowser(url);
1695void TrackPropDlg::OnShowTimeTZ(wxCommandEvent& event) {
1696 if (m_rbShowTimeUTC && m_rbShowTimeUTC->GetValue())
1705 throw std::logic_error(
"Unexpected time zone selection");
1706 m_lcPoints->DeleteAllItems();
1710bool TrackPropDlg::SaveChanges() {
1711 if (m_pTrack && !m_pTrack->m_bIsInLayer) {
1713 m_pTrack->SetName(m_tName->GetValue());
1714 m_pTrack->m_TrackStartString = m_tFrom->GetValue();
1715 m_pTrack->m_TrackEndString = m_tTo->GetValue();
1717 m_pTrack->m_TrackDescription = m_tDescription->GetValue();
1718 m_pTrack->SetVisible(m_cbShow->GetValue());
1719 if (m_cColor->GetSelection() == 0)
1720 m_pTrack->m_Colour =
"";
1722 m_pTrack->m_Colour = ::GpxxColorNames[m_cColor->GetSelection() - 1];
1723 m_pTrack->m_style = (wxPenStyle)::StyleValues[m_cStyle->GetSelection()];
1724 m_pTrack->m_width = ::WidthValues[m_cWidth->GetSelection()];
1726 NavObj_dB::GetInstance().UpdateDBTrackAttributes(m_pTrack);
1731 if (m_pTrack && m_pTrack->IsRunning()) {
1733 v[
"Changed"] =
true;
1734 v[
"Name"] = m_pTrack->GetName();
1735 v[
"GUID"] = m_pTrack->m_GUID;
1736 wxString msg_id(
"OCPN_TRK_ACTIVATED");
1737 SendJSONMessageToAllPlugins(msg_id, v);
1743void TrackPropDlg::OnOKBtnClick(wxCommandEvent& event) {
1750 if (b_found_track) {
1752 m_pTrack->ClearHighlights();
1755 m_bStartNow =
false;
1761 top_frame::Get()->InvalidateAllGL();
1762 top_frame::Get()->RefreshAllCanvas(
false);
1767void TrackPropDlg::OnCancelBtnClick(wxCommandEvent& event) {
1771 if (b_found_track) m_pTrack->ClearHighlights();
1774 top_frame::Get()->InvalidateAllGL();
1775 top_frame::Get()->RefreshAllCanvas(
false);
1784OCPNTrackListCtrl::OCPNTrackListCtrl(wxWindow* parent, wxWindowID
id,
1785 const wxPoint& pos,
const wxSize& size,
1787 : wxListCtrl(parent, id, pos, size, style) {
1793OCPNTrackListCtrl::~OCPNTrackListCtrl() {}
1796 if (m_pTrack->GetnPoints()) {
1798 if (prp)
return prp->m_lon;
1803wxString OCPNTrackListCtrl::OnGetItemText(
long item,
long column)
const {
1806 if (item < 0 || item >= m_pTrack->GetnPoints())
return "";
1808 TrackPoint* this_point = m_pTrack->GetPoint(item);
1809 TrackPoint* prev_point = item > 0 ? m_pTrack->GetPoint(item - 1) : NULL;
1811 if (!this_point)
return "";
1813 double gt_brg, gt_leg_dist;
1819 slat = prev_point->m_lat;
1820 slon = prev_point->m_lon;
1828 ret.Printf(
"%ld", item);
1832 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat, slon,
1833 >_brg, >_leg_dist);
1835 ret.Printf(
"%6.2f " + getUsrDistanceUnit(),
toUsrDistance(gt_leg_dist));
1839 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat, slon,
1840 >_brg, >_leg_dist);
1841 ret.Printf(
"%03.0f %cT", gt_brg, 0x00B0);
1845 ret = toSDMM(1, this_point->m_lat, 1);
1849 ret = toSDMM(2, this_point->m_lon, 1);
1854 if (timestamp.IsValid()) {
1859 ret = ocpn::toUsrDateTimeFormat(timestamp.FromUTC(), opts);
1867 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat,
1868 slon, >_brg, >_leg_dist);
1875 if (seconds > 0.) speed = gt_leg_dist / seconds * 3600;
1877 ret.Printf(
"%5.2f", toUsrSpeed(speed));
1889int 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.
The JSON value class implementation.
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.