52#include "user_colors.h"
55#include "androidUTIL.h"
63extern GLenum g_texture_rectangle_format;
71 const wxBitmap &bmpNormal,
const wxBitmap &bmpRollover,
72 wxItemKind kind, wxObject *clientData,
73 const wxString &shortHelp,
const wxString &longHelp)
74 : wxToolBarToolBase((wxToolBarBase *)tbar,
id, label, bmpNormal,
75 bmpRollover, kind, clientData, shortHelp, longHelp) {
80 m_btooltip_hiviz =
false;
90 pluginNormalIcon = bmpNormal;
91 pluginRolloverIcon = bmpRollover;
96 const wxBitmap &bmpRollover, wxItemKind kind,
97 wxObject *clientData,
const wxString &shortHelp,
98 const wxString &longHelp)
99 : wxToolBarToolBase((wxToolBarBase *)tbar,
id,
"", bmpNormal, bmpRollover,
100 kind, clientData, shortHelp, longHelp) {
104 m_btooltip_hiviz =
false;
105 isPluginTool =
false;
107 m_bmpNormal = bmpNormal;
111 void SetSize(
const wxSize &size) {
116 wxCoord GetWidth()
const {
return m_width; }
118 wxCoord GetHeight()
const {
return m_height; }
120 wxString GetToolname() {
return toolname; }
122 void SetIconName(wxString name) { iconName = name; }
123 wxString GetIconName() {
return iconName; }
125 void SetTooltipHiviz(
bool enable) { m_btooltip_hiviz = enable; }
134 wxBitmap pluginNormalIcon;
135 wxBitmap pluginRolloverIcon;
136 const wxBitmap *pluginToggledIcon;
143 bool m_btooltip_hiviz;
145 wxString pluginNormalIconSVG;
146 wxString pluginRolloverIconSVG;
147 wxString pluginToggledIconSVG;
148 wxBitmap m_activeBitmap;
155ocpnFloatingToolbarDialog::ocpnFloatingToolbarDialog(wxWindow *parent,
165 m_position = position;
167 m_sizefactor = size_factor;
170 m_bAutoHideToolbar =
false;
171 m_nAutoHideToolbar = 5;
172 m_toolbar_scale_tools_shown =
false;
173 m_backcolorString =
"GREY3";
174 m_toolShowMask =
"XXXXXXXXXXXXXXXX";
175 n_toolbarHideMethod = TOOLBAR_HIDE_TO_GRABBER;
176 b_canToggleOrientation =
true;
177 m_enableRolloverBitmaps =
true;
180 m_ptoolbar = CreateNewToolbar();
181 if (m_ptoolbar) m_ptoolbar->SetBackgroundColour(GetGlobalColor(
"GREY3"));
182 m_cs = (ColorScheme)-1;
184 m_style = g_StyleManager->GetCurrentStyle();
186 SetULDockPosition(wxPoint(4, g_maintoolbar_y));
188 SetULDockPosition(wxPoint(4, 4));
191 SetGeometry(
false, wxRect());
200 m_marginsInvisible = m_style->marginsInvisible;
202 m_FloatingToolbarConfigMenu = NULL;
204 m_fade_timer.SetOwner(
this);
205 this->Connect(wxEVT_TIMER,
206 wxTimerEventHandler(ocpnFloatingToolbarDialog::FadeTimerEvent),
209 if (m_bAutoHideToolbar && (m_nAutoHideToolbar > 0))
210 m_fade_timer.Start(m_nAutoHideToolbar * 1000);
212 m_bsubmerged =
false;
213 m_benableSubmerge =
true;
216ocpnFloatingToolbarDialog::~ocpnFloatingToolbarDialog() {
217 delete m_FloatingToolbarConfigMenu;
222void ocpnFloatingToolbarDialog::FadeTimerEvent(wxTimerEvent &event) {
223 if (n_toolbarHideMethod == TOOLBAR_HIDE_TO_FIRST_TOOL) {
224 if (g_bmasterToolbarFull) {
225 if (m_bAutoHideToolbar && (m_nAutoHideToolbar > 0) ) {
228 top_frame::Get()->GetAbstractPrimaryCanvas()->ScreenToClient(
229 ::wxGetMousePosition());
231 wxRect r = GetToolbarRect();
232 if (r.Contains(mp))
return;
234 wxCommandEvent event;
235 event.SetId(ID_MASTERTOGGLE);
236 top_frame::Get()->OnToolLeftClick(event);
243 m_Items.push_back(item);
246int ocpnFloatingToolbarDialog::RebuildToolbar() {
253 for (
auto it = m_Items.cbegin(); it != m_Items.cend(); it++) {
257 bool bEnabled = _toolbarConfigMenuUtil(tic);
260 wxToolBarToolBase *tool =
261 tb->AddTool(tic->m_ID, tic->m_label, tic->m_bmpNormal,
262 tic->m_bmpDisabled, tic->m_toolKind, tic->m_tipString);
267 if (!tic->m_NormalIconSVG.IsEmpty()) {
268 tb->SetToolBitmapsSVG(tic->m_ID, tic->m_NormalIconSVG,
269 tic->m_RolloverIconSVG, tic->m_ToggledIconSVG);
279void ocpnFloatingToolbarDialog::SetULDockPosition(wxPoint position) {
280 if (position.x >= 0) m_dock_min_x = position.x;
281 if (position.y >= 0) m_dock_min_y = position.y;
284size_t ocpnFloatingToolbarDialog::GetToolCount() {
286 return m_ptoolbar->GetToolsCount();
291void ocpnFloatingToolbarDialog::SetToolShowMask(wxString mask) {}
293void ocpnFloatingToolbarDialog::SetToolShowCount(
int count) {
295 m_ptoolbar->SetToolShowCount(count);
296 m_ptoolbar->SetDirty(
true);
300int ocpnFloatingToolbarDialog::GetToolShowCount() {
302 return m_ptoolbar->GetToolShowCount();
307void ocpnFloatingToolbarDialog::SetBackGroundColorString(wxString colorRef) {
308 m_backcolorString = colorRef;
309 SetColorScheme(m_cs);
312void ocpnFloatingToolbarDialog::OnKeyDown(wxKeyEvent &event) {
event.Skip(); }
314void ocpnFloatingToolbarDialog::OnKeyUp(wxKeyEvent &event) {
event.Skip(); }
316void ocpnFloatingToolbarDialog::CreateConfigMenu() {
317 if (m_FloatingToolbarConfigMenu)
delete m_FloatingToolbarConfigMenu;
318 m_FloatingToolbarConfigMenu =
new wxMenu();
321bool ocpnFloatingToolbarDialog::_toolbarConfigMenuUtil(
323 if (m_FloatingToolbarConfigMenu) {
324 wxMenuItem *menuitem;
326 if (tic->m_ID == ID_MOB && g_bPermanentMOBIcon)
return true;
328 if (tic->m_bRequired)
return true;
329 if (tic->m_bPlugin)
return true;
336 int menuItemId = tic->m_ID + idOffset;
338 menuitem = m_FloatingToolbarConfigMenu->FindItem(menuItemId);
341 return menuitem->IsChecked();
344 menuitem = m_FloatingToolbarConfigMenu->AppendCheckItem(menuItemId,
346 size_t n = m_FloatingToolbarConfigMenu->GetMenuItemCount();
347 menuitem->Check(m_configString.Len() >= n
348 ? m_configString.GetChar(n - 1) ==
'X'
350 return menuitem->IsChecked();
355void ocpnFloatingToolbarDialog::EnableTool(
int toolid,
bool enable) {
356 if (m_ptoolbar) m_ptoolbar->EnableTool(toolid, enable);
359void ocpnFloatingToolbarDialog::SetColorScheme(ColorScheme cs) {
361 wxColour back_color = GetGlobalColor(m_backcolorString);
364 m_ptoolbar->SetToggledBackgroundColour(GetGlobalColor(
"GREY1"));
365 m_ptoolbar->SetColorScheme(cs);
369wxSize ocpnFloatingToolbarDialog::GetToolSize() {
370 wxSize style_tool_size;
372 style_tool_size = m_style->GetToolSize();
374 style_tool_size.x *= m_sizefactor;
375 style_tool_size.y *= m_sizefactor;
377 style_tool_size.x = 32;
378 style_tool_size.y = 32;
381 return style_tool_size;
384void ocpnFloatingToolbarDialog::SetGeometry(
bool bAvoid, wxRect rectAvoid) {
386 wxSize style_tool_size = m_style->GetToolSize();
388 style_tool_size.x *= m_sizefactor;
389 style_tool_size.y *= m_sizefactor;
391 m_ptoolbar->SetToolBitmapSize(style_tool_size);
393 wxSize tool_size = m_ptoolbar->GetToolBitmapSize();
394 int grabber_width = m_style->GetIcon(
"grabber").GetWidth();
401 m_pparent->GetClientSize().x -
402 (tool_size.x + m_style->GetToolSeparation()) * 2;
403 if (bAvoid && !rectAvoid.IsEmpty()) {
404 avoid_start = m_pparent->GetClientSize().x - rectAvoid.width -
408 max_rows = (m_pparent->GetClientSize().y /
409 (tool_size.y + m_style->GetToolSeparation())) -
412 max_cols = (avoid_start - grabber_width) /
413 (tool_size.x + m_style->GetToolSeparation());
416 if (m_orient == wxTB_VERTICAL)
417 max_rows = wxMax(max_rows, 2);
419 max_cols = wxMax(max_cols, 2);
422 if (m_orient == wxTB_VERTICAL)
423 m_ptoolbar->SetMaxRowsCols(max_rows, 100);
425 m_ptoolbar->SetMaxRowsCols(100, max_cols);
426 m_ptoolbar->SetSizeFactor(m_sizefactor);
430void ocpnFloatingToolbarDialog::SetDefaultPosition() {
433 if (m_pparent && m_ptoolbar) {
434 wxSize cs = m_pparent->GetClientSize();
436 m_position.x = m_dock_min_x;
437 else if (1 == m_dock_x)
438 m_position.x = cs.x - m_ptoolbar->m_maxWidth;
441 m_position.y = m_dock_min_y;
442 else if (1 == m_dock_y)
443 m_position.y = cs.y - m_ptoolbar->m_maxHeight;
445 m_position.x = wxMin(cs.x - m_ptoolbar->m_maxWidth, m_position.x);
446 m_position.y = wxMin(cs.y - m_ptoolbar->m_maxHeight, m_position.y);
448 m_position.x = wxMax(m_dock_min_x, m_position.x);
449 m_position.y = wxMax(m_dock_min_y, m_position.y);
451 m_position.y += m_auxOffsetY;
453 g_maintoolbar_x = m_position.x;
454 g_maintoolbar_y = m_position.y;
475void ocpnFloatingToolbarDialog::Submerge() {
478 if (m_ptoolbar) m_ptoolbar->KillTooltip();
481void ocpnFloatingToolbarDialog::HideTooltip() {
483 if (m_ptoolbar) m_ptoolbar->HideTooltip();
487void ocpnFloatingToolbarDialog::ShowTooltips() {
489 if (m_ptoolbar) m_ptoolbar->EnableTooltips();
493void ocpnFloatingToolbarDialog::ToggleOrientation() {}
495wxRect ocpnFloatingToolbarDialog::GetToolbarRect() {
496 return wxRect(m_position.x, m_position.y, m_ptoolbar->m_maxWidth,
497 m_ptoolbar->m_maxHeight);
500wxSize ocpnFloatingToolbarDialog::GetToolbarSize() {
501 return wxSize(m_ptoolbar->m_maxWidth, m_ptoolbar->m_maxHeight);
504wxPoint ocpnFloatingToolbarDialog::GetToolbarPosition() {
505 return wxPoint(m_position.x, m_position.y);
508bool ocpnFloatingToolbarDialog::MouseEvent(wxMouseEvent &event) {
509 if (g_disable_main_toolbar)
return false;
511 bool bproc = m_ptoolbar->OnMouseEvent(event, m_position);
512 if (bproc) m_ptoolbar->CreateBitmap();
518void ocpnFloatingToolbarDialog::RefreshToolbar() {
520 if (m_ptoolbar->IsDirty()) {
522 top_frame::Get()->GetAbstractPrimaryCanvas()->Refresh();
527void ocpnFloatingToolbarDialog::SetAutoHideTimer(
int time) {
528 m_nAutoHideToolbar = time;
529 if (m_bAutoHideToolbar) {
531 m_fade_timer.Start(m_nAutoHideToolbar * 1000);
535void ocpnFloatingToolbarDialog::RefreshFadeTimer() {
536 if (m_bAutoHideToolbar && (m_nAutoHideToolbar > 0)) {
537 m_fade_timer.Start(m_nAutoHideToolbar * 1000);
541void ocpnFloatingToolbarDialog::SetToolShortHelp(
int id,
const wxString &help) {
542 if (m_ptoolbar) m_ptoolbar->SetToolShortHelp(
id, help);
545void ocpnFloatingToolbarDialog::Realize() {
547 m_ptoolbar->Realize();
548 m_ptoolbar->CreateBitmap();
549 m_toolbar_image.Destroy();
553void ocpnFloatingToolbarDialog::DrawDC(
ocpnDC &dc,
double displayScale) {
555 m_ptoolbar->CreateBitmap();
556 if (m_ptoolbar->GetBitmap().IsOk()) {
557 dc.DrawBitmap(m_ptoolbar->GetBitmap(), m_position.x, m_position.y,
false);
558 m_ptoolbar->SetDirty(
false);
563void ocpnFloatingToolbarDialog::DrawGL(
ocpnDC &gldc,
double displayScale) {
564 if (g_disable_main_toolbar)
return;
567 if (!m_ptoolbar)
return;
569 wxColour backColor = GetGlobalColor(
"GREY3");
570 gldc.SetBrush(wxBrush(backColor));
571 gldc.SetPen(wxPen(backColor));
573 wxRect r = GetToolbarRect();
574 int m_end_margin = wxMin(GetToolSize().x, GetToolSize().y) / 8;
576 if (m_orient == wxHORIZONTAL)
577 gldc.DrawRoundedRectangle(
578 (r.x - m_end_margin / 2) * displayScale, (r.y - 1) * displayScale,
579 (r.width + m_end_margin) * displayScale, (r.height + 2) * displayScale,
580 (m_end_margin * 1) * displayScale);
582 gldc.DrawRoundedRectangle(
583 (r.x - 1) * displayScale, (r.y - m_end_margin / 2) * displayScale,
584 (r.width + 2) * displayScale, (r.height + m_end_margin) * displayScale,
585 (m_end_margin * 1.5) * displayScale);
587 int width = GetToolbarSize().x;
588 int height = GetToolbarSize().y;
590 m_ptoolbar->CreateBitmap(displayScale);
594 glGenTextures(1, &m_texture);
596 glBindTexture(g_texture_rectangle_format, m_texture);
597 glTexParameterf(g_texture_rectangle_format, GL_TEXTURE_MIN_FILTER,
599 glTexParameteri(g_texture_rectangle_format, GL_TEXTURE_MAG_FILTER,
601 glTexParameteri(g_texture_rectangle_format, GL_TEXTURE_WRAP_S,
603 glTexParameteri(g_texture_rectangle_format, GL_TEXTURE_WRAP_T,
606 glBindTexture(g_texture_rectangle_format, m_texture);
609 if (!m_toolbar_image.IsOk()) {
611 m_toolbar_image = m_ptoolbar->GetBitmap().ConvertToImage();
613 unsigned char *d = m_toolbar_image.GetData();
614 unsigned char *e =
new unsigned char[4 * width * height];
615 for (
int y = 0; y < height; y++)
616 for (
int x = 0; x < width; x++) {
617 int i = y * width + x;
618 memcpy(e + 4 * i, d + 3 * i, 3);
621 glTexImage2D(g_texture_rectangle_format, 0, GL_RGBA, width, height, 0,
622 GL_RGBA, GL_UNSIGNED_BYTE, e);
624 glDisable(g_texture_rectangle_format);
630 glEnable(g_texture_rectangle_format);
631 glBindTexture(g_texture_rectangle_format, m_texture);
634 int x0 = GetToolbarPosition().x, x1 = x0 + width;
635 int y0 = GetToolbarPosition().y - 0, y1 = y0 + height;
642 if (GL_TEXTURE_RECTANGLE_ARB == g_texture_rectangle_format)
643 tx = width, ty = height;
670 m_callbacks.render_gl_textures(gldc, coords, uv);
671 glDisable(g_texture_rectangle_format);
672 glBindTexture(g_texture_rectangle_format, 0);
680void ocpnFloatingToolbarDialog::OnToolLeftClick(wxCommandEvent &event) {
684 m_pparent->GetEventHandler()->AddPendingEvent(event);
686 wxTheApp->GetTopWindow()->Raise();
692 m_ptoolbar = CreateNewToolbar();
699 long winstyle = wxNO_BORDER | wxTB_FLAT;
700 winstyle |= m_orient;
707 m_ptoolbar->SetToggledBackgroundColour(GetGlobalColor(
"GREY1"));
708 m_ptoolbar->SetColorScheme(m_cs);
709 m_ptoolbar->EnableRolloverBitmaps(GetEnableRolloverBitmaps());
714void ocpnFloatingToolbarDialog::DestroyToolBar() {
715 g_toolbarConfig = GetToolConfigString();
718 m_ptoolbar->ClearTools();
723 for (
auto it = m_Items.cbegin(); it != m_Items.cend(); it++) {
733 int n_tools = tb->GetToolsCount();
737 ArrayOfPlugInToolbarTools tool_array =
740 for (
unsigned int i = 0; i < tool_array.GetCount(); i++) {
742 if (pttc->position == n_tools) {
746 case GLOBAL_COLOR_SCHEME_DAY:
747 case GLOBAL_COLOR_SCHEME_DAY_HICON:
748 ptool_bmp = pttc->bitmap_day;
751 case GLOBAL_COLOR_SCHEME_DUSK:
752 case GLOBAL_COLOR_SCHEME_NIGHT_HICON:
753 ptool_bmp = pttc->bitmap_dusk;
755 case GLOBAL_COLOR_SCHEME_NIGHT:
756 ptool_bmp = pttc->bitmap_night;
759 ptool_bmp = pttc->bitmap_day;
764 wxToolBarToolBase *tool =
765 tb->AddTool(pttc->id, wxString(pttc->label), *(ptool_bmp),
766 wxString(pttc->shortHelp), pttc->kind);
768 tb->SetToolBitmapsSVG(pttc->id, pttc->pluginNormalIconSVG,
769 pttc->pluginRolloverIconSVG,
770 pttc->pluginToggledIconSVG);
779 while (CheckAndAddPlugInTool(tb)) {
785void ocpnFloatingToolbarDialog::EnableRolloverBitmaps(
bool bEnable) {
786 m_enableRolloverBitmaps = bEnable;
787 if (m_ptoolbar) m_ptoolbar->EnableRolloverBitmaps(bEnable);
797EVT_TIMER(TOOLTIPON_TIMER, ocpnToolBarSimple::OnToolTipTimerEvent)
798EVT_TIMER(TOOLTIPOFF_TIMER, ocpnToolBarSimple::OnToolTipOffTimerEvent)
806 int id, const wxString &label, const wxBitmap &bmpNormal,
807 const wxBitmap &bmpDisabled, wxItemKind kind, wxObject *clientData,
808 const wxString &shortHelp, const wxString &longHelp) {
809 if (m_style->NativeToolIconExists(label)) {
810 return new ocpnToolBarTool(
this,
id, label, bmpNormal, bmpDisabled, kind,
811 clientData, shortHelp, longHelp);
813 wxString testToolname =
g_pi_manager->GetToolOwnerCommonName(
id);
815 if (testToolname ==
"") {
817 clientData, shortHelp, longHelp);
819 return new ocpnToolBarTool(
this,
id, label, bmpNormal, bmpDisabled, kind,
820 clientData, shortHelp, longHelp);
829void ocpnToolBarSimple::Init() {
830 m_currentRowsOrColumns = 0;
832 m_lastX = m_lastY = 0;
834 m_maxWidth = m_maxHeight = 0;
836 m_pressedTool = m_currentTool = -1;
838 m_xPos = m_yPos = wxDefaultCoord;
840 m_style = g_StyleManager->GetCurrentStyle();
843 m_defaultHeight = 15;
845 m_toggle_bg_color = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
846 m_toolOutlineColour.Set(
"BLACK");
847 m_last_ro_tool = NULL;
849 m_btoolbar_is_zooming =
false;
852 m_last_plugin_down_id = -1;
859 m_tbenableRolloverBitmaps =
false;
862wxToolBarToolBase *ocpnToolBarSimple::DoAddTool(
863 int id,
const wxString &label,
const wxBitmap &bitmap,
864 const wxBitmap &bmpDisabled, wxItemKind kind,
const wxString &shortHelp,
865 const wxString &longHelp, wxObject *clientData, wxCoord xPos,
872 return InsertTool(GetToolsCount(),
id, label, bitmap, bmpDisabled, kind,
873 shortHelp, longHelp, clientData);
878wxToolBarToolBase *ocpnToolBarSimple::AddTool(
879 int toolid,
const wxString &label,
const wxBitmap &bitmap,
880 const wxBitmap &bmpDisabled, wxItemKind kind,
const wxString &shortHelp,
881 const wxString &longHelp, wxObject *data) {
884 GetToolsCount(), toolid, label, bitmap, bmpDisabled, kind, shortHelp,
889wxToolBarToolBase *ocpnToolBarSimple::InsertTool(
890 size_t pos,
int id,
const wxString &label,
const wxBitmap &bitmap,
891 const wxBitmap &bmpDisabled, wxItemKind kind,
const wxString &shortHelp,
892 const wxString &longHelp, wxObject *clientData) {
893 wxCHECK_MSG(pos <= GetToolsCount(), (wxToolBarToolBase *)NULL,
894 "invalid position in wxToolBar::InsertTool()");
896 wxToolBarToolBase *tool = CreateTool(
id, label, bitmap, bmpDisabled, kind,
897 clientData, shortHelp, longHelp);
899 if (!InsertTool(pos, tool)) {
908wxToolBarToolBase *ocpnToolBarSimple::InsertTool(
size_t pos,
909 wxToolBarToolBase *tool) {
910 wxCHECK_MSG(pos <= GetToolsCount(), (wxToolBarToolBase *)NULL,
911 "invalid position in wxToolBar::InsertTool()");
913 if (!tool || !DoInsertTool(pos, tool)) {
917 m_tools.Insert(pos, tool);
923bool ocpnToolBarSimple::DoInsertTool(
size_t WXUNUSED(pos),
924 wxToolBarToolBase *toolBase) {
930 if (tool->isPluginTool) {
931 for (
unsigned int i = 0; i < GetToolsCount(); i++) {
932 if (tool->GetToolname() ==
934 tool->toolname <<
"1";
940 if (tool->m_x == wxDefaultCoord) tool->m_x = m_style->GetLeftMargin();
943 if (tool->m_y == wxDefaultCoord) tool->m_y = m_style->GetTopMargin();
945 if (tool->IsButton()) {
946 tool->SetSize(GetToolSize());
949 if ((tool->m_x + tool->GetNormalBitmap().GetWidth() +
950 m_style->GetLeftMargin()) > m_maxWidth)
952 (wxCoord)((tool->m_x + tool->GetWidth() + m_style->GetLeftMargin()));
954 if ((tool->m_y + tool->GetNormalBitmap().GetHeight() +
955 m_style->GetTopMargin()) > m_maxHeight)
957 (wxCoord)((tool->m_y + tool->GetHeight() + m_style->GetTopMargin()));
960 else if (tool->IsControl()) {
961 tool->SetSize(tool->GetControl()->GetSize());
964 tool->b_hilite =
false;
969bool ocpnToolBarSimple::DoDeleteTool(
size_t WXUNUSED(pos),
970 wxToolBarToolBase *tool) {
974 if (m_last_ro_tool == tool) m_last_ro_tool = NULL;
982 const wxPoint &pos,
const wxSize &size,
983 long style,
int orient) {
984 m_parentContainer = parent;
1003 m_tooltip_timer.SetOwner(
this, TOOLTIPON_TIMER);
1004 m_tooltipoff_timer.SetOwner(
this, TOOLTIPOFF_TIMER);
1005 m_tooltip_off = 3000;
1007 m_tbenableRolloverBitmaps =
false;
1012ocpnToolBarSimple::~ocpnToolBarSimple() {}
1014void ocpnToolBarSimple::EnableTooltips() {
1016 m_btooltip_show =
true;
1020bool ocpnToolBarSimple::DisableTooltips() {
1022 bool ret = ocpnToolBarSimple::m_btooltip_show;
1023 ocpnToolBarSimple::m_btooltip_show =
false;
1030void ocpnToolBarSimple::KillTooltip() {
1034 m_tooltip_timer.Stop();
1036 wxTheApp->GetTopWindow()->Raise();
1037 top_frame::Get()->GetAbstractFocusCanvas()->TriggerDeferredFocus();
1040void ocpnToolBarSimple::HideTooltip() {
1046void ocpnToolBarSimple::SetColorScheme(ColorScheme cs) {
1050 m_toolOutlineColour = GetGlobalColor(
"UIBDR");
1052 m_currentColorScheme = cs;
1055bool ocpnToolBarSimple::Realize() {
1057 m_style->SetOrientation(wxTB_VERTICAL);
1059 m_style->SetOrientation(wxTB_HORIZONTAL);
1061 wxSize toolSize = wxSize(-1, -1);
1062 int separatorSize = m_style->GetToolSeparation() * m_sizefactor;
1063 int topMargin = m_style->GetTopMargin() * m_sizefactor;
1064 int leftMargin = m_style->GetLeftMargin() * m_sizefactor;
1066 m_currentRowsOrColumns = 0;
1068 m_lastX = leftMargin;
1069 m_lastY = topMargin;
1074 bool firstNode =
true;
1075 wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
1080 if (iNode >= m_nShowTools)
break;
1086 if (toolSize.x == -1) {
1087 if (!tool->IsSeparator()) {
1088 toolSize.x = tool->m_width;
1089 toolSize.y = tool->m_height;
1093 tool->firstInLine = firstNode;
1094 tool->lastInLine =
false;
1097 tool->last_rect.width = 0;
1099 if (tool->IsSeparator()) {
1108 if (m_currentRowsOrColumns >= m_maxRows)
1109 m_lastX += separatorSize;
1111 m_lastY += separatorSize;
1113 }
else if (tool->IsButton()) {
1114 if (!IsVertical()) {
1115 if (m_currentRowsOrColumns >= m_maxCols) {
1116 tool->firstInLine =
true;
1117 if (lastTool && m_LineCount > 1) lastTool->lastInLine =
true;
1119 m_currentRowsOrColumns = 0;
1120 m_lastX = leftMargin;
1121 m_lastY += toolSize.y + topMargin;
1123 tool->m_x = (wxCoord)m_lastX;
1124 tool->m_y = (wxCoord)m_lastY;
1126 tool->trect = wxRect(tool->m_x, tool->m_y, toolSize.x, toolSize.y);
1127 tool->trect.Inflate(separatorSize / 2, topMargin);
1129 m_lastX += toolSize.x + separatorSize;
1131 if (m_currentRowsOrColumns >= m_maxRows) {
1132 tool->firstInLine =
true;
1133 if (lastTool) lastTool->lastInLine =
true;
1135 m_currentRowsOrColumns = 0;
1136 m_lastX += toolSize.x + leftMargin;
1137 m_lastY = topMargin;
1139 tool->m_x = (wxCoord)m_lastX;
1140 tool->m_y = (wxCoord)m_lastY;
1142 tool->trect = wxRect(tool->m_x, tool->m_y, toolSize.x, toolSize.y);
1143 tool->trect.Inflate((separatorSize / 2), topMargin);
1145 m_lastY += toolSize.y + separatorSize;
1147 m_currentRowsOrColumns++;
1162 if (m_lastX > m_maxWidth) m_maxWidth = m_lastX;
1163 if (m_lastY > m_maxHeight) m_maxHeight = m_lastY;
1166 node = node->GetNext();
1169 if (lastTool && (m_LineCount > 1 || IsVertical()))
1170 lastTool->lastInLine =
true;
1172 if (!IsVertical()) {
1173 m_maxHeight += toolSize.y;
1174 m_maxHeight += m_style->GetBottomMargin();
1176 m_maxWidth += toolSize.x;
1177 m_maxWidth += m_style->GetRightMargin() * m_sizefactor;
1180 m_bitmap = wxNullBitmap;
1185wxBitmap &ocpnToolBarSimple::CreateBitmap(
double display_scale) {
1186 if (m_bitmap.IsOk())
return m_bitmap;
1189 int width = m_maxWidth;
1190 int height = m_maxHeight;
1193 wxBitmap bm(width, height);
1194 mdc.SelectObject(bm);
1195 mdc.SetBackground(wxBrush(GetBackgroundColour()));
1199 for (wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
1200 node; node = node->GetNext()) {
1201 wxToolBarToolBase *tool = node->GetData();
1203 wxRect toolRect = tools->trect;
1204 CreateToolBitmap(tool);
1206 if (tools->m_activeBitmap.IsOk()) {
1207 mdc.DrawBitmap(tools->m_activeBitmap, tools->m_x, tools->m_y,
false);
1212 mdc.SelectObject(wxNullBitmap);
1218void ocpnToolBarSimple::OnToolTipTimerEvent(wxTimerEvent &event) {
1219 if (!top_frame::Get())
1224 if (m_btooltip_show ) {
1225 if (m_last_ro_tool) {
1226 wxString s = m_last_ro_tool->GetShortHelp();
1230 wxPoint pos_in_toolbar(m_last_ro_tool->m_x, m_last_ro_tool->m_y);
1231 pos_in_toolbar.x += m_last_ro_tool->m_width + 2;
1233 wxPoint screenPosition =
1234 top_frame::Get()->GetAbstractPrimaryCanvas()->ClientToScreen(
1239 top_frame::Get()->GetAbstractPrimaryCanvas()->GetWindow(), s,
1240 screenPosition, m_last_ro_tool->m_btooltip_hiviz);
1243 wxTheApp->GetTopWindow()->Raise();
1247 if (g_btouch) m_tooltipoff_timer.Start(m_tooltip_off, wxTIMER_ONE_SHOT);
1254void ocpnToolBarSimple::OnToolTipOffTimerEvent(wxTimerEvent &event) {
1258bool ocpnToolBarSimple::OnMouseEvent(wxMouseEvent &event, wxPoint &position) {
1260 event.GetPosition(&x, &y);
1263 wxRect r = wxRect(position, wxSize(m_maxWidth, m_maxHeight));
1264 if (!r.Contains(x, y)) {
1269 m_parentContainer->RefreshFadeTimer();
1272 (
ocpnToolBarTool *)FindToolForPosition(x - position.x, y - position.y);
1274 m_tooltipoff_timer.Start(m_tooltip_off, wxTIMER_ONE_SHOT);
1277 m_tooltipoff_timer.Stop();
1280 if (tool && tool->IsButton() ) {
1281 if (m_btooltip_show) {
1282 if (tool != m_last_ro_tool) {
1288 if (!m_tooltip_timer.IsRunning()) {
1289 m_tooltip_timer.Start(m_one_shot, wxTIMER_ONE_SHOT);
1296 m_last_ro_tool = tool;
1299 if (event.LeftIsDown()) m_leftDown =
true;
1301 if (event.LeftDown() && tool->IsEnabled()) {
1302 if (tool->CanBeToggled()) {
1304 tool->bitmapOK =
false;
1306 m_bitmap = wxNullBitmap;
1312 ArrayOfPlugInToolbarTools tool_array =
1314 for (
unsigned int i = 0; i < tool_array.GetCount(); i++) {
1316 if (tool->GetId() == pttc->id) {
1321 m_last_plugin_down_id = pttc->id;
1326 }
else if (event.RightDown()) {
1327 OnRightClick(tool->GetId(), x, y);
1340 if (event.LeftUp() && tool->IsEnabled() && (m_leftDown || g_btouch)) {
1342 if (!OnLeftClick(tool->GetId(), tool->IsToggled()) &&
1343 tool->CanBeToggled()) {
1347 tool->bitmapOK =
false;
1362void ocpnToolBarSimple::CreateToolBitmap(wxToolBarToolBase *toolBase) {
1365 wxBitmap bmp = wxNullBitmap;
1367 bool bNeedClear = !tool->bitmapOK;
1369 if (tool->bitmapOK) {
1370 if (tool->IsEnabled()) {
1371 bmp = tool->GetNormalBitmap();
1374 m_style->GetToolIcon(tool->GetToolname(), TOOLICON_NORMAL,
1375 tool->rollover, tool->m_width, tool->m_height);
1376 tool->SetNormalBitmap(bmp);
1377 tool->bitmapOK =
true;
1380 bmp = tool->GetDisabledBitmap();
1382 bmp = m_style->GetToolIcon(tool->GetToolname(), TOOLICON_DISABLED,
1383 false, tool->m_width, tool->m_height);
1384 tool->SetDisabledBitmap(bmp);
1385 tool->bitmapOK =
true;
1389 if (tool->isPluginTool) {
1390 int toggleFlag = tool->IsToggled() ? TOOLICON_TOGGLED : TOOLICON_NORMAL;
1397 wxString svgFile = tool->pluginNormalIconSVG;
1399 if (tool->pluginToggledIconSVG.Length())
1400 svgFile = tool->pluginToggledIconSVG;
1402 if (tool->rollover) {
1403 if (tool->pluginRolloverIconSVG.Length())
1404 svgFile = tool->pluginRolloverIconSVG;
1407 if (!svgFile.IsEmpty()) {
1409 bmp =
LoadSVG(svgFile, tool->m_width, tool->m_height);
1411 bmp = m_style->BuildPluginIcon(bmp, toggleFlag, m_sizefactor);
1414 m_style->BuildPluginIcon(tool->pluginNormalIcon, TOOLICON_NORMAL);
1418 if (!bmp.IsOk() || bmp.IsNull()) {
1419 if (m_style->NativeToolIconExists(tool->GetToolname())) {
1420 bmp = m_style->GetToolIcon(tool->GetToolname(), toggleFlag,
1421 tool->rollover, tool->m_width,
1429 bmp = tool->pluginNormalIcon;
1430 if (fabs(m_sizefactor - 1.0) > 0.01) {
1431 if (tool->m_width && tool->m_height) {
1432 wxImage scaled_image = bmp.ConvertToImage();
1433 bmp = wxBitmap(scaled_image.Scale(tool->m_width, tool->m_height,
1434 wxIMAGE_QUALITY_HIGH));
1439 tool->SetNormalBitmap(bmp);
1440 tool->bitmapOK =
true;
1442 bmp = tool->GetNormalBitmap();
1443 if (tool->IsEnabled()) {
1444 if (tool->IsToggled()) {
1445 if (!tool->bitmapOK) {
1446 if (m_style->NativeToolIconExists(tool->GetToolname())) {
1447 bmp = m_style->GetToolIcon(tool->GetToolname(), TOOLICON_TOGGLED,
1448 tool->rollover, tool->m_width,
1450 tool->SetNormalBitmap(bmp);
1456 if (!tool->bitmapOK) {
1457 if (m_style->NativeToolIconExists(tool->GetToolname())) {
1458 bmp = m_style->GetToolIcon(tool->GetIconName(), TOOLICON_NORMAL,
1459 tool->rollover, tool->m_width,
1461 tool->SetNormalBitmap(bmp);
1466 tool->bitmapOK =
true;
1468 bmp = m_style->GetToolIcon(tool->GetToolname(), TOOLICON_DISABLED,
1469 false, tool->m_width, tool->m_height);
1470 tool->SetDisabledBitmap(bmp);
1471 tool->bitmapOK =
true;
1475 tool->m_activeBitmap = bmp;
1481void ocpnToolBarSimple::DrawTool(wxDC &dc, wxToolBarToolBase *toolBase) {
1485 wxPoint drawAt(tool->m_x, tool->m_y);
1486 wxBitmap bmp = wxNullBitmap;
1488 bool bNeedClear = !tool->bitmapOK;
1490 if (tool->bitmapOK) {
1491 if (tool->IsEnabled()) {
1492 bmp = tool->GetNormalBitmap();
1495 m_style->GetToolIcon(tool->GetToolname(), TOOLICON_NORMAL,
1496 tool->rollover, tool->m_width, tool->m_height);
1497 tool->SetNormalBitmap(bmp);
1498 tool->bitmapOK =
true;
1501 bmp = tool->GetDisabledBitmap();
1503 bmp = m_style->GetToolIcon(tool->GetToolname(), TOOLICON_DISABLED,
1504 false, tool->m_width, tool->m_height);
1505 tool->SetDisabledBitmap(bmp);
1506 tool->bitmapOK =
true;
1510 if (tool->isPluginTool) {
1511 int toggleFlag = tool->IsToggled() ? TOOLICON_TOGGLED : TOOLICON_NORMAL;
1518 wxString svgFile = tool->pluginNormalIconSVG;
1520 if (tool->pluginToggledIconSVG.Length())
1521 svgFile = tool->pluginToggledIconSVG;
1523 if (tool->rollover) {
1524 if (tool->pluginRolloverIconSVG.Length())
1525 svgFile = tool->pluginRolloverIconSVG;
1528 if (!svgFile.IsEmpty()) {
1530 bmp =
LoadSVG(svgFile, tool->m_width, tool->m_height);
1532 bmp = m_style->BuildPluginIcon(bmp, toggleFlag, m_sizefactor);
1535 m_style->BuildPluginIcon(tool->pluginNormalIcon, TOOLICON_NORMAL);
1539 if (!bmp.IsOk() || bmp.IsNull()) {
1540 if (m_style->NativeToolIconExists(tool->GetToolname())) {
1541 bmp = m_style->GetToolIcon(tool->GetToolname(), toggleFlag,
1542 tool->rollover, tool->m_width,
1549 if (tool->rollover) {
1551 m_style->BuildPluginIcon(tool->pluginRolloverIcon, toggleFlag);
1554 m_style->BuildPluginIcon(tool->pluginNormalIcon, toggleFlag);
1557 bmp = m_style->BuildPluginIcon(tool->pluginNormalIcon, toggleFlag);
1559 if (fabs(m_sizefactor - 1.0) > 0.01) {
1560 if (tool->m_width && tool->m_height) {
1561 wxImage scaled_image = bmp.ConvertToImage();
1562 bmp = wxBitmap(scaled_image.Scale(tool->m_width, tool->m_height,
1563 wxIMAGE_QUALITY_HIGH));
1568 tool->SetNormalBitmap(bmp);
1569 tool->bitmapOK =
true;
1571 bmp = tool->GetNormalBitmap();
1572 if (tool->IsEnabled()) {
1573 if (tool->IsToggled()) {
1574 if (!tool->bitmapOK) {
1575 if (m_style->NativeToolIconExists(tool->GetToolname())) {
1576 bmp = m_style->GetToolIcon(tool->GetToolname(), TOOLICON_TOGGLED,
1577 tool->rollover, tool->m_width,
1579 tool->SetNormalBitmap(bmp);
1585 if (!tool->bitmapOK) {
1586 if (m_style->NativeToolIconExists(tool->GetToolname())) {
1587 bmp = m_style->GetToolIcon(tool->GetIconName(), TOOLICON_NORMAL,
1588 tool->rollover, tool->m_width,
1590 tool->SetNormalBitmap(bmp);
1595 tool->bitmapOK =
true;
1597 bmp = m_style->GetToolIcon(tool->GetToolname(), TOOLICON_DISABLED,
1598 false, tool->m_width, tool->m_height);
1599 tool->SetDisabledBitmap(bmp);
1600 tool->bitmapOK =
true;
1605 if (tool->firstInLine) {
1606 m_style->DrawToolbarLineStart(bmp, m_sizefactor);
1608 if (tool->lastInLine) {
1609 m_style->DrawToolbarLineEnd(bmp, m_sizefactor);
1612 if (bmp.GetWidth() != m_style->GetToolSize().x ||
1613 bmp.GetHeight() != m_style->GetToolSize().y) {
1619 if ((tool->last_rect.width &&
1620 (tool->last_rect.x != drawAt.x || tool->last_rect.y != drawAt.y)) ||
1622 wxBrush bb(GetGlobalColor(
"GREY3"));
1624 dc.SetPen(*wxTRANSPARENT_PEN);
1625 dc.DrawRectangle(tool->last_rect.x, tool->last_rect.y,
1626 tool->last_rect.width, tool->last_rect.height);
1633 wxImage scaled_image = bmp.ConvertToImage();
1634 wxBitmap sbmp = wxBitmap(scaled_image.Scale(tool->m_width, tool->m_height,
1635 wxIMAGE_QUALITY_HIGH));
1636 dc.DrawBitmap(sbmp, drawAt);
1638 wxRect(drawAt.x, drawAt.y, sbmp.GetWidth(), sbmp.GetHeight());
1641 dc.DrawBitmap(bmp, drawAt);
1643 wxRect(drawAt.x, drawAt.y, bmp.GetWidth(), bmp.GetHeight());
1651wxToolBarToolBase *ocpnToolBarSimple::FindToolForPosition(wxCoord x,
1653 wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
1656 if ((x >= tool->m_x) && (y >= tool->m_y) &&
1657 (x < (tool->m_x + tool->GetWidth())) &&
1658 (y < (tool->m_y + tool->GetHeight()))) {
1662 node = node->GetNext();
1665 return (wxToolBarToolBase *)NULL;
1668void ocpnToolBarSimple::InvalidateBitmaps() {
1669 wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
1672 tool->bitmapOK =
false;
1673 node = node->GetNext();
1675 m_bitmap = wxNullBitmap;
1678wxRect ocpnToolBarSimple::GetToolRect(
int tool_id) {
1680 wxToolBarToolBase *tool = FindById(tool_id);
1683 if (otool) rect = otool->trect;
1693void ocpnToolBarSimple::DoEnableTool(wxToolBarToolBase *tool,
1694 bool WXUNUSED(enable)) {
1696 t->bitmapOK =
false;
1699void ocpnToolBarSimple::DoToggleTool(wxToolBarToolBase *tool,
1700 bool WXUNUSED(toggle)) {
1702 t->bitmapOK =
false;
1710wxString ocpnToolBarSimple::GetToolShortHelp(
int id)
const {
1711 wxToolBarToolBase *tool = FindById(
id);
1712 wxCHECK_MSG(tool,
"",
"no such tool");
1714 return tool->GetShortHelp();
1717wxString ocpnToolBarSimple::GetToolLongHelp(
int id)
const {
1718 wxToolBarToolBase *tool = FindById(
id);
1719 wxCHECK_MSG(tool,
"",
"no such tool");
1721 return tool->GetLongHelp();
1724void ocpnToolBarSimple::SetToolShortHelp(
int id,
const wxString &help) {
1725 wxToolBarToolBase *tool = FindById(
id);
1727 (void)tool->SetShortHelp(help);
1731void ocpnToolBarSimple::SetToolLongHelp(
int id,
const wxString &help) {
1732 wxToolBarToolBase *tool = FindById(
id);
1734 (void)tool->SetLongHelp(help);
1738int ocpnToolBarSimple::GetToolPos(
int id)
const {
1740 wxToolBarToolsList::compatibility_iterator node;
1742 for (node = m_tools.GetFirst(); node; node = node->GetNext()) {
1743 if (node->GetData()->GetId() == id)
return pos;
1750bool ocpnToolBarSimple::GetToolState(
int id)
const {
1751 wxToolBarToolBase *tool = FindById(
id);
1752 wxCHECK_MSG(tool,
false,
"no such tool");
1754 return tool->IsToggled();
1757bool ocpnToolBarSimple::GetToolEnabled(
int id)
const {
1758 wxToolBarToolBase *tool = FindById(
id);
1759 wxCHECK_MSG(tool,
false,
"no such tool");
1761 return tool->IsEnabled();
1764void ocpnToolBarSimple::ToggleTool(
int id,
bool toggle) {
1765 wxToolBarToolBase *tool = FindById(
id);
1767 if (tool && tool->CanBeToggled() && tool->Toggle(toggle)) {
1768 DoToggleTool(tool, toggle);
1769 InvalidateBitmaps();
1770 top_frame::Get()->GetAbstractPrimaryCanvas()->Refresh(
true);
1774wxObject *ocpnToolBarSimple::GetToolClientData(
int id)
const {
1775 wxToolBarToolBase *tool = FindById(
id);
1776 return tool ? tool->GetClientData() : (wxObject *)NULL;
1779void ocpnToolBarSimple::SetToolClientData(
int id, wxObject *clientData) {
1780 wxToolBarToolBase *tool = FindById(
id);
1782 wxCHECK_RET(tool,
"no such tool in wxToolBar::SetToolClientData");
1784 tool->SetClientData(clientData);
1787void ocpnToolBarSimple::EnableTool(
int id,
bool enable) {
1788 wxToolBarToolBase *tool = FindById(
id);
1790 if (tool->Enable(enable)) {
1791 DoEnableTool(tool, enable);
1796 if (parent && parent->m_FloatingToolbarConfigMenu) {
1797 wxMenuItem *configItem = parent->m_FloatingToolbarConfigMenu->FindItem(
id);
1798 if (configItem) configItem->Check(
true);
1802void ocpnToolBarSimple::SetToolTooltipHiViz(
int id,
bool b_hiviz) {
1805 tool->SetTooltipHiviz(b_hiviz);
1809void ocpnToolBarSimple::ClearTools() {
1810 while (GetToolsCount()) {
1815int ocpnToolBarSimple::GetVisibleToolCount() {
1817 wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
1821 node = node->GetNext();
1826bool ocpnToolBarSimple::DeleteToolByPos(
size_t pos) {
1827 wxCHECK_MSG(pos < GetToolsCount(),
false,
1828 "invalid position in wxToolBar::DeleteToolByPos()");
1830 wxToolBarToolsList::compatibility_iterator node = m_tools.Item(pos);
1832 if (!DoDeleteTool(pos, node->GetData())) {
1836 delete node->GetData();
1837 m_tools.Erase(node);
1842bool ocpnToolBarSimple::DeleteTool(
int id) {
1844 wxToolBarToolsList::compatibility_iterator node;
1845 for (node = m_tools.GetFirst(); node; node = node->GetNext()) {
1846 if (node->GetData()->GetId() == id)
break;
1851 if (!node || !DoDeleteTool(pos, node->GetData())) {
1855 delete node->GetData();
1856 m_tools.Erase(node);
1861wxToolBarToolBase *ocpnToolBarSimple::AddSeparator() {
1862 return InsertSeparator(GetToolsCount());
1865wxToolBarToolBase *ocpnToolBarSimple::InsertSeparator(
size_t pos) {
1866 wxCHECK_MSG(pos <= GetToolsCount(), (wxToolBarToolBase *)NULL,
1867 "invalid position in wxToolBar::InsertSeparator()");
1869 wxToolBarToolBase *tool =
1870 CreateTool(wxID_SEPARATOR,
"", wxNullBitmap, wxNullBitmap,
1871 wxITEM_SEPARATOR, (wxObject *)NULL,
"",
"");
1873 if (!tool || !DoInsertTool(pos, tool)) {
1879 m_tools.Insert(pos, tool);
1885wxToolBarToolBase *ocpnToolBarSimple::RemoveTool(
int id) {
1887 wxToolBarToolsList::compatibility_iterator node;
1888 for (node = m_tools.GetFirst(); node; node = node->GetNext()) {
1889 if (node->GetData()->GetId() == id)
break;
1897 return (wxToolBarToolBase *)NULL;
1900 wxToolBarToolBase *tool = node->GetData();
1901 if (!DoDeleteTool(pos, tool)) {
1902 return (wxToolBarToolBase *)NULL;
1905 m_tools.Erase(node);
1910wxControl *ocpnToolBarSimple::FindControl(
int id) {
1911 for (wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
1912 node; node = node->GetNext()) {
1913 const wxToolBarToolBase *
const tool = node->GetData();
1914 if (tool->IsControl()) {
1915 wxControl *
const control = tool->GetControl();
1918 wxFAIL_MSG(
"NULL control in toolbar?");
1919 }
else if (control->GetId() ==
id) {
1929wxToolBarToolBase *ocpnToolBarSimple::FindById(
int id)
const {
1930 wxToolBarToolBase *tool = (wxToolBarToolBase *)NULL;
1932 for (wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
1933 node; node = node->GetNext()) {
1934 tool = node->GetData();
1935 if (tool->GetId() == id) {
1952bool ocpnToolBarSimple::OnLeftClick(
int id,
bool toggleDown) {
1953 wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED,
id);
1957 event.SetInt((
int)toggleDown);
1960 event.SetExtraLong((
long)toggleDown);
1962 top_frame::Get()->GetEventHandler()->AddPendingEvent(event);
1968void ocpnToolBarSimple::OnRightClick(
int id,
long WXUNUSED(x),
1972 if (m_parentContainer) {
1973 if (m_parentContainer->m_FloatingToolbarConfigMenu) {
1976 wxDefaultPosition, wxSize(100, 100));
1977 int rc = dlg->ShowModal();
1980 if (rc == wxID_OK) {
1981 wxCommandEvent event(wxEVT_COMMAND_TOOL_RCLICKED,
id);
1982 event.SetEventObject(
this);
1985 top_frame::Get()->GetEventHandler()->AddPendingEvent(event);
1991void ocpnToolBarSimple::DoPluginToolUp() {
1996 ArrayOfPlugInToolbarTools tool_array =
1998 for (
unsigned int i = 0; i < tool_array.GetCount(); i++) {
2000 if (m_last_plugin_down_id == pttc->id) {
2007 m_last_plugin_down_id = -1;
2010void ocpnToolBarSimple::SetToolNormalBitmapEx(wxToolBarToolBase *tool,
2011 const wxString &iconName) {
2017 wxBitmap bmp = style->GetToolIcon(iconName, TOOLICON_NORMAL,
false,
2018 otool->m_width, otool->m_height);
2019 tool->SetNormalBitmap(bmp);
2020 otool->SetIconName(iconName);
2025void ocpnToolBarSimple::SetToolNormalBitmapSVG(wxToolBarToolBase *tool,
2030 otool->pluginNormalIconSVG = fileSVG;
2035void ocpnToolBarSimple::SetToolBitmaps(
int id, wxBitmap *bmp,
2036 wxBitmap *bmpRollover) {
2039 if (tool->isPluginTool) {
2040 if (bmp->GetWidth() != tool->GetWidth()) {
2042 wxImage ibmp = bmp->ConvertToImage();
2043 ibmp.Rescale(tool->GetWidth(), tool->GetHeight(),
2044 wxIMAGE_QUALITY_HIGH);
2045 wxBitmap sbmp = wxBitmap(ibmp);
2046 tool->pluginNormalIcon = sbmp;
2049 tool->pluginNormalIcon = *bmp;
2052 if (bmpRollover->GetWidth() != tool->GetWidth()) {
2053 if (bmpRollover->IsOk()) {
2054 wxImage ibmp = bmpRollover->ConvertToImage();
2055 ibmp.Rescale(tool->GetWidth(), tool->GetHeight(),
2056 wxIMAGE_QUALITY_HIGH);
2057 wxBitmap sbmp = wxBitmap(ibmp);
2058 tool->pluginRolloverIcon = sbmp;
2061 tool->pluginRolloverIcon = *bmpRollover;
2063 tool->bitmapOK =
false;
2066 tool->SetNormalBitmap(*bmp);
2067 tool->bitmapOK =
true;
2069 InvalidateBitmaps();
2073void ocpnToolBarSimple::SetToolBitmapsSVG(
int id, wxString fileSVGNormal,
2074 wxString fileSVGRollover,
2075 wxString fileSVGToggled) {
2078 tool->pluginNormalIconSVG = fileSVGNormal;
2079 tool->pluginRolloverIconSVG = fileSVGRollover;
2080 tool->pluginToggledIconSVG = fileSVGToggled;
2081 tool->bitmapOK =
false;
2082 InvalidateBitmaps();
2088ToolbarMOBDialog::ToolbarMOBDialog(wxWindow *parent)
2089 : wxDialog(parent, wxID_ANY, _(
"OpenCPN Alert"), wxDefaultPosition,
2091 wxBoxSizer *topSizer =
new wxBoxSizer(wxVERTICAL);
2093 wxBoxSizer *sizer =
new wxBoxSizer(wxVERTICAL);
2094 topSizer->Add(sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
2097 new wxRadioButton(
this, 0, _(
"No, I don't want to hide it."),
2098 wxDefaultPosition, wxDefaultSize, wxRB_GROUP));
2100 choices.push_back(
new wxRadioButton(
2101 this, 1, _(
"No, and permanently remove the option to hide it."),
2102 wxDefaultPosition));
2105 new wxRadioButton(
this, 2, _(
"Yes, hide it."), wxDefaultPosition));
2107 wxStdDialogButtonSizer *buttonSizer =
2108 CreateStdDialogButtonSizer(wxOK | wxCANCEL);
2110 wxStaticText *textCtrl =
2111 new wxStaticText(
this, wxID_ANY,
2112 _(
"The Man Over Board button could be an important "
2113 "safety feature.\nAre you sure you want to hide it?"));
2115 sizer->Add(textCtrl, 0, wxEXPAND | wxALL, 5);
2116 sizer->Add(choices[0], 0, wxEXPAND | wxALL, 5);
2117 sizer->Add(choices[1], 0, wxEXPAND | wxALL, 5);
2118 sizer->Add(choices[2], 0, wxEXPAND | wxALL, 5);
2119 sizer->Add(buttonSizer, 0, wxEXPAND | wxTOP, 5);
2121 topSizer->SetSizeHints(
this);
2125int ToolbarMOBDialog::GetSelection() {
2126 for (
unsigned int i = 0; i < choices.size(); i++) {
2127 if (choices[i]->GetValue())
return choices[i]->GetId();
2147 const wxString &caption,
2149 const wxSize &size,
long style) {
2150 long wstyle = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER;
2151 wxDialog::Create(parent,
id, caption, pos, size, wstyle);
2153 m_configMenu = NULL;
2154 m_ToolbarDialogAncestor = sponsor;
2156 if (m_ToolbarDialogAncestor)
2157 m_configMenu = m_ToolbarDialogAncestor->m_FloatingToolbarConfigMenu;
2160 GetSizer()->Fit(
this);
2165ToolbarChoicesDialog::~ToolbarChoicesDialog() {}
2172 wxBoxSizer *itemBoxSizer1 =
new wxBoxSizer(wxVERTICAL);
2173 SetSizer(itemBoxSizer1);
2175 wxScrolledWindow *itemDialog1 =
new wxScrolledWindow(
2176 this, wxID_ANY, wxDefaultPosition, wxSize(-1, -1), wxHSCROLL | wxVSCROLL);
2177 itemDialog1->SetScrollRate(2, 2);
2184 wxString wqs = getFontQtStylesheet(qFont);
2185 wxCharBuffer sbuf = wqs.ToUTF8();
2186 QString qsb = QString(sbuf.data());
2188 QString qsbq = getQtStyleSheet();
2190 this->GetHandle()->setStyleSheet(qsb + qsbq);
2193 itemBoxSizer1->Add(itemDialog1, 2, wxEXPAND | wxALL, 0);
2195 wxBoxSizer *itemBoxSizer2 =
new wxBoxSizer(wxVERTICAL);
2196 itemDialog1->SetSizer(itemBoxSizer2);
2198 wxStaticBox *itemStaticBoxSizer3Static =
2199 new wxStaticBox(itemDialog1, wxID_ANY, _(
"Choose Toolbar Icons"));
2200 wxStaticBoxSizer *itemStaticBoxSizer3 =
2201 new wxStaticBoxSizer(itemStaticBoxSizer3Static, wxVERTICAL);
2202 itemBoxSizer2->Add(itemStaticBoxSizer3, 0, wxEXPAND | wxALL, 5);
2207 nitems = m_configMenu->GetMenuItemCount();
2210 for (
int i = 0; i < nitems; i++) {
2211 if (i + ID_ZOOMIN == ID_MOB && g_bPermanentMOBIcon)
continue;
2212 wxMenuItem *item = m_configMenu->FindItemByPosition(i);
2214 wxString label = item->GetItemLabel();
2215 int l = label.Len();
2216 max_width = wxMax(max_width, l);
2218 wxString windowName =
"";
2219 if (item->GetId() == ID_MOB + 100) windowName =
"MOBCheck";
2222 new wxCheckBox(itemDialog1, -1, label, wxDefaultPosition,
2223 wxDefaultSize, 0, wxDefaultValidator, windowName);
2225 itemStaticBoxSizer3->Add(cb, 0, wxALL | wxEXPAND, 2);
2226 cb->SetValue(item->IsChecked());
2228 cboxes.push_back(cb);
2232 itemBoxSizer1->SetMinSize((max_width + 20) * GetCharWidth(),
2233 (nitems + 4) * GetCharHeight() * 2);
2235 wxBoxSizer *itemBoxSizerBottom =
new wxBoxSizer(wxHORIZONTAL);
2236 itemBoxSizer1->Add(itemBoxSizerBottom, 0, wxALL | wxEXPAND, 5);
2238 wxBoxSizer *itemBoxSizerAux =
new wxBoxSizer(wxHORIZONTAL);
2239 itemBoxSizerBottom->Add(itemBoxSizerAux, 1, wxALL, 3);
2241 wxBoxSizer *itemBoxSizer16 =
new wxBoxSizer(wxHORIZONTAL);
2242 itemBoxSizerBottom->Add(itemBoxSizer16, 0, wxALL, 3);
2245 new wxButton(
this, -1, _(
"Cancel"), wxDefaultPosition, wxDefaultSize, 0);
2246 itemBoxSizer16->Add(m_CancelButton, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1);
2249 new wxButton(
this, -1, _(
"OK"), wxDefaultPosition, wxDefaultSize, 0);
2250 itemBoxSizer16->Add(m_OKButton, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1);
2251 m_OKButton->SetDefault();
2253 m_CancelButton->Connect(
2254 wxEVT_COMMAND_BUTTON_CLICKED,
2255 wxCommandEventHandler(ToolbarChoicesDialog::OnCancelClick), NULL,
this);
2256 m_OKButton->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
2257 wxCommandEventHandler(ToolbarChoicesDialog::OnOkClick),
2260 SetColorScheme((ColorScheme)0);
2263void ToolbarChoicesDialog::SetColorScheme(ColorScheme cs) { DimeControl(
this); }
2265void ToolbarChoicesDialog::OnCancelClick(wxCommandEvent &event) {
2266 EndModal(wxID_CANCEL);
2269void ToolbarChoicesDialog::OnOkClick(wxCommandEvent &event) {
2270 unsigned int ncheck = 0;
2272 wxString toolbarConfigSave = m_ToolbarDialogAncestor->GetToolConfigString();
2273 wxString new_toolbarConfig = toolbarConfigSave;
2275 for (
unsigned int i = 0; i < cboxes.size(); i++) {
2276 wxCheckBox *cb = cboxes[i];
2277 wxString cbName = cb->GetName();
2279 if (cbName.IsSameAs(
"MOBCheck") && !cb->IsChecked()) {
2282 int dialog_ret = mdlg.ShowModal();
2283 int answer = mdlg.GetSelection();
2284 if (dialog_ret == wxID_OK) {
2286 g_bPermanentMOBIcon =
true;
2288 }
else if (answer == 0) {
2292 new_toolbarConfig = toolbarConfigSave;
2297 wxMenuItem *item = m_configMenu->FindItemByPosition(i);
2298 if (new_toolbarConfig.Len() > i) {
2299 new_toolbarConfig.SetChar(i, cb->IsChecked() ?
'X' :
'.');
2301 new_toolbarConfig.Append(cb->IsChecked() ?
'X' :
'.');
2303 item->Check(cb->IsChecked());
2304 if (cb->IsChecked()) ncheck++;
2311 new_toolbarConfig.SetChar( ID_SETTINGS -ID_ZOOMIN ,
'X' );
2313 int idOffset = ID_PLUGIN_BASE - ID_ZOOMIN + 100;
2316 wxMenuItem *item = m_configMenu->FindItem(ID_SETTINGS + idOffset);
2318 item->Check(
true );
2322 m_ToolbarDialogAncestor->SetToolConfigString(new_toolbarConfig);
2327void ToolbarChoicesDialog::RecalculateSize() {
2328 wxSize esize = GetSize();
2331 wxSize dsize = GetParent()->GetClientSize();
2332 esize.y = wxMin(esize.y, dsize.y - (4 * GetCharHeight()));
2333 esize.x = wxMin(esize.x, dsize.x - (2 * GetCharHeight()));
2339 fsize.y = wxMin(esize.y, fsize.y - (4 * GetCharHeight()));
2340 fsize.x = wxMin(esize.x, fsize.x - (2 * GetCharHeight()));
2344 Move(GetPosition().x, 10);
Global state for AIS decoder.
Charts database management
Generic Chart canvas base.
Device context class that can use either wxDC or OpenGL for drawing.
virtual void OnToolbarToolDownCallback(int id)
Handles toolbar button press.
virtual void OnToolbarToolUpCallback(int id)
Handles toolbar button release.
Global variables stored in configuration file.
OpenGL chart rendering canvas.
wxFont * GetOCPNScaledFont(wxString item, int default_size)
Retrieves a font from FontMgr, optionally scaled for physical readability.
General purpose GUI support.
Miscellaneous globals primarely used by gui layer, not persisted in configuration file.
GUI constant definitions.
PlugInManager * g_pi_manager
Global instance.
PlugInManager and helper classes – Mostly gui parts (dialogs) and plugin API stuff.
wxBitmap LoadSVG(const wxString filename, const unsigned int width, const unsigned int height, wxBitmap *default_bitmap, bool use_cache)
Load SVG file and return it's bitmap representation of requested size In case file can't be loaded an...
Abstract gFrame/MyFrame interface.