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 "FontMgr.h"
43#include "gui_lib.h"
44#include "navutil.h"
45#include "ocpn_frame.h"
46#include "OCPNPlatform.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(_T("DILG1" /*UIBDR*/)), wxBRUSHSTYLE_SOLID);
139 SetBackgroundColour(GetGlobalColor(_T("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(_T("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 wxRoutePointListNode* node = (prt->pRoutePointList)->GetFirst();
354 RoutePoint* prp;
355
356 int n_addflag = 0;
357 while (node) {
358 prp = node->GetData();
359 if (n_addflag) trng += prp->m_seg_len;
360
361 if (prp == prt->m_pRouteActivePoint) n_addflag++;
362
363 node = node->GetNext();
364 }
365
366 // total rng
367 wxString strng;
368 if (trng < 10.0)
369 strng.Printf("%6.2f", toUsrDistance(trng));
370 else
371 strng.Printf("%6.1f", toUsrDistance(trng));
372
373 pRNG->SetAValue(strng);
374
375 // total TTG
376 // If showing total route TTG/ETA, use gSog for calculation
377
378 wxString tttg_s;
379 wxTimeSpan tttg_span;
380 float tttg_sec = 0.0;
381 if (speed > 0.) {
382 tttg_sec = (trng / gSog) * 3600.;
383 tttg_span = wxTimeSpan::Seconds((long)tttg_sec);
384 // Show also #days if TTG > 24 h
385 tttg_s = tttg_sec > SECONDS_PER_DAY ? tttg_span.Format(_("%Dd %H:%M"))
386 : tttg_span.Format("%H:%M:%S");
387 } else {
388 tttg_span = wxTimeSpan::Seconds(0);
389 tttg_s = "---";
390 }
391
392 pTTG->SetAValue(tttg_s);
393
394 // total ETA to be shown on XTE panel
395 wxDateTime dtnow, eta;
396 dtnow.SetToCurrent();
397 eta = dtnow.Add(tttg_span);
398 wxString seta;
399
400 if (speed > 0.) {
401 // Show date, e.g. Feb 15, if TTG > 24 h
402 seta = tttg_sec > SECONDS_PER_DAY ? eta.Format("%d/%m %H:%M")
403 : eta.Format("%H:%M");
404 } else {
405 seta = "---";
406 }
407 pXTE->SetAValue(seta);
408 if (m_speedUsed == SPEED_VMG) {
409 pTTG->SetALabel(wxString(_("TTG @VMG")));
410 pXTE->SetALabel(wxString(_("ETA @VMG")));
411 } else {
412 pTTG->SetALabel(wxString(_("TTG @SOG")));
413 pXTE->SetALabel(wxString(_("ETA @SOG")));
414 }
415 }
416
417 pRNG->Refresh();
418 pBRG->Refresh();
419 pVMG->Refresh();
420 pTTG->Refresh();
421 pXTE->Refresh();
422 }
423 }
424}
425
426void ConsoleCanvasWin::RefreshConsoleData(void) {
428
429 pRNG->Refresh();
430 pBRG->Refresh();
431 pVMG->Refresh();
432 pTTG->Refresh();
433 pXTE->Refresh();
434 pCDI->Refresh();
435}
436
438 Hide();
439 UpdateFonts();
440 gFrame->PositionConsole();
441 Show();
442}
443
444void ConsoleCanvasWin::UpdateFonts(void) {
445 pBRG->RefreshFonts();
446 pXTE->RefreshFonts();
447 pTTG->RefreshFonts();
448 pRNG->RefreshFonts();
449 pVMG->RefreshFonts();
450
451 m_pitemBoxSizerLeg->SetSizeHints(this);
452 Layout();
453 Fit();
454
455 Refresh();
456}
457
458//------------------------------------------------------------------------------
459// ConsoleCanvasFrame Implementation
460//------------------------------------------------------------------------------
461BEGIN_EVENT_TABLE(ConsoleCanvasFrame, wxWindow)
462EVT_PAINT(ConsoleCanvasFrame::OnPaint)
463EVT_SHOW(ConsoleCanvasFrame::OnShow)
464EVT_CONTEXT_MENU(ConsoleCanvasFrame::OnContextMenu)
465EVT_MENU(ID_NAVLEG, ConsoleCanvasFrame::OnContextMenuSelection)
466EVT_MENU(ID_NAVROUTE, ConsoleCanvasFrame::OnContextMenuSelection)
467EVT_MENU(ID_NAVHIGHWAY, ConsoleCanvasFrame::OnContextMenuSelection)
468END_EVENT_TABLE()
469
470// Define a constructor for my canvas
471ConsoleCanvasFrame::ConsoleCanvasFrame(wxWindow* parent) {
472 m_speedUsed = SPEED_SOG;
473 pbackBrush = NULL;
474 m_bNeedClear = false;
475
476 long style = wxSIMPLE_BORDER | wxCLIP_CHILDREN | wxFRAME_FLOAT_ON_PARENT;
477
478#ifdef __WXMSW__
479 style |= wxFRAME_NO_TASKBAR;
480#endif
481
482 wxFrame::Create(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize,
483 style);
484
485 m_pParent = parent;
486
487 m_pitemBoxSizerLeg = new wxBoxSizer(wxVERTICAL);
488
489 pThisLegText = new wxStaticText(this, -1, _("This Leg"));
490 pThisLegText->Fit();
491 m_pitemBoxSizerLeg->Add(pThisLegText, 0, wxALIGN_CENTER_HORIZONTAL, 2);
492
493 wxFont* qFont = GetOCPNScaledFont(_("Dialog"));
494
495 wxFont* pThisLegFont = FontMgr::Get().FindOrCreateFont(
496 qFont->GetPointSize(), wxFONTFAMILY_DEFAULT, qFont->GetStyle(),
497 wxFONTWEIGHT_BOLD, false, qFont->GetFaceName());
498 pThisLegText->SetFont(*pThisLegFont);
499
500 pXTE = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
501 pXTE->SetALabel("XTE");
502 m_pitemBoxSizerLeg->Add(pXTE, 1, wxALIGN_LEFT | wxALL, 2);
503
504 pBRG = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
505 pBRG->SetALabel("BRG");
506 m_pitemBoxSizerLeg->Add(pBRG, 1, wxALIGN_LEFT | wxALL, 2);
507
508 pVMG = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
509 pVMG->SetALabel("VMG");
510 m_pitemBoxSizerLeg->Add(pVMG, 1, wxALIGN_LEFT | wxALL, 2);
511
512 pRNG = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
513 pRNG->SetALabel("RNG");
514 m_pitemBoxSizerLeg->Add(pRNG, 1, wxALIGN_LEFT | wxALL, 2);
515
516 pTTG = new AnnunText(this, -1, _("Console Legend"), _("Console Value"));
517 pTTG->SetALabel("TTG @VMG");
518 m_pitemBoxSizerLeg->Add(pTTG, 1, wxALIGN_LEFT | wxALL, 2);
519
520 // Create CDI Display Window
521
522 pCDI = new CDI(this, -1, wxSIMPLE_BORDER, "CDI");
523 m_pitemBoxSizerLeg->AddSpacer(5);
524 m_pitemBoxSizerLeg->Add(pCDI, 0, wxALL | wxEXPAND, 2);
525
526 SetSizer(m_pitemBoxSizerLeg); // use the sizer for layout
527 m_pitemBoxSizerLeg->SetSizeHints(this);
528 Layout();
529 Fit();
530
531 if (g_bShowRouteTotal)
532 pThisLegText->SetLabel(_("Route"));
533 else
534 pThisLegText->SetLabel(_("This Leg"));
535
536 Hide();
537}
538
539ConsoleCanvasFrame::~ConsoleCanvasFrame() { delete pCDI; }
540
541void ConsoleCanvasFrame::SetColorScheme(ColorScheme cs) {
542 pbackBrush = wxTheBrushList->FindOrCreateBrush(
543 GetGlobalColor(_T("DILG1" /*UIBDR*/)), wxBRUSHSTYLE_SOLID);
544 SetBackgroundColour(GetGlobalColor(_T("DILG1" /*"UIBDR"*/)));
545
546 if (g_bShowRouteTotal)
547 pThisLegText->SetLabel(_("Route"));
548 else
549 pThisLegText->SetLabel(_("This Leg"));
550
551 // Also apply color scheme to all known children
552
553 pThisLegText->SetBackgroundColour(GetGlobalColor(_T("DILG1" /*"UIBDR"*/)));
554
555 pXTE->SetColorScheme(cs);
556 pBRG->SetColorScheme(cs);
557 pRNG->SetColorScheme(cs);
558 pTTG->SetColorScheme(cs);
559 pVMG->SetColorScheme(cs);
560
561 pCDI->SetColorScheme(cs);
562}
563
564void ConsoleCanvasFrame::OnPaint(wxPaintEvent& event) {
565 wxPaintDC dc(this);
566
567 if (g_pRouteMan->GetpActiveRoute()) {
568 if (m_bNeedClear) {
569 pThisLegText->Refresh();
570 m_bNeedClear = false;
571 }
573 }
574
575 if (!g_bShowActiveRouteHighway) pCDI->Hide();
576}
577
578void ConsoleCanvasFrame::OnShow(wxShowEvent& event) {
579 pCDI->Show(g_bShowActiveRouteHighway);
580 m_pitemBoxSizerLeg->SetSizeHints(this);
581}
582
583void ConsoleCanvasFrame::LegRoute() {
584 if (g_bShowRouteTotal)
585 pThisLegText->SetLabel(_("Route"));
586 else
587 pThisLegText->SetLabel(_("This Leg"));
588
589 pThisLegText->Refresh(true);
590 RefreshConsoleData();
591}
592
593void ConsoleCanvasFrame::OnContextMenu(wxContextMenuEvent& event) {
594 wxMenu* contextMenu = new wxMenu();
595 wxMenuItem* btnLeg =
596 new wxMenuItem(contextMenu, ID_NAVLEG, _("This Leg"), "", wxITEM_RADIO);
597 wxMenuItem* btnRoute = new wxMenuItem(contextMenu, ID_NAVROUTE,
598 _("Full Route"), "", wxITEM_RADIO);
599 wxMenuItem* btnHighw = new wxMenuItem(contextMenu, ID_NAVHIGHWAY,
600 _("Show Highway"), "", wxITEM_CHECK);
601
602#ifdef __ANDROID__
603 wxFont sFont = GetOCPNGUIScaledFont(_("Menu"));
604 btnLeg->SetFont(sFont);
605 btnRoute->SetFont(sFont);
606 btnHighw->SetFont(sFont);
607#endif
608
609 contextMenu->Append(btnLeg);
610 contextMenu->Append(btnRoute);
611 contextMenu->AppendSeparator();
612 contextMenu->Append(btnHighw);
613
614 btnLeg->Check(!g_bShowRouteTotal);
615 btnRoute->Check(g_bShowRouteTotal);
616 btnHighw->Check(g_bShowActiveRouteHighway);
617
618 PopupMenu(contextMenu);
619
620 delete contextMenu;
621}
622
623void ConsoleCanvasFrame::OnContextMenuSelection(wxCommandEvent& event) {
624 switch (event.GetId()) {
625 case ID_NAVLEG: {
626 g_bShowRouteTotal = false;
627 LegRoute();
628 break;
629 }
630 case ID_NAVROUTE: {
631 g_bShowRouteTotal = true;
632 LegRoute();
633 break;
634 }
635 case ID_NAVHIGHWAY: {
636 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
637 if (g_bShowActiveRouteHighway) {
638 pCDI->Show();
639 } else {
640 pCDI->Hide();
641 }
642 m_pitemBoxSizerLeg->SetSizeHints(this);
643 break;
644 }
645 }
646}
647
648void ConsoleCanvasFrame::ToggleShowHighway() {
649 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
650 if (g_bShowActiveRouteHighway) {
651 pCDI->Show();
652 } else {
653 pCDI->Hide();
654 }
655 m_pitemBoxSizerLeg->SetSizeHints(this);
656 Layout();
657}
658
660 // Implement 3-state logic
661 // Route/SOG -> LEG/SOG -> LEG/VMG -> ....
662
663 if (g_bShowRouteTotal) {
664 g_bShowRouteTotal = false;
665 m_speedUsed = SPEED_SOG;
666 } else {
667 if (m_speedUsed == SPEED_VMG) {
668 g_bShowRouteTotal = true;
669 m_speedUsed = SPEED_SOG;
670 } else
671 m_speedUsed = SPEED_VMG;
672 }
673 LegRoute();
674}
675
677 wxString str_buf;
678
679 if (g_pRouteMan->GetpActiveRoute()) {
680 if (g_pRouteMan->m_bDataValid) {
681 // Range to the next waypoint is needed always
682 float rng = g_pRouteMan->GetCurrentRngToActivePoint();
683
684 // Brg to the next waypoint
685 float dcog = g_pRouteMan->GetCurrentBrgToActivePoint();
686 if (dcog >= 359.5) dcog = 0;
687
688 wxString cogstr;
689 if (g_bShowTrue)
690 cogstr << wxString::Format(wxString("%6.0f", wxConvUTF8), dcog);
691 if (g_bShowMag)
692 cogstr << wxString::Format(wxString("%6.0f(M)", wxConvUTF8),
693 toMagnetic(dcog));
694
695 pBRG->SetAValue(cogstr);
696
697 double speed = 0.;
698 if (!std::isnan(gCog) && !std::isnan(gSog)) {
699 double BRG;
700 BRG = g_pRouteMan->GetCurrentBrgToActivePoint();
701 double vmg = gSog * cos((BRG - gCog) * PI / 180.);
702 str_buf.Printf("%6.2f", toUsrSpeed(vmg));
703
704 if (m_speedUsed == SPEED_VMG) {
705 // VMG
706 // VMG is always to next waypoint, not to end of route
707 // VMG is SOG x cosine (difference between COG and BRG to Waypoint)
708 speed = vmg;
709 } else {
710 speed = gSog;
711 }
712 } else
713 str_buf = "---";
714
715 pVMG->SetAValue(str_buf);
716
717 if (!g_bShowRouteTotal) {
718 float nrng = g_pRouteMan->GetCurrentRngToActiveNormalArrival();
719 wxString srng;
720 double deltarng = fabs(rng - nrng);
721 if ((deltarng > .01) && ((deltarng / rng) > .10) &&
722 (rng < 10.0)) // show if there is more than 10% difference in
723 // ranges, etc...
724 {
725 if (nrng < 10.0)
726 srng.Printf("%5.2f/%5.2f", toUsrDistance(rng), toUsrDistance(nrng));
727 else
728 srng.Printf("%5.1f/%5.1f", toUsrDistance(rng), toUsrDistance(nrng));
729 } else {
730 if (rng < 10.0)
731 srng.Printf("%6.2f", toUsrDistance(rng));
732 else
733 srng.Printf("%6.1f", toUsrDistance(rng));
734 }
735
736 // RNG to the next WPT
737 pRNG->SetAValue(srng);
738 // XTE
739 str_buf.Printf(
740 "%6.2f", toUsrDistance(g_pRouteMan->GetCurrentXTEToActivePoint()));
741 pXTE->SetAValue(str_buf);
742 if (g_pRouteMan->GetXTEDir() < 0)
743 pXTE->SetALabel(wxString(_("XTE L")));
744 else
745 pXTE->SetALabel(wxString(_("XTE R")));
746 // TTG
747 // In all cases, ttg/eta are declared invalid if VMG <= 0.
748 // If showing only "this leg", use VMG for calculation of ttg
749 wxString ttg_s;
750 if ((speed > 0.) && !std::isnan(gCog) && !std::isnan(gSog)) {
751 float ttg_sec = (rng / speed) * 3600.;
752 wxTimeSpan ttg_span(0, 0, long(ttg_sec), 0);
753 ttg_s = ttg_span.Format();
754 } else
755 ttg_s = "---";
756
757 pTTG->SetAValue(ttg_s);
758 if (m_speedUsed == SPEED_VMG) {
759 pTTG->SetALabel(wxString(_("TTG @VMG")));
760 } else {
761 pTTG->SetALabel(wxString(_("TTG @SOG")));
762 }
763 } else {
764 // Remainder of route
765 float trng = rng;
766
767 Route* prt = g_pRouteMan->GetpActiveRoute();
768 wxRoutePointListNode* node = (prt->pRoutePointList)->GetFirst();
769 RoutePoint* prp;
770
771 int n_addflag = 0;
772 while (node) {
773 prp = node->GetData();
774 if (n_addflag) trng += prp->m_seg_len;
775
776 if (prp == prt->m_pRouteActivePoint) n_addflag++;
777
778 node = node->GetNext();
779 }
780
781 // total rng
782 wxString strng;
783 if (trng < 10.0)
784 strng.Printf("%6.2f", toUsrDistance(trng));
785 else
786 strng.Printf("%6.1f", toUsrDistance(trng));
787
788 pRNG->SetAValue(strng);
789
790 // total TTG
791 // If showing total route TTG/ETA, use gSog for calculation
792
793 wxString tttg_s;
794 wxTimeSpan tttg_span;
795 float tttg_sec = 0.0;
796 if (speed > 0.) {
797 tttg_sec = (trng / gSog) * 3600.;
798 tttg_span = wxTimeSpan::Seconds((long)tttg_sec);
799 // Show also #days if TTG > 24 h
800 tttg_s = tttg_sec > SECONDS_PER_DAY ? tttg_span.Format(_("%Dd %H:%M"))
801 : tttg_span.Format("%H:%M:%S");
802 } else {
803 tttg_span = wxTimeSpan::Seconds(0);
804 tttg_s = "---";
805 }
806
807 pTTG->SetAValue(tttg_s);
808
809 // total ETA to be shown on XTE panel
810 wxDateTime dtnow, eta;
811 dtnow.SetToCurrent();
812 eta = dtnow.Add(tttg_span);
813 wxString seta;
814
815 if (speed > 0.) {
816 // Show date, e.g. Feb 15, if TTG > 24 h
817 seta = tttg_sec > SECONDS_PER_DAY ? eta.Format("%d/%m %H:%M")
818 : eta.Format("%H:%M");
819 } else {
820 seta = "---";
821 }
822 pXTE->SetAValue(seta);
823 if (m_speedUsed == SPEED_VMG) {
824 pTTG->SetALabel(wxString(_("TTG @VMG")));
825 pXTE->SetALabel(wxString(_("ETA @VMG")));
826 } else {
827 pTTG->SetALabel(wxString(_("TTG @SOG")));
828 pXTE->SetALabel(wxString(_("ETA @SOG")));
829 }
830 }
831
832 pRNG->Refresh();
833 pBRG->Refresh();
834 pVMG->Refresh();
835 pTTG->Refresh();
836 pXTE->Refresh();
837 }
838 }
839}
840
841void ConsoleCanvasFrame::RefreshConsoleData(void) {
843
844 pRNG->Refresh();
845 pBRG->Refresh();
846 pVMG->Refresh();
847 pTTG->Refresh();
848 pXTE->Refresh();
849 pCDI->Refresh();
850}
851
853 Hide();
854 Move(0, 0);
855 UpdateFonts();
856 gFrame->PositionConsole();
857 Show();
858}
859
860void ConsoleCanvasFrame::UpdateFonts(void) {
861 pBRG->RefreshFonts();
862 pXTE->RefreshFonts();
863 pTTG->RefreshFonts();
864 pRNG->RefreshFonts();
865 pVMG->RefreshFonts();
866
867 m_pitemBoxSizerLeg->SetSizeHints(this);
868 Layout();
869 Fit();
870
871 Refresh();
872}
873
874//------------------------------------------------------------------------------
875// AnnunText Implementation
876//------------------------------------------------------------------------------
877BEGIN_EVENT_TABLE(AnnunText, wxWindow)
878EVT_PAINT(AnnunText::OnPaint)
879EVT_MOUSE_EVENTS(AnnunText::MouseEvent)
880END_EVENT_TABLE()
881
882AnnunText::AnnunText(wxWindow* parent, wxWindowID id,
883 const wxString& LegendElement,
884 const wxString& ValueElement)
885 : wxWindow(parent, id, wxDefaultPosition, wxDefaultSize, wxNO_BORDER) {
886 m_label = "Label";
887 m_value = "-----";
888
889 m_plabelFont = FontMgr::Get().FindOrCreateFont(
890 14, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, FALSE,
891 wxString("Arial Bold"));
892 m_pvalueFont = FontMgr::Get().FindOrCreateFont(
893 24, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, FALSE,
894 wxString("helvetica"), wxFONTENCODING_ISO8859_1);
895
896 m_LegendTextElement = LegendElement;
897 m_ValueTextElement = ValueElement;
898
899 RefreshFonts();
900}
901
902AnnunText::~AnnunText() {}
903void AnnunText::MouseEvent(wxMouseEvent& event) {
904 ConsoleCanvasWin* ccpw = dynamic_cast<ConsoleCanvasWin*>(GetParent());
905 if (ccpw) {
906 if (event.RightDown()) {
907 wxContextMenuEvent cevt;
908 cevt.SetPosition(event.GetPosition());
909 ccpw->OnContextMenu(cevt);
910 } else if (event.LeftDown()) {
912 }
913 } else {
914 ConsoleCanvasFrame* ccpf = dynamic_cast<ConsoleCanvasFrame*>(GetParent());
915 if (ccpf) {
916 if (event.RightDown()) {
917 wxContextMenuEvent cevt;
918 cevt.SetPosition(event.GetPosition());
919 ccpf->OnContextMenu(cevt);
920 } else if (event.LeftDown()) {
922 }
923 }
924 }
925}
926
927void AnnunText::CalculateMinSize(void) {
928 // Calculate the minimum required size of the window based on text size
929
930 int wl = 50; // reasonable defaults?
931 int hl = 20;
932 int wv = 50;
933 int hv = 20;
934
935 if (m_plabelFont)
936 GetTextExtent("TTG @SOG", &wl, &hl, NULL, NULL, m_plabelFont);
937
938 if (m_pvalueFont)
939 GetTextExtent("123.4567", &wv, &hv, NULL, NULL, m_pvalueFont);
940
941 double pdifactor = g_BasePlatform->GetDisplayDIPMult(gFrame);
942 wl *= pdifactor;
943 hl *= pdifactor;
944 wv *= pdifactor;
945 hv *= pdifactor;
946
947 wxSize min;
948 min.x = wxMax(min.x, wl * 1.2);
949
950 // Space is tight on Android....
951#ifdef __ANDROID__
952 min.x = wv * 1.2;
953 min.x = wxMax(min.x, wl * 1.2);
954#endif
955 min.y = (int)((hl + hv) * 1.2);
956
957 SetMinSize(min);
958
959 // resize background to the necessary size
960 ocpnStyle::Style* style = g_StyleManager->GetCurrentStyle();
961 if (style->consoleTextBackground.IsOk()) {
962 wxImage img = style->consoleTextBackground.ConvertToImage();
963 style->consoleTextBackground = wxBitmap(img.Rescale(min.x, min.y));
964 }
965}
966
967void AnnunText::SetColorScheme(ColorScheme cs) {
968 ocpnStyle::Style* style = g_StyleManager->GetCurrentStyle();
969 m_backBrush = *wxTheBrushList->FindOrCreateBrush(GetGlobalColor("UBLCK"),
970 wxBRUSHSTYLE_SOLID);
971
972 m_default_text_color = style->consoleFontColor;
973 RefreshFonts();
974}
975
976void AnnunText::RefreshFonts() {
977 wxFont* pl = FontMgr::Get().GetFont(m_LegendTextElement);
978 m_plabelFont = FontMgr::Get().FindOrCreateFont(
979 pl->GetPointSize() / OCPN_GetWinDIPScaleFactor(), pl->GetFamily(),
980 pl->GetStyle(), pl->GetWeight(), FALSE, pl->GetFaceName());
981
982 wxFont* pv = FontMgr::Get().GetFont(m_ValueTextElement);
983 m_pvalueFont = FontMgr::Get().FindOrCreateFont(
984 pv->GetPointSize() / OCPN_GetWinDIPScaleFactor(), pv->GetFamily(),
985 pv->GetStyle(), pv->GetWeight(), FALSE, pv->GetFaceName());
986
987 m_legend_color = FontMgr::Get().GetFontColor(_("Console Legend"));
988 m_val_color = FontMgr::Get().GetFontColor(_("Console Value"));
989
990 CalculateMinSize();
991
992 // Make sure that the background color and the text colors are not too close,
993 // for contrast
994 if (m_backBrush.IsOk()) {
995 wxColour back_color = m_backBrush.GetColour();
996
997 wxColour legend_color = m_legend_color;
998 if ((abs(legend_color.Red() - back_color.Red()) < 5) &&
999 (abs(legend_color.Green() - back_color.Blue()) < 5) &&
1000 (abs(legend_color.Blue() - back_color.Blue()) < 5))
1001 m_legend_color = m_default_text_color;
1002
1003 wxColour value_color = m_val_color;
1004 if ((abs(value_color.Red() - back_color.Red()) < 5) &&
1005 (abs(value_color.Green() - back_color.Blue()) < 5) &&
1006 (abs(value_color.Blue() - back_color.Blue()) < 5))
1007 m_val_color = m_default_text_color;
1008 }
1009}
1010
1011void AnnunText::SetLegendElement(const wxString& element) {
1012 m_LegendTextElement = element;
1013}
1014
1015void AnnunText::SetValueElement(const wxString& element) {
1016 m_ValueTextElement = element;
1017}
1018
1019void AnnunText::SetALabel(const wxString& l) { m_label = l; }
1020
1021void AnnunText::SetAValue(const wxString& v) { m_value = v; }
1022
1023void AnnunText::OnPaint(wxPaintEvent& event) {
1024 int sx, sy;
1025 GetClientSize(&sx, &sy);
1026 ocpnStyle::Style* style = g_StyleManager->GetCurrentStyle();
1027
1028 // Do the drawing on an off-screen memory DC, and blit into place
1029 // to avoid objectionable flashing
1030 wxMemoryDC mdc;
1031
1032 wxBitmap m_bitmap(sx, sy, -1);
1033 mdc.SelectObject(m_bitmap);
1034 mdc.SetBackground(m_backBrush);
1035 mdc.Clear();
1036
1037 if (style->consoleTextBackground.IsOk())
1038 mdc.DrawBitmap(style->consoleTextBackground, 0, 0);
1039
1040 mdc.SetTextForeground(m_default_text_color);
1041
1042 if (m_plabelFont) {
1043 mdc.SetFont(*m_plabelFont);
1044 mdc.SetTextForeground(m_legend_color);
1045 mdc.DrawText(m_label, 5, 2);
1046 }
1047
1048 if (m_pvalueFont) {
1049 mdc.SetFont(*m_pvalueFont);
1050 mdc.SetTextForeground(m_val_color);
1051
1052 int w, h;
1053 mdc.GetTextExtent(m_value, &w, &h);
1054 int cw, ch;
1055 mdc.GetSize(&cw, &ch);
1056
1057 mdc.DrawText(m_value, cw - w - 2, ch - h - 2);
1058 }
1059
1060 wxPaintDC dc(this);
1061 dc.Blit(0, 0, sx, sy, &mdc, 0, 0);
1062}
1063//------------------------------------------------------------------------------
1064// CDI Implementation
1065//------------------------------------------------------------------------------
1066BEGIN_EVENT_TABLE(CDI, wxWindow)
1067EVT_PAINT(CDI::OnPaint)
1068EVT_MOUSE_EVENTS(CDI::MouseEvent)
1069END_EVENT_TABLE()
1070
1071CDI::CDI(wxWindow* parent, wxWindowID id, long style, const wxString& name)
1072 : wxWindow(parent, id, wxDefaultPosition, wxDefaultSize, style, name)
1073
1074{
1075 SetMinSize(wxSize(10, 150));
1076}
1077
1078void CDI::MouseEvent(wxMouseEvent& event) {
1079#ifdef __ANDROID__
1080 if (event.RightDown()) {
1081 qDebug() << "right down";
1082
1083 wxContextMenuEvent cevt;
1084 cevt.SetPosition(event.GetPosition());
1085
1086 ConsoleCanvasFrame* ccp = dynamic_cast<ConsoleCanvasFrame*>(GetParent());
1087 if (ccp) ccp->OnContextMenu(cevt);
1088 }
1089#endif
1090}
1091
1092void CDI::SetColorScheme(ColorScheme cs) {
1093 m_pbackBrush = wxTheBrushList->FindOrCreateBrush(GetGlobalColor("DILG2"),
1094 wxBRUSHSTYLE_SOLID);
1095 m_proadBrush = wxTheBrushList->FindOrCreateBrush(GetGlobalColor("DILG1"),
1096 wxBRUSHSTYLE_SOLID);
1097 m_proadPen = wxThePenList->FindOrCreatePen(GetGlobalColor("CHBLK"), 1,
1098 wxPENSTYLE_SOLID);
1099}
1100
1101void CDI::OnPaint(wxPaintEvent& event) {
1102 int sx, sy;
1103 GetClientSize(&sx, &sy);
1104
1105 // Do the drawing on an off-screen memory DC, and blit into place
1106 // to avoid objectionable flashing
1107 wxMemoryDC mdc;
1108
1109 wxBitmap m_bitmap(sx, sy, -1);
1110 mdc.SelectObject(m_bitmap);
1111 mdc.SetBackground(*m_pbackBrush);
1112 mdc.Clear();
1113
1114 int xp = sx / 2;
1115 int yp = sy * 9 / 10;
1116
1117 int path_length = sy * 3;
1118 int pix_per_xte = 120;
1119
1120 if (g_pRouteMan->GetpActiveRoute()) {
1121 double angle = 90 - (g_pRouteMan->GetCurrentSegmentCourse() - gCog);
1122
1123 double dy = path_length * sin(angle * PI / 180.);
1124 double dx = path_length * cos(angle * PI / 180.);
1125
1126 int xtedir;
1127 xtedir = g_pRouteMan->GetXTEDir();
1128 double xte = g_pRouteMan->GetCurrentXTEToActivePoint();
1129
1130 double ddy = xtedir * pix_per_xte * xte * sin((90 - angle) * PI / 180.);
1131 double ddx = xtedir * pix_per_xte * xte * cos((90 - angle) * PI / 180.);
1132
1133 int ddxi = (int)ddx;
1134 int ddyi = (int)ddy;
1135
1136 int xc1 = xp - (int)(dx / 2) + ddxi;
1137 int yc1 = yp + (int)(dy / 2) + ddyi;
1138 int xc2 = xp + (int)(dx / 2) + ddxi;
1139 int yc2 = yp - (int)(dy / 2) + ddyi;
1140
1141 wxPoint road[4];
1142
1143 int road_top_width = 10;
1144 int road_bot_width = 40;
1145
1146 road[0].x = xc1 - (int)(road_bot_width * cos((90 - angle) * PI / 180.));
1147 road[0].y = yc1 - (int)(road_bot_width * sin((90 - angle) * PI / 180.));
1148
1149 road[1].x = xc2 - (int)(road_top_width * cos((90 - angle) * PI / 180.));
1150 road[1].y = yc2 - (int)(road_top_width * sin((90 - angle) * PI / 180.));
1151
1152 road[2].x = xc2 + (int)(road_top_width * cos((90 - angle) * PI / 180.));
1153 road[2].y = yc2 + (int)(road_top_width * sin((90 - angle) * PI / 180.));
1154
1155 road[3].x = xc1 + (int)(road_bot_width * cos((90 - angle) * PI / 180.));
1156 road[3].y = yc1 + (int)(road_bot_width * sin((90 - angle) * PI / 180.));
1157
1158 mdc.SetBrush(*m_proadBrush);
1159 mdc.SetPen(*m_proadPen);
1160 mdc.DrawPolygon(4, road, 0, 0, wxODDEVEN_RULE);
1161
1163
1164 mdc.DrawLine(0, yp, sx, yp);
1165 mdc.DrawCircle(xp, yp, 6);
1166 mdc.DrawLine(xp, yp + 5, xp, yp - 5);
1167 }
1168
1169 wxPaintDC dc(this);
1170 dc.Blit(0, 0, sx, sy, &mdc, 0, 0);
1171}
1172
1173#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__ANDROID__)
1174APConsole::APConsole(wxWindow* parent) {
1175 m_con_frame = new ConsoleCanvasFrame(gFrame);
1176}
1177APConsole::~APConsole() {}
1178void APConsole::SetColorScheme(ColorScheme cs) {
1179 m_con_frame->SetColorScheme(cs);
1180}
1181bool APConsole::IsShown() { return m_con_frame->IsShown(); }
1182void APConsole::UpdateFonts(void) { m_con_frame->UpdateFonts(); }
1183void APConsole::RefreshConsoleData(void) { m_con_frame->RefreshConsoleData(); }
1184void APConsole::Raise() { m_con_frame->Raise(); }
1185void APConsole::ShowWithFreshFonts(void) { m_con_frame->ShowWithFreshFonts(); }
1186void APConsole::Show(bool bshow) { m_con_frame->Show(bshow); }
1187CDI* APConsole::GetCDI() { return m_con_frame->pCDI; }
1188wxSize APConsole::GetSize() { return m_con_frame->GetSize(); }
1189void APConsole::ToggleShowHighway() { m_con_frame->ToggleShowHighway(); }
1190void APConsole::Move(wxPoint p) { m_con_frame->Move(p); }
1191
1192#else
1193
1194APConsole::APConsole(wxWindow* parent) {
1195 m_con_win = new ConsoleCanvasWin(parent);
1196}
1197APConsole::~APConsole() {}
1198void APConsole::SetColorScheme(ColorScheme cs) {
1199 m_con_win->SetColorScheme(cs);
1200}
1201bool APConsole::IsShown() { return m_con_win->IsShown(); }
1202void APConsole::UpdateFonts(void) { m_con_win->UpdateFonts(); }
1203void APConsole::RefreshConsoleData(void) { m_con_win->RefreshConsoleData(); }
1204void APConsole::Raise() {}
1205void APConsole::ShowWithFreshFonts(void) { m_con_win->ShowWithFreshFonts(); }
1206void APConsole::Show(bool bshow) { m_con_win->Show(bshow); }
1207CDI* APConsole::GetCDI() { return m_con_win->pCDI; }
1208wxSize APConsole::GetSize() { return m_con_win->GetSize(); }
1209void APConsole::ToggleShowHighway() { m_con_win->ToggleShowHighway(); }
1210void APConsole::Move(wxPoint p) { m_con_win->Move(p); }
1211
1212#endif
double GetDisplayDIPMult(wxWindow *win)
Get the display scaling factor for DPI-aware rendering.
Annunciator Text display.
Definition concanv.h:61
Course Deviation Indicator display.
Definition concanv.h:42
void OnPaint(wxPaintEvent &event)
Definition concanv.cpp:1101
void ToggleRouteTotalDisplay()
Toggles between route total and current leg display modes.
Definition concanv.cpp:659
void ShowWithFreshFonts(void)
Recomputes and applies new fonts to console elements.
Definition concanv.cpp:852
void UpdateRouteData()
Updates route-related data displays.
Definition concanv.cpp:676
Primary navigation console display for route and vessel tracking.
Definition concanv.h:119
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:437
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 FontMgr.cpp:449
wxColour GetFontColor(const wxString &TextElement) const
Gets the text color for a UI element.
Definition FontMgr.cpp:117
wxFont * GetFont(const wxString &TextElement, int requested_font_size=0)
Gets a font object for a UI element.
Definition FontMgr.cpp:200
Represents a waypoint or mark within the navigation system.
Definition route_point.h:70
double m_seg_len
Length of the leg from previous waypoint to this waypoint in nautical miles.
Represents a navigational route in the navigation system.
Definition route.h:98
RoutePointList * pRoutePointList
Ordered list of waypoints (RoutePoints) that make up this route.
Definition route.h:335
RoutePoint * m_pRouteActivePoint
Pointer to the currently active waypoint within this route.
Definition route.h:213
APConsole * console
Global instance.
Definition concanv.cpp:52
Primary navigation console display for route and vessel tracking.
Global variables stored in configuration file.
wxFont * GetOCPNScaledFont(wxString item, int default_size)
Retrieves a font from FontMgr, optionally scaled for physical readability.
Definition gui_lib.cpp:56
wxFont GetOCPNGUIScaledFont(wxString item)
Retrieves a font optimized for touch and high-resolution interfaces.
Definition gui_lib.cpp:85
General purpose GUI support.
PlugIn Object Definition/API.
double OCPN_GetWinDIPScaleFactor()
Gets Windows-specific DPI scaling factor.