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