X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a310c91c7c51703f88cbcf4f2c6975e7c0db3cda..eea4d01c65f9b29baa1193db762b4c6b8144af24:/src/aui/auibar.cpp diff --git a/src/aui/auibar.cpp b/src/aui/auibar.cpp index 3885fdf078..a64ed0cce5 100644 --- a/src/aui/auibar.cpp +++ b/src/aui/auibar.cpp @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: src/aui/dockart.cpp +// Name: src/aui/auibar.cpp // Purpose: wxaui: wx advanced user interface - docking window manager // Author: Benjamin I. Williams // Modified by: @@ -69,41 +69,6 @@ const int BUTTON_DROPDOWN_WIDTH = 10; wxBitmap wxAuiBitmapFromBits(const unsigned char bits[], int w, int h, const wxColour& color); -static wxBitmap MakeDisabledBitmap(wxBitmap& bmp) -{ - wxImage image = bmp.ConvertToImage(); - - int mr, mg, mb; - mr = image.GetMaskRed(); - mg = image.GetMaskGreen(); - mb = image.GetMaskBlue(); - - unsigned char* data = image.GetData(); - int width = image.GetWidth(); - int height = image.GetHeight(); - bool has_mask = image.HasMask(); - - for (int y = height-1; y >= 0; --y) - { - for (int x = width-1; x >= 0; --x) - { - data = image.GetData() + (y*(width*3))+(x*3); - unsigned char* r = data; - unsigned char* g = data+1; - unsigned char* b = data+2; - - if (has_mask && *r == mr && *g == mg && *b == mb) - continue; - - *r = wxColour::AlphaBlend(*r, 255, 0.4); - *g = wxColour::AlphaBlend(*g, 255, 0.4); - *b = wxColour::AlphaBlend(*b, 255, 0.4); - } - } - - return wxBitmap(image); -} - static wxColor GetBaseColor() { @@ -362,10 +327,8 @@ void wxAuiDefaultToolBarArt::DrawButton( else bmp = item.GetBitmap(); - if (!bmp.IsOk()) - return; - - dc.DrawBitmap(bmp, bmp_x, bmp_y, true); + if ( bmp.IsOk() ) + dc.DrawBitmap(bmp, bmp_x, bmp_y, true); // set the item's text color based on if it is disabled dc.SetTextForeground(*wxBLACK); @@ -465,6 +428,15 @@ void wxAuiDefaultToolBarArt::DrawDropDownButton( dc.DrawRectangle(button_rect); dc.DrawRectangle(dropdown_rect); } + else if (item.GetState() & wxAUI_BUTTON_STATE_CHECKED) + { + // Notice that this branch must come after the hover one to ensure the + // correct appearance when the mouse hovers over a checked item. + dc.SetPen(wxPen(m_highlight_colour)); + dc.SetBrush(wxBrush(m_highlight_colour.ChangeLightness(170))); + dc.DrawRectangle(button_rect); + dc.DrawRectangle(dropdown_rect); + } wxBitmap bmp; wxBitmap dropbmp; @@ -972,7 +944,7 @@ wxAuiToolBarItem* wxAuiToolBar::AddTool(int tool_id, item.active = true; item.dropdown = false; item.spacer_pixels = 0; - item.id = tool_id; + item.toolid = tool_id; item.state = 0; item.proportion = 0; item.kind = kind; @@ -981,18 +953,15 @@ wxAuiToolBarItem* wxAuiToolBar::AddTool(int tool_id, item.user_data = 0; item.sticky = false; - if (item.id == wxID_ANY) - item.id = wxNewId(); + if (item.toolid == wxID_ANY) + item.toolid = wxNewId(); if (!item.disabled_bitmap.IsOk()) { // no disabled bitmap specified, we need to make one if (item.bitmap.IsOk()) { - //wxImage img = item.bitmap.ConvertToImage(); - //wxImage grey_version = img.ConvertToGreyscale(); - //item.disabled_bitmap = wxBitmap(grey_version); - item.disabled_bitmap = MakeDisabledBitmap(item.bitmap); + item.disabled_bitmap = item.bitmap.ConvertToDisabled(); } } m_items.Add(item); @@ -1010,7 +979,7 @@ wxAuiToolBarItem* wxAuiToolBar::AddControl(wxControl* control, item.active = true; item.dropdown = false; item.spacer_pixels = 0; - item.id = control->GetId(); + item.toolid = control->GetId(); item.state = 0; item.proportion = 0; item.kind = wxITEM_CONTROL; @@ -1039,7 +1008,7 @@ wxAuiToolBarItem* wxAuiToolBar::AddLabel(int tool_id, item.active = true; item.dropdown = false; item.spacer_pixels = 0; - item.id = tool_id; + item.toolid = tool_id; item.state = 0; item.proportion = 0; item.kind = wxITEM_LABEL; @@ -1048,8 +1017,8 @@ wxAuiToolBarItem* wxAuiToolBar::AddLabel(int tool_id, item.user_data = 0; item.sticky = false; - if (item.id == wxID_ANY) - item.id = wxNewId(); + if (item.toolid == wxID_ANY) + item.toolid = wxNewId(); m_items.Add(item); return &m_items.Last(); @@ -1064,7 +1033,7 @@ wxAuiToolBarItem* wxAuiToolBar::AddSeparator() item.disabled_bitmap = wxNullBitmap; item.active = true; item.dropdown = false; - item.id = -1; + item.toolid = -1; item.state = 0; item.proportion = 0; item.kind = wxITEM_SEPARATOR; @@ -1087,7 +1056,7 @@ wxAuiToolBarItem* wxAuiToolBar::AddSpacer(int pixels) item.active = true; item.dropdown = false; item.spacer_pixels = pixels; - item.id = -1; + item.toolid = -1; item.state = 0; item.proportion = 0; item.kind = wxITEM_SPACER; @@ -1110,7 +1079,7 @@ wxAuiToolBarItem* wxAuiToolBar::AddStretchSpacer(int proportion) item.active = true; item.dropdown = false; item.spacer_pixels = 0; - item.id = -1; + item.toolid = -1; item.state = 0; item.proportion = proportion; item.kind = wxITEM_SPACER; @@ -1167,7 +1136,7 @@ wxAuiToolBarItem* wxAuiToolBar::FindTool(int tool_id) const for (i = 0, count = m_items.GetCount(); i < count; ++i) { wxAuiToolBarItem& item = m_items.Item(i); - if (item.id == tool_id) + if (item.toolid == tool_id) return &item; } @@ -1537,13 +1506,13 @@ void wxAuiToolBar::ToggleTool(int tool_id, bool state) if (idx >= 0 && idx < count) { - for (i = idx; i < count; ++i) + for (i = idx + 1; i < count; ++i) { if (m_items[i].kind != wxITEM_RADIO) break; m_items[i].state &= ~wxAUI_BUTTON_STATE_CHECKED; } - for (i = idx; i > 0; i--) + for (i = idx - 1; i >= 0; i--) { if (m_items[i].kind != wxITEM_RADIO) break; @@ -1760,7 +1729,7 @@ int wxAuiToolBar::GetToolIndex(int tool_id) const for (i = 0; i < count; ++i) { wxAuiToolBarItem& item = m_items.Item(i); - if (item.id == tool_id) + if (item.toolid == tool_id) return i; } @@ -2169,10 +2138,10 @@ void wxAuiToolBar::DoIdleUpdate() { wxAuiToolBarItem& item = m_items.Item(i); - if (item.id == -1) + if (item.toolid == -1) continue; - wxUpdateUIEvent evt(item.id); + wxUpdateUIEvent evt(item.toolid); evt.SetEventObject(this); if (handler->ProcessEvent(evt)) @@ -2446,8 +2415,11 @@ void wxAuiToolBar::OnPaint(wxPaintEvent& WXUNUSED(evt)) } else if (item.kind == wxITEM_CHECK) { - // draw a toggle button - m_art->DrawButton(dc, this, item, item_rect); + // draw either a regular or dropdown toggle button + if (!item.dropdown) + m_art->DrawButton(dc, this, item, item_rect); + else + m_art->DrawDropDownButton(dc, this, item, item_rect); } else if (item.kind == wxITEM_RADIO) { @@ -2573,9 +2545,9 @@ void wxAuiToolBar::OnLeftDown(wxMouseEvent& evt) UnsetToolTip(); // fire the tool dropdown event - wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, m_action_item->id); + wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, m_action_item->toolid); e.SetEventObject(this); - e.SetToolId(m_action_item->id); + e.SetToolId(m_action_item->toolid); int mouse_x = evt.GetX(); wxRect rect = m_action_item->sizer_item->GetRect(); @@ -2636,14 +2608,14 @@ void wxAuiToolBar::OnLeftUp(wxMouseEvent& evt) { UnsetToolTip(); - wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, m_action_item->id); + wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, m_action_item->toolid); e.SetEventObject(this); if (hit_item->kind == wxITEM_CHECK || hit_item->kind == wxITEM_RADIO) { const bool toggle = !(m_action_item->state & wxAUI_BUTTON_STATE_CHECKED); - ToggleTool(m_action_item->id, toggle); + ToggleTool(m_action_item->toolid, toggle); // repaint immediately Refresh(false); @@ -2712,9 +2684,9 @@ void wxAuiToolBar::OnRightUp(wxMouseEvent& evt) { if (hit_item->kind == wxITEM_NORMAL) { - wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, m_action_item->id); + wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, m_action_item->toolid); e.SetEventObject(this); - e.SetToolId(m_action_item->id); + e.SetToolId(m_action_item->toolid); e.SetClickPoint(m_action_pos); GetEventHandler()->ProcessEvent(e); DoIdleUpdate(); @@ -2785,9 +2757,9 @@ void wxAuiToolBar::OnMiddleUp(wxMouseEvent& evt) { if (hit_item->kind == wxITEM_NORMAL) { - wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, m_action_item->id); + wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, m_action_item->toolid); e.SetEventObject(this); - e.SetToolId(m_action_item->id); + e.SetToolId(m_action_item->toolid); e.SetClickPoint(m_action_pos); GetEventHandler()->ProcessEvent(e); DoIdleUpdate(); @@ -2811,7 +2783,7 @@ void wxAuiToolBar::OnMotion(wxMouseEvent& evt) // event sent sometime in the future (see OnLeftUp()) wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, GetId()); e.SetEventObject(this); - e.SetToolId(m_action_item->id); + e.SetToolId(m_action_item->toolid); m_dragging = GetEventHandler()->ProcessEvent(e) && !e.GetSkipped(); DoIdleUpdate();