39#include <wx/datetime.h>
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"
51#include "ocpn_frame.h"
52#include "OCPNPlatform.h"
58extern bool g_bShowActiveRouteHighway;
61bool g_bShowRouteTotal;
65enum eMenuItems { ID_NAVLEG = 1, ID_NAVROUTE, ID_NAVHIGHWAY } menuItems;
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)
81 m_speedUsed = SPEED_SOG;
85 long style = wxSIMPLE_BORDER | wxCLIP_CHILDREN | wxFRAME_FLOAT_ON_PARENT;
88 style |= wxFRAME_NO_TASKBAR;
91 wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, style);
95 m_pitemBoxSizerLeg =
new wxBoxSizer(wxVERTICAL);
97 pThisLegText =
new wxStaticText(
this, -1, _(
"This Leg"));
99 m_pitemBoxSizerLeg->Add(pThisLegText, 0, wxALIGN_CENTER_HORIZONTAL, 2);
104 qFont->GetPointSize(), wxFONTFAMILY_DEFAULT, qFont->GetStyle(),
105 wxFONTWEIGHT_BOLD,
false, qFont->GetFaceName());
106 pThisLegText->SetFont(*pThisLegFont);
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);
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);
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);
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);
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);
130 pCDI =
new CDI(
this, -1, wxSIMPLE_BORDER, _T(
"CDI"));
131 m_pitemBoxSizerLeg->AddSpacer(5);
132 m_pitemBoxSizerLeg->Add(pCDI, 0, wxALL | wxEXPAND, 2);
134 SetSizer(m_pitemBoxSizerLeg);
135 m_pitemBoxSizerLeg->SetSizeHints(
this);
139 if (g_bShowRouteTotal)
140 pThisLegText->SetLabel(_(
"Route"));
142 pThisLegText->SetLabel(_(
"This Leg"));
147ConsoleCanvasWin::~ConsoleCanvasWin() {
delete pCDI; }
149void ConsoleCanvasWin::SetColorScheme(ColorScheme cs) {
150 pbackBrush = wxTheBrushList->FindOrCreateBrush(
151 GetGlobalColor(_T(
"DILG1" )), wxBRUSHSTYLE_SOLID);
152 SetBackgroundColour(GetGlobalColor(_T(
"DILG1" )));
154 if (g_bShowRouteTotal)
155 pThisLegText->SetLabel(_(
"Route"));
157 pThisLegText->SetLabel(_(
"This Leg"));
161 pThisLegText->SetBackgroundColour(GetGlobalColor(_T(
"DILG1" )));
163 pXTE->SetColorScheme(cs);
164 pBRG->SetColorScheme(cs);
165 pRNG->SetColorScheme(cs);
166 pTTG->SetColorScheme(cs);
167 pVMG->SetColorScheme(cs);
169 pCDI->SetColorScheme(cs);
172void ConsoleCanvasWin::OnPaint(wxPaintEvent& event) {
175 if (g_pRouteMan->GetpActiveRoute()) {
177 pThisLegText->Refresh();
178 m_bNeedClear =
false;
182 if (!g_bShowActiveRouteHighway) pCDI->Hide();
185void ConsoleCanvasWin::OnShow(wxShowEvent& event) {
186 pCDI->Show(g_bShowActiveRouteHighway);
187 m_pitemBoxSizerLeg->SetSizeHints(
this);
190void ConsoleCanvasWin::LegRoute() {
191 if (g_bShowRouteTotal)
192 pThisLegText->SetLabel(_(
"Route"));
194 pThisLegText->SetLabel(_(
"This Leg"));
196 pThisLegText->Refresh(
true);
197 RefreshConsoleData();
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);
213 btnLeg->Check(!g_bShowRouteTotal);
214 btnRoute->Check(g_bShowRouteTotal);
215 btnHighw->Check(g_bShowActiveRouteHighway);
217 PopupMenu(contextMenu);
222void ConsoleCanvasWin::OnContextMenuSelection(wxCommandEvent& event) {
223 switch (event.GetId()) {
225 g_bShowRouteTotal =
false;
230 g_bShowRouteTotal =
true;
234 case ID_NAVHIGHWAY: {
235 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
236 if (g_bShowActiveRouteHighway) {
241 m_pitemBoxSizerLeg->SetSizeHints(
this);
247void ConsoleCanvasWin::ToggleShowHighway() {
248 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
249 if (g_bShowActiveRouteHighway) {
254 m_pitemBoxSizerLeg->SetSizeHints(
this);
262 if (g_bShowRouteTotal) {
263 g_bShowRouteTotal =
false;
264 m_speedUsed = SPEED_SOG;
266 if (m_speedUsed == SPEED_VMG) {
267 g_bShowRouteTotal =
true;
268 m_speedUsed = SPEED_SOG;
270 m_speedUsed = SPEED_VMG;
277 if (g_pRouteMan->GetpActiveRoute()) {
278 if (g_pRouteMan->m_bDataValid) {
280 float rng = g_pRouteMan->GetCurrentRngToActivePoint();
283 float dcog = g_pRouteMan->GetCurrentBrgToActivePoint();
284 if (dcog >= 359.5) dcog = 0;
288 cogstr << wxString::Format(wxString(
"%6.0f", wxConvUTF8), dcog);
290 cogstr << wxString::Format(wxString(
"%6.0f(M)", wxConvUTF8),
293 pBRG->SetAValue(cogstr);
296 if (!std::isnan(gCog) && !std::isnan(gSog)) {
298 BRG = g_pRouteMan->GetCurrentBrgToActivePoint();
299 double vmg = gSog * cos((BRG - gCog) * PI / 180.);
300 str_buf.Printf(_T(
"%6.2f"), toUsrSpeed(vmg));
302 if (m_speedUsed == SPEED_VMG) {
313 pVMG->SetAValue(str_buf);
315 if (!g_bShowRouteTotal) {
316 float nrng = g_pRouteMan->GetCurrentRngToActiveNormalArrival();
318 double deltarng = fabs(rng - nrng);
319 if ((deltarng > .01) && ((deltarng / rng) > .10) &&
324 srng.Printf(_T(
"%5.2f/%5.2f"), toUsrDistance(rng),
325 toUsrDistance(nrng));
327 srng.Printf(_T(
"%5.1f/%5.1f"), toUsrDistance(rng),
328 toUsrDistance(nrng));
331 srng.Printf(_T(
"%6.2f"), toUsrDistance(rng));
333 srng.Printf(_T(
"%6.1f"), toUsrDistance(rng));
337 pRNG->SetAValue(srng);
341 toUsrDistance(g_pRouteMan->GetCurrentXTEToActivePoint()));
342 pXTE->SetAValue(str_buf);
343 if (g_pRouteMan->GetXTEDir() < 0)
344 pXTE->SetALabel(wxString(_(
"XTE L")));
346 pXTE->SetALabel(wxString(_(
"XTE R")));
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();
358 pTTG->SetAValue(ttg_s);
359 if (m_speedUsed == SPEED_VMG) {
360 pTTG->SetALabel(wxString(_(
"TTG @VMG")));
362 pTTG->SetALabel(wxString(_(
"TTG @SOG")));
368 Route* prt = g_pRouteMan->GetpActiveRoute();
374 prp = node->GetData();
379 node = node->GetNext();
385 strng.Printf(_T(
"%6.2f"), toUsrDistance(trng));
387 strng.Printf(_T(
"%6.1f"), toUsrDistance(trng));
389 pRNG->SetAValue(strng);
395 wxTimeSpan tttg_span;
396 float tttg_sec = 0.0;
398 tttg_sec = (trng / gSog) * 3600.;
399 tttg_span = wxTimeSpan::Seconds((
long)tttg_sec);
401 tttg_s = tttg_sec > SECONDS_PER_DAY ? tttg_span.Format(_(
"%Dd %H:%M"))
402 : tttg_span.Format(
"%H:%M:%S");
404 tttg_span = wxTimeSpan::Seconds(0);
408 pTTG->SetAValue(tttg_s);
411 wxDateTime dtnow, eta;
412 dtnow.SetToCurrent();
413 eta = dtnow.Add(tttg_span);
418 seta = tttg_sec > SECONDS_PER_DAY ? eta.Format(_T(
"%d/%m %H:%M"))
419 : eta.Format(_T(
"%H:%M"));
423 pXTE->SetAValue(seta);
424 if (m_speedUsed == SPEED_VMG) {
425 pTTG->SetALabel(wxString(_(
"TTG @VMG")));
426 pXTE->SetALabel(wxString(_(
"ETA @VMG")));
428 pTTG->SetALabel(wxString(_(
"TTG @SOG")));
429 pXTE->SetALabel(wxString(_(
"ETA @SOG")));
442void ConsoleCanvasWin::RefreshConsoleData(
void) {
456 gFrame->PositionConsole();
460void ConsoleCanvasWin::UpdateFonts(
void) {
461 pBRG->RefreshFonts();
462 pXTE->RefreshFonts();
463 pTTG->RefreshFonts();
464 pRNG->RefreshFonts();
465 pVMG->RefreshFonts();
467 m_pitemBoxSizerLeg->SetSizeHints(
this);
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)
488 m_speedUsed = SPEED_SOG;
490 m_bNeedClear =
false;
492 long style = wxSIMPLE_BORDER | wxCLIP_CHILDREN | wxFRAME_FLOAT_ON_PARENT;
495 style |= wxFRAME_NO_TASKBAR;
498 wxFrame::Create(parent, wxID_ANY, _T(
""), wxDefaultPosition, wxDefaultSize,
503 m_pitemBoxSizerLeg =
new wxBoxSizer(wxVERTICAL);
505 pThisLegText =
new wxStaticText(
this, -1, _(
"This Leg"));
507 m_pitemBoxSizerLeg->Add(pThisLegText, 0, wxALIGN_CENTER_HORIZONTAL, 2);
512 qFont->GetPointSize(), wxFONTFAMILY_DEFAULT, qFont->GetStyle(),
513 wxFONTWEIGHT_BOLD,
false, qFont->GetFaceName());
514 pThisLegText->SetFont(*pThisLegFont);
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);
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);
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);
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);
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);
538 pCDI =
new CDI(
this, -1, wxSIMPLE_BORDER, _T(
"CDI"));
539 m_pitemBoxSizerLeg->AddSpacer(5);
540 m_pitemBoxSizerLeg->Add(pCDI, 0, wxALL | wxEXPAND, 2);
542 SetSizer(m_pitemBoxSizerLeg);
543 m_pitemBoxSizerLeg->SetSizeHints(
this);
547 if (g_bShowRouteTotal)
548 pThisLegText->SetLabel(_(
"Route"));
550 pThisLegText->SetLabel(_(
"This Leg"));
555ConsoleCanvasFrame::~ConsoleCanvasFrame() {
delete pCDI; }
557void ConsoleCanvasFrame::SetColorScheme(ColorScheme cs) {
558 pbackBrush = wxTheBrushList->FindOrCreateBrush(
559 GetGlobalColor(_T(
"DILG1" )), wxBRUSHSTYLE_SOLID);
560 SetBackgroundColour(GetGlobalColor(_T(
"DILG1" )));
562 if (g_bShowRouteTotal)
563 pThisLegText->SetLabel(_(
"Route"));
565 pThisLegText->SetLabel(_(
"This Leg"));
569 pThisLegText->SetBackgroundColour(GetGlobalColor(_T(
"DILG1" )));
571 pXTE->SetColorScheme(cs);
572 pBRG->SetColorScheme(cs);
573 pRNG->SetColorScheme(cs);
574 pTTG->SetColorScheme(cs);
575 pVMG->SetColorScheme(cs);
577 pCDI->SetColorScheme(cs);
580void ConsoleCanvasFrame::OnPaint(wxPaintEvent& event) {
583 if (g_pRouteMan->GetpActiveRoute()) {
585 pThisLegText->Refresh();
586 m_bNeedClear =
false;
591 if (!g_bShowActiveRouteHighway) pCDI->Hide();
594void ConsoleCanvasFrame::OnShow(wxShowEvent& event) {
595 pCDI->Show(g_bShowActiveRouteHighway);
596 m_pitemBoxSizerLeg->SetSizeHints(
this);
599void ConsoleCanvasFrame::LegRoute() {
600 if (g_bShowRouteTotal)
601 pThisLegText->SetLabel(_(
"Route"));
603 pThisLegText->SetLabel(_(
"This Leg"));
605 pThisLegText->Refresh(
true);
606 RefreshConsoleData();
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);
620 btnLeg->SetFont(sFont);
621 btnRoute->SetFont(sFont);
622 btnHighw->SetFont(sFont);
625 contextMenu->Append(btnLeg);
626 contextMenu->Append(btnRoute);
627 contextMenu->AppendSeparator();
628 contextMenu->Append(btnHighw);
630 btnLeg->Check(!g_bShowRouteTotal);
631 btnRoute->Check(g_bShowRouteTotal);
632 btnHighw->Check(g_bShowActiveRouteHighway);
634 PopupMenu(contextMenu);
639void ConsoleCanvasFrame::OnContextMenuSelection(wxCommandEvent& event) {
640 switch (event.GetId()) {
642 g_bShowRouteTotal =
false;
647 g_bShowRouteTotal =
true;
651 case ID_NAVHIGHWAY: {
652 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
653 if (g_bShowActiveRouteHighway) {
658 m_pitemBoxSizerLeg->SetSizeHints(
this);
664void ConsoleCanvasFrame::ToggleShowHighway() {
665 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
666 if (g_bShowActiveRouteHighway) {
671 m_pitemBoxSizerLeg->SetSizeHints(
this);
679 if (g_bShowRouteTotal) {
680 g_bShowRouteTotal =
false;
681 m_speedUsed = SPEED_SOG;
683 if (m_speedUsed == SPEED_VMG) {
684 g_bShowRouteTotal =
true;
685 m_speedUsed = SPEED_SOG;
687 m_speedUsed = SPEED_VMG;
695 if (g_pRouteMan->GetpActiveRoute()) {
696 if (g_pRouteMan->m_bDataValid) {
698 float rng = g_pRouteMan->GetCurrentRngToActivePoint();
701 float dcog = g_pRouteMan->GetCurrentBrgToActivePoint();
702 if (dcog >= 359.5) dcog = 0;
706 cogstr << wxString::Format(wxString(
"%6.0f", wxConvUTF8), dcog);
708 cogstr << wxString::Format(wxString(
"%6.0f(M)", wxConvUTF8),
711 pBRG->SetAValue(cogstr);
714 if (!std::isnan(gCog) && !std::isnan(gSog)) {
716 BRG = g_pRouteMan->GetCurrentBrgToActivePoint();
717 double vmg = gSog * cos((BRG - gCog) * PI / 180.);
718 str_buf.Printf(_T(
"%6.2f"), toUsrSpeed(vmg));
720 if (m_speedUsed == SPEED_VMG) {
731 pVMG->SetAValue(str_buf);
733 if (!g_bShowRouteTotal) {
734 float nrng = g_pRouteMan->GetCurrentRngToActiveNormalArrival();
736 double deltarng = fabs(rng - nrng);
737 if ((deltarng > .01) && ((deltarng / rng) > .10) &&
742 srng.Printf(_T(
"%5.2f/%5.2f"), toUsrDistance(rng),
743 toUsrDistance(nrng));
745 srng.Printf(_T(
"%5.1f/%5.1f"), toUsrDistance(rng),
746 toUsrDistance(nrng));
749 srng.Printf(_T(
"%6.2f"), toUsrDistance(rng));
751 srng.Printf(_T(
"%6.1f"), toUsrDistance(rng));
755 pRNG->SetAValue(srng);
759 toUsrDistance(g_pRouteMan->GetCurrentXTEToActivePoint()));
760 pXTE->SetAValue(str_buf);
761 if (g_pRouteMan->GetXTEDir() < 0)
762 pXTE->SetALabel(wxString(_(
"XTE L")));
764 pXTE->SetALabel(wxString(_(
"XTE R")));
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();
776 pTTG->SetAValue(ttg_s);
777 if (m_speedUsed == SPEED_VMG) {
778 pTTG->SetALabel(wxString(_(
"TTG @VMG")));
780 pTTG->SetALabel(wxString(_(
"TTG @SOG")));
786 Route* prt = g_pRouteMan->GetpActiveRoute();
792 prp = node->GetData();
797 node = node->GetNext();
803 strng.Printf(_T(
"%6.2f"), toUsrDistance(trng));
805 strng.Printf(_T(
"%6.1f"), toUsrDistance(trng));
807 pRNG->SetAValue(strng);
813 wxTimeSpan tttg_span;
814 float tttg_sec = 0.0;
816 tttg_sec = (trng / gSog) * 3600.;
817 tttg_span = wxTimeSpan::Seconds((
long)tttg_sec);
819 tttg_s = tttg_sec > SECONDS_PER_DAY ? tttg_span.Format(_(
"%Dd %H:%M"))
820 : tttg_span.Format(
"%H:%M:%S");
822 tttg_span = wxTimeSpan::Seconds(0);
826 pTTG->SetAValue(tttg_s);
829 wxDateTime dtnow, eta;
830 dtnow.SetToCurrent();
831 eta = dtnow.Add(tttg_span);
836 seta = tttg_sec > SECONDS_PER_DAY ? eta.Format(_T(
"%d/%m %H:%M"))
837 : eta.Format(_T(
"%H:%M"));
841 pXTE->SetAValue(seta);
842 if (m_speedUsed == SPEED_VMG) {
843 pTTG->SetALabel(wxString(_(
"TTG @VMG")));
844 pXTE->SetALabel(wxString(_(
"ETA @VMG")));
846 pTTG->SetALabel(wxString(_(
"TTG @SOG")));
847 pXTE->SetALabel(wxString(_(
"ETA @SOG")));
860void ConsoleCanvasFrame::RefreshConsoleData(
void) {
875 gFrame->PositionConsole();
879void ConsoleCanvasFrame::UpdateFonts(
void) {
880 pBRG->RefreshFonts();
881 pXTE->RefreshFonts();
882 pTTG->RefreshFonts();
883 pRNG->RefreshFonts();
884 pVMG->RefreshFonts();
886 m_pitemBoxSizerLeg->SetSizeHints(
this);
897EVT_PAINT(AnnunText::OnPaint)
898EVT_MOUSE_EVENTS(AnnunText::MouseEvent)
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(
"-----");
909 14, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, FALSE,
910 wxString(_T(
"Arial Bold")));
912 24, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, FALSE,
913 wxString(_T(
"helvetica")), wxFONTENCODING_ISO8859_1);
915 m_LegendTextElement = LegendElement;
916 m_ValueTextElement = ValueElement;
921AnnunText::~AnnunText() {}
922void AnnunText::MouseEvent(wxMouseEvent& event) {
925 if (event.RightDown()) {
926 wxContextMenuEvent cevt;
927 cevt.SetPosition(event.GetPosition());
928 ccpw->OnContextMenu(cevt);
929 }
else if (event.LeftDown()) {
935 if (event.RightDown()) {
936 wxContextMenuEvent cevt;
937 cevt.SetPosition(event.GetPosition());
938 ccpf->OnContextMenu(cevt);
939 }
else if (event.LeftDown()) {
946void AnnunText::CalculateMinSize(
void) {
955 GetTextExtent(_T(
"TTG @SOG"), &wl, &hl, NULL, NULL, m_plabelFont);
958 GetTextExtent(_T(
"123.4567"), &wv, &hv, NULL, NULL, m_pvalueFont);
967 min.x = wxMax(min.x, wl * 1.2);
972 min.x = wxMax(min.x, wl * 1.2);
974 min.y = (int)((hl + hv) * 1.2);
980 if (style->consoleTextBackground.IsOk()) {
981 wxImage img = style->consoleTextBackground.ConvertToImage();
982 style->consoleTextBackground = wxBitmap(img.Rescale(min.x, min.y));
986void AnnunText::SetColorScheme(ColorScheme cs) {
988 m_backBrush = *wxTheBrushList->FindOrCreateBrush(GetGlobalColor(_T(
"UBLCK")),
991 m_default_text_color = style->consoleFontColor;
995void AnnunText::RefreshFonts() {
996 wxFont* pl = FontMgr::Get().
GetFont(m_LegendTextElement);
999 pl->GetStyle(), pl->GetWeight(), FALSE, pl->GetFaceName());
1001 wxFont* pv = FontMgr::Get().
GetFont(m_ValueTextElement);
1004 pv->GetStyle(), pv->GetWeight(), FALSE, pv->GetFaceName());
1006 m_legend_color = FontMgr::Get().
GetFontColor(_(
"Console Legend"));
1007 m_val_color = FontMgr::Get().
GetFontColor(_(
"Console Value"));
1013 if (m_backBrush.IsOk()) {
1014 wxColour back_color = m_backBrush.GetColour();
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;
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;
1030void AnnunText::SetLegendElement(
const wxString& element) {
1031 m_LegendTextElement = element;
1034void AnnunText::SetValueElement(
const wxString& element) {
1035 m_ValueTextElement = element;
1038void AnnunText::SetALabel(
const wxString& l) { m_label = l; }
1040void AnnunText::SetAValue(
const wxString& v) { m_value = v; }
1042void AnnunText::OnPaint(wxPaintEvent& event) {
1044 GetClientSize(&sx, &sy);
1051 wxBitmap m_bitmap(sx, sy, -1);
1052 mdc.SelectObject(m_bitmap);
1053 mdc.SetBackground(m_backBrush);
1056 if (style->consoleTextBackground.IsOk())
1057 mdc.DrawBitmap(style->consoleTextBackground, 0, 0);
1059 mdc.SetTextForeground(m_default_text_color);
1062 mdc.SetFont(*m_plabelFont);
1063 mdc.SetTextForeground(m_legend_color);
1064 mdc.DrawText(m_label, 5, 2);
1068 mdc.SetFont(*m_pvalueFont);
1069 mdc.SetTextForeground(m_val_color);
1072 mdc.GetTextExtent(m_value, &w, &h);
1074 mdc.GetSize(&cw, &ch);
1076 mdc.DrawText(m_value, cw - w - 2, ch - h - 2);
1080 dc.Blit(0, 0, sx, sy, &mdc, 0, 0);
1085BEGIN_EVENT_TABLE(
CDI, wxWindow)
1087EVT_MOUSE_EVENTS(CDI::MouseEvent)
1090CDI::
CDI(wxWindow* parent, wxWindowID
id,
long style, const wxString& name)
1091 : wxWindow(parent,
id, wxDefaultPosition, wxDefaultSize, style, name)
1094 SetMinSize(wxSize(10, 150));
1097void CDI::MouseEvent(wxMouseEvent& event) {
1099 if (event.RightDown()) {
1100 qDebug() <<
"right down";
1102 wxContextMenuEvent cevt;
1103 cevt.SetPosition(event.GetPosition());
1106 if (ccp) ccp->OnContextMenu(cevt);
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,
1122 GetClientSize(&sx, &sy);
1128 wxBitmap m_bitmap(sx, sy, -1);
1129 mdc.SelectObject(m_bitmap);
1130 mdc.SetBackground(*m_pbackBrush);
1134 int yp = sy * 9 / 10;
1136 int path_length = sy * 3;
1137 int pix_per_xte = 120;
1139 if (g_pRouteMan->GetpActiveRoute()) {
1140 double angle = 90 - (g_pRouteMan->GetCurrentSegmentCourse() - gCog);
1142 double dy = path_length * sin(angle * PI / 180.);
1143 double dx = path_length * cos(angle * PI / 180.);
1146 xtedir = g_pRouteMan->GetXTEDir();
1147 double xte = g_pRouteMan->GetCurrentXTEToActivePoint();
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.);
1152 int ddxi = (int)ddx;
1153 int ddyi = (int)ddy;
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;
1162 int road_top_width = 10;
1163 int road_bot_width = 40;
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.));
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.));
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.));
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.));
1177 mdc.SetBrush(*m_proadBrush);
1178 mdc.SetPen(*m_proadPen);
1179 mdc.DrawPolygon(4, road, 0, 0, wxODDEVEN_RULE);
1183 mdc.DrawLine(0, yp, sx, yp);
1184 mdc.DrawCircle(xp, yp, 6);
1185 mdc.DrawLine(xp, yp + 5, xp, yp - 5);
1189 dc.Blit(0, 0, sx, sy, &mdc, 0, 0);
1192#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__ANDROID__)
1193APConsole::APConsole(wxWindow* parent) {
1196APConsole::~APConsole() {}
1197void APConsole::SetColorScheme(ColorScheme cs) {
1198 m_con_frame->SetColorScheme(cs);
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(); }
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); }
1213APConsole::APConsole(wxWindow* parent) {
1216APConsole::~APConsole() {}
1217void APConsole::SetColorScheme(ColorScheme cs) {
1218 m_con_win->SetColorScheme(cs);
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() {}
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); }
Annunciator Text display.
Course Deviation Indicator display.
void OnPaint(wxPaintEvent &event)
void ToggleRouteTotalDisplay()
Toggles between route total and current leg display modes.
void ShowWithFreshFonts(void)
Recomputes and applies new fonts to console elements.
void UpdateRouteData()
Updates route-related data displays.
Primary navigation console display for route and vessel tracking.
void UpdateRouteData()
Updates route-related data displays.
void ShowWithFreshFonts(void)
Recomputes and applies new fonts to console elements.
void ToggleRouteTotalDisplay()
Toggles between route total and current leg display modes.
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.
wxColour GetFontColor(const wxString &TextElement) const
Gets the text color for a UI element.
wxFont * GetFont(const wxString &TextElement, int requested_font_size=0)
Gets a font object for a UI element.
Represents a waypoint or mark within the navigation system.
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.
RoutePointList * pRoutePointList
Ordered list of waypoints (RoutePoints) that make up this route.
RoutePoint * m_pRouteActivePoint
Pointer to the currently active waypoint within this route.
wxFont * GetOCPNScaledFont(wxString item, int default_size)
Retrieves a font from FontMgr, optionally scaled for physical readability.
wxFont GetOCPNGUIScaledFont(wxString item)
Retrieves a font optimized for touch and high-resolution interfaces.
General purpose GUI support.
PlugIn Object Definition/API.
double OCPN_GetWinDIPScaleFactor()
Gets Windows-specific DPI scaling factor.