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) {
1408 printer.Initialize(wxPORTRAIT);
1409 printer.EnablePageNumbers(
true);
1410 printer.Print(
this, &printout);
1414void TrackPropDlg::OnTrackPropRightClick(wxListEvent& event) {
1417 wxMenuItem* copyItem =
1418 menu.Append(ID_RCLK_MENU_COPY_TEXT, _(
"&Copy all as text"));
1423void TrackPropDlg::OnTrackPropListClick(wxListEvent& event) {
1429 m_lcPoints->GetNextItem(itemno, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
1433 selected_no = itemno;
1435 m_pTrack->m_HighlightedTrackPoint = -1;
1438 TrackPoint* prp = m_pTrack->GetPoint(itemno);
1440 m_pTrack->m_HighlightedTrackPoint = itemno;
1442 if (!(m_pTrack->m_bIsInLayer) && !(m_pTrack ==
g_pActiveTrack)) {
1443 m_nSelected = selected_no + 1;
1444 m_sdbBtmBtnsSizerSplit->Enable(
true);
1446 top_frame::Get()->JumpToPosition(prp->m_lat, prp->m_lon);
1448 if (m_lcPoints) m_lcPoints->SetFocus();
1452 if (selected_no == 0 || selected_no == m_pTrack->GetnPoints() - 1)
1453 m_sdbBtmBtnsSizerSplit->Enable(
false);
1456void TrackPropDlg::OnTrackPropMenuSelected(wxCommandEvent& event) {
1457 switch (event.GetId()) {
1458 case ID_RCLK_MENU_COPY_TEXT:
1459 OnTrackPropCopyTxtClick(event);
1464void TrackPropDlg::OnToRouteBtnClick(wxCommandEvent& event) {
1470void TrackPropDlg::OnExportBtnClick(wxCommandEvent& event) {
1471 wxString suggested_name = _(
"track");
1472 std::vector<Track*> list = {m_pTrack};
1473 if (m_pTrack->GetName() !=
"") suggested_name = m_pTrack->GetName();
1474 ExportGPXTracks(
this, &list, suggested_name);
1477void TrackPropDlg::m_hyperlinkContextMenu(wxMouseEvent& event) {
1478 m_pEditedLink = (wxHyperlinkCtrl*)event.GetEventObject();
1480 wxEVT_COMMAND_MENU_SELECTED,
1481 (wxObjectEventFunction)(wxEventFunction)&TrackPropDlg::PopupMenuHandler);
1482 m_scrolledWindowLinks->PopupMenu(
1483 m_menuLink, m_pEditedLink->GetPosition().x + event.GetPosition().x,
1484 m_pEditedLink->GetPosition().y + event.GetPosition().y);
1487void TrackPropDlg::PopupMenuHandler(wxCommandEvent& event) {
1488 switch (event.GetId()) {
1489 case ID_TRK_MENU_ADD:
1492 case ID_TRK_MENU_EDIT:
1495 case ID_TRK_MENU_DELETE:
1496 OnDeleteLink(event);
1503void TrackPropDlg::OnDeleteLink(wxCommandEvent& event) {
1504 wxString findurl = m_pEditedLink->GetURL();
1505 wxString findlabel = m_pEditedLink->GetLabel();
1507 wxWindowList kids = m_scrolledWindowLinks->GetChildren();
1508 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
1509 wxWindowListNode* node = kids.Item(i);
1510 wxWindow* win = node->GetData();
1512 auto link_win =
dynamic_cast<wxHyperlinkCtrl*
>(win);
1514 link_win->Disconnect(
1515 wxEVT_COMMAND_HYPERLINK,
1516 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick));
1517 link_win->Disconnect(
1519 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu));
1524 HyperlinkList* list = m_pTrack->m_TrackHyperlinkList;
1525 auto nodeToDelete = list->end();
1526 for (
auto it = list->begin(); it != list->end(); it++) {
1528 wxString Link = link->Link;
1529 wxString Descr = link->DescrText;
1530 if (Link == findurl &&
1531 (Descr == findlabel || (Link == findlabel && Descr ==
"")))
1534 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1535 m_scrolledWindowLinks, wxID_ANY, Descr, Link, wxDefaultPosition,
1536 wxDefaultSize, wxHL_DEFAULT_STYLE);
1537 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1538 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1540 ctrl->Connect(wxEVT_RIGHT_DOWN,
1541 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu),
1544 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1547 if (nodeToDelete != list->end()) list->erase(nodeToDelete);
1548 m_scrolledWindowLinks->InvalidateBestSize();
1549 m_scrolledWindowLinks->Layout();
1550 sbSizerLinks->Layout();
1554void TrackPropDlg::OnEditLink(wxCommandEvent& event) {
1555 wxString findurl = m_pEditedLink->GetURL();
1556 wxString findlabel = m_pEditedLink->GetLabel();
1559 LinkPropDlg->m_textCtrlLinkDescription->SetValue(findlabel);
1560 LinkPropDlg->m_textCtrlLinkUrl->SetValue(findurl);
1561 DimeControl(LinkPropDlg);
1562 LinkPropDlg->ShowWindowModalThenDo([
this, LinkPropDlg, findurl,
1563 findlabel](
int retcode) {
1564 if (retcode == wxID_OK) {
1565 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->size();
1566 HyperlinkList* list = m_pTrack->m_TrackHyperlinkList;
1568 if (NbrOfLinks > 0) {
1569 for (
auto it = list->begin(); it != list->end(); it++) {
1571 wxString Link = link->Link;
1572 wxString Descr = link->DescrText;
1573 if (Link == findurl &&
1574 (Descr == findlabel || (Link == findlabel && Descr ==
""))) {
1575 link->Link = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1577 LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1578 wxHyperlinkCtrl* h =
1579 (wxHyperlinkCtrl*)m_scrolledWindowLinks->FindWindowByLabel(
1582 h->SetLabel(LinkPropDlg->m_textCtrlLinkDescription->GetValue());
1583 h->SetURL(LinkPropDlg->m_textCtrlLinkUrl->GetValue());
1589 m_scrolledWindowLinks->InvalidateBestSize();
1590 m_scrolledWindowLinks->Layout();
1591 sbSizerLinks->Layout();
1597void TrackPropDlg::OnAddLink(wxCommandEvent& event) {
1599 LinkPropDlg->m_textCtrlLinkDescription->SetValue(
"");
1600 LinkPropDlg->m_textCtrlLinkUrl->SetValue(
"");
1601 DimeControl(LinkPropDlg);
1602 LinkPropDlg->ShowWindowModalThenDo([
this, LinkPropDlg](
int retcode) {
1603 if (retcode == wxID_OK) {
1604 wxString desc = LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1605 if (desc ==
"") desc = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1606 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1607 m_scrolledWindowLinks, wxID_ANY, desc,
1608 LinkPropDlg->m_textCtrlLinkUrl->GetValue(), wxDefaultPosition,
1609 wxDefaultSize, wxHL_DEFAULT_STYLE);
1610 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1611 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1613 ctrl->Connect(wxEVT_RIGHT_DOWN,
1614 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu),
1617 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1618 bSizerLinks->Fit(m_scrolledWindowLinks);
1622 h->DescrText = LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1623 h->Link = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1625 m_pTrack->m_TrackHyperlinkList->push_back(h);
1630 m_scrolledWindowLinks->InvalidateBestSize();
1631 m_scrolledWindowLinks->Layout();
1632 sbSizerLinks->Layout();
1637void TrackPropDlg::OnEditLinkToggle(wxCommandEvent& event) {
1638 if (m_toggleBtnEdit->GetValue())
1639 m_staticTextEditEnabled->SetLabel(_(
"Links are opened for editing."));
1641 m_staticTextEditEnabled->SetLabel(
1642 _(
"Links are opened in the default browser."));
1646void TrackPropDlg::OnHyperLinkClick(wxHyperlinkEvent& event) {
1647 if (m_toggleBtnEdit->GetValue()) {
1648 m_pEditedLink = (wxHyperlinkCtrl*)event.GetEventObject();
1663 wxString cc =
event.GetURL();
1664 if (cc.Find(
"#") != wxNOT_FOUND) {
1665 wxRegKey RegKey(wxString(
"HKEY_CLASSES_ROOT\\HTTP\\shell\\open\\command"));
1666 if (RegKey.Exists()) {
1667 wxString command_line;
1668 RegKey.QueryValue(wxString(
""), command_line);
1671 command_line.Replace(wxString(
"\""), wxString(
""));
1674 int l = command_line.Find(
".exe");
1675 if (wxNOT_FOUND == l) l = command_line.Find(
".EXE");
1677 if (wxNOT_FOUND != l) {
1678 wxString cl = command_line.Mid(0, l + 4);
1689 wxString url =
event.GetURL();
1690 url.Replace(
" ",
"%20");
1691 ::wxLaunchDefaultBrowser(url);
1696void TrackPropDlg::OnShowTimeTZ(wxCommandEvent& event) {
1697 if (m_rbShowTimeUTC && m_rbShowTimeUTC->GetValue())
1706 throw std::logic_error(
"Unexpected time zone selection");
1707 m_lcPoints->DeleteAllItems();
1711bool TrackPropDlg::SaveChanges() {
1712 if (m_pTrack && !m_pTrack->m_bIsInLayer) {
1714 m_pTrack->SetName(m_tName->GetValue());
1715 m_pTrack->m_TrackStartString = m_tFrom->GetValue();
1716 m_pTrack->m_TrackEndString = m_tTo->GetValue();
1718 m_pTrack->m_TrackDescription = m_tDescription->GetValue();
1719 m_pTrack->SetVisible(m_cbShow->GetValue());
1720 if (m_cColor->GetSelection() == 0)
1721 m_pTrack->m_Colour =
"";
1723 m_pTrack->m_Colour = ::GpxxColorNames[m_cColor->GetSelection() - 1];
1724 m_pTrack->m_style = (wxPenStyle)::StyleValues[m_cStyle->GetSelection()];
1725 m_pTrack->m_width = ::WidthValues[m_cWidth->GetSelection()];
1727 NavObj_dB::GetInstance().UpdateDBTrackAttributes(m_pTrack);
1732 if (m_pTrack && m_pTrack->IsRunning()) {
1734 v[
"Changed"] =
true;
1735 v[
"Name"] = m_pTrack->GetName();
1736 v[
"GUID"] = m_pTrack->m_GUID;
1737 SendJsonMessageToAllPlugins(
"OCPN_TRK_ACTIVATED", 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.
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.