[gtk+/treeview-refactor: 14/102] Added GtkCellArea to the build
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/treeview-refactor: 14/102] Added GtkCellArea to the build
- Date: Tue, 26 Oct 2010 09:21:41 +0000 (UTC)
commit 705e7ee100e89280033307275b5037b96c3c57e7
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date: Fri Oct 22 16:41:52 2010 +0900
Added GtkCellArea to the build
Starting to form a good api, implemented most of GtkCellLayout iface
on the base class routing the apis through the new class vfuncs.
gtk/Makefile.am | 2 +
gtk/gtkcellarea.c | 405 ++++++++++++++++++++++++++++++++++++++++++++++++-----
gtk/gtkcellarea.h | 76 ++++++++--
3 files changed, 435 insertions(+), 48 deletions(-)
---
diff --git a/gtk/Makefile.am b/gtk/Makefile.am
index 2f77957..ae999f1 100644
--- a/gtk/Makefile.am
+++ b/gtk/Makefile.am
@@ -168,6 +168,7 @@ gtk_public_h_sources = \
gtkbuildable.h \
gtkbutton.h \
gtkcalendar.h \
+ gtkcellarea.h \
gtkcelleditable.h \
gtkcelllayout.h \
gtkcellrenderer.h \
@@ -428,6 +429,7 @@ gtk_base_c_sources = \
gtkbuilderparser.c \
gtkbutton.c \
gtkcalendar.c \
+ gtkcellarea.c \
gtkcelleditable.c \
gtkcelllayout.c \
gtkcellrenderer.c \
diff --git a/gtk/gtkcellarea.c b/gtk/gtkcellarea.c
index 4b44f38..a1bdb04 100644
--- a/gtk/gtkcellarea.c
+++ b/gtk/gtkcellarea.c
@@ -1,13 +1,236 @@
+/* gtkcellarea.c
+ *
+ * Copyright (C) 2010 Openismus GmbH
+ *
+ * Authors:
+ * Tristan Van Berkom <tristanvb openismus com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * 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.
+ */
+
+#include "gtkcelllayout.h"
+#include "gtkcellarea.h"
+/* GtkCellAreaClass */
+static void gtk_cell_area_real_get_preferred_height_for_width (GtkCellArea *area,
+ GtkWidget *widget,
+ gint width,
+ gint *minimum_height,
+ gint *natural_height);
+static void gtk_cell_area_real_get_preferred_width_for_height (GtkCellArea *area,
+ GtkWidget *widget,
+ gint height,
+ gint *minimum_width,
+ gint *natural_width);
+
+
+/* GtkCellLayoutIface */
+static void gtk_cell_area_cell_layout_init (GtkCellLayoutIface *iface);
+static void gtk_cell_area_pack_default (GtkCellLayout *cell_layout,
+ GtkCellRenderer *renderer,
+ gboolean expand);
+static void gtk_cell_area_clear (GtkCellLayout *cell_layout);
+static void gtk_cell_area_add_attribute (GtkCellLayout *cell_layout,
+ GtkCellRenderer *renderer,
+ const gchar *attribute,
+ gint id);
+static void gtk_cell_area_clear_attributes (GtkCellLayout *cell_layout,
+ GtkCellRenderer *renderer);
+static GList *gtk_cell_area_get_cells (GtkCellLayout *cell_layout);
+
+G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GtkCellArea, gtk_cell_area, G_TYPE_INITIALLY_UNOWNED,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_LAYOUT,
+ gtk_cell_area_cell_layout_init));
+
+
+static void
+gtk_cell_area_init (GtkCellArea *area)
+{
+}
-#include "gtkcellarea.h"
+static void
+gtk_cell_area_class_init (GtkCellAreaClass *klass)
+{
+ /* general */
+ klass->add = NULL;
+ klass->remove = NULL;
+ klass->forall = NULL;
+ klass->event = NULL;
+ klass->render = NULL;
+
+ /* attributes */
+ klass->attribute_connect = NULL;
+ klass->attribute_disconnect = NULL;
+ klass->attribute_apply = NULL;
+ klass->attribute_forall = NULL;
+
+ /* geometry */
+ klass->get_request_mode = NULL;
+ klass->get_preferred_width = NULL;
+ klass->get_preferred_height = NULL;
+ klass->get_preferred_height_for_width = gtk_cell_area_real_get_preferred_height_for_width;
+ klass->get_preferred_width_for_height = gtk_cell_area_real_get_preferred_width_for_height;
+}
+
+
+/*************************************************************
+ * GtkCellLayoutIface *
+ *************************************************************/
+static void
+gtk_cell_area_cell_layout_init (GtkCellLayoutIface *iface)
+{
+ iface->pack_start = gtk_cell_area_pack_default;
+ iface->pack_end = gtk_cell_area_pack_default;
+ iface->clear = gtk_cell_area_clear;
+ iface->add_attribute = gtk_cell_area_add_attribute;
+ iface->clear_attributes = gtk_cell_area_clear_attributes;
+ iface->get_cells = gtk_cell_area_get_cells;
+}
+static void
+gtk_cell_area_pack_default (GtkCellLayout *cell_layout,
+ GtkCellRenderer *renderer,
+ gboolean expand)
+{
+ gtk_cell_area_add (GTK_CELL_AREA (cell_layout), renderer);
+}
+
+static void
+gtk_cell_area_clear (GtkCellLayout *cell_layout)
+{
+ GtkCellArea *area = GTK_CELL_AREA (cell_layout);
+ GList *l, *cells =
+ gtk_cell_layout_get_cells (cell_layout);
+
+ for (l = cells; l; l = l->next)
+ {
+ GtkCellRenderer *renderer = l->data;
+ gtk_cell_area_remove (area, renderer);
+ }
+ g_list_free (cells);
+}
+
+
+static void
+gtk_cell_area_add_attribute (GtkCellLayout *cell_layout,
+ GtkCellRenderer *renderer,
+ const gchar *attribute,
+ gint id)
+{
+ gtk_cell_area_attribute_connect (GTK_CELL_AREA (cell_layout),
+ renderer, attribute, id);
+}
-G_DEFINE_ABSTRACT_TYPE (GtkCellArea, gtk_cell_area, G_TYPE_INITIALLY_UNOWNED);
+typedef struct {
+ const gchar *attribute;
+ gchar id;
+} CellAttribute;
+
+static void
+accum_attributes (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *attribute,
+ gint id,
+ GList **accum)
+{
+ CellAttribute *attrib = g_slice_new (CellAttribute);
+
+ attrib->attribute = attribute;
+ attrib->id = id;
+
+ *accum = g_list_prepend (*accum, attrib);
+}
+
+static void
+gtk_cell_area_clear_attributes (GtkCellLayout *cell_layout,
+ GtkCellRenderer *renderer)
+{
+ GtkCellArea *area = GTK_CELL_AREA (cell_layout);
+ GList *l, *attributes = NULL;
+
+ /* Get a list of attributes so we dont modify the list inline */
+ gtk_cell_area_attribute_forall (area, renderer,
+ (GtkCellAttributeCallback)accum_attributes,
+ &attributes);
+
+ for (l = attributes; l; l = l->next)
+ {
+ CellAttribute *attrib = l->data;
+
+ gtk_cell_area_attribute_disconnect (area, renderer,
+ attrib->attribute, attrib->id);
+
+ g_slice_free (CellAttribute, attrib);
+ }
+
+ g_list_free (attributes);
+}
+
+
+static void
+accum_cells (GtkCellRenderer *renderer,
+ GList **accum)
+{
+ *accum = g_list_prepend (*accum, renderer);
+}
+
+static GList *
+gtk_cell_area_get_cells (GtkCellLayout *cell_layout)
+{
+ GList *cells = NULL;
+ gtk_cell_area_forall (GTK_CELL_AREA (cell_layout),
+ (GtkCellCallback)accum_cells,
+ &cells);
+
+ return g_list_reverse (cells);
+}
+
+
+/*************************************************************
+ * GtkCellAreaClass *
+ *************************************************************/
+static void
+gtk_cell_area_real_get_preferred_height_for_width (GtkCellArea *area,
+ GtkWidget *widget,
+ gint width,
+ gint *minimum_height,
+ gint *natural_height)
+{
+ /* If the area doesnt do height-for-width, fallback on base preferred height */
+ GTK_CELL_AREA_GET_CLASS (area)->get_preferred_width (area, widget, minimum_height, natural_height);
+}
+
+static void
+gtk_cell_area_real_get_preferred_width_for_height (GtkCellArea *area,
+ GtkWidget *widget,
+ gint height,
+ gint *minimum_width,
+ gint *natural_width)
+{
+ /* If the area doesnt do width-for-height, fallback on base preferred width */
+ GTK_CELL_AREA_GET_CLASS (area)->get_preferred_width (area, widget, minimum_width, natural_width);
+}
+
+/*************************************************************
+ * API *
+ *************************************************************/
/* Basic methods */
void
@@ -65,63 +288,154 @@ gtk_cell_area_forall (GtkCellArea *area,
g_type_name (G_TYPE_FROM_INSTANCE (area)));
}
+gint
+gtk_cell_area_event (GtkCellArea *area,
+ GtkWidget *widget,
+ GdkEvent *event,
+ const GdkRectangle *cell_area)
+{
+ GtkCellAreaClass *klass;
+
+ g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0);
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
+ g_return_val_if_fail (event != NULL, 0);
+ g_return_val_if_fail (cell_area != NULL, 0);
+
+ klass = GTK_CELL_AREA_GET_CLASS (area);
+
+ if (klass->event)
+ return klass->event (area, widget, event, cell_area);
+
+ g_warning ("GtkCellAreaClass::event not implemented for `%s'",
+ g_type_name (G_TYPE_FROM_INSTANCE (area)));
+ return 0;
+}
+
void
-gtk_cell_area_apply_attribute (GtkCellArea *area,
- gint attribute,
- GValue *value)
+gtk_cell_area_render (GtkCellArea *area,
+ cairo_t *cr,
+ GtkWidget *widget,
+ const GdkRectangle *cell_area)
{
GtkCellAreaClass *klass;
g_return_if_fail (GTK_IS_CELL_AREA (area));
- g_return_if_fail (G_IS_VALUE (value));
+ g_return_if_fail (cr != NULL);
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ g_return_if_fail (cell_area != NULL);
klass = GTK_CELL_AREA_GET_CLASS (area);
- if (klass->forall)
- klass->apply_attribute (area, attribute, value);
+ if (klass->render)
+ klass->render (area, cr, widget, cell_area);
+ else
+ g_warning ("GtkCellAreaClass::render not implemented for `%s'",
+ g_type_name (G_TYPE_FROM_INSTANCE (area)));
+}
+
+
+/* Attributes */
+void
+gtk_cell_area_attribute_connect (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *attribute,
+ gint id)
+{
+ GtkCellAreaClass *klass;
+
+ g_return_if_fail (GTK_IS_CELL_AREA (area));
+ g_return_if_fail (GTK_IS_CELL_RENDERER (renderer));
+ g_return_if_fail (attribute != NULL);
+
+ klass = GTK_CELL_AREA_GET_CLASS (area);
+
+ if (klass->attribute_connect)
+ klass->attribute_connect (area, renderer, attribute, id);
else
- g_warning ("GtkCellAreaClass::apply_attribute not implemented for `%s'",
+ g_warning ("GtkCellAreaClass::attribute_connect not implemented for `%s'",
g_type_name (G_TYPE_FROM_INSTANCE (area)));
+}
+
+void
+gtk_cell_area_attribute_disconnect (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *attribute,
+ gint id)
+{
+ GtkCellAreaClass *klass;
+
+ g_return_if_fail (GTK_IS_CELL_AREA (area));
+ g_return_if_fail (GTK_IS_CELL_RENDERER (renderer));
+ g_return_if_fail (attribute != NULL);
+
+ klass = GTK_CELL_AREA_GET_CLASS (area);
+ if (klass->attribute_disconnect)
+ klass->attribute_disconnect (area, renderer, attribute, id);
+ else
+ g_warning ("GtkCellAreaClass::attribute_disconnect not implemented for `%s'",
+ g_type_name (G_TYPE_FROM_INSTANCE (area)));
}
-gint
-gtk_cell_area_event (GtkCellArea *area,
- GtkWidget *widget,
- GdkEvent *event,
- const GdkRectangle *cell_area)
+void
+gtk_cell_area_attribute_apply (GtkCellArea *area,
+ gint id,
+ GValue *value)
{
GtkCellAreaClass *klass;
- g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0);
- g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
- g_return_val_if_fail (event != NULL, 0);
- g_return_val_if_fail (cell_area != NULL, 0);
+ g_return_if_fail (GTK_IS_CELL_AREA (area));
+ g_return_if_fail (G_IS_VALUE (value));
klass = GTK_CELL_AREA_GET_CLASS (area);
- if (klass->forall)
- klass->apply_attribute (area, attribute, value);
+ if (klass->attribute_apply)
+ klass->attribute_apply (area, id, value);
else
- g_warning ("GtkCellAreaClass::apply_attribute not implemented for `%s'",
+ g_warning ("GtkCellAreaClass::attribute_apply not implemented for `%s'",
g_type_name (G_TYPE_FROM_INSTANCE (area)));
}
void
-gtk_cell_area_render (GtkCellArea *area,
- cairo_t *cr,
- GtkWidget *widget,
- const GdkRectangle *cell_area)
+gtk_cell_area_attribute_forall (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ GtkCellAttributeCallback callback,
+ gpointer user_data)
{
+ GtkCellAreaClass *klass;
+
+ g_return_if_fail (GTK_IS_CELL_AREA (area));
+ g_return_if_fail (GTK_IS_CELL_RENDERER (renderer));
+ g_return_if_fail (callback != NULL);
+
+ klass = GTK_CELL_AREA_GET_CLASS (area);
+ if (klass->attribute_forall)
+ klass->attribute_forall (area, renderer, callback, user_data);
+ else
+ g_warning ("GtkCellAreaClass::attribute_forall not implemented for `%s'",
+ g_type_name (G_TYPE_FROM_INSTANCE (area)));
}
/* Geometry */
GtkSizeRequestMode
-gtk_cell_area_get_request_mode (GtkCellArea *area)
+gtk_cell_area_get_request_mode (GtkCellArea *area)
{
+ GtkCellAreaClass *klass;
+
+ g_return_val_if_fail (GTK_IS_CELL_AREA (area),
+ GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH);
+
+ klass = GTK_CELL_AREA_GET_CLASS (area);
+
+ if (klass->get_request_mode)
+ return klass->get_request_mode (area);
+ g_warning ("GtkCellAreaClass::get_request_mode not implemented for `%s'",
+ g_type_name (G_TYPE_FROM_INSTANCE (area)));
+
+ return GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH;
}
void
@@ -130,8 +444,18 @@ gtk_cell_area_get_preferred_width (GtkCellArea *area,
gint *minimum_size,
gint *natural_size)
{
+ GtkCellAreaClass *klass;
+
+ g_return_if_fail (GTK_IS_CELL_AREA (area));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ klass = GTK_CELL_AREA_GET_CLASS (area);
+ if (klass->get_preferred_width)
+ klass->get_preferred_width (area, widget, minimum_size, natural_size);
+ else
+ g_warning ("GtkCellAreaClass::get_preferred_width not implemented for `%s'",
+ g_type_name (G_TYPE_FROM_INSTANCE (area)));
}
void
@@ -141,7 +465,13 @@ gtk_cell_area_get_preferred_height_for_width (GtkCellArea *area,
gint *minimum_height,
gint *natural_height)
{
+ GtkCellAreaClass *klass;
+
+ g_return_if_fail (GTK_IS_CELL_AREA (area));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ klass = GTK_CELL_AREA_GET_CLASS (area);
+ klass->get_preferred_height_for_width (area, widget, width, minimum_height, natural_height);
}
void
@@ -150,8 +480,18 @@ gtk_cell_area_get_preferred_height (GtkCellArea *area,
gint *minimum_size,
gint *natural_size)
{
+ GtkCellAreaClass *klass;
+ g_return_if_fail (GTK_IS_CELL_AREA (area));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+
+ klass = GTK_CELL_AREA_GET_CLASS (area);
+ if (klass->get_preferred_height)
+ klass->get_preferred_height (area, widget, minimum_size, natural_size);
+ else
+ g_warning ("GtkCellAreaClass::get_preferred_height not implemented for `%s'",
+ g_type_name (G_TYPE_FROM_INSTANCE (area)));
}
void
@@ -161,14 +501,11 @@ gtk_cell_area_get_preferred_width_for_height (GtkCellArea *area,
gint *minimum_width,
gint *natural_width)
{
+ GtkCellAreaClass *klass;
-}
-
-void
-gtk_cell_area_get_preferred_size (GtkCellArea *area,
- GtkWidget *widget,
- GtkRequisition *minimum_size,
- GtkRequisition *natural_size)
-{
+ g_return_if_fail (GTK_IS_CELL_AREA (area));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ klass = GTK_CELL_AREA_GET_CLASS (area);
+ klass->get_preferred_width_for_height (area, widget, height, minimum_width, natural_width);
}
diff --git a/gtk/gtkcellarea.h b/gtk/gtkcellarea.h
index 57d6781..20da8c4 100644
--- a/gtk/gtkcellarea.h
+++ b/gtk/gtkcellarea.h
@@ -1,5 +1,9 @@
/* gtkcellarea.h
- * Copyright (C) 2000 Red Hat, Inc., Jonathan Blandford <jrb redhat com>
+ *
+ * Copyright (C) 2010 Openismus GmbH
+ *
+ * Authors:
+ * Tristan Van Berkom <tristanvb openismus com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -42,7 +46,7 @@ typedef struct _GtkCellAreaClass GtkCellAreaClass;
/**
* GtkCellCallback:
- * @cell: the cell renderer to operate on
+ * @renderer: the cell renderer to operate on
* @data: user-supplied data
*
* The type of the callback functions used for iterating over
@@ -52,12 +56,29 @@ typedef void (*GtkCellCallback) (GtkCellRenderer *renderer,
gpointer data);
+/**
+ * GtkCellAttributeCallback:
+ * @area: the #GtkCellArea containing @renderer
+ * @renderer: the #GtkCellRenderer that has an attribute
+ * @attribute: the property attributed to @id
+ * @id: the identifier of this attributed value
+ * @data: user-supplied data
+ *
+ * The type of the callback functions used for iterating over the
+ * attributes of the cell renderers in a #GtkCellArea,
+ * see gtk_cell_area_attribute_forall().
+ */
+typedef void (*GtkCellAttributeCallback) (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *attribute,
+ gint id,
+ gpointer data);
+
+
struct _GtkCellArea
{
GInitiallyUnowned parent_instance;
- /* <private> */
- GtkCellAreaPrivate *priv;
};
struct _GtkCellAreaClass
@@ -65,6 +86,8 @@ struct _GtkCellAreaClass
GInitiallyUnownedClass parent_class;
/* vtable - not signals */
+
+ /* Basic methods */
void (* add) (GtkCellArea *area,
GtkCellRenderer *renderer);
void (* remove) (GtkCellArea *area,
@@ -72,9 +95,6 @@ struct _GtkCellAreaClass
void (* forall) (GtkCellArea *area,
GtkCellCallback callback,
gpointer callback_data);
- void (* apply_attribute) (GtkCellArea *area,
- gint attribute,
- GValue *value);
gint (* event) (GtkCellArea *area,
GtkWidget *widget,
GdkEvent *event,
@@ -84,6 +104,24 @@ struct _GtkCellAreaClass
GtkWidget *widget,
const GdkRectangle *cell_area);
+ /* Attributes */
+ void (* attribute_connect) (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *attribute,
+ gint id);
+ void (* attribute_disconnect) (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *attribute,
+ gint id);
+ void (* attribute_apply) (GtkCellArea *area,
+ gint id,
+ GValue *value);
+ void (* attribute_forall) (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ GtkCellAttributeCallback callback,
+ gpointer user_data);
+
+ /* Geometry */
GtkSizeRequestMode (* get_request_mode) (GtkCellArea *area);
void (* get_preferred_width) (GtkCellArea *area,
GtkWidget *widget,
@@ -126,9 +164,6 @@ void gtk_cell_area_remove (GtkCellArea
void gtk_cell_area_forall (GtkCellArea *area,
GtkCellCallback callback,
gpointer callback_data);
-void gtk_cell_area_apply_attribute (GtkCellArea *area,
- gint attribute,
- GValue *value);
gint gtk_cell_area_event (GtkCellArea *area,
GtkWidget *widget,
GdkEvent *event,
@@ -138,6 +173,23 @@ void gtk_cell_area_render (GtkCellArea
GtkWidget *widget,
const GdkRectangle *cell_area);
+/* Attributes */
+void gtk_cell_area_attribute_connect (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *attribute,
+ gint id);
+void gtk_cell_area_attribute_disconnect (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *attribute,
+ gint id);
+void gtk_cell_area_attribute_apply (GtkCellArea *area,
+ gint id,
+ GValue *value);
+void gtk_cell_area_attribute_forall (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ GtkCellAttributeCallback callback,
+ gpointer user_data);
+
/* Geometry */
GtkSizeRequestMode gtk_cell_area_get_request_mode (GtkCellArea *area);
void gtk_cell_area_get_preferred_width (GtkCellArea *area,
@@ -158,10 +210,6 @@ void gtk_cell_area_get_preferred_width_for_height (GtkCellArea
gint height,
gint *minimum_width,
gint *natural_width);
-void gtk_cell_area_get_preferred_size (GtkCellArea *area,
- GtkWidget *widget,
- GtkRequisition *minimum_size,
- GtkRequisition *natural_size);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]