X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcellrenderertoggle.c;h=c83f6003b71df66146c6bb873bd07ef7c4854e20;hb=a41b73fbc71f613e4ca90ae8b9dd3bd317d026d6;hp=9087adb32471709aede47848d605500e6dc80955;hpb=5f1b5d24067468fc86b28dccc504c71abdaf68b8;p=~andy%2Fgtk diff --git a/gtk/gtkcellrenderertoggle.c b/gtk/gtkcellrenderertoggle.c index 9087adb32..c83f6003b 100644 --- a/gtk/gtkcellrenderertoggle.c +++ b/gtk/gtkcellrenderertoggle.c @@ -12,9 +12,7 @@ * Library General Public License for more details. * * You should have received a copy of the GNU Library 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 . */ #include "config.h" @@ -24,6 +22,19 @@ #include "gtkmarshalers.h" #include "gtkprivate.h" #include "gtktreeprivate.h" +#include "a11y/gtkbooleancellaccessible.h" + + +/** + * SECTION:gtkcellrenderertoggle + * @Short_description: Renders a toggle button in a cell + * @Title: GtkCellRendererToggle + * + * #GtkCellRendererToggle renders a toggle button in a cell. The + * button is drawn as a radio or a checkbutton, depending on the + * #GtkCellRendererToggle:radio property. + * When activated, it emits the #GtkCellRendererToggle::toggled signal. + */ static void gtk_cell_renderer_toggle_get_property (GObject *object, @@ -36,24 +47,23 @@ static void gtk_cell_renderer_toggle_set_property (GObject * GParamSpec *pspec); static void gtk_cell_renderer_toggle_get_size (GtkCellRenderer *cell, GtkWidget *widget, - GdkRectangle *cell_area, + const GdkRectangle *cell_area, gint *x_offset, gint *y_offset, gint *width, gint *height); static void gtk_cell_renderer_toggle_render (GtkCellRenderer *cell, - GdkWindow *window, + cairo_t *cr, GtkWidget *widget, - GdkRectangle *background_area, - GdkRectangle *cell_area, - GdkRectangle *expose_area, + const GdkRectangle *background_area, + const GdkRectangle *cell_area, GtkCellRendererState flags); static gboolean gtk_cell_renderer_toggle_activate (GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path, - GdkRectangle *background_area, - GdkRectangle *cell_area, + const GdkRectangle *background_area, + const GdkRectangle *cell_area, GtkCellRendererState flags); @@ -71,11 +81,11 @@ enum { PROP_INDICATOR_SIZE }; -#define TOGGLE_WIDTH 13 +#define TOGGLE_WIDTH 16 static guint toggle_cell_signals[LAST_SIGNAL] = { 0 }; -struct _GtkCellRendererTogglePriv +struct _GtkCellRendererTogglePrivate { gint indicator_size; @@ -92,11 +102,11 @@ G_DEFINE_TYPE (GtkCellRendererToggle, gtk_cell_renderer_toggle, GTK_TYPE_CELL_RE static void gtk_cell_renderer_toggle_init (GtkCellRendererToggle *celltoggle) { - GtkCellRendererTogglePriv *priv; + GtkCellRendererTogglePrivate *priv; celltoggle->priv = G_TYPE_INSTANCE_GET_PRIVATE (celltoggle, GTK_TYPE_CELL_RENDERER_TOGGLE, - GtkCellRendererTogglePriv); + GtkCellRendererTogglePrivate); priv = celltoggle->priv; priv->activatable = TRUE; @@ -184,7 +194,9 @@ gtk_cell_renderer_toggle_class_init (GtkCellRendererToggleClass *class) G_TYPE_NONE, 1, G_TYPE_STRING); - g_type_class_add_private (object_class, sizeof (GtkCellRendererTogglePriv)); + g_type_class_add_private (object_class, sizeof (GtkCellRendererTogglePrivate)); + + _gtk_cell_renderer_class_set_accessible_type (cell_class, GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE); } static void @@ -194,7 +206,7 @@ gtk_cell_renderer_toggle_get_property (GObject *object, GParamSpec *pspec) { GtkCellRendererToggle *celltoggle = GTK_CELL_RENDERER_TOGGLE (object); - GtkCellRendererTogglePriv *priv = celltoggle->priv; + GtkCellRendererTogglePrivate *priv = celltoggle->priv; switch (param_id) { @@ -227,7 +239,7 @@ gtk_cell_renderer_toggle_set_property (GObject *object, GParamSpec *pspec) { GtkCellRendererToggle *celltoggle = GTK_CELL_RENDERER_TOGGLE (object); - GtkCellRendererTogglePriv *priv = celltoggle->priv; + GtkCellRendererTogglePrivate *priv = celltoggle->priv; switch (param_id) { @@ -272,15 +284,15 @@ gtk_cell_renderer_toggle_new (void) } static void -gtk_cell_renderer_toggle_get_size (GtkCellRenderer *cell, - GtkWidget *widget, - GdkRectangle *cell_area, - gint *x_offset, - gint *y_offset, - gint *width, - gint *height) +gtk_cell_renderer_toggle_get_size (GtkCellRenderer *cell, + GtkWidget *widget, + const GdkRectangle *cell_area, + gint *x_offset, + gint *y_offset, + gint *width, + gint *height) { - GtkCellRendererTogglePriv *priv; + GtkCellRendererTogglePrivate *priv; gint calc_width; gint calc_height; gint xpad, ypad; @@ -324,21 +336,21 @@ gtk_cell_renderer_toggle_get_size (GtkCellRenderer *cell, static void gtk_cell_renderer_toggle_render (GtkCellRenderer *cell, - GdkDrawable *window, + cairo_t *cr, GtkWidget *widget, - GdkRectangle *background_area, - GdkRectangle *cell_area, - GdkRectangle *expose_area, + const GdkRectangle *background_area, + const GdkRectangle *cell_area, GtkCellRendererState flags) { GtkCellRendererToggle *celltoggle = GTK_CELL_RENDERER_TOGGLE (cell); - GtkCellRendererTogglePriv *priv = celltoggle->priv; + GtkCellRendererTogglePrivate *priv = celltoggle->priv; + GtkStyleContext *context; gint width, height; gint x_offset, y_offset; gint xpad, ypad; - GtkShadowType shadow; - GtkStateType state = 0; + GtkStateFlags state; + context = gtk_widget_get_style_context (widget); gtk_cell_renderer_toggle_get_size (cell, widget, cell_area, &x_offset, &y_offset, &width, &height); @@ -349,51 +361,45 @@ gtk_cell_renderer_toggle_render (GtkCellRenderer *cell, if (width <= 0 || height <= 0) return; + state = gtk_cell_renderer_get_state (cell, widget, flags); + + if (!priv->activatable) + state |= GTK_STATE_FLAG_INSENSITIVE; + + state &= ~(GTK_STATE_FLAG_INCONSISTENT | GTK_STATE_FLAG_ACTIVE); + if (priv->inconsistent) - shadow = GTK_SHADOW_ETCHED_IN; - else - shadow = priv->active ? GTK_SHADOW_IN : GTK_SHADOW_OUT; + state |= GTK_STATE_FLAG_INCONSISTENT; + else if (priv->active) + state |= GTK_STATE_FLAG_ACTIVE; - if (gtk_widget_get_state (widget) == GTK_STATE_INSENSITIVE || - !gtk_cell_renderer_get_sensitive (cell)) - { - state = GTK_STATE_INSENSITIVE; - } - else if ((flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED) + cairo_save (cr); + + gdk_cairo_rectangle (cr, cell_area); + cairo_clip (cr); + + gtk_style_context_save (context); + gtk_style_context_set_state (context, state); + + if (priv->radio) { - if (gtk_widget_has_focus (widget)) - state = GTK_STATE_SELECTED; - else - state = GTK_STATE_ACTIVE; + gtk_style_context_add_class (context, GTK_STYLE_CLASS_RADIO); + gtk_render_option (context, cr, + cell_area->x + x_offset + xpad, + cell_area->y + y_offset + ypad, + width, height); } else { - if (priv->activatable) - state = GTK_STATE_NORMAL; - else - state = GTK_STATE_INSENSITIVE; - } - - if (priv->radio) - { - gtk_paint_option (widget->style, - window, - state, shadow, - expose_area, widget, "cellradio", + gtk_style_context_add_class (context, GTK_STYLE_CLASS_CHECK); + gtk_render_check (context, cr, cell_area->x + x_offset + xpad, cell_area->y + y_offset + ypad, width, height); } - else - { - gtk_paint_check (widget->style, - window, - state, shadow, - expose_area, widget, "cellcheck", - cell_area->x + x_offset + xpad, - cell_area->y + y_offset + ypad, - width, height); - } + + gtk_style_context_restore (context); + cairo_restore (cr); } static gint @@ -401,11 +407,11 @@ gtk_cell_renderer_toggle_activate (GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path, - GdkRectangle *background_area, - GdkRectangle *cell_area, + const GdkRectangle *background_area, + const GdkRectangle *cell_area, GtkCellRendererState flags) { - GtkCellRendererTogglePriv *priv; + GtkCellRendererTogglePrivate *priv; GtkCellRendererToggle *celltoggle; celltoggle = GTK_CELL_RENDERER_TOGGLE (cell); @@ -437,7 +443,7 @@ void gtk_cell_renderer_toggle_set_radio (GtkCellRendererToggle *toggle, gboolean radio) { - GtkCellRendererTogglePriv *priv; + GtkCellRendererTogglePrivate *priv; g_return_if_fail (GTK_IS_CELL_RENDERER_TOGGLE (toggle)); @@ -527,7 +533,7 @@ void gtk_cell_renderer_toggle_set_activatable (GtkCellRendererToggle *toggle, gboolean setting) { - GtkCellRendererTogglePriv *priv; + GtkCellRendererTogglePrivate *priv; g_return_if_fail (GTK_IS_CELL_RENDERER_TOGGLE (toggle));