X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c37dd6dad7f53b8f5f4c4a8d6434c2851cd2b9e4..b718a533ac2c8406a786369b4eaa1c84f0039188:/src/gtk/button.cpp diff --git a/src/gtk/button.cpp b/src/gtk/button.cpp index 198a46a72d..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, @@ -126,7 +124,8 @@ bool wxButton::Create(wxWindow *parent, // create either a standard button with text label (which may still contain // an image under GTK+ 2.6+) or a bitmap-only button if we don't have any // label - const bool useLabel = !label.empty() || wxIsStockID(id); + const bool + useLabel = !(style & wxBU_NOTEXT) && (!label.empty() || wxIsStockID(id)); if ( useLabel ) { m_widget = gtk_button_new_with_mnemonic(""); @@ -182,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 @@ -237,6 +236,10 @@ void wxButton::SetLabel( const wxString &lbl ) wxControl::SetLabel(label); + // don't use label if it was explicitly disabled + if ( HasFlag(wxBU_NOTEXT) ) + return; + if (wxIsStockID(m_windowId) && wxIsStockLabel(m_windowId, label)) { const char *stock = wxGetStockGtkID(m_windowId); @@ -248,6 +251,10 @@ void wxButton::SetLabel( const wxString &lbl ) } } + // this call is necessary if the button had been initially created without + // a (text) label -- then we didn't use gtk_button_new_with_mnemonic() and + // so "use-underline" GtkButton property remained unset + gtk_button_set_use_underline(GTK_BUTTON(m_widget), TRUE); const wxString labelGTK = GTKConvertMnemonics(label); gtk_button_set_label(GTK_BUTTON(m_widget), wxGTK_CONV(labelGTK)); gtk_button_set_use_stock(GTK_BUTTON(m_widget), FALSE); @@ -255,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(); @@ -279,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); } } } @@ -307,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() ); @@ -319,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)) @@ -400,9 +447,15 @@ wxButton::State wxButton::GTKGetCurrentState() const void wxButton::GTKUpdateBitmap() { - State state = GTKGetCurrentState(); + // if we don't show bitmaps at all, there is nothing to update + if ( m_bitmaps[State_Normal].IsOk() ) + { + // if we do show them, this will return a state for which we do have a + // valid bitmap + State state = GTKGetCurrentState(); - GTKDoShowBitmap(m_bitmaps[state]); + GTKDoShowBitmap(m_bitmaps[state]); + } } void wxButton::GTKDoShowBitmap(const wxBitmap& bitmap) @@ -410,9 +463,9 @@ void wxButton::GTKDoShowBitmap(const wxBitmap& bitmap) wxASSERT_MSG( bitmap.IsOk(), "invalid bitmap" ); GtkWidget *image; - if ( GetLabel().empty() ) + if ( DontShowLabel() ) { - image = GTK_BIN(m_widget)->child; + image = gtk_bin_get_child(GTK_BIN(m_widget)); } else // have both label and bitmap { @@ -450,7 +503,7 @@ void wxButton::DoSetBitmap(const wxBitmap& bitmap, State which) switch ( which ) { case State_Normal: - if ( GetLabel().empty() ) + if ( DontShowLabel() ) { // we only have the bitmap in this button, never remove it but // do invalidate the best size when the bitmap (and presumably @@ -653,6 +706,7 @@ void wxButton::DoSetBitmapPosition(wxDirection dir) } gtk_button_set_image_position(GTK_BUTTON(m_widget), gtkpos); + InvalidateBestSize(); } #endif // GTK+ 2.10+ }