X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcheckbutton.c;h=d7df5a914e98f9c71ba306b063bf294af767b64a;hb=1074aa0c49f647ed4b2a969618051c59da5aad01;hp=5b9d35d3c5ceff35d21d3598eb0ecc2b0b039fb9;hpb=c7514e8f0d19a833257497caff413bb4dfae6eb4;p=~andy%2Fgtk diff --git a/gtk/gtkcheckbutton.c b/gtk/gtkcheckbutton.c index 5b9d35d3c..d7df5a914 100644 --- a/gtk/gtkcheckbutton.c +++ b/gtk/gtkcheckbutton.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ /* @@ -35,6 +33,21 @@ #include "gtkintl.h" +/** + * SECTION:gtkcheckbutton + * @Short_description: Create widgets with a discrete toggle button + * @Title: GtkCheckButton + * @See_also: #GtkCheckMenuItem, #GtkButton, #GtkToggleButton, #GtkRadioButton + * + * A #GtkCheckButton places a discrete #GtkToggleButton next to a widget, + * (usually a #GtkLabel). See the section on #GtkToggleButton widgets for + * more information about toggle/check buttons. + * + * The important signal ( #GtkToggleButton::toggled ) is also inherited from + * #GtkToggleButton. + */ + + #define INDICATOR_SIZE 16 #define INDICATOR_SPACING 2 @@ -72,6 +85,8 @@ gtk_check_button_class_init (GtkCheckButtonClass *class) class->draw_indicator = gtk_real_check_button_draw_indicator; + gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_CHECK_BOX); + gtk_widget_class_install_style_property (widget_class, g_param_spec_int ("indicator-size", P_("Indicator Size"), @@ -90,15 +105,34 @@ gtk_check_button_class_init (GtkCheckButtonClass *class) GTK_PARAM_READABLE)); } +static void +draw_indicator_changed (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + GtkButton *button = GTK_BUTTON (object); + + if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (button))) + gtk_button_set_alignment (button, 0.0, 0.5); + else + gtk_button_set_alignment (button, 0.5, 0.5); +} + static void gtk_check_button_init (GtkCheckButton *check_button) { - gtk_widget_set_has_window (GTK_WIDGET (check_button), FALSE); gtk_widget_set_receives_default (GTK_WIDGET (check_button), FALSE); + g_signal_connect (check_button, "notify::draw-indicator", G_CALLBACK (draw_indicator_changed), NULL); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (check_button), TRUE); - gtk_button_set_alignment (GTK_BUTTON (check_button), 0.0, 0.5); } +/** + * gtk_check_button_new: + * + * Creates a new #GtkCheckButton. + * + * Returns: a #GtkWidget. + */ GtkWidget* gtk_check_button_new (void) { @@ -106,6 +140,14 @@ gtk_check_button_new (void) } +/** + * gtk_check_button_new_with_label: + * @label: the text for the check button. + * + * Creates a new #GtkCheckButton with a #GtkLabel to the right of it. + * + * Returns: a #GtkWidget. + */ GtkWidget* gtk_check_button_new_with_label (const gchar *label) { @@ -115,13 +157,14 @@ gtk_check_button_new_with_label (const gchar *label) /** * gtk_check_button_new_with_mnemonic: * @label: The text of the button, with an underscore in front of the - * mnemonic character - * @returns: a new #GtkCheckButton + * mnemonic character * * Creates a new #GtkCheckButton containing a label. The label * will be created using gtk_label_new_with_mnemonic(), so underscores * in @label indicate the mnemonic for the check button. - **/ + * + * Returns: a new #GtkCheckButton + */ GtkWidget* gtk_check_button_new_with_mnemonic (const gchar *label) { @@ -140,32 +183,29 @@ gtk_check_button_paint (GtkWidget *widget, cairo_t *cr) { GtkCheckButton *check_button = GTK_CHECK_BUTTON (widget); - gint border_width; - gint interior_focus; - gint focus_width; - gint focus_pad; - - gtk_widget_style_get (widget, - "interior-focus", &interior_focus, - "focus-line-width", &focus_width, - "focus-padding", &focus_pad, - NULL); gtk_check_button_draw_indicator (check_button, cr); - border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); - if (gtk_widget_has_focus (widget)) + if (gtk_widget_has_visible_focus (widget)) { GtkWidget *child = gtk_bin_get_child (GTK_BIN (widget)); GtkStyleContext *context; - GtkStateFlags state; GtkAllocation allocation; + gint border_width; + gint interior_focus; + gint focus_width; + gint focus_pad; + + border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); + + gtk_widget_style_get (widget, + "interior-focus", &interior_focus, + "focus-line-width", &focus_width, + "focus-padding", &focus_pad, + NULL); gtk_widget_get_allocation (widget, &allocation); context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - - gtk_style_context_set_state (context, state); if (interior_focus && child && gtk_widget_get_visible (child)) { @@ -419,6 +459,7 @@ gtk_real_check_button_draw_indicator (GtkCheckButton *check_button, gtk_widget_get_allocation (widget, &allocation); context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); gtk_widget_style_get (widget, "interior-focus", &interior_focus, @@ -437,6 +478,11 @@ gtk_real_check_button_draw_indicator (GtkCheckButton *check_button, if (!interior_focus || !(child && gtk_widget_get_visible (child))) x += focus_width + focus_pad; + state &= ~(GTK_STATE_FLAG_INCONSISTENT | + GTK_STATE_FLAG_ACTIVE | + GTK_STATE_FLAG_SELECTED | + GTK_STATE_FLAG_PRELIGHT); + if (gtk_toggle_button_get_inconsistent (toggle_button)) state |= GTK_STATE_FLAG_INCONSISTENT; else if (gtk_toggle_button_get_active (toggle_button) || @@ -448,12 +494,11 @@ gtk_real_check_button_draw_indicator (GtkCheckButton *check_button, if (button->priv->in_button) state |= GTK_STATE_FLAG_PRELIGHT; - else if (!gtk_widget_is_sensitive (widget)) - state |= GTK_STATE_FLAG_INSENSITIVE; if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) x = allocation.width - (indicator_size + x); + gtk_style_context_save (context); gtk_style_context_set_state (context, state); if (state & GTK_STATE_FLAG_PRELIGHT) @@ -462,7 +507,6 @@ gtk_real_check_button_draw_indicator (GtkCheckButton *check_button, allocation.width - (2 * border_width), allocation.height - (2 * border_width)); - gtk_style_context_save (context); gtk_style_context_add_class (context, GTK_STYLE_CLASS_CHECK); gtk_render_check (context, cr,