/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* e-cell-renderer-color.c
*
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, see .
*/
#include "evolution-data-server-config.h"
#include
#include
#include "e-cell-renderer-color.h"
enum {
PROP_0,
PROP_RGBA
};
struct _ECellRendererColorPrivate {
GdkRGBA rgba;
};
G_DEFINE_TYPE_WITH_PRIVATE (
ECellRendererColor,
e_cell_renderer_color,
GTK_TYPE_CELL_RENDERER)
static void
#if GTK_CHECK_VERSION(4, 0, 0)
cell_renderer_color_get_aligned_area (GtkCellRenderer *cell,
GtkWidget *widget,
GtkCellRendererState flags,
const GdkRectangle *cell_area,
GdkRectangle *aligned_area)
#else
cell_renderer_color_get_size (GtkCellRenderer *cell,
GtkWidget *widget,
const GdkRectangle *cell_area,
gint *x_offset,
gint *y_offset,
gint *width,
gint *height)
#endif
{
gint color_width = 16;
gint color_height = 16;
gint calc_width;
gint calc_height;
gint xx, yy;
gfloat xalign;
gfloat yalign;
guint xpad;
guint ypad;
#if GTK_CHECK_VERSION(4, 0, 0)
if (!aligned_area)
return;
#endif
g_object_get (
cell, "xalign", &xalign, "yalign", &yalign,
"xpad", &xpad, "ypad", &ypad, NULL);
calc_width = (gint) xpad * 2 + color_width;
calc_height = (gint) ypad * 2 + color_height;
if (cell_area && color_width > 0 && color_height > 0) {
xx = (((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) ?
(1.0 - xalign) : xalign) *
(cell_area->width - calc_width));
xx = MAX (xx, 0);
yy = yalign * (cell_area->height - calc_height);
yy = MAX (yy, 0);
} else {
xx = 0;
yy = 0;
}
#if GTK_CHECK_VERSION(4, 0, 0)
aligned_area->x = xx;
aligned_area->y = yy;
aligned_area->width = calc_width;
aligned_area->height = calc_height;
#else
if (x_offset)
*x_offset = xx;
if (y_offset)
*y_offset = yy;
if (width)
*width = calc_width;
if (height)
*height = calc_height;
#endif
}
static void
#if GTK_CHECK_VERSION(4, 0, 0)
cell_renderer_color_snapshot (GtkCellRenderer *cell,
GtkSnapshot *snapshot,
GtkWidget *widget,
const GdkRectangle *background_area,
const GdkRectangle *cell_area,
GtkCellRendererState flags)
#else
cell_renderer_color_render (GtkCellRenderer *cell,
cairo_t *cr,
GtkWidget *widget,
const GdkRectangle *background_area,
const GdkRectangle *cell_area,
GtkCellRendererState flags)
#endif
{
#if GTK_CHECK_VERSION(4, 0, 0)
graphene_rect_t rect;
#endif
ECellRendererColorPrivate *priv;
GdkRectangle pix_rect;
GdkRectangle draw_rect;
guint xpad;
guint ypad;
priv = E_CELL_RENDERER_COLOR (cell)->priv;
#if GTK_CHECK_VERSION(4, 0, 0)
cell_renderer_color_get_aligned_area (cell, widget, 0, cell_area, &pix_rect);
#else
cell_renderer_color_get_size (
cell, widget, cell_area,
&pix_rect.x, &pix_rect.y,
&pix_rect.width, &pix_rect.height);
#endif
g_object_get (cell, "xpad", &xpad, "ypad", &ypad, NULL);
pix_rect.x += cell_area->x + xpad;
pix_rect.y += cell_area->y + ypad;
pix_rect.width -= xpad * 2;
pix_rect.height -= ypad * 2;
if (!gdk_rectangle_intersect (cell_area, &pix_rect, &draw_rect))
return;
#if GTK_CHECK_VERSION(4, 0, 0)
rect.origin.x = pix_rect.x;
rect.origin.y = pix_rect.y;
rect.size.width = draw_rect.width;
rect.size.height = draw_rect.height;
gtk_snapshot_append_color (snapshot, &priv->rgba, &rect);
#else
gdk_cairo_set_source_rgba (cr, &priv->rgba);
cairo_rectangle (cr, pix_rect.x, pix_rect.y, draw_rect.width, draw_rect.height);
cairo_fill (cr);
#endif
}
#if GTK_CHECK_VERSION(4, 0, 0)
static void
cell_renderer_color_get_preferred_width (GtkCellRenderer *cell,
GtkWidget *widget,
gint *minimum_size,
gint *natural_size)
{
gint xpad = 0, ypad = 0;
gtk_cell_renderer_get_padding (cell, &xpad, &ypad);
if (minimum_size)
*minimum_size = 16 + xpad;
if (natural_size)
*natural_size = 16 + xpad;
}
static void
cell_renderer_color_get_preferred_height (GtkCellRenderer *cell,
GtkWidget *widget,
gint *minimum_size,
gint *natural_size)
{
gint xpad = 0, ypad = 0;
gtk_cell_renderer_get_padding (cell, &xpad, &ypad);
if (minimum_size)
*minimum_size = 16 + ypad;
if (natural_size)
*natural_size = 16 + ypad;
}
#endif
static void
cell_renderer_color_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
ECellRendererColorPrivate *priv;
GdkRGBA *rgba;
priv = E_CELL_RENDERER_COLOR (object)->priv;
switch (property_id) {
case PROP_RGBA:
rgba = g_value_dup_boxed (value);
if (rgba) {
priv->rgba = *rgba;
gdk_rgba_free (rgba);
} else {
priv->rgba.red = 0.0;
priv->rgba.green = 0.0;
priv->rgba.blue = 0.0;
priv->rgba.alpha = 0.0;
}
return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
cell_renderer_color_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
ECellRendererColorPrivate *priv;
priv = E_CELL_RENDERER_COLOR (object)->priv;
switch (property_id) {
case PROP_RGBA:
g_value_set_boxed (value, &priv->rgba);
return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
e_cell_renderer_color_class_init (ECellRendererColorClass *class)
{
GObjectClass *object_class;
GtkCellRendererClass *cell_class;
object_class = G_OBJECT_CLASS (class);
object_class->set_property = cell_renderer_color_set_property;
object_class->get_property = cell_renderer_color_get_property;
cell_class = GTK_CELL_RENDERER_CLASS (class);
#if GTK_CHECK_VERSION(4, 0, 0)
cell_class->get_aligned_area = cell_renderer_color_get_aligned_area;
cell_class->snapshot = cell_renderer_color_snapshot;
cell_class->get_preferred_width = cell_renderer_color_get_preferred_width;
cell_class->get_preferred_height = cell_renderer_color_get_preferred_height;
#else
cell_class->get_size = cell_renderer_color_get_size;
cell_class->render = cell_renderer_color_render;
#endif
g_object_class_install_property (
object_class,
PROP_RGBA,
g_param_spec_boxed (
"rgba",
"Color Info",
"The GdkRGBA color to render",
GDK_TYPE_RGBA,
G_PARAM_READWRITE));
}
static void
e_cell_renderer_color_init (ECellRendererColor *cellcolor)
{
cellcolor->priv = e_cell_renderer_color_get_instance_private (cellcolor);
g_object_set (cellcolor, "xpad", 4, NULL);
}
/**
* e_cell_renderer_color_new:
*
* Since: 2.22
**/
GtkCellRenderer *
e_cell_renderer_color_new (void)
{
return g_object_new (E_TYPE_CELL_RENDERER_COLOR, NULL);
}