[gtk+] Removed special casing code in GtkCellLayout in favor of default implementation.
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Removed special casing code in GtkCellLayout in favor of default implementation.
- Date: Fri, 7 Jan 2011 09:05:11 +0000 (UTC)
commit da41937b421fd5bafc4cad309f4c7cf7752d3fb4
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date: Fri Jan 7 18:08:51 2011 +0900
Removed special casing code in GtkCellLayout in favor of default implementation.
The fact that GtkCellLayout was checking "if (gtk_cell_layout_get_area (layout))"
and executing code contitionally from the apis instead of simply falling
back to the default implementation for these things was causing problems
in language bindings such as gtkmm... Regardless, the implementation
is cleaner this way too.
gtk/gtkcelllayout.c | 337 +++++++++++++++++++++++++++++----------------------
1 files changed, 192 insertions(+), 145 deletions(-)
---
diff --git a/gtk/gtkcelllayout.c b/gtk/gtkcelllayout.c
index 49b2ec4..c4b9d6f 100644
--- a/gtk/gtkcelllayout.c
+++ b/gtk/gtkcelllayout.c
@@ -97,12 +97,191 @@
typedef GtkCellLayoutIface GtkCellLayoutInterface;
G_DEFINE_INTERFACE (GtkCellLayout, gtk_cell_layout, G_TYPE_OBJECT);
+static void gtk_cell_layout_default_pack_start (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ gboolean expand);
+static void gtk_cell_layout_default_pack_end (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ gboolean expand);
+static void gtk_cell_layout_default_clear (GtkCellLayout *cell_layout);
+static void gtk_cell_layout_default_add_attribute (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ const gchar *attribute,
+ gint column);
+static void gtk_cell_layout_default_set_cell_data_func (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ GtkCellLayoutDataFunc func,
+ gpointer func_data,
+ GDestroyNotify destroy);
+static void gtk_cell_layout_default_clear_attributes (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell);
+static void gtk_cell_layout_default_reorder (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ gint position);
+static GList *gtk_cell_layout_default_get_cells (GtkCellLayout *cell_layout);
+
+
+static void
+gtk_cell_layout_default_init (GtkCellLayoutIface *iface)
+{
+ iface->pack_start = gtk_cell_layout_default_pack_start;
+ iface->pack_end = gtk_cell_layout_default_pack_end;
+ iface->clear = gtk_cell_layout_default_clear;
+ iface->add_attribute = gtk_cell_layout_default_add_attribute;
+ iface->set_cell_data_func = gtk_cell_layout_default_set_cell_data_func;
+ iface->clear_attributes = gtk_cell_layout_default_clear_attributes;
+ iface->reorder = gtk_cell_layout_default_reorder;
+ iface->get_cells = gtk_cell_layout_default_get_cells;
+}
+
+
+/* Default implementation is to fall back on an underlying cell area */
+static void
+gtk_cell_layout_default_pack_start (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ gboolean expand)
+{
+ GtkCellLayoutIface *iface;
+ GtkCellArea *area;
+
+ iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
+
+ if (iface->get_area)
+ {
+ area = iface->get_area (cell_layout);
+
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (area), cell, expand);
+ }
+}
+
+static void
+gtk_cell_layout_default_pack_end (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ gboolean expand)
+{
+ GtkCellLayoutIface *iface;
+ GtkCellArea *area;
+
+ iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
+
+ if (iface->get_area)
+ {
+ area = iface->get_area (cell_layout);
+
+ gtk_cell_layout_pack_end (GTK_CELL_LAYOUT (area), cell, expand);
+ }
+}
+
+static void
+gtk_cell_layout_default_clear (GtkCellLayout *cell_layout)
+{
+ GtkCellLayoutIface *iface;
+ GtkCellArea *area;
+
+ iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
+
+ if (iface->get_area)
+ {
+ area = iface->get_area (cell_layout);
+
+ gtk_cell_layout_clear (GTK_CELL_LAYOUT (area));
+ }
+}
+
+static void
+gtk_cell_layout_default_add_attribute (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ const gchar *attribute,
+ gint column)
+{
+ GtkCellLayoutIface *iface;
+ GtkCellArea *area;
+
+ iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
+
+ if (iface->get_area)
+ {
+ area = iface->get_area (cell_layout);
+
+ gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (area), cell, attribute, column);
+ }
+}
+
+static void
+gtk_cell_layout_default_set_cell_data_func (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ GtkCellLayoutDataFunc func,
+ gpointer func_data,
+ GDestroyNotify destroy)
+{
+ GtkCellLayoutIface *iface;
+ GtkCellArea *area;
+
+ iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
+
+ if (iface->get_area)
+ {
+ area = iface->get_area (cell_layout);
+
+ _gtk_cell_area_set_cell_data_func_with_proxy (area, cell,
+ (GFunc)func, func_data, destroy,
+ cell_layout);
+ }
+}
static void
-gtk_cell_layout_default_init (GtkCellLayoutInterface *iface)
+gtk_cell_layout_default_clear_attributes (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell)
+{
+ GtkCellLayoutIface *iface;
+ GtkCellArea *area;
+
+ iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
+
+ if (iface->get_area)
+ {
+ area = iface->get_area (cell_layout);
+
+ gtk_cell_layout_clear_attributes (GTK_CELL_LAYOUT (area), cell);
+ }
+}
+
+static void
+gtk_cell_layout_default_reorder (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ gint position)
+{
+ GtkCellLayoutIface *iface;
+ GtkCellArea *area;
+
+ iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
+
+ if (iface->get_area)
+ {
+ area = iface->get_area (cell_layout);
+
+ gtk_cell_layout_reorder (GTK_CELL_LAYOUT (area), cell, position);
+ }
+}
+
+static GList *
+gtk_cell_layout_default_get_cells (GtkCellLayout *cell_layout)
{
+ GtkCellLayoutIface *iface;
+ GtkCellArea *area;
+
+ iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
+
+ if (iface->get_area)
+ {
+ area = iface->get_area (cell_layout);
+
+ return gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (area));
+ }
+ return NULL;
}
+
/**
* gtk_cell_layout_pack_start:
* @cell_layout: a #GtkCellLayout
@@ -122,23 +301,10 @@ gtk_cell_layout_pack_start (GtkCellLayout *cell_layout,
GtkCellRenderer *cell,
gboolean expand)
{
- GtkCellLayoutIface *iface;
- GtkCellArea *area;
-
g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout));
g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
- iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
-
- if (iface->pack_start)
- iface->pack_start (cell_layout, cell, expand);
- else
- {
- area = iface->get_area (cell_layout);
-
- if (area)
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (area), cell, expand);
- }
+ GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->pack_start (cell_layout, cell, expand);
}
/**
@@ -160,23 +326,10 @@ gtk_cell_layout_pack_end (GtkCellLayout *cell_layout,
GtkCellRenderer *cell,
gboolean expand)
{
- GtkCellLayoutIface *iface;
- GtkCellArea *area;
-
g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout));
g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
- iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
-
- if (iface->pack_end)
- iface->pack_end (cell_layout, cell, expand);
- else
- {
- area = iface->get_area (cell_layout);
-
- if (area)
- gtk_cell_layout_pack_end (GTK_CELL_LAYOUT (area), cell, expand);
- }
+ GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->pack_end (cell_layout, cell, expand);
}
/**
@@ -191,22 +344,9 @@ gtk_cell_layout_pack_end (GtkCellLayout *cell_layout,
void
gtk_cell_layout_clear (GtkCellLayout *cell_layout)
{
- GtkCellLayoutIface *iface;
- GtkCellArea *area;
-
g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout));
- iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
-
- if (iface->clear)
- iface->clear (cell_layout);
- else
- {
- area = iface->get_area (cell_layout);
-
- if (area)
- gtk_cell_layout_clear (GTK_CELL_LAYOUT (area));
- }
+ GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->clear (cell_layout);
}
static void
@@ -216,28 +356,16 @@ gtk_cell_layout_set_attributesv (GtkCellLayout *cell_layout,
{
gchar *attribute;
gint column;
- GtkCellLayoutIface *iface;
- GtkCellArea *area;
attribute = va_arg (args, gchar *);
- iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
-
- if (iface->get_area)
- area = iface->get_area (cell_layout);
-
- if (iface->clear_attributes)
- iface->clear_attributes (cell_layout, cell);
- else if (area)
- gtk_cell_layout_clear_attributes (GTK_CELL_LAYOUT (area), cell);
+ gtk_cell_layout_clear_attributes (cell_layout, cell);
while (attribute != NULL)
{
column = va_arg (args, gint);
- if (iface->add_attribute)
- iface->add_attribute (cell_layout, cell, attribute, column);
- else if (area)
- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (area), cell, attribute, column);
+
+ gtk_cell_layout_add_attribute (cell_layout, cell, attribute, column);
attribute = va_arg (args, gchar *);
}
@@ -294,28 +422,12 @@ gtk_cell_layout_add_attribute (GtkCellLayout *cell_layout,
const gchar *attribute,
gint column)
{
- GtkCellLayoutIface *iface;
- GtkCellArea *area;
-
g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout));
g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
g_return_if_fail (attribute != NULL);
g_return_if_fail (column >= 0);
- iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
-
- if (iface->add_attribute)
- iface->add_attribute (cell_layout,
- cell,
- attribute,
- column);
- else
- {
- area = iface->get_area (cell_layout);
-
- if (area)
- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (area), cell, attribute, column);
- }
+ GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->add_attribute (cell_layout, cell, attribute, column);
}
/**
@@ -343,36 +455,11 @@ gtk_cell_layout_set_cell_data_func (GtkCellLayout *cell_layout,
gpointer func_data,
GDestroyNotify destroy)
{
- GtkCellLayoutIface *iface;
- GtkCellArea *area;
-
g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout));
g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
- iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
-
- if (iface->set_cell_data_func)
- iface->set_cell_data_func (cell_layout,
- cell,
- func,
- func_data,
- destroy);
- else
- {
- area = iface->get_area (cell_layout);
-
- if (area)
- {
- /* Ensure that the correct proxy object is sent to 'func' */
- if (GTK_CELL_LAYOUT (area) != cell_layout)
- _gtk_cell_area_set_cell_data_func_with_proxy (area, cell,
- (GFunc)func, func_data, destroy,
- cell_layout);
- else
- gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (area), cell,
- func, func_data, destroy);
- }
- }
+ GTK_CELL_LAYOUT_GET_IFACE
+ (cell_layout)->set_cell_data_func (cell_layout, cell, func, func_data, destroy);
}
/**
@@ -389,23 +476,10 @@ void
gtk_cell_layout_clear_attributes (GtkCellLayout *cell_layout,
GtkCellRenderer *cell)
{
- GtkCellLayoutIface *iface;
- GtkCellArea *area;
-
g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout));
g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
- iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
-
- if (iface->clear_attributes)
- iface->clear_attributes (cell_layout, cell);
- else
- {
- area = iface->get_area (cell_layout);
-
- if (area)
- gtk_cell_layout_clear_attributes (GTK_CELL_LAYOUT (area), cell);
- }
+ GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->clear_attributes (cell_layout, cell);
}
/**
@@ -426,23 +500,10 @@ gtk_cell_layout_reorder (GtkCellLayout *cell_layout,
GtkCellRenderer *cell,
gint position)
{
- GtkCellLayoutIface *iface;
- GtkCellArea *area;
-
g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout));
g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
- iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
-
- if (iface->reorder)
- iface->reorder (cell_layout, cell, position);
- else
- {
- area = iface->get_area (cell_layout);
-
- if (area)
- gtk_cell_layout_reorder (GTK_CELL_LAYOUT (area), cell, position);
- }
+ GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->reorder (cell_layout, cell, position);
}
/**
@@ -461,23 +522,9 @@ gtk_cell_layout_reorder (GtkCellLayout *cell_layout,
GList *
gtk_cell_layout_get_cells (GtkCellLayout *cell_layout)
{
- GtkCellLayoutIface *iface;
- GtkCellArea *area;
-
g_return_val_if_fail (GTK_IS_CELL_LAYOUT (cell_layout), NULL);
- iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout);
- if (iface->get_cells)
- return iface->get_cells (cell_layout);
- else
- {
- area = iface->get_area (cell_layout);
-
- if (area)
- return gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (area));
- }
-
- return NULL;
+ return GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->get_cells (cell_layout);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]