X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce00f59b5b169752d2f05ce3bb1a88ddc1b38b4c..04b2b47a4e817fb32a78316b8b50efd0612509b9:/src/ribbon/buttonbar.cpp diff --git a/src/ribbon/buttonbar.cpp b/src/ribbon/buttonbar.cpp index 543e8385c9..ad44278f14 100644 --- a/src/ribbon/buttonbar.cpp +++ b/src/ribbon/buttonbar.cpp @@ -249,6 +249,16 @@ wxRibbonButtonBarButtonBase* wxRibbonButtonBar::AddDropdownButton( wxRIBBON_BUTTON_DROPDOWN); } +wxRibbonButtonBarButtonBase* wxRibbonButtonBar::AddToggleButton( + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string) +{ + return AddButton(button_id, label, bitmap, help_string, + wxRIBBON_BUTTON_TOGGLE); +} + wxRibbonButtonBarButtonBase* wxRibbonButtonBar::AddHybridButton( int button_id, const wxString& label, @@ -269,6 +279,23 @@ wxRibbonButtonBarButtonBase* wxRibbonButtonBar::AddButton( wxRibbonButtonKind kind, const wxString& help_string, wxObject* client_data) +{ + return InsertButton(GetButtonCount(), button_id, label, bitmap, + bitmap_small, bitmap_disabled,bitmap_small_disabled, kind, help_string, + client_data); +} + +wxRibbonButtonBarButtonBase* wxRibbonButtonBar::InsertButton( + size_t pos, + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bitmap_small, + const wxBitmap& bitmap_disabled, + const wxBitmap& bitmap_small_disabled, + wxRibbonButtonKind kind, + const wxString& help_string, + wxObject* client_data) { wxASSERT(bitmap.IsOk() || bitmap_small.IsOk()); if(m_buttons.IsEmpty()) @@ -338,12 +365,56 @@ wxRibbonButtonBarButtonBase* wxRibbonButtonBar::AddButton( FetchButtonSizeInfo(base, wxRIBBON_BUTTONBAR_BUTTON_MEDIUM, temp_dc); FetchButtonSizeInfo(base, wxRIBBON_BUTTONBAR_BUTTON_LARGE, temp_dc); - // TODO - m_buttons.Add(base); + m_buttons.Insert(base, pos); m_layouts_valid = false; return base; } +wxRibbonButtonBarButtonBase* wxRibbonButtonBar::InsertButton( + size_t pos, + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string, + wxRibbonButtonKind kind) +{ + return InsertButton(pos, button_id, label, bitmap, wxNullBitmap, + wxNullBitmap, wxNullBitmap, kind, help_string); +} + +wxRibbonButtonBarButtonBase* wxRibbonButtonBar::InsertDropdownButton( + size_t pos, + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string) +{ + return InsertButton(pos, button_id, label, bitmap, help_string, + wxRIBBON_BUTTON_DROPDOWN); +} + +wxRibbonButtonBarButtonBase* wxRibbonButtonBar::InsertToggleButton( + size_t pos, + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string) +{ + return InsertButton(pos, button_id, label, bitmap, help_string, + wxRIBBON_BUTTON_TOGGLE); +} + +wxRibbonButtonBarButtonBase* wxRibbonButtonBar::InsertHybridButton( + size_t pos, + int button_id, + const wxString& label, + const wxBitmap& bitmap, + const wxString& help_string) +{ + return InsertButton(pos, button_id, label, bitmap, help_string, + wxRIBBON_BUTTON_HYBRID); +} + void wxRibbonButtonBar::FetchButtonSizeInfo(wxRibbonButtonBarButtonBase* button, wxRibbonButtonBarButtonState size, wxDC& dc) { @@ -372,6 +443,11 @@ wxBitmap wxRibbonButtonBar::MakeDisabledBitmap(const wxBitmap& original) return wxBitmap(img.ConvertToGreyscale()); } +size_t wxRibbonButtonBar::GetButtonCount() const +{ + return m_buttons.GetCount(); +} + bool wxRibbonButtonBar::Realize() { if(!m_layouts_valid) @@ -445,6 +521,36 @@ void wxRibbonButtonBar::EnableButton(int button_id, bool enable) } } +void wxRibbonButtonBar::ToggleButton(int button_id, bool checked) +{ + size_t count = m_buttons.GetCount(); + size_t i; + for(i = 0; i < count; ++i) + { + wxRibbonButtonBarButtonBase* button = m_buttons.Item(i); + if(button->id == button_id) + { + if(checked) + { + if((button->state & wxRIBBON_BUTTONBAR_BUTTON_TOGGLED) == 0) + { + button->state |= wxRIBBON_BUTTONBAR_BUTTON_TOGGLED; + Refresh(); + } + } + else + { + if(button->state & wxRIBBON_BUTTONBAR_BUTTON_TOGGLED) + { + button->state &= ~wxRIBBON_BUTTONBAR_BUTTON_TOGGLED; + Refresh(); + } + } + return; + } + } +} + void wxRibbonButtonBar::SetArtProvider(wxRibbonArtProvider* art) { if(art == m_art) @@ -558,6 +664,42 @@ wxSize wxRibbonButtonBar::DoGetNextLargerSize(wxOrientation direction, return result; } +void wxRibbonButtonBar::UpdateWindowUI(long flags) +{ + wxWindowBase::UpdateWindowUI(flags); + + // don't waste time updating state of tools in a hidden toolbar + if ( !IsShown() ) + return; + + size_t btn_count = m_buttons.size(); + bool rerealize = false; + for ( size_t btn_i = 0; btn_i < btn_count; ++btn_i ) + { + wxRibbonButtonBarButtonBase& btn = *m_buttons.Item(btn_i); + int id = btn.id; + + wxUpdateUIEvent event(id); + event.SetEventObject(this); + + if ( ProcessWindowEvent(event) ) + { + if ( event.GetSetEnabled() ) + EnableButton(id, event.GetEnabled()); + if ( event.GetSetChecked() ) + ToggleButton(id, event.GetChecked()); + if ( event.GetSetText() ) + { + btn.label = event.GetText(); + rerealize = true; + } + } + } + + if ( rerealize ) + Realize(); +} + void wxRibbonButtonBar::OnEraseBackground(wxEraseEvent& WXUNUSED(evt)) { // All painting done in main paint handler to minimise flicker @@ -835,6 +977,13 @@ void wxRibbonButtonBar::OnMouseMove(wxMouseEvent& evt) } } +#if wxUSE_TOOLTIPS + if(new_hovered == NULL && GetToolTip()) + { + UnsetToolTip(); + } +#endif + if(new_hovered != m_hovered_button || (m_hovered_button != NULL && new_hovered_state != m_hovered_button->base->state)) { @@ -846,6 +995,9 @@ 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); } @@ -936,6 +1088,13 @@ void wxRibbonButtonBar::OnMouseUp(wxMouseEvent& evt) else break; wxRibbonButtonBarEvent notification(event_type, id); + if(m_active_button->base->kind == wxRIBBON_BUTTON_TOGGLE) + { + m_active_button->base->state ^= + wxRIBBON_BUTTONBAR_BUTTON_TOGGLED; + notification.SetInt(m_active_button->base->state & + wxRIBBON_BUTTONBAR_BUTTON_TOGGLED); + } notification.SetEventObject(this); notification.SetBar(this); m_lock_active_state = true;