OpenCPN Partial API docs
Loading...
Searching...
No Matches
concanv.cpp
Go to the documentation of this file.
1/**************************************************************************
2 * Copyright (C) 2010 by David S. Register *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, see <https://www.gnu.org/licenses/>. *
16 ****************************************************************************/
17
24#include <stdlib.h>
25#include <time.h>
26
27#include <wx/wxprec.h>
28
29#ifndef WX_PRECOMP
30#include <wx/wx.h>
31#endif // precompiled headers
32
33#include <wx/app.h>
34#include <wx/datetime.h>
35#include "gl_headers.h" // Must be before anything using GL
36
37#include "model/config_vars.h"
38#include "model/navutil_base.h"
39#include "model/own_ship.h"
40#include "model/route.h"
41#include "model/routeman.h"
42
43#include "color_handler.h"
44#include "concanv.h"
45#include "font_mgr.h"
46#include "gui_lib.h"
47#include "navutil.h"
48#include "ocpn_platform.h"
49#include "ocpn_plugin.h"
50#include "styles.h"
51#include "top_frame.h"
52
53enum eMenuItems { ID_NAVLEG = 1, ID_NAVROUTE, ID_NAVHIGHWAY } menuItems;
54
56
57//------------------------------------------------------------------------------
58// ConsoleCanvasWin Implementation
59//------------------------------------------------------------------------------
60BEGIN_EVENT_TABLE(ConsoleCanvasWin, wxWindow)
61EVT_PAINT(ConsoleCanvasWin::OnPaint)
62EVT_SHOW(ConsoleCanvasWin::OnShow)
63EVT_CONTEXT_MENU(ConsoleCanvasWin::OnContextMenu)
64EVT_MENU(ID_NAVLEG, ConsoleCanvasWin::OnContextMenuSelection)
65EVT_MENU(ID_NAVROUTE, ConsoleCanvasWin::OnContextMenuSelection)
66EVT_MENU(ID_NAVHIGHWAY, ConsoleCanvasWin::OnContextMenuSelection)
67END_EVENT_TABLE()
68
69// Define a constructor for my canvas
70ConsoleCanvasWin::ConsoleCanvasWin(wxWindow* parent) {
71 m_speedUsed = SPEED_SOG;
72 pbackBrush = NULL;
73 m_bNeedClear = false;
74
75 long style = wxSIMPLE_BORDER | wxCLIP_CHILDREN | wxFRAME_FLOAT_ON_PARENT;
76
77#ifdef __WXMSW__
78 style |= wxFRAME_NO_TASKBAR;
79#endif
80
81 wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, style);
82
83 m_pParent = parent;
84
85 m_pitemBoxSizerLeg = new wxBoxSizer(wxVERTICAL);
86
87 pThisLegText = new wxStaticText(this, -1, _("This Leg"));
88 pThisLegText->Fit();
89 m_pitemBoxSizerLeg->Add(pThisLegText, 0, wxALIGN_CENTER_HORIZONTAL, 2);
90
91 wxFont* qFont = GetOCPNScaledFont(_("Dialog"));
92
93 wxFont* pThisLegFont = FontMgr::Get().FindOrCreateFont(
94 qFont->GetPointSize(), wxFONTFAMILY_DEFAULT, qFont->GetStyle(),
95 wxFONTWEIGHT_BOLD, false, qFont->GetFaceName());
96 pThisLegText->SetFont(*pThisLegFont);
97
98 pXTE = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
99 pXTE->SetALabel("XTE");
100 m_pitemBoxSizerLeg->Add(pXTE, 1, wxALIGN_LEFT | wxALL, 2);
101
102 pBRG = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
103 pBRG->SetALabel("BRG");
104 m_pitemBoxSizerLeg->Add(pBRG, 1, wxALIGN_LEFT | wxALL, 2);
105
106 pVMG = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
107 pVMG->SetALabel("VMG");
108 m_pitemBoxSizerLeg->Add(pVMG, 1, wxALIGN_LEFT | wxALL, 2);
109
110 pRNG = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
111 pRNG->SetALabel("RNG");
112 m_pitemBoxSizerLeg->Add(pRNG, 1, wxALIGN_LEFT | wxALL, 2);
113
114 pTTG = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
115 pTTG->SetALabel("TTG @VMG");
116 m_pitemBoxSizerLeg->Add(pTTG, 1, wxALIGN_LEFT | wxALL, 2);
117
118 // Create CDI Display Window
119
120 pCDI = new CDI(this, -1, wxSIMPLE_BORDER, "CDI");
121 m_pitemBoxSizerLeg->AddSpacer(5);
122 m_pitemBoxSizerLeg->Add(pCDI, 0, wxALL | wxEXPAND, 2);
123
124 SetSizer(m_pitemBoxSizerLeg); // use the sizer for layout
125 m_pitemBoxSizerLeg->SetSizeHints(this);
126 Layout();
127 Fit();
128
129 if (g_bShowRouteTotal)
130 pThisLegText->SetLabel(_("Route"));
131 else
132 pThisLegText->SetLabel(_("This Leg"));
133
134 Hide();
135}
136
137ConsoleCanvasWin::~ConsoleCanvasWin() { delete pCDI; }
138
139void ConsoleCanvasWin::SetColorScheme(ColorScheme cs) {
140 pbackBrush = wxTheBrushList->FindOrCreateBrush(
141 GetGlobalColor("DILG1" /*UIBDR*/), wxBRUSHSTYLE_SOLID);
142 SetBackgroundColour(GetGlobalColor("DILG1" /*"UIBDR"*/));
143
144 if (g_bShowRouteTotal)
145 pThisLegText->SetLabel(_("Route"));
146 else
147 pThisLegText->SetLabel(_("This Leg"));
148
149 // Also apply color scheme to all known children
150
151 pThisLegText->SetBackgroundColour(GetGlobalColor("DILG1" /*"UIBDR"*/));
152
153 pXTE->SetColorScheme(cs);
154 pBRG->SetColorScheme(cs);
155 pRNG->SetColorScheme(cs);
156 pTTG->SetColorScheme(cs);
157 pVMG->SetColorScheme(cs);
158
159 pCDI->SetColorScheme(cs);
160}
161
162void ConsoleCanvasWin::OnPaint(wxPaintEvent& event) {
163 wxPaintDC dc(this);
164
165 if (g_pRouteMan->GetpActiveRoute()) {
166 if (m_bNeedClear) {
167 pThisLegText->Refresh();
168 m_bNeedClear = false;
169 }
170 }
171
172 if (!g_bShowActiveRouteHighway) pCDI->Hide();
173}
174
175void ConsoleCanvasWin::OnShow(wxShowEvent& event) {
176 pCDI->Show(g_bShowActiveRouteHighway);
177 m_pitemBoxSizerLeg->SetSizeHints(this);
178}
179
180void ConsoleCanvasWin::LegRoute() {
181 if (g_bShowRouteTotal)
182 pThisLegText->SetLabel(_("Route"));
183 else
184 pThisLegText->SetLabel(_("This Leg"));
185
186 pThisLegText->Refresh(true);
187 RefreshConsoleData();
188}
189
190void ConsoleCanvasWin::OnContextMenu(wxContextMenuEvent& event) {
191 wxMenu* contextMenu = new wxMenu();
192 wxMenuItem* btnLeg =
193 new wxMenuItem(contextMenu, ID_NAVLEG, _("This Leg"), "", wxITEM_RADIO);
194 wxMenuItem* btnRoute = new wxMenuItem(contextMenu, ID_NAVROUTE,
195 _("Full Route"), "", wxITEM_RADIO);
196 wxMenuItem* btnHighw = new wxMenuItem(contextMenu, ID_NAVHIGHWAY,
197 _("Show Highway"), "", wxITEM_CHECK);
198 contextMenu->Append(btnLeg);
199 contextMenu->Append(btnRoute);
200 contextMenu->AppendSeparator();
201 contextMenu->Append(btnHighw);
202
203 btnLeg->Check(!g_bShowRouteTotal);
204 btnRoute->Check(g_bShowRouteTotal);
205 btnHighw->Check(g_bShowActiveRouteHighway);
206
207 PopupMenu(contextMenu);
208
209 delete contextMenu;
210}
211
212void ConsoleCanvasWin::OnContextMenuSelection(wxCommandEvent& event) {
213 switch (event.GetId()) {
214 case ID_NAVLEG: {
215 g_bShowRouteTotal = false;
216 LegRoute();
217 break;
218 }
219 case ID_NAVROUTE: {
220 g_bShowRouteTotal = true;
221 LegRoute();
222 break;
223 }
224 case ID_NAVHIGHWAY: {
225 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
226 if (g_bShowActiveRouteHighway) {
227 pCDI->Show();
228 } else {
229 pCDI->Hide();
230 }
231 m_pitemBoxSizerLeg->SetSizeHints(this);
232 break;
233 }
234 }
235}
236
237void ConsoleCanvasWin::ToggleShowHighway() {
238 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
239 if (g_bShowActiveRouteHighway) {
240 pCDI->Show();
241 } else {
242 pCDI->Hide();
243 }
244 m_pitemBoxSizerLeg->SetSizeHints(this);
245 Layout();
246}
247
249 // Implement 3-state logic
250 // Route/SOG -> LEG/SOG -> LEG/VMG -> ....
251
252 if (g_bShowRouteTotal) {
253 g_bShowRouteTotal = false;
254 m_speedUsed = SPEED_SOG;
255 } else {
256 if (m_speedUsed == SPEED_VMG) {
257 g_bShowRouteTotal = true;
258 m_speedUsed = SPEED_SOG;
259 } else
260 m_speedUsed = SPEED_VMG;
261 }
262 LegRoute();
263}
264
266 wxString str_buf;
267 if (g_pRouteMan->GetpActiveRoute()) {
268 if (g_pRouteMan->m_bDataValid) {
269 // Range to the next waypoint is needed always
270 float rng = g_pRouteMan->GetCurrentRngToActivePoint();
271
272 // Brg to the next waypoint
273 float dcog = g_pRouteMan->GetCurrentBrgToActivePoint();
274 if (dcog >= 359.5) dcog = 0;
275
276 wxString cogstr;
277 if (g_bShowTrue)
278 cogstr << wxString::Format(wxString("%6.0f", wxConvUTF8), dcog);
279 if (g_bShowMag)
280 cogstr << wxString::Format(wxString("%6.0f(M)", wxConvUTF8),
281 toMagnetic(dcog));
282
283 pBRG->SetAValue(cogstr);
284
285 double speed = 0.;
286 if (!std::isnan(gCog) && !std::isnan(gSog)) {
287 double BRG;
288 BRG = g_pRouteMan->GetCurrentBrgToActivePoint();
289 double vmg = gSog * cos((BRG - gCog) * PI / 180.);
290 str_buf.Printf("%6.2f", toUsrSpeed(vmg));
291
292 if (m_speedUsed == SPEED_VMG) {
293 // VMG
294 // VMG is always to next waypoint, not to end of route
295 // VMG is SOG x cosine (difference between COG and BRG to Waypoint)
296 speed = vmg;
297 } else {
298 speed = gSog;
299 }
300 } else
301 str_buf = "---";
302
303 pVMG->SetAValue(str_buf);
304
305 if (!g_bShowRouteTotal) {
306 float nrng = g_pRouteMan->GetCurrentRngToActiveNormalArrival();
307 wxString srng;
308 double deltarng = fabs(rng - nrng);
309 if ((deltarng > .01) && ((deltarng / rng) > .10) &&
310 (rng < 10.0)) // show if there is more than 10% difference in
311 // ranges, etc...
312 {
313 if (nrng < 10.0)
314 srng.Printf("%5.2f/%5.2f", toUsrDistance(rng), toUsrDistance(nrng));
315 else
316 srng.Printf("%5.1f/%5.1f", toUsrDistance(rng), toUsrDistance(nrng));
317 } else {
318 if (rng < 10.0)
319 srng.Printf("%6.2f", toUsrDistance(rng));
320 else
321 srng.Printf("%6.1f", toUsrDistance(rng));
322 }
323
324 // RNG to the next WPT
325 pRNG->SetAValue(srng);
326 // XTE
327 str_buf.Printf(
328 "%6.2f", toUsrDistance(g_pRouteMan->GetCurrentXTEToActivePoint()));
329 pXTE->SetAValue(str_buf);
330 if (g_pRouteMan->GetXTEDir() < 0)
331 pXTE->SetALabel(wxString(_("XTE L")));
332 else
333 pXTE->SetALabel(wxString(_("XTE R")));
334 // TTG
335 // In all cases, ttg/eta are declared invalid if VMG <= 0.
336 // If showing only "this leg", use VMG for calculation of ttg
337 wxString ttg_s;
338 if ((speed > 0.) && !std::isnan(gCog) && !std::isnan(gSog)) {
339 float ttg_sec = (rng / speed) * 3600.;
340 wxTimeSpan ttg_span(0, 0, long(ttg_sec), 0);
341 ttg_s = ttg_span.Format();
342 } else
343 ttg_s = "---";
344
345 pTTG->SetAValue(ttg_s);
346 if (m_speedUsed == SPEED_VMG) {
347 pTTG->SetALabel(wxString(_("TTG @VMG")));
348 } else {
349 pTTG->SetALabel(wxString(_("TTG @SOG")));
350 }
351 } else {
352 // Remainder of route
353 float trng = rng;
354
355 Route* prt = g_pRouteMan->GetpActiveRoute();
356 int n_addflag = 0;
357 for (RoutePoint* prp : *prt->pRoutePointList) {
358 if (n_addflag) trng += prp->m_seg_len;
359
360 if (prp == prt->m_pRouteActivePoint) n_addflag++;
361 }
362
363 // total rng
364 wxString strng;
365 if (trng < 10.0)
366 strng.Printf("%6.2f", toUsrDistance(trng));
367 else
368 strng.Printf("%6.1f", toUsrDistance(trng));
369
370 pRNG->SetAValue(strng);
371
372 // total TTG
373 // If showing total route TTG/ETA, use gSog for calculation
374
375 wxString tttg_s;
376 wxTimeSpan tttg_span;
377 float tttg_sec = 0.0;
378 if (speed > 0.) {
379 tttg_sec = (trng / gSog) * 3600.;
380 tttg_span = wxTimeSpan::Seconds((long)tttg_sec);
381 // Show also #days if TTG > 24 h
382 tttg_s = tttg_sec > SECONDS_PER_DAY ? tttg_span.Format(_("%Dd %H:%M"))
383 : tttg_span.Format("%H:%M:%S");
384 } else {
385 tttg_span = wxTimeSpan::Seconds(0);
386 tttg_s = "---";
387 }
388
389 pTTG->SetAValue(tttg_s);
390
391 // total ETA to be shown on XTE panel
392 wxDateTime dtnow, eta;
393 dtnow.SetToCurrent();
394 eta = dtnow.Add(tttg_span);
395 wxString seta;
396
397 if (speed > 0.) {
398 // Show date, e.g. Feb 15, if TTG > 24 h
399 seta = tttg_sec > SECONDS_PER_DAY ? eta.Format("%d/%m %H:%M")
400 : eta.Format("%H:%M");
401 } else {
402 seta = "---";
403 }
404 pXTE->SetAValue(seta);
405 if (m_speedUsed == SPEED_VMG) {
406 pTTG->SetALabel(wxString(_("TTG @VMG")));
407 pXTE->SetALabel(wxString(_("ETA @VMG")));
408 } else {
409 pTTG->SetALabel(wxString(_("TTG @SOG")));
410 pXTE->SetALabel(wxString(_("ETA @SOG")));
411 }
412 }
413
414 pRNG->Refresh();
415 pBRG->Refresh();
416 pVMG->Refresh();
417 pTTG->Refresh();
418 pXTE->Refresh();
419 }
420 }
421}
422
423void ConsoleCanvasWin::RefreshConsoleData() {
425
426 pRNG->Refresh();
427 pBRG->Refresh();
428 pVMG->Refresh();
429 pTTG->Refresh();
430 pXTE->Refresh();
431 pCDI->Refresh();
432}
433
435 Hide();
436 UpdateFonts();
437 top_frame::Get()->PositionConsole();
438 Show();
439}
440
441void ConsoleCanvasWin::UpdateFonts() {
442 pBRG->RefreshFonts();
443 pXTE->RefreshFonts();
444 pTTG->RefreshFonts();
445 pRNG->RefreshFonts();
446 pVMG->RefreshFonts();
447
448 m_pitemBoxSizerLeg->SetSizeHints(this);
449 Layout();
450 Fit();
451
452 Refresh();
453}
454
455//------------------------------------------------------------------------------
456// ConsoleCanvasFrame Implementation
457//------------------------------------------------------------------------------
458BEGIN_EVENT_TABLE(ConsoleCanvasFrame, wxWindow)
459EVT_PAINT(ConsoleCanvasFrame::OnPaint)
460EVT_SHOW(ConsoleCanvasFrame::OnShow)
461EVT_CONTEXT_MENU(ConsoleCanvasFrame::OnContextMenu)
462EVT_MENU(ID_NAVLEG, ConsoleCanvasFrame::OnContextMenuSelection)
463EVT_MENU(ID_NAVROUTE, ConsoleCanvasFrame::OnContextMenuSelection)
464EVT_MENU(ID_NAVHIGHWAY, ConsoleCanvasFrame::OnContextMenuSelection)
465END_EVENT_TABLE()
466
467// Define a constructor for my canvas
468ConsoleCanvasFrame::ConsoleCanvasFrame(wxWindow* parent) {
469 m_speedUsed = SPEED_SOG;
470 pbackBrush = NULL;
471 m_bNeedClear = false;
472
473 long style = wxSIMPLE_BORDER | wxCLIP_CHILDREN | wxFRAME_FLOAT_ON_PARENT;
474
475#ifdef __WXMSW__
476 style |= wxFRAME_NO_TASKBAR;
477#endif
478
479 wxFrame::Create(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize,
480 style);
481
482 m_pParent = parent;
483
484 m_pitemBoxSizerLeg = new wxBoxSizer(wxVERTICAL);
485
486 pThisLegText = new wxStaticText(this, -1, _("This Leg"));
487 pThisLegText->Fit();
488 m_pitemBoxSizerLeg->Add(pThisLegText, 0, wxALIGN_CENTER_HORIZONTAL, 2);
489
490 wxFont* qFont = GetOCPNScaledFont(_("Dialog"));
491
492 wxFont* pThisLegFont = FontMgr::Get().FindOrCreateFont(
493 qFont->GetPointSize(), wxFONTFAMILY_DEFAULT, qFont->GetStyle(),
494 wxFONTWEIGHT_BOLD, false, qFont->GetFaceName());
495 pThisLegText->SetFont(*pThisLegFont);
496
497 pXTE = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
498 pXTE->SetALabel("XTE");
499 m_pitemBoxSizerLeg->Add(pXTE, 1, wxALIGN_LEFT | wxALL, 2);
500
501 pBRG = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
502 pBRG->SetALabel("BRG");
503 m_pitemBoxSizerLeg->Add(pBRG, 1, wxALIGN_LEFT | wxALL, 2);
504
505 pVMG = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
506 pVMG->SetALabel("VMG");
507 m_pitemBoxSizerLeg->Add(pVMG, 1, wxALIGN_LEFT | wxALL, 2);
508
509 pRNG = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
510 pRNG->SetALabel("RNG");
511 m_pitemBoxSizerLeg->Add(pRNG, 1, wxALIGN_LEFT | wxALL, 2);
512
513 pTTG = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
514 pTTG->SetALabel("TTG @VMG");
515 m_pitemBoxSizerLeg->Add(pTTG, 1, wxALIGN_LEFT | wxALL, 2);
516
517 // Create CDI Display Window
518
519 pCDI = new CDI(this, -1, wxSIMPLE_BORDER, "CDI");
520 m_pitemBoxSizerLeg->AddSpacer(5);
521 m_pitemBoxSizerLeg->Add(pCDI, 0, wxALL | wxEXPAND, 2);
522
523 SetSizer(m_pitemBoxSizerLeg); // use the sizer for layout
524 m_pitemBoxSizerLeg->SetSizeHints(this);
525 Layout();
526 Fit();
527
528 if (g_bShowRouteTotal)
529 pThisLegText->SetLabel(_("Route"));
530 else
531 pThisLegText->SetLabel(_("This Leg"));
532
533 Hide();
534}
535
536ConsoleCanvasFrame::~ConsoleCanvasFrame() { delete pCDI; }
537
538void ConsoleCanvasFrame::SetColorScheme(ColorScheme cs) {
539 pbackBrush = wxTheBrushList->FindOrCreateBrush(
540 GetGlobalColor("DILG1" /*UIBDR*/), wxBRUSHSTYLE_SOLID);
541 SetBackgroundColour(GetGlobalColor("DILG1" /*"UIBDR"*/));
542
543 if (g_bShowRouteTotal)
544 pThisLegText->SetLabel(_("Route"));
545 else
546 pThisLegText->SetLabel(_("This Leg"));
547
548 // Also apply color scheme to all known children
549
550 pThisLegText->SetBackgroundColour(GetGlobalColor("DILG1" /*"UIBDR"*/));
551
552 pXTE->SetColorScheme(cs);
553 pBRG->SetColorScheme(cs);
554 pRNG->SetColorScheme(cs);
555 pTTG->SetColorScheme(cs);
556 pVMG->SetColorScheme(cs);
557
558 pCDI->SetColorScheme(cs);
559}
560
561void ConsoleCanvasFrame::OnPaint(wxPaintEvent& event) {
562 wxPaintDC dc(this);
563
564 if (g_pRouteMan->GetpActiveRoute()) {
565 if (m_bNeedClear) {
566 pThisLegText->Refresh();
567 m_bNeedClear = false;
568 }
570 }
571
572 if (!g_bShowActiveRouteHighway) pCDI->Hide();
573}
574
575void ConsoleCanvasFrame::OnShow(wxShowEvent& event) {
576 pCDI->Show(g_bShowActiveRouteHighway);
577 m_pitemBoxSizerLeg->SetSizeHints(this);
578}
579
580void ConsoleCanvasFrame::LegRoute() {
581 if (g_bShowRouteTotal)
582 pThisLegText->SetLabel(_("Route"));
583 else
584 pThisLegText->SetLabel(_("This Leg"));
585
586 pThisLegText->Refresh(true);
587 RefreshConsoleData();
588}
589
590void ConsoleCanvasFrame::OnContextMenu(wxContextMenuEvent& event) {
591 wxMenu* contextMenu = new wxMenu();
592 wxMenuItem* btnLeg =
593 new wxMenuItem(contextMenu, ID_NAVLEG, _("This Leg"), "", wxITEM_RADIO);
594 wxMenuItem* btnRoute = new wxMenuItem(contextMenu, ID_NAVROUTE,
595 _("Full Route"), "", wxITEM_RADIO);
596 wxMenuItem* btnHighw = new wxMenuItem(contextMenu, ID_NAVHIGHWAY,
597 _("Show Highway"), "", wxITEM_CHECK);
598
599#ifdef __ANDROID__
600 wxFont sFont = GetOCPNGUIScaledFont(_("Menu"));
601 btnLeg->SetFont(sFont);
602 btnRoute->SetFont(sFont);
603 btnHighw->SetFont(sFont);
604#endif
605
606 contextMenu->Append(btnLeg);
607 contextMenu->Append(btnRoute);
608 contextMenu->AppendSeparator();
609 contextMenu->Append(btnHighw);
610
611 btnLeg->Check(!g_bShowRouteTotal);
612 btnRoute->Check(g_bShowRouteTotal);
613 btnHighw->Check(g_bShowActiveRouteHighway);
614
615 PopupMenu(contextMenu);
616
617 delete contextMenu;
618}
619
620void ConsoleCanvasFrame::OnContextMenuSelection(wxCommandEvent& event) {
621 switch (event.GetId()) {
622 case ID_NAVLEG: {
623 g_bShowRouteTotal = false;
624 LegRoute();
625 break;
626 }
627 case ID_NAVROUTE: {
628 g_bShowRouteTotal = true;
629 LegRoute();
630 break;
631 }
632 case ID_NAVHIGHWAY: {
633 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
634 if (g_bShowActiveRouteHighway) {
635 pCDI->Show();
636 } else {
637 pCDI->Hide();
638 }
639 m_pitemBoxSizerLeg->SetSizeHints(this);
640 break;
641 }
642 }
643}
644
645void ConsoleCanvasFrame::ToggleShowHighway() {
646 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
647 if (g_bShowActiveRouteHighway) {
648 pCDI->Show();
649 } else {
650 pCDI->Hide();
651 }
652 m_pitemBoxSizerLeg->SetSizeHints(this);
653 Layout();
654}
655
657 // Implement 3-state logic
658 // Route/SOG -> LEG/SOG -> LEG/VMG -> ....
659
660 if (g_bShowRouteTotal) {
661 g_bShowRouteTotal = false;
662 m_speedUsed = SPEED_SOG;
663 } else {
664 if (m_speedUsed == SPEED_VMG) {
665 g_bShowRouteTotal = true;
666 m_speedUsed = SPEED_SOG;
667 } else
668 m_speedUsed = SPEED_VMG;
669 }
670 LegRoute();
671}
672
674 wxString str_buf;
675
676 if (g_pRouteMan->GetpActiveRoute()) {
677 if (g_pRouteMan->m_bDataValid) {
678 // Range to the next waypoint is needed always
679 float rng = g_pRouteMan->GetCurrentRngToActivePoint();
680
681 // Brg to the next waypoint
682 float dcog = g_pRouteMan->GetCurrentBrgToActivePoint();
683 if (dcog >= 359.5) dcog = 0;
684
685 wxString cogstr;
686 if (g_bShowTrue)
687 cogstr << wxString::Format(wxString("%6.0f", wxConvUTF8), dcog);
688 if (g_bShowMag)
689 cogstr << wxString::Format(wxString("%6.0f(M)", wxConvUTF8),
690 toMagnetic(dcog));
691
692 pBRG->SetAValue(cogstr);
693
694 double speed = 0.;
695 if (!std::isnan(gCog) && !std::isnan(gSog)) {
696 double BRG;
697 BRG = g_pRouteMan->GetCurrentBrgToActivePoint();
698 double vmg = gSog * cos((BRG - gCog) * PI / 180.);
699 str_buf.Printf("%6.2f", toUsrSpeed(vmg));
700
701 if (m_speedUsed == SPEED_VMG) {
702 // VMG
703 // VMG is always to next waypoint, not to end of route
704 // VMG is SOG x cosine (difference between COG and BRG to Waypoint)
705 speed = vmg;
706 } else {
707 speed = gSog;
708 }
709 } else
710 str_buf = "---";
711
712 pVMG->SetAValue(str_buf);
713
714 if (!g_bShowRouteTotal) {
715 float nrng = g_pRouteMan->GetCurrentRngToActiveNormalArrival();
716 wxString srng;
717 double deltarng = fabs(rng - nrng);
718 if ((deltarng > .01) && ((deltarng / rng) > .10) &&
719 (rng < 10.0)) // show if there is more than 10% difference in
720 // ranges, etc...
721 {
722 if (nrng < 10.0)
723 srng.Printf("%5.2f/%5.2f", toUsrDistance(rng), toUsrDistance(nrng));
724 else
725 srng.Printf("%5.1f/%5.1f", toUsrDistance(rng), toUsrDistance(nrng));
726 } else {
727 if (rng < 10.0)
728 srng.Printf("%6.2f", toUsrDistance(rng));
729 else
730 srng.Printf("%6.1f", toUsrDistance(rng));
731 }
732
733 // RNG to the next WPT
734 pRNG->SetAValue(srng);
735 // XTE
736 str_buf.Printf(
737 "%6.2f", toUsrDistance(g_pRouteMan->GetCurrentXTEToActivePoint()));
738 pXTE->SetAValue(str_buf);
739 if (g_pRouteMan->GetXTEDir() < 0)
740 pXTE->SetALabel(wxString(_("XTE L")));
741 else
742 pXTE->SetALabel(wxString(_("XTE R")));
743 // TTG
744 // In all cases, ttg/eta are declared invalid if VMG <= 0.
745 // If showing only "this leg", use VMG for calculation of ttg
746 wxString ttg_s;
747 if ((speed > 0.) && !std::isnan(gCog) && !std::isnan(gSog)) {
748 float ttg_sec = (rng / speed) * 3600.;
749 wxTimeSpan ttg_span(0, 0, long(ttg_sec), 0);
750 ttg_s = ttg_span.Format();
751 } else
752 ttg_s = "---";
753
754 pTTG->SetAValue(ttg_s);
755 if (m_speedUsed == SPEED_VMG) {
756 pTTG->SetALabel(wxString(_("TTG @VMG")));
757 } else {
758 pTTG->SetALabel(wxString(_("TTG @SOG")));
759 }
760 } else {
761 // Remainder of route
762 float trng = rng;
763
764 Route* prt = g_pRouteMan->GetpActiveRoute();
765 int n_addflag = 0;
766 for (RoutePoint* prp : *prt->pRoutePointList) {
767 if (n_addflag) trng += prp->m_seg_len;
768
769 if (prp == prt->m_pRouteActivePoint) n_addflag++;
770 }
771
772 // total rng
773 wxString strng;
774 if (trng < 10.0)
775 strng.Printf("%6.2f", toUsrDistance(trng));
776 else
777 strng.Printf("%6.1f", toUsrDistance(trng));
778
779 pRNG->SetAValue(strng);
780
781 // total TTG
782 // If showing total route TTG/ETA, use gSog for calculation
783
784 wxString tttg_s;
785 wxTimeSpan tttg_span;
786 float tttg_sec = 0.0;
787 if (speed > 0.) {
788 tttg_sec = (trng / gSog) * 3600.;
789 tttg_span = wxTimeSpan::Seconds((long)tttg_sec);
790 // Show also #days if TTG > 24 h
791 tttg_s = tttg_sec > SECONDS_PER_DAY ? tttg_span.Format(_("%Dd %H:%M"))
792 : tttg_span.Format("%H:%M:%S");
793 } else {
794 tttg_span = wxTimeSpan::Seconds(0);
795 tttg_s = "---";
796 }
797
798 pTTG->SetAValue(tttg_s);
799
800 // total ETA to be shown on XTE panel
801 wxDateTime dtnow, eta;
802 dtnow.SetToCurrent();
803 eta = dtnow.Add(tttg_span);
804 wxString seta;
805
806 if (speed > 0.) {
807 // Show date, e.g. Feb 15, if TTG > 24 h
808 seta = tttg_sec > SECONDS_PER_DAY ? eta.Format("%d/%m %H:%M")
809 : eta.Format("%H:%M");
810 } else {
811 seta = "---";
812 }
813 pXTE->SetAValue(seta);
814 if (m_speedUsed == SPEED_VMG) {
815 pTTG->SetALabel(wxString(_("TTG @VMG")));
816 pXTE->SetALabel(wxString(_("ETA @VMG")));
817 } else {
818 pTTG->SetALabel(wxString(_("TTG @SOG")));
819 pXTE->SetALabel(wxString(_("ETA @SOG")));
820 }
821 }
822
823 pRNG->Refresh();
824 pBRG->Refresh();
825 pVMG->Refresh();
826 pTTG->Refresh();
827 pXTE->Refresh();
828 }
829 }
830}
831
832void ConsoleCanvasFrame::RefreshConsoleData() {
834
835 pRNG->Refresh();
836 pBRG->Refresh();
837 pVMG->Refresh();
838 pTTG->Refresh();
839 pXTE->Refresh();
840 pCDI->Refresh();
841}
842
844 Hide();
845 Move(0, 0);
846 UpdateFonts();
847 top_frame::Get()->PositionConsole();
848 Show();
849}
850
851void ConsoleCanvasFrame::UpdateFonts() {
852 pBRG->RefreshFonts();
853 pXTE->RefreshFonts();
854 pTTG->RefreshFonts();
855 pRNG->RefreshFonts();
856 pVMG->RefreshFonts();
857
858 m_pitemBoxSizerLeg->SetSizeHints(this);
859 Layout();
860 Fit();
861
862 Refresh();
863}
864
865//------------------------------------------------------------------------------
866// AnnunText Implementation
867//------------------------------------------------------------------------------
868BEGIN_EVENT_TABLE(AnnunText, wxWindow)
869EVT_PAINT(AnnunText::OnPaint)
870EVT_MOUSE_EVENTS(AnnunText::MouseEvent)
871END_EVENT_TABLE()
872
873AnnunText::AnnunText(wxWindow* parent, wxWindowID id,
874 const wxString& LegendElement,
875 const wxString& ValueElement)
876 : wxWindow(parent, id, wxDefaultPosition, wxDefaultSize, wxNO_BORDER) {
877 m_label = "Label";
878 m_value = "-----";
879
880 m_plabelFont = FontMgr::Get().FindOrCreateFont(
881 14, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, FALSE,
882 wxString("Arial Bold"));
883 m_pvalueFont = FontMgr::Get().FindOrCreateFont(
884 24, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, FALSE,
885 wxString("helvetica"), wxFONTENCODING_ISO8859_1);
886
887 m_LegendTextElement = LegendElement;
888 m_ValueTextElement = ValueElement;
889
890 RefreshFonts();
891}
892
893AnnunText::~AnnunText() {}
894void AnnunText::MouseEvent(wxMouseEvent& event) {
895 ConsoleCanvasWin* ccpw = dynamic_cast<ConsoleCanvasWin*>(GetParent());
896 if (ccpw) {
897 if (event.RightDown()) {
898 wxContextMenuEvent cevt;
899 cevt.SetPosition(event.GetPosition());
900 ccpw->OnContextMenu(cevt);
901 } else if (event.LeftDown()) {
903 }
904 } else {
905 ConsoleCanvasFrame* ccpf = dynamic_cast<ConsoleCanvasFrame*>(GetParent());
906 if (ccpf) {
907 if (event.RightDown()) {
908 wxContextMenuEvent cevt;
909 cevt.SetPosition(event.GetPosition());
910 ccpf->OnContextMenu(cevt);
911 } else if (event.LeftDown()) {
913 }
914 }
915 }
916}
917
918void AnnunText::CalculateMinSize() {
919 // Calculate the minimum required size of the window based on text size
920
921 int wl = 50; // reasonable defaults?
922 int hl = 20;
923 int wv = 50;
924 int hv = 20;
925
926 if (m_plabelFont)
927 GetTextExtent("TTG @SOG", &wl, &hl, NULL, NULL, m_plabelFont);
928
929 if (m_pvalueFont)
930 GetTextExtent("123.4567", &wv, &hv, NULL, NULL, m_pvalueFont);
931
932 double pdifactor =
933 g_BasePlatform->GetDisplayDIPMult(wxTheApp->GetTopWindow());
934 wl *= pdifactor;
935 hl *= pdifactor;
936 wv *= pdifactor;
937 hv *= pdifactor;
938
939 wxSize min;
940 min.x = wv * 1.2;
941 min.x = wxMax(min.x, wl * 1.2);
942 min.y = (int)((hl + hv) * 1.2);
943
944 SetMinSize(min);
945
946 // resize background to the necessary size
947 ocpnStyle::Style* style = g_StyleManager->GetCurrentStyle();
948 if (style->consoleTextBackground.IsOk()) {
949 wxImage img = style->consoleTextBackground.ConvertToImage();
950 style->consoleTextBackground = wxBitmap(img.Rescale(min.x, min.y));
951 }
952}
953
954void AnnunText::SetColorScheme(ColorScheme cs) {
955 ocpnStyle::Style* style = g_StyleManager->GetCurrentStyle();
956 m_backBrush = *wxTheBrushList->FindOrCreateBrush(GetGlobalColor("UBLCK"),
957 wxBRUSHSTYLE_SOLID);
958
959 m_default_text_color = style->consoleFontColor;
960 RefreshFonts();
961}
962
963void AnnunText::RefreshFonts() {
964 wxFont* pl = FontMgr::Get().GetFont(m_LegendTextElement);
965 m_plabelFont = FontMgr::Get().FindOrCreateFont(
966 pl->GetPointSize() / OCPN_GetWinDIPScaleFactor(), pl->GetFamily(),
967 pl->GetStyle(), pl->GetWeight(), FALSE, pl->GetFaceName());
968
969 wxFont* pv = FontMgr::Get().GetFont(m_ValueTextElement);
970 m_pvalueFont = FontMgr::Get().FindOrCreateFont(
971 pv->GetPointSize() / OCPN_GetWinDIPScaleFactor(), pv->GetFamily(),
972 pv->GetStyle(), pv->GetWeight(), FALSE, pv->GetFaceName());
973
974 m_legend_color = FontMgr::Get().GetFontColor(_("Console Legend"));
975 m_val_color = FontMgr::Get().GetFontColor(_("Console Value"));
976
977 CalculateMinSize();
978
979 // Make sure that the background color and the text colors are not too close,
980 // for contrast
981 if (m_backBrush.IsOk()) {
982 wxColour back_color = m_backBrush.GetColour();
983
984 wxColour legend_color = m_legend_color;
985 if ((abs(legend_color.Red() - back_color.Red()) < 5) &&
986 (abs(legend_color.Green() - back_color.Blue()) < 5) &&
987 (abs(legend_color.Blue() - back_color.Blue()) < 5))
988 m_legend_color = m_default_text_color;
989
990 wxColour value_color = m_val_color;
991 if ((abs(value_color.Red() - back_color.Red()) < 5) &&
992 (abs(value_color.Green() - back_color.Blue()) < 5) &&
993 (abs(value_color.Blue() - back_color.Blue()) < 5))
994 m_val_color = m_default_text_color;
995 }
996}
997
998void AnnunText::SetLegendElement(const wxString& element) {
999 m_LegendTextElement = element;
1000}
1001
1002void AnnunText::SetValueElement(const wxString& element) {
1003 m_ValueTextElement = element;
1004}
1005
1006void AnnunText::SetALabel(const wxString& l) { m_label = l; }
1007
1008void AnnunText::SetAValue(const wxString& v) { m_value = v; }
1009
1010void AnnunText::OnPaint(wxPaintEvent& event) {
1011 int sx, sy;
1012 GetClientSize(&sx, &sy);
1013 ocpnStyle::Style* style = g_StyleManager->GetCurrentStyle();
1014
1015 // Do the drawing on an off-screen memory DC, and blit into place
1016 // to avoid objectionable flashing
1017 wxMemoryDC mdc;
1018
1019 wxBitmap m_bitmap(sx, sy, -1);
1020 mdc.SelectObject(m_bitmap);
1021 mdc.SetBackground(m_backBrush);
1022 mdc.Clear();
1023
1024 if (style->consoleTextBackground.IsOk())
1025 mdc.DrawBitmap(style->consoleTextBackground, 0, 0);
1026
1027 mdc.SetTextForeground(m_default_text_color);
1028
1029 if (m_plabelFont) {
1030 mdc.SetFont(*m_plabelFont);
1031 mdc.SetTextForeground(m_legend_color);
1032 mdc.DrawText(m_label, 5, 2);
1033 }
1034
1035 if (m_pvalueFont) {
1036 mdc.SetFont(*m_pvalueFont);
1037 mdc.SetTextForeground(m_val_color);
1038
1039 int w, h;
1040 mdc.GetTextExtent(m_value, &w, &h);
1041 int cw, ch;
1042 mdc.GetSize(&cw, &ch);
1043
1044 mdc.DrawText(m_value, cw - w - 2, ch - h - 2);
1045 }
1046
1047 wxPaintDC dc(this);
1048 dc.Blit(0, 0, sx, sy, &mdc, 0, 0);
1049}
1050//------------------------------------------------------------------------------
1051// CDI Implementation
1052//------------------------------------------------------------------------------
1053BEGIN_EVENT_TABLE(CDI, wxWindow)
1054EVT_PAINT(CDI::OnPaint)
1055EVT_MOUSE_EVENTS(CDI::MouseEvent)
1056END_EVENT_TABLE()
1057
1058CDI::CDI(wxWindow* parent, wxWindowID id, long style, const wxString& name)
1059 : wxWindow(parent, id, wxDefaultPosition, wxDefaultSize, style, name)
1060
1061{
1062 SetMinSize(wxSize(10, 150));
1063}
1064
1065void CDI::MouseEvent(wxMouseEvent& event) {
1066#ifdef __ANDROID__
1067 if (event.RightDown()) {
1068 qDebug() << "right down";
1069
1070 wxContextMenuEvent cevt;
1071 cevt.SetPosition(event.GetPosition());
1072
1073 ConsoleCanvasFrame* ccp = dynamic_cast<ConsoleCanvasFrame*>(GetParent());
1074 if (ccp) ccp->OnContextMenu(cevt);
1075 }
1076#endif
1077}
1078
1079void CDI::SetColorScheme(ColorScheme cs) {
1080 m_pbackBrush = wxTheBrushList->FindOrCreateBrush(GetGlobalColor("DILG2"),
1081 wxBRUSHSTYLE_SOLID);
1082 m_proadBrush = wxTheBrushList->FindOrCreateBrush(GetGlobalColor("DILG1"),
1083 wxBRUSHSTYLE_SOLID);
1084 m_proadPen = wxThePenList->FindOrCreatePen(GetGlobalColor("CHBLK"), 1,
1085 wxPENSTYLE_SOLID);
1086}
1087
1088void CDI::OnPaint(wxPaintEvent& event) {
1089 int sx, sy;
1090 GetClientSize(&sx, &sy);
1091
1092 // Do the drawing on an off-screen memory DC, and blit into place
1093 // to avoid objectionable flashing
1094 wxMemoryDC mdc;
1095
1096 wxBitmap m_bitmap(sx, sy, -1);
1097 mdc.SelectObject(m_bitmap);
1098 mdc.SetBackground(*m_pbackBrush);
1099 mdc.Clear();
1100
1101 int xp = sx / 2;
1102 int yp = sy * 9 / 10;
1103
1104 int path_length = sy * 3;
1105 int pix_per_xte = 120;
1106
1107 if (g_pRouteMan->GetpActiveRoute()) {
1108 double angle = 90 - (g_pRouteMan->GetCurrentSegmentCourse() - gCog);
1109
1110 double dy = path_length * sin(angle * PI / 180.);
1111 double dx = path_length * cos(angle * PI / 180.);
1112
1113 int xtedir;
1114 xtedir = g_pRouteMan->GetXTEDir();
1115 double xte = g_pRouteMan->GetCurrentXTEToActivePoint();
1116
1117 double ddy = xtedir * pix_per_xte * xte * sin((90 - angle) * PI / 180.);
1118 double ddx = xtedir * pix_per_xte * xte * cos((90 - angle) * PI / 180.);
1119
1120 int ddxi = (int)ddx;
1121 int ddyi = (int)ddy;
1122
1123 int xc1 = xp - (int)(dx / 2) + ddxi;
1124 int yc1 = yp + (int)(dy / 2) + ddyi;
1125 int xc2 = xp + (int)(dx / 2) + ddxi;
1126 int yc2 = yp - (int)(dy / 2) + ddyi;
1127
1128 wxPoint road[4];
1129
1130 int road_top_width = 10;
1131 int road_bot_width = 40;
1132
1133 road[0].x = xc1 - (int)(road_bot_width * cos((90 - angle) * PI / 180.));
1134 road[0].y = yc1 - (int)(road_bot_width * sin((90 - angle) * PI / 180.));
1135
1136 road[1].x = xc2 - (int)(road_top_width * cos((90 - angle) * PI / 180.));
1137 road[1].y = yc2 - (int)(road_top_width * sin((90 - angle) * PI / 180.));
1138
1139 road[2].x = xc2 + (int)(road_top_width * cos((90 - angle) * PI / 180.));
1140 road[2].y = yc2 + (int)(road_top_width * sin((90 - angle) * PI / 180.));
1141
1142 road[3].x = xc1 + (int)(road_bot_width * cos((90 - angle) * PI / 180.));
1143 road[3].y = yc1 + (int)(road_bot_width * sin((90 - angle) * PI / 180.));
1144
1145 mdc.SetBrush(*m_proadBrush);
1146 mdc.SetPen(*m_proadPen);
1147 mdc.DrawPolygon(4, road, 0, 0, wxODDEVEN_RULE);
1148
1150
1151 mdc.DrawLine(0, yp, sx, yp);
1152 mdc.DrawCircle(xp, yp, 6);
1153 mdc.DrawLine(xp, yp + 5, xp, yp - 5);
1154 }
1155
1156 wxPaintDC dc(this);
1157 dc.Blit(0, 0, sx, sy, &mdc, 0, 0);
1158}
1159
1160#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__ANDROID__)
1161APConsole::APConsole(wxWindow* parent) {
1162 m_con_frame = new ConsoleCanvasFrame(wxTheApp->GetTopWindow());
1163}
1164APConsole::~APConsole() {}
1165void APConsole::SetColorScheme(ColorScheme cs) {
1166 m_con_frame->SetColorScheme(cs);
1167}
1168bool APConsole::IsShown() { return m_con_frame->IsShown(); }
1169void APConsole::UpdateFonts() { m_con_frame->UpdateFonts(); }
1170void APConsole::RefreshConsoleData() { m_con_frame->RefreshConsoleData(); }
1171void APConsole::Raise() { m_con_frame->Raise(); }
1172void APConsole::ShowWithFreshFonts() { m_con_frame->ShowWithFreshFonts(); }
1173void APConsole::Show(bool bshow) { m_con_frame->Show(bshow); }
1174CDI* APConsole::GetCDI() { return m_con_frame->pCDI; }
1175wxSize APConsole::GetSize() { return m_con_frame->GetSize(); }
1176void APConsole::ToggleShowHighway() { m_con_frame->ToggleShowHighway(); }
1177void APConsole::Move(wxPoint p) { m_con_frame->Move(p); }
1178
1179#else
1180
1181APConsole::APConsole(wxWindow* parent) {
1182 m_con_win = new ConsoleCanvasWin(parent);
1183}
1184APConsole::~APConsole() {}
1185void APConsole::SetColorScheme(ColorScheme cs) {
1186 m_con_win->SetColorScheme(cs);
1187}
1188bool APConsole::IsShown() { return m_con_win->IsShown(); }
1189void APConsole::UpdateFonts() { m_con_win->UpdateFonts(); }
1190void APConsole::RefreshConsoleData() { m_con_win->RefreshConsoleData(); }
1191void APConsole::Raise() {}
1192void APConsole::ShowWithFreshFonts() { m_con_win->ShowWithFreshFonts(); }
1193void APConsole::Show(bool bshow) { m_con_win->Show(bshow); }
1194CDI* APConsole::GetCDI() { return m_con_win->pCDI; }
1195wxSize APConsole::GetSize() { return m_con_win->GetSize(); }
1196void APConsole::ToggleShowHighway() { m_con_win->ToggleShowHighway(); }
1197void APConsole::Move(wxPoint p) { m_con_win->Move(p); }
1198
1199#endif
BasePlatform * g_BasePlatform
points to g_platform, handles brain-dead MS linker.
double GetDisplayDIPMult(wxWindow *win)
Get the display scaling factor for DPI-aware rendering.
Annunciator Text display.
Definition concanv.h:58
Course Deviation Indicator display.
Definition concanv.h:39
void OnPaint(wxPaintEvent &event)
Definition concanv.cpp:1088
void ToggleRouteTotalDisplay()
Toggles between route total and current leg display modes.
Definition concanv.cpp:656
void ShowWithFreshFonts(void)
Recomputes and applies new fonts to console elements.
Definition concanv.cpp:843
void UpdateRouteData()
Updates route-related data displays.
Definition concanv.cpp:673
Primary navigation console display for route and vessel tracking.
Definition concanv.h:116
void UpdateRouteData()
Updates route-related data displays.
Definition concanv.cpp:265
void ShowWithFreshFonts(void)
Recomputes and applies new fonts to console elements.
Definition concanv.cpp:434
void ToggleRouteTotalDisplay()
Toggles between route total and current leg display modes.
Definition concanv.cpp:248
wxFont * FindOrCreateFont(int point_size, wxFontFamily family, wxFontStyle style, wxFontWeight weight, bool underline=false, const wxString &facename=wxEmptyString, wxFontEncoding encoding=wxFONTENCODING_DEFAULT)
Creates or finds a matching font in the font cache.
Definition font_mgr.cpp:442
wxColour GetFontColor(const wxString &TextElement) const
Gets the text color for a UI element.
Definition font_mgr.cpp:110
wxFont * GetFont(const wxString &TextElement, int requested_font_size=0)
Get a font object for a UI element.
Definition font_mgr.cpp:193
Represents a waypoint or mark within the navigation system.
Definition route_point.h:71
Represents a navigational route in the navigation system.
Definition route.h:99
RoutePointList * pRoutePointList
Ordered list of waypoints (RoutePoints) that make up this route.
Definition route.h:336
RoutePoint * m_pRouteActivePoint
Pointer to the currently active waypoint within this route.
Definition route.h:214
Global color handling by name.
APConsole * console
Global instance.
Definition concanv.cpp:55
Primary navigation console display for route and vessel tracking.
Global variables stored in configuration file.
Font list manager.
Platform independent GL includes.
wxFont * GetOCPNScaledFont(wxString item, int default_size)
Retrieves a font from FontMgr, optionally scaled for physical readability.
Definition gui_lib.cpp:61
wxFont GetOCPNGUIScaledFont(wxString item)
Retrieves a font optimized for touch and high-resolution interfaces.
Definition gui_lib.cpp:90
General purpose GUI support.
Utility functions.
double toUsrDistance(double nm_distance, int unit)
Convert a distance from nautical miles (NMi) to user display units.
Navigation Utility Functions without GUI dependencies.
OpenCPN Platform specific support utilities.
PlugIn Object Definition/API.
double OCPN_GetWinDIPScaleFactor()
Gets Windows-specific DPI scaling factor.
double gCog
Course over ground in degrees (0-359.99).
Definition own_ship.cpp:28
double gSog
Speed over ground in knots.
Definition own_ship.cpp:29
Position, course, speed, etc.
Route abstraction.
Routeman * g_pRouteMan
Global instance.
Definition routeman.cpp:60
Route Manager.
Chart Symbols.
Abstract gFrame/MyFrame interface.