X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7f08b8283b9ad93aca84a69a4091094c50f44940..404b319a85dadd7decf7a5a5331020520031a41c:/src/ribbon/buttonbar.cpp diff --git a/src/ribbon/buttonbar.cpp b/src/ribbon/buttonbar.cpp index 761af0d18f..7e2b3bc43a 100644 --- a/src/ribbon/buttonbar.cpp +++ b/src/ribbon/buttonbar.cpp @@ -117,7 +117,7 @@ public: wxBitmap bitmap_small; wxBitmap bitmap_small_disabled; wxRibbonButtonBarButtonSizeInfo sizes[3]; - wxObject* client_data; + wxClientDataContainer client_data; int id; wxRibbonButtonKind kind; long state; @@ -278,12 +278,10 @@ wxRibbonButtonBarButtonBase* wxRibbonButtonBar::AddButton( const wxBitmap& bitmap_disabled, const wxBitmap& bitmap_small_disabled, wxRibbonButtonKind kind, - const wxString& help_string, - wxObject* client_data) + const wxString& help_string) { return InsertButton(GetButtonCount(), button_id, label, bitmap, - bitmap_small, bitmap_disabled,bitmap_small_disabled, kind, help_string, - client_data); + bitmap_small, bitmap_disabled,bitmap_small_disabled, kind, help_string); } wxRibbonButtonBarButtonBase* wxRibbonButtonBar::InsertButton( @@ -295,8 +293,7 @@ wxRibbonButtonBarButtonBase* wxRibbonButtonBar::InsertButton( const wxBitmap& bitmap_disabled, const wxBitmap& bitmap_small_disabled, wxRibbonButtonKind kind, - const wxString& help_string, - wxObject* client_data) + const wxString& help_string) { wxASSERT(bitmap.IsOk() || bitmap_small.IsOk()); if(m_buttons.IsEmpty()) @@ -358,7 +355,6 @@ wxRibbonButtonBarButtonBase* wxRibbonButtonBar::InsertButton( } base->kind = kind; base->help_string = help_string; - base->client_data = client_data; base->state = 0; wxClientDC temp_dc(this); @@ -371,6 +367,42 @@ wxRibbonButtonBarButtonBase* wxRibbonButtonBar::InsertButton( return base; } + +void +wxRibbonButtonBar::SetItemClientObject(wxRibbonButtonBarButtonBase* item, + wxClientData* data) +{ + wxCHECK_RET( item, "Can't associate client object with an invalid item" ); + + item->client_data.SetClientObject(data); +} + +wxClientData* +wxRibbonButtonBar::GetItemClientObject(const wxRibbonButtonBarButtonBase* item) const +{ + wxCHECK_MSG( item, NULL, "Can't get client object for an invalid item" ); + + return item->client_data.GetClientObject(); +} + +void +wxRibbonButtonBar::SetItemClientData(wxRibbonButtonBarButtonBase* item, + void* data) +{ + wxCHECK_RET( item, "Can't associate client data with an invalid item" ); + + item->client_data.SetClientData(data); +} + +void* +wxRibbonButtonBar::GetItemClientData(const wxRibbonButtonBarButtonBase* item) const +{ + wxCHECK_MSG( item, NULL, "Can't get client data for an invalid item" ); + + return item->client_data.GetClientData(); +} + + wxRibbonButtonBarButtonBase* wxRibbonButtonBar::InsertButton( size_t pos, int button_id, @@ -768,10 +800,21 @@ void wxRibbonButtonBar::CommonInit(long WXUNUSED(style)) m_hovered_button = NULL; m_active_button = NULL; m_lock_active_state = false; + m_show_tooltips_for_disabled = false; SetBackgroundStyle(wxBG_STYLE_CUSTOM); } +void wxRibbonButtonBar::SetShowToolTipsForDisabled(bool show) +{ + m_show_tooltips_for_disabled = show; +} + +bool wxRibbonButtonBar::GetShowToolTipsForDisabled() const +{ + return m_show_tooltips_for_disabled; +} + wxSize wxRibbonButtonBar::GetMinSize() const { return m_layouts.Last()->overall_size; @@ -902,7 +945,7 @@ bool wxRibbonButtonBar::TryCollapseLayout(wxRibbonButtonBarLayout* original, // If height isn't preserved (i.e. it is reduced), then the minimum // size for the button bar will decrease, preventing the original // layout from being used (in some cases). - // It may be a good idea to always preverse the height, but for now + // It may be a good idea to always preserve the height, but for now // it is only done when the first button is involved in a collapse. preserve_height = true; } @@ -947,6 +990,7 @@ void wxRibbonButtonBar::OnMouseMove(wxMouseEvent& evt) { wxPoint cursor(evt.GetPosition()); wxRibbonButtonBarButtonInstance* new_hovered = NULL; + wxRibbonButtonBarButtonInstance* tooltipButton = NULL; long new_hovered_state = 0; wxRibbonButtonBarLayout* layout = m_layouts.Item(m_current_layout); @@ -961,28 +1005,40 @@ void wxRibbonButtonBar::OnMouseMove(wxMouseEvent& evt) btn_rect.SetSize(size.size); if(btn_rect.Contains(cursor)) { - new_hovered = &instance; - new_hovered_state = instance.base->state; - new_hovered_state &= ~wxRIBBON_BUTTONBAR_BUTTON_HOVER_MASK; - wxPoint offset(cursor); - offset -= btn_rect.GetTopLeft(); - if(size.normal_region.Contains(offset)) + if((instance.base->state & wxRIBBON_BUTTONBAR_BUTTON_DISABLED) == 0) { - new_hovered_state |= wxRIBBON_BUTTONBAR_BUTTON_NORMAL_HOVERED; + tooltipButton = &instance; + new_hovered = &instance; + new_hovered_state = instance.base->state; + new_hovered_state &= ~wxRIBBON_BUTTONBAR_BUTTON_HOVER_MASK; + wxPoint offset(cursor); + offset -= btn_rect.GetTopLeft(); + if(size.normal_region.Contains(offset)) + { + new_hovered_state |= wxRIBBON_BUTTONBAR_BUTTON_NORMAL_HOVERED; + } + if(size.dropdown_region.Contains(offset)) + { + new_hovered_state |= wxRIBBON_BUTTONBAR_BUTTON_DROPDOWN_HOVERED; + } + break; } - if(size.dropdown_region.Contains(offset)) + else if (m_show_tooltips_for_disabled) { - new_hovered_state |= wxRIBBON_BUTTONBAR_BUTTON_DROPDOWN_HOVERED; + tooltipButton = &instance; } - break; } } #if wxUSE_TOOLTIPS - if(new_hovered == NULL && GetToolTip()) + if(tooltipButton == NULL && GetToolTip()) { UnsetToolTip(); } + if(tooltipButton) + { + SetToolTip(tooltipButton->base->help_string); + } #endif if(new_hovered != m_hovered_button || (m_hovered_button != NULL && @@ -996,9 +1052,6 @@ void wxRibbonButtonBar::OnMouseMove(wxMouseEvent& evt) if(m_hovered_button != NULL) { m_hovered_button->base->state = new_hovered_state; -#if wxUSE_TOOLTIPS - SetToolTip(m_hovered_button->base->help_string); -#endif } Refresh(false); } @@ -1050,16 +1103,19 @@ void wxRibbonButtonBar::OnMouseDown(wxMouseEvent& evt) btn_rect.SetSize(size.size); if(btn_rect.Contains(cursor)) { - m_active_button = &instance; - cursor -= btn_rect.GetTopLeft(); - long state = 0; - if(size.normal_region.Contains(cursor)) - state = wxRIBBON_BUTTONBAR_BUTTON_NORMAL_ACTIVE; - else if(size.dropdown_region.Contains(cursor)) - state = wxRIBBON_BUTTONBAR_BUTTON_DROPDOWN_ACTIVE; - instance.base->state |= state; - Refresh(false); - break; + if((instance.base->state & wxRIBBON_BUTTONBAR_BUTTON_DISABLED) == 0) + { + m_active_button = &instance; + cursor -= btn_rect.GetTopLeft(); + long state = 0; + if(size.normal_region.Contains(cursor)) + state = wxRIBBON_BUTTONBAR_BUTTON_NORMAL_ACTIVE; + else if(size.dropdown_region.Contains(cursor)) + state = wxRIBBON_BUTTONBAR_BUTTON_DROPDOWN_ACTIVE; + instance.base->state |= state; + Refresh(false); + break; + } } } } @@ -1155,7 +1211,7 @@ wxRibbonButtonBarButtonBase *wxRibbonButtonBar::GetHoveredItem() const wxRibbonButtonBarButtonBase *wxRibbonButtonBar::GetItem(size_t n) const { - wxCHECK_MSG(n >= 0 && n < m_buttons.GetCount(), NULL, "wxRibbonButtonBar item's index is out of bound"); + wxCHECK_MSG(n < m_buttons.GetCount(), NULL, "wxRibbonButtonBar item's index is out of bound"); return m_buttons.Item(n); }