33#include <wx/datetime.h>
36#include "model/navutil_base.h"
37#include "model/own_ship.h"
38#include "model/route.h"
39#include "model/routeman.h"
45#include "ocpn_frame.h"
46#include "OCPNPlatform.h"
50enum eMenuItems { ID_NAVLEG = 1, ID_NAVROUTE, ID_NAVHIGHWAY } menuItems;
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)
68 m_speedUsed = SPEED_SOG;
72 long style = wxSIMPLE_BORDER | wxCLIP_CHILDREN | wxFRAME_FLOAT_ON_PARENT;
75 style |= wxFRAME_NO_TASKBAR;
78 wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, style);
82 m_pitemBoxSizerLeg =
new wxBoxSizer(wxVERTICAL);
84 pThisLegText =
new wxStaticText(
this, -1, _(
"This Leg"));
86 m_pitemBoxSizerLeg->Add(pThisLegText, 0, wxALIGN_CENTER_HORIZONTAL, 2);
91 qFont->GetPointSize(), wxFONTFAMILY_DEFAULT, qFont->GetStyle(),
92 wxFONTWEIGHT_BOLD,
false, qFont->GetFaceName());
93 pThisLegText->SetFont(*pThisLegFont);
95 pXTE =
new AnnunText(
this, -1, _(
"Console Legend"), _(
"Console Value"));
96 pXTE->SetALabel(
"XTE");
97 m_pitemBoxSizerLeg->Add(pXTE, 1, wxALIGN_LEFT | wxALL, 2);
99 pBRG =
new AnnunText(
this, -1, _(
"Console Legend"), _(
"Console Value"));
100 pBRG->SetALabel(
"BRG");
101 m_pitemBoxSizerLeg->Add(pBRG, 1, wxALIGN_LEFT | wxALL, 2);
103 pVMG =
new AnnunText(
this, -1, _(
"Console Legend"), _(
"Console Value"));
104 pVMG->SetALabel(
"VMG");
105 m_pitemBoxSizerLeg->Add(pVMG, 1, wxALIGN_LEFT | wxALL, 2);
107 pRNG =
new AnnunText(
this, -1, _(
"Console Legend"), _(
"Console Value"));
108 pRNG->SetALabel(
"RNG");
109 m_pitemBoxSizerLeg->Add(pRNG, 1, wxALIGN_LEFT | wxALL, 2);
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);
117 pCDI =
new CDI(
this, -1, wxSIMPLE_BORDER,
"CDI");
118 m_pitemBoxSizerLeg->AddSpacer(5);
119 m_pitemBoxSizerLeg->Add(pCDI, 0, wxALL | wxEXPAND, 2);
121 SetSizer(m_pitemBoxSizerLeg);
122 m_pitemBoxSizerLeg->SetSizeHints(
this);
126 if (g_bShowRouteTotal)
127 pThisLegText->SetLabel(_(
"Route"));
129 pThisLegText->SetLabel(_(
"This Leg"));
134ConsoleCanvasWin::~ConsoleCanvasWin() {
delete pCDI; }
136void ConsoleCanvasWin::SetColorScheme(ColorScheme cs) {
137 pbackBrush = wxTheBrushList->FindOrCreateBrush(
138 GetGlobalColor(_T(
"DILG1" )), wxBRUSHSTYLE_SOLID);
139 SetBackgroundColour(GetGlobalColor(_T(
"DILG1" )));
141 if (g_bShowRouteTotal)
142 pThisLegText->SetLabel(_(
"Route"));
144 pThisLegText->SetLabel(_(
"This Leg"));
148 pThisLegText->SetBackgroundColour(GetGlobalColor(_T(
"DILG1" )));
150 pXTE->SetColorScheme(cs);
151 pBRG->SetColorScheme(cs);
152 pRNG->SetColorScheme(cs);
153 pTTG->SetColorScheme(cs);
154 pVMG->SetColorScheme(cs);
156 pCDI->SetColorScheme(cs);
159void ConsoleCanvasWin::OnPaint(wxPaintEvent& event) {
162 if (g_pRouteMan->GetpActiveRoute()) {
164 pThisLegText->Refresh();
165 m_bNeedClear =
false;
169 if (!g_bShowActiveRouteHighway) pCDI->Hide();
172void ConsoleCanvasWin::OnShow(wxShowEvent& event) {
173 pCDI->Show(g_bShowActiveRouteHighway);
174 m_pitemBoxSizerLeg->SetSizeHints(
this);
177void ConsoleCanvasWin::LegRoute() {
178 if (g_bShowRouteTotal)
179 pThisLegText->SetLabel(_(
"Route"));
181 pThisLegText->SetLabel(_(
"This Leg"));
183 pThisLegText->Refresh(
true);
184 RefreshConsoleData();
187void ConsoleCanvasWin::OnContextMenu(wxContextMenuEvent& event) {
188 wxMenu* contextMenu =
new wxMenu();
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);
200 btnLeg->Check(!g_bShowRouteTotal);
201 btnRoute->Check(g_bShowRouteTotal);
202 btnHighw->Check(g_bShowActiveRouteHighway);
204 PopupMenu(contextMenu);
209void ConsoleCanvasWin::OnContextMenuSelection(wxCommandEvent& event) {
210 switch (event.GetId()) {
212 g_bShowRouteTotal =
false;
217 g_bShowRouteTotal =
true;
221 case ID_NAVHIGHWAY: {
222 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
223 if (g_bShowActiveRouteHighway) {
228 m_pitemBoxSizerLeg->SetSizeHints(
this);
234void ConsoleCanvasWin::ToggleShowHighway() {
235 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
236 if (g_bShowActiveRouteHighway) {
241 m_pitemBoxSizerLeg->SetSizeHints(
this);
249 if (g_bShowRouteTotal) {
250 g_bShowRouteTotal =
false;
251 m_speedUsed = SPEED_SOG;
253 if (m_speedUsed == SPEED_VMG) {
254 g_bShowRouteTotal =
true;
255 m_speedUsed = SPEED_SOG;
257 m_speedUsed = SPEED_VMG;
264 if (g_pRouteMan->GetpActiveRoute()) {
265 if (g_pRouteMan->m_bDataValid) {
267 float rng = g_pRouteMan->GetCurrentRngToActivePoint();
270 float dcog = g_pRouteMan->GetCurrentBrgToActivePoint();
271 if (dcog >= 359.5) dcog = 0;
275 cogstr << wxString::Format(wxString(
"%6.0f", wxConvUTF8), dcog);
277 cogstr << wxString::Format(wxString(
"%6.0f(M)", wxConvUTF8),
280 pBRG->SetAValue(cogstr);
283 if (!std::isnan(gCog) && !std::isnan(gSog)) {
285 BRG = g_pRouteMan->GetCurrentBrgToActivePoint();
286 double vmg = gSog * cos((BRG - gCog) * PI / 180.);
287 str_buf.Printf(
"%6.2f", toUsrSpeed(vmg));
289 if (m_speedUsed == SPEED_VMG) {
300 pVMG->SetAValue(str_buf);
302 if (!g_bShowRouteTotal) {
303 float nrng = g_pRouteMan->GetCurrentRngToActiveNormalArrival();
305 double deltarng = fabs(rng - nrng);
306 if ((deltarng > .01) && ((deltarng / rng) > .10) &&
311 srng.Printf(
"%5.2f/%5.2f", toUsrDistance(rng), toUsrDistance(nrng));
313 srng.Printf(
"%5.1f/%5.1f", toUsrDistance(rng), toUsrDistance(nrng));
316 srng.Printf(
"%6.2f", toUsrDistance(rng));
318 srng.Printf(
"%6.1f", toUsrDistance(rng));
322 pRNG->SetAValue(srng);
325 "%6.2f", toUsrDistance(g_pRouteMan->GetCurrentXTEToActivePoint()));
326 pXTE->SetAValue(str_buf);
327 if (g_pRouteMan->GetXTEDir() < 0)
328 pXTE->SetALabel(wxString(_(
"XTE L")));
330 pXTE->SetALabel(wxString(_(
"XTE R")));
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();
342 pTTG->SetAValue(ttg_s);
343 if (m_speedUsed == SPEED_VMG) {
344 pTTG->SetALabel(wxString(_(
"TTG @VMG")));
346 pTTG->SetALabel(wxString(_(
"TTG @SOG")));
352 Route* prt = g_pRouteMan->GetpActiveRoute();
358 prp = node->GetData();
363 node = node->GetNext();
369 strng.Printf(
"%6.2f", toUsrDistance(trng));
371 strng.Printf(
"%6.1f", toUsrDistance(trng));
373 pRNG->SetAValue(strng);
379 wxTimeSpan tttg_span;
380 float tttg_sec = 0.0;
382 tttg_sec = (trng / gSog) * 3600.;
383 tttg_span = wxTimeSpan::Seconds((
long)tttg_sec);
385 tttg_s = tttg_sec > SECONDS_PER_DAY ? tttg_span.Format(_(
"%Dd %H:%M"))
386 : tttg_span.Format(
"%H:%M:%S");
388 tttg_span = wxTimeSpan::Seconds(0);
392 pTTG->SetAValue(tttg_s);
395 wxDateTime dtnow, eta;
396 dtnow.SetToCurrent();
397 eta = dtnow.Add(tttg_span);
402 seta = tttg_sec > SECONDS_PER_DAY ? eta.Format(
"%d/%m %H:%M")
403 : eta.Format(
"%H:%M");
407 pXTE->SetAValue(seta);
408 if (m_speedUsed == SPEED_VMG) {
409 pTTG->SetALabel(wxString(_(
"TTG @VMG")));
410 pXTE->SetALabel(wxString(_(
"ETA @VMG")));
412 pTTG->SetALabel(wxString(_(
"TTG @SOG")));
413 pXTE->SetALabel(wxString(_(
"ETA @SOG")));
426void ConsoleCanvasWin::RefreshConsoleData(
void) {
440 gFrame->PositionConsole();
444void ConsoleCanvasWin::UpdateFonts(
void) {
445 pBRG->RefreshFonts();
446 pXTE->RefreshFonts();
447 pTTG->RefreshFonts();
448 pRNG->RefreshFonts();
449 pVMG->RefreshFonts();
451 m_pitemBoxSizerLeg->SetSizeHints(
this);
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)
472 m_speedUsed = SPEED_SOG;
474 m_bNeedClear =
false;
476 long style = wxSIMPLE_BORDER | wxCLIP_CHILDREN | wxFRAME_FLOAT_ON_PARENT;
479 style |= wxFRAME_NO_TASKBAR;
482 wxFrame::Create(parent, wxID_ANY,
"", wxDefaultPosition, wxDefaultSize,
487 m_pitemBoxSizerLeg =
new wxBoxSizer(wxVERTICAL);
489 pThisLegText =
new wxStaticText(
this, -1, _(
"This Leg"));
491 m_pitemBoxSizerLeg->Add(pThisLegText, 0, wxALIGN_CENTER_HORIZONTAL, 2);
496 qFont->GetPointSize(), wxFONTFAMILY_DEFAULT, qFont->GetStyle(),
497 wxFONTWEIGHT_BOLD,
false, qFont->GetFaceName());
498 pThisLegText->SetFont(*pThisLegFont);
500 pXTE =
new AnnunText(
this, -1, _(
"Console Legend"), _(
"Console Value"));
501 pXTE->SetALabel(
"XTE");
502 m_pitemBoxSizerLeg->Add(pXTE, 1, wxALIGN_LEFT | wxALL, 2);
504 pBRG =
new AnnunText(
this, -1, _(
"Console Legend"), _(
"Console Value"));
505 pBRG->SetALabel(
"BRG");
506 m_pitemBoxSizerLeg->Add(pBRG, 1, wxALIGN_LEFT | wxALL, 2);
508 pVMG =
new AnnunText(
this, -1, _(
"Console Legend"), _(
"Console Value"));
509 pVMG->SetALabel(
"VMG");
510 m_pitemBoxSizerLeg->Add(pVMG, 1, wxALIGN_LEFT | wxALL, 2);
512 pRNG =
new AnnunText(
this, -1, _(
"Console Legend"), _(
"Console Value"));
513 pRNG->SetALabel(
"RNG");
514 m_pitemBoxSizerLeg->Add(pRNG, 1, wxALIGN_LEFT | wxALL, 2);
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);
522 pCDI =
new CDI(
this, -1, wxSIMPLE_BORDER,
"CDI");
523 m_pitemBoxSizerLeg->AddSpacer(5);
524 m_pitemBoxSizerLeg->Add(pCDI, 0, wxALL | wxEXPAND, 2);
526 SetSizer(m_pitemBoxSizerLeg);
527 m_pitemBoxSizerLeg->SetSizeHints(
this);
531 if (g_bShowRouteTotal)
532 pThisLegText->SetLabel(_(
"Route"));
534 pThisLegText->SetLabel(_(
"This Leg"));
539ConsoleCanvasFrame::~ConsoleCanvasFrame() {
delete pCDI; }
541void ConsoleCanvasFrame::SetColorScheme(ColorScheme cs) {
542 pbackBrush = wxTheBrushList->FindOrCreateBrush(
543 GetGlobalColor(_T(
"DILG1" )), wxBRUSHSTYLE_SOLID);
544 SetBackgroundColour(GetGlobalColor(_T(
"DILG1" )));
546 if (g_bShowRouteTotal)
547 pThisLegText->SetLabel(_(
"Route"));
549 pThisLegText->SetLabel(_(
"This Leg"));
553 pThisLegText->SetBackgroundColour(GetGlobalColor(_T(
"DILG1" )));
555 pXTE->SetColorScheme(cs);
556 pBRG->SetColorScheme(cs);
557 pRNG->SetColorScheme(cs);
558 pTTG->SetColorScheme(cs);
559 pVMG->SetColorScheme(cs);
561 pCDI->SetColorScheme(cs);
564void ConsoleCanvasFrame::OnPaint(wxPaintEvent& event) {
567 if (g_pRouteMan->GetpActiveRoute()) {
569 pThisLegText->Refresh();
570 m_bNeedClear =
false;
575 if (!g_bShowActiveRouteHighway) pCDI->Hide();
578void ConsoleCanvasFrame::OnShow(wxShowEvent& event) {
579 pCDI->Show(g_bShowActiveRouteHighway);
580 m_pitemBoxSizerLeg->SetSizeHints(
this);
583void ConsoleCanvasFrame::LegRoute() {
584 if (g_bShowRouteTotal)
585 pThisLegText->SetLabel(_(
"Route"));
587 pThisLegText->SetLabel(_(
"This Leg"));
589 pThisLegText->Refresh(
true);
590 RefreshConsoleData();
593void ConsoleCanvasFrame::OnContextMenu(wxContextMenuEvent& event) {
594 wxMenu* contextMenu =
new wxMenu();
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);
604 btnLeg->SetFont(sFont);
605 btnRoute->SetFont(sFont);
606 btnHighw->SetFont(sFont);
609 contextMenu->Append(btnLeg);
610 contextMenu->Append(btnRoute);
611 contextMenu->AppendSeparator();
612 contextMenu->Append(btnHighw);
614 btnLeg->Check(!g_bShowRouteTotal);
615 btnRoute->Check(g_bShowRouteTotal);
616 btnHighw->Check(g_bShowActiveRouteHighway);
618 PopupMenu(contextMenu);
623void ConsoleCanvasFrame::OnContextMenuSelection(wxCommandEvent& event) {
624 switch (event.GetId()) {
626 g_bShowRouteTotal =
false;
631 g_bShowRouteTotal =
true;
635 case ID_NAVHIGHWAY: {
636 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
637 if (g_bShowActiveRouteHighway) {
642 m_pitemBoxSizerLeg->SetSizeHints(
this);
648void ConsoleCanvasFrame::ToggleShowHighway() {
649 g_bShowActiveRouteHighway = !g_bShowActiveRouteHighway;
650 if (g_bShowActiveRouteHighway) {
655 m_pitemBoxSizerLeg->SetSizeHints(
this);
663 if (g_bShowRouteTotal) {
664 g_bShowRouteTotal =
false;
665 m_speedUsed = SPEED_SOG;
667 if (m_speedUsed == SPEED_VMG) {
668 g_bShowRouteTotal =
true;
669 m_speedUsed = SPEED_SOG;
671 m_speedUsed = SPEED_VMG;
679 if (g_pRouteMan->GetpActiveRoute()) {
680 if (g_pRouteMan->m_bDataValid) {
682 float rng = g_pRouteMan->GetCurrentRngToActivePoint();
685 float dcog = g_pRouteMan->GetCurrentBrgToActivePoint();
686 if (dcog >= 359.5) dcog = 0;
690 cogstr << wxString::Format(wxString(
"%6.0f", wxConvUTF8), dcog);
692 cogstr << wxString::Format(wxString(
"%6.0f(M)", wxConvUTF8),
695 pBRG->SetAValue(cogstr);
698 if (!std::isnan(gCog) && !std::isnan(gSog)) {
700 BRG = g_pRouteMan->GetCurrentBrgToActivePoint();
701 double vmg = gSog * cos((BRG - gCog) * PI / 180.);
702 str_buf.Printf(
"%6.2f", toUsrSpeed(vmg));
704 if (m_speedUsed == SPEED_VMG) {
715 pVMG->SetAValue(str_buf);
717 if (!g_bShowRouteTotal) {
718 float nrng = g_pRouteMan->GetCurrentRngToActiveNormalArrival();
720 double deltarng = fabs(rng - nrng);
721 if ((deltarng > .01) && ((deltarng / rng) > .10) &&
726 srng.Printf(
"%5.2f/%5.2f", toUsrDistance(rng), toUsrDistance(nrng));
728 srng.Printf(
"%5.1f/%5.1f", toUsrDistance(rng), toUsrDistance(nrng));
731 srng.Printf(
"%6.2f", toUsrDistance(rng));
733 srng.Printf(
"%6.1f", toUsrDistance(rng));
737 pRNG->SetAValue(srng);
740 "%6.2f", toUsrDistance(g_pRouteMan->GetCurrentXTEToActivePoint()));
741 pXTE->SetAValue(str_buf);
742 if (g_pRouteMan->GetXTEDir() < 0)
743 pXTE->SetALabel(wxString(_(
"XTE L")));
745 pXTE->SetALabel(wxString(_(
"XTE R")));
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();
757 pTTG->SetAValue(ttg_s);
758 if (m_speedUsed == SPEED_VMG) {
759 pTTG->SetALabel(wxString(_(
"TTG @VMG")));
761 pTTG->SetALabel(wxString(_(
"TTG @SOG")));
767 Route* prt = g_pRouteMan->GetpActiveRoute();
773 prp = node->GetData();
778 node = node->GetNext();
784 strng.Printf(
"%6.2f", toUsrDistance(trng));
786 strng.Printf(
"%6.1f", toUsrDistance(trng));
788 pRNG->SetAValue(strng);
794 wxTimeSpan tttg_span;
795 float tttg_sec = 0.0;
797 tttg_sec = (trng / gSog) * 3600.;
798 tttg_span = wxTimeSpan::Seconds((
long)tttg_sec);
800 tttg_s = tttg_sec > SECONDS_PER_DAY ? tttg_span.Format(_(
"%Dd %H:%M"))
801 : tttg_span.Format(
"%H:%M:%S");
803 tttg_span = wxTimeSpan::Seconds(0);
807 pTTG->SetAValue(tttg_s);
810 wxDateTime dtnow, eta;
811 dtnow.SetToCurrent();
812 eta = dtnow.Add(tttg_span);
817 seta = tttg_sec > SECONDS_PER_DAY ? eta.Format(
"%d/%m %H:%M")
818 : eta.Format(
"%H:%M");
822 pXTE->SetAValue(seta);
823 if (m_speedUsed == SPEED_VMG) {
824 pTTG->SetALabel(wxString(_(
"TTG @VMG")));
825 pXTE->SetALabel(wxString(_(
"ETA @VMG")));
827 pTTG->SetALabel(wxString(_(
"TTG @SOG")));
828 pXTE->SetALabel(wxString(_(
"ETA @SOG")));
841void ConsoleCanvasFrame::RefreshConsoleData(
void) {
856 gFrame->PositionConsole();
860void ConsoleCanvasFrame::UpdateFonts(
void) {
861 pBRG->RefreshFonts();
862 pXTE->RefreshFonts();
863 pTTG->RefreshFonts();
864 pRNG->RefreshFonts();
865 pVMG->RefreshFonts();
867 m_pitemBoxSizerLeg->SetSizeHints(
this);
878EVT_PAINT(AnnunText::OnPaint)
879EVT_MOUSE_EVENTS(AnnunText::MouseEvent)
883 const wxString& LegendElement,
884 const wxString& ValueElement)
885 : wxWindow(parent,
id, wxDefaultPosition, wxDefaultSize, wxNO_BORDER) {
890 14, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, FALSE,
891 wxString(
"Arial Bold"));
893 24, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, FALSE,
894 wxString(
"helvetica"), wxFONTENCODING_ISO8859_1);
896 m_LegendTextElement = LegendElement;
897 m_ValueTextElement = ValueElement;
902AnnunText::~AnnunText() {}
903void AnnunText::MouseEvent(wxMouseEvent& event) {
906 if (event.RightDown()) {
907 wxContextMenuEvent cevt;
908 cevt.SetPosition(event.GetPosition());
909 ccpw->OnContextMenu(cevt);
910 }
else if (event.LeftDown()) {
916 if (event.RightDown()) {
917 wxContextMenuEvent cevt;
918 cevt.SetPosition(event.GetPosition());
919 ccpf->OnContextMenu(cevt);
920 }
else if (event.LeftDown()) {
927void AnnunText::CalculateMinSize(
void) {
936 GetTextExtent(
"TTG @SOG", &wl, &hl, NULL, NULL, m_plabelFont);
939 GetTextExtent(
"123.4567", &wv, &hv, NULL, NULL, m_pvalueFont);
948 min.x = wxMax(min.x, wl * 1.2);
953 min.x = wxMax(min.x, wl * 1.2);
955 min.y = (int)((hl + hv) * 1.2);
961 if (style->consoleTextBackground.IsOk()) {
962 wxImage img = style->consoleTextBackground.ConvertToImage();
963 style->consoleTextBackground = wxBitmap(img.Rescale(min.x, min.y));
967void AnnunText::SetColorScheme(ColorScheme cs) {
969 m_backBrush = *wxTheBrushList->FindOrCreateBrush(GetGlobalColor(
"UBLCK"),
972 m_default_text_color = style->consoleFontColor;
976void AnnunText::RefreshFonts() {
977 wxFont* pl = FontMgr::Get().
GetFont(m_LegendTextElement);
980 pl->GetStyle(), pl->GetWeight(), FALSE, pl->GetFaceName());
982 wxFont* pv = FontMgr::Get().
GetFont(m_ValueTextElement);
985 pv->GetStyle(), pv->GetWeight(), FALSE, pv->GetFaceName());
987 m_legend_color = FontMgr::Get().
GetFontColor(_(
"Console Legend"));
988 m_val_color = FontMgr::Get().
GetFontColor(_(
"Console Value"));
994 if (m_backBrush.IsOk()) {
995 wxColour back_color = m_backBrush.GetColour();
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;
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;
1011void AnnunText::SetLegendElement(
const wxString& element) {
1012 m_LegendTextElement = element;
1015void AnnunText::SetValueElement(
const wxString& element) {
1016 m_ValueTextElement = element;
1019void AnnunText::SetALabel(
const wxString& l) { m_label = l; }
1021void AnnunText::SetAValue(
const wxString& v) { m_value = v; }
1023void AnnunText::OnPaint(wxPaintEvent& event) {
1025 GetClientSize(&sx, &sy);
1032 wxBitmap m_bitmap(sx, sy, -1);
1033 mdc.SelectObject(m_bitmap);
1034 mdc.SetBackground(m_backBrush);
1037 if (style->consoleTextBackground.IsOk())
1038 mdc.DrawBitmap(style->consoleTextBackground, 0, 0);
1040 mdc.SetTextForeground(m_default_text_color);
1043 mdc.SetFont(*m_plabelFont);
1044 mdc.SetTextForeground(m_legend_color);
1045 mdc.DrawText(m_label, 5, 2);
1049 mdc.SetFont(*m_pvalueFont);
1050 mdc.SetTextForeground(m_val_color);
1053 mdc.GetTextExtent(m_value, &w, &h);
1055 mdc.GetSize(&cw, &ch);
1057 mdc.DrawText(m_value, cw - w - 2, ch - h - 2);
1061 dc.Blit(0, 0, sx, sy, &mdc, 0, 0);
1066BEGIN_EVENT_TABLE(
CDI, wxWindow)
1068EVT_MOUSE_EVENTS(CDI::MouseEvent)
1071CDI::
CDI(wxWindow* parent, wxWindowID
id,
long style, const wxString& name)
1072 : wxWindow(parent,
id, wxDefaultPosition, wxDefaultSize, style, name)
1075 SetMinSize(wxSize(10, 150));
1078void CDI::MouseEvent(wxMouseEvent& event) {
1080 if (event.RightDown()) {
1081 qDebug() <<
"right down";
1083 wxContextMenuEvent cevt;
1084 cevt.SetPosition(event.GetPosition());
1087 if (ccp) ccp->OnContextMenu(cevt);
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,
1103 GetClientSize(&sx, &sy);
1109 wxBitmap m_bitmap(sx, sy, -1);
1110 mdc.SelectObject(m_bitmap);
1111 mdc.SetBackground(*m_pbackBrush);
1115 int yp = sy * 9 / 10;
1117 int path_length = sy * 3;
1118 int pix_per_xte = 120;
1120 if (g_pRouteMan->GetpActiveRoute()) {
1121 double angle = 90 - (g_pRouteMan->GetCurrentSegmentCourse() - gCog);
1123 double dy = path_length * sin(angle * PI / 180.);
1124 double dx = path_length * cos(angle * PI / 180.);
1127 xtedir = g_pRouteMan->GetXTEDir();
1128 double xte = g_pRouteMan->GetCurrentXTEToActivePoint();
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.);
1133 int ddxi = (int)ddx;
1134 int ddyi = (int)ddy;
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;
1143 int road_top_width = 10;
1144 int road_bot_width = 40;
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.));
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.));
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.));
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.));
1158 mdc.SetBrush(*m_proadBrush);
1159 mdc.SetPen(*m_proadPen);
1160 mdc.DrawPolygon(4, road, 0, 0, wxODDEVEN_RULE);
1164 mdc.DrawLine(0, yp, sx, yp);
1165 mdc.DrawCircle(xp, yp, 6);
1166 mdc.DrawLine(xp, yp + 5, xp, yp - 5);
1170 dc.Blit(0, 0, sx, sy, &mdc, 0, 0);
1173#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__ANDROID__)
1174APConsole::APConsole(wxWindow* parent) {
1177APConsole::~APConsole() {}
1178void APConsole::SetColorScheme(ColorScheme cs) {
1179 m_con_frame->SetColorScheme(cs);
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(); }
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); }
1194APConsole::APConsole(wxWindow* parent) {
1197APConsole::~APConsole() {}
1198void APConsole::SetColorScheme(ColorScheme cs) {
1199 m_con_win->SetColorScheme(cs);
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() {}
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); }
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.
APConsole * console
Global instance.
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.
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.