X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e71aec80fd2c0d55067dd726ad1abbf5c102e168..ad7922b8aaf4aea61c4a364887fc89b0548a6047:/src/gtk/button.cpp?ds=sidebyside diff --git a/src/gtk/button.cpp b/src/gtk/button.cpp index 2ce3e1d0a1..2d83f10cbf 100644 --- a/src/gtk/button.cpp +++ b/src/gtk/button.cpp @@ -83,7 +83,7 @@ wxgtk_button_style_set_callback(GtkWidget* widget, GtkStyle*, wxButton* win) { /* the default button has a border around it */ wxWindow* parent = win->GetParent(); - if (parent && parent->m_wxwindow && GTK_WIDGET_CAN_DEFAULT(widget)) + if (parent && parent->m_wxwindow && gtk_widget_get_can_default(widget)) { GtkBorder* border = NULL; gtk_widget_style_get(widget, "default_border", &border, NULL); @@ -105,8 +105,6 @@ wxgtk_button_style_set_callback(GtkWidget* widget, GtkStyle*, wxButton* win) // wxButton //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxButton,wxControl) - bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString &label, @@ -183,7 +181,7 @@ wxWindow *wxButton::SetDefault() { wxWindow *oldDefault = wxButtonBase::SetDefault(); - GTK_WIDGET_SET_FLAGS( m_widget, GTK_CAN_DEFAULT ); + gtk_widget_set_can_default(m_widget, TRUE); gtk_widget_grab_default( m_widget ); // resize for default border @@ -264,19 +262,35 @@ void wxButton::SetLabel( const wxString &lbl ) GTKApplyWidgetStyle( false ); } -bool wxButton::Enable( bool enable ) +#if wxUSE_MARKUP +bool wxButton::DoSetLabelMarkup(const wxString& markup) { - bool isEnabled = IsEnabled(); + wxCHECK_MSG( m_widget != NULL, false, "invalid button" ); - if ( !wxControl::Enable( enable ) ) + const wxString stripped = RemoveMarkup(markup); + if ( stripped.empty() && !markup.empty() ) return false; - gtk_widget_set_sensitive(GTK_BIN(m_widget)->child, enable); + wxControl::SetLabel(stripped); - if (!isEnabled && enable) - { + GtkLabel * const label = GTKGetLabel(); + wxCHECK_MSG( label, false, "no label in this button?" ); + + GTKSetLabelWithMarkupForLabel(label, markup); + + return true; +} +#endif // wxUSE_MARKUP + +bool wxButton::Enable( bool enable ) +{ + if (!base_type::Enable(enable)) + return false; + + gtk_widget_set_sensitive(gtk_bin_get_child(GTK_BIN(m_widget)), enable); + + if (enable) GTKFixSensitivity(); - } GTKUpdateBitmap(); @@ -288,24 +302,48 @@ GdkWindow *wxButton::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const return GTK_BUTTON(m_widget)->event_window; } +GtkLabel *wxButton::GTKGetLabel() const +{ + GtkWidget* child = gtk_bin_get_child(GTK_BIN(m_widget)); + if ( GTK_IS_ALIGNMENT(child) ) + { + GtkWidget* box = gtk_bin_get_child(GTK_BIN(child)); + GtkLabel* label = NULL; + GList* list = gtk_container_get_children(GTK_CONTAINER(box)); + for (GList* item = list; item; item = item->next) + { + GtkBoxChild* boxChild = static_cast(item->data); + if ( GTK_IS_LABEL(boxChild->widget) ) + label = GTK_LABEL(boxChild->widget); + } + g_list_free(list); + + return label; + } + + return GTK_LABEL(child); +} + void wxButton::DoApplyWidgetStyle(GtkRcStyle *style) { gtk_widget_modify_style(m_widget, style); - GtkWidget *child = GTK_BIN(m_widget)->child; + GtkWidget* child = gtk_bin_get_child(GTK_BIN(m_widget)); gtk_widget_modify_style(child, style); // for buttons with images, the path to the label is (at least in 2.12) // GtkButton -> GtkAlignment -> GtkHBox -> GtkLabel if ( GTK_IS_ALIGNMENT(child) ) { - GtkWidget *box = GTK_BIN(child)->child; + GtkWidget* box = gtk_bin_get_child(GTK_BIN(child)); if ( GTK_IS_BOX(box) ) { - for (GList* item = GTK_BOX(box)->children; item; item = item->next) + GList* list = gtk_container_get_children(GTK_CONTAINER(box)); + for (GList* item = list; item; item = item->next) { GtkBoxChild* boxChild = static_cast(item->data); gtk_widget_modify_style(boxChild->widget, style); } + g_list_free(list); } } } @@ -316,11 +354,11 @@ wxSize wxButton::DoGetBestSize() const // extra border around it, but we don't want to take it into account in // our size calculations (otherwise the result is visually ugly), so // always return the size of non default button from here - const bool isDefault = GTK_WIDGET_HAS_DEFAULT(m_widget); + const bool isDefault = gtk_widget_has_default(m_widget); if ( isDefault ) { // temporarily unset default flag - GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_DEFAULT ); + gtk_widget_set_can_default(m_widget, FALSE); } wxSize ret( wxControl::DoGetBestSize() ); @@ -328,7 +366,7 @@ wxSize wxButton::DoGetBestSize() const if ( isDefault ) { // set it back again - GTK_WIDGET_SET_FLAGS( m_widget, GTK_CAN_DEFAULT ); + gtk_widget_set_can_default(m_widget, TRUE); } if (!HasFlag(wxBU_EXACTFIT)) @@ -427,7 +465,7 @@ void wxButton::GTKDoShowBitmap(const wxBitmap& bitmap) GtkWidget *image; if ( DontShowLabel() ) { - image = GTK_BIN(m_widget)->child; + image = gtk_bin_get_child(GTK_BIN(m_widget)); } else // have both label and bitmap { @@ -668,6 +706,7 @@ void wxButton::DoSetBitmapPosition(wxDirection dir) } gtk_button_set_image_position(GTK_BUTTON(m_widget), gtkpos); + InvalidateBestSize(); } #endif // GTK+ 2.10+ }