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