[ekiga] GmCellRenderers: Ported our custom renderers to GTK+ 3.



commit 1c7e14d7cc50fec0abe4176b2873dcd63eff6451
Author: Damien Sandras <dsandras beip be>
Date:   Sun Mar 10 17:14:50 2013 +0100

    GmCellRenderers: Ported our custom renderers to GTK+ 3.

 lib/gui/gm-cell-renderer-bitext.c |   13 +-
 lib/gui/gmcellrendererexpander.c  |  618 ++++++++++++++-----------------------
 lib/gui/gmcellrendererexpander.h  |   22 +-
 3 files changed, 253 insertions(+), 400 deletions(-)
---
diff --git a/lib/gui/gm-cell-renderer-bitext.c b/lib/gui/gm-cell-renderer-bitext.c
index 4b90d03..a182fd9 100644
--- a/lib/gui/gm-cell-renderer-bitext.c
+++ b/lib/gui/gm-cell-renderer-bitext.c
@@ -144,13 +144,13 @@ gm_cell_renderer_bitext_get_size (GtkCellRenderer *cell,
                          width, height);
 }
 
+
 static void
 gm_cell_renderer_bitext_render (GtkCellRenderer *cell,
-                               GdkWindow *window,
+                               cairo_t *cr,
                                GtkWidget *widget,
                                GdkRectangle *background_area,
                                GdkRectangle *cell_area,
-                               GdkRectangle *expose_area,
                                GtkCellRendererState flags)
 {
   GmCellRendererBitext *renderer = NULL;
@@ -161,9 +161,12 @@ gm_cell_renderer_bitext_render (GtkCellRenderer *cell,
 
   gm_cell_renderer_bitext_update_text (renderer, widget,
                                       (flags & GTK_CELL_RENDERER_SELECTED));
-  parent_class->render (cell, window, widget,
-                       background_area, cell_area,
-                       expose_area, flags);
+  parent_class->render (cell,
+                        cr,
+                        widget,
+                       background_area,
+                        cell_area,
+                       flags);
 }
 
 /* GObject code */
diff --git a/lib/gui/gmcellrendererexpander.c b/lib/gui/gmcellrendererexpander.c
index f69bd9c..22a227f 100644
--- a/lib/gui/gmcellrendererexpander.c
+++ b/lib/gui/gmcellrendererexpander.c
@@ -1,5 +1,7 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
  * Copyright (C) 2006-2007 Imendio AB
+ * Copyright (C) 2007-2011 Collabora Ltd.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -13,29 +15,30 @@
  *
  * You should have received a copy of the GNU General Public
  * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- * 
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA  02110-1301  USA
+ *
  * Authors: Kristian Rietveld <kris imendio com>
  */
 
-/* To do:
- *  - should probably cancel animation if model changes
- *  - need to handle case where node-in-animation is removed
- *  - it only handles a single animation at a time; but I guess users
- *    aren't fast enough to trigger two or more animations at once anyway :P
- *    (could guard for this by just cancelling the "old" animation, and
- *     start the new one).
- */
-
 #include <gtk/gtk.h>
 
 #include "gmcellrendererexpander.h"
 
-#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GM_TYPE_CELL_RENDERER_EXPANDER, 
GmCellRendererExpanderPriv))
+typedef struct {
+       GtkExpanderStyle     expander_style;
+       gint                 expander_size;
+
+       guint                activatable : 1;
+} EmpathyCellRendererExpanderPriv;
+
+enum {
+       PROP_0,
+       PROP_EXPANDER_STYLE,
+       PROP_EXPANDER_SIZE,
+       PROP_ACTIVATABLE
+};
 
-static void     gm_cell_renderer_expander_init         (GmCellRendererExpander      *expander);
-static void     gm_cell_renderer_expander_class_init   (GmCellRendererExpanderClass *klass);
 static void     gm_cell_renderer_expander_get_property (GObject                         *object,
                                                         guint                            param_id,
                                                         GValue                          *value,
@@ -47,116 +50,91 @@ static void     gm_cell_renderer_expander_set_property (GObject
 static void     gm_cell_renderer_expander_finalize     (GObject                         *object);
 static void     gm_cell_renderer_expander_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     gm_cell_renderer_expander_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 gm_cell_renderer_expander_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);
 
-enum {
-  PROP_0,
-  PROP_EXPANDER_STYLE,
-  PROP_EXPANDER_SIZE,
-  PROP_ACTIVATABLE
-};
-
-typedef struct _GmCellRendererExpanderPriv GmCellRendererExpanderPriv;
-
-struct _GmCellRendererExpanderPriv {
-  GtkExpanderStyle     expander_style;
-  gint                 expander_size;
-
-  GtkTreeView         *animation_view;
-  GtkTreeRowReference *animation_node;
-  GtkExpanderStyle     animation_style;
-  guint                animation_timeout;
-  GdkRectangle         animation_area;
-
-  guint                activatable : 1;
-  guint                animation_expanding : 1;
-};
-
-G_DEFINE_TYPE (GmCellRendererExpander, gm_cell_renderer_expander, GTK_TYPE_CELL_RENDERER);
+G_DEFINE_TYPE (EmpathyCellRendererExpander, gm_cell_renderer_expander, GTK_TYPE_CELL_RENDERER)
 
 static void
-gm_cell_renderer_expander_init (GmCellRendererExpander *expander)
+gm_cell_renderer_expander_init (EmpathyCellRendererExpander *expander)
 {
-  GmCellRendererExpanderPriv *priv;
-
-  priv = GET_PRIV (expander);
-
-  priv->expander_style = GTK_EXPANDER_COLLAPSED;
-  priv->expander_size = 12;
-  priv->activatable = TRUE;
-  priv->animation_node = NULL;
-
-  g_object_set (G_OBJECT (expander),
-               "xpad", 2,
-               "ypad", 2,
-               "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE,
-               NULL);
+       EmpathyCellRendererExpanderPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (expander,
+               GM_TYPE_CELL_RENDERER_EXPANDER, EmpathyCellRendererExpanderPriv);
+
+       expander->priv = priv;
+       priv->expander_style = GTK_EXPANDER_COLLAPSED;
+       priv->expander_size = 12;
+       priv->activatable = TRUE;
+
+       g_object_set (expander,
+                     "xpad", 2,
+                     "ypad", 2,
+                     "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE,
+                     NULL);
 }
 
 static void
-gm_cell_renderer_expander_class_init (GmCellRendererExpanderClass *klass)
+gm_cell_renderer_expander_class_init (EmpathyCellRendererExpanderClass *klass)
 {
-  GObjectClass         *object_class;
-  GtkCellRendererClass *cell_class;
-
-  object_class  = G_OBJECT_CLASS (klass);
-  cell_class = GTK_CELL_RENDERER_CLASS (klass);
-
-  object_class->finalize = gm_cell_renderer_expander_finalize;
-
-  object_class->get_property = gm_cell_renderer_expander_get_property;
-  object_class->set_property = gm_cell_renderer_expander_set_property;
-
-  cell_class->get_size = gm_cell_renderer_expander_get_size;
-  cell_class->render = gm_cell_renderer_expander_render;
-  cell_class->activate = gm_cell_renderer_expander_activate;
-
-  g_object_class_install_property (object_class,
-                                   PROP_EXPANDER_STYLE,
-                                   g_param_spec_enum ("expander-style",
-                                                      "Expander Style",
-                                                      "Style to use when painting the expander",
-                                                      GTK_TYPE_EXPANDER_STYLE,
-                                                      GTK_EXPANDER_COLLAPSED,
-                                                      G_PARAM_READWRITE));
-
-  g_object_class_install_property (object_class,
-                                   PROP_EXPANDER_SIZE,
-                                   g_param_spec_int ("expander-size",
-                                                     "Expander Size",
-                                                     "The size of the expander",
-                                                     0,
-                                                     G_MAXINT,
-                                                     12,
-                                                     G_PARAM_READWRITE));
-
-  g_object_class_install_property (object_class,
-                                   PROP_ACTIVATABLE,
-                                   g_param_spec_boolean ("activatable",
-                                                         "Activatable",
-                                                         "The expander can be activated",
-                                                         TRUE,
-                                                         G_PARAM_READWRITE));
-
-  g_type_class_add_private (object_class, sizeof (GmCellRendererExpanderPriv));
+       GObjectClass         *object_class;
+       GtkCellRendererClass *cell_class;
+
+       object_class  = G_OBJECT_CLASS (klass);
+       cell_class = GTK_CELL_RENDERER_CLASS (klass);
+
+       object_class->finalize = gm_cell_renderer_expander_finalize;
+
+       object_class->get_property = gm_cell_renderer_expander_get_property;
+       object_class->set_property = gm_cell_renderer_expander_set_property;
+
+       cell_class->get_size = gm_cell_renderer_expander_get_size;
+       cell_class->render = gm_cell_renderer_expander_render;
+       cell_class->activate = gm_cell_renderer_expander_activate;
+
+       g_object_class_install_property (object_class,
+                                        PROP_EXPANDER_STYLE,
+                                        g_param_spec_enum ("expander-style",
+                                                           "Expander Style",
+                                                           "Style to use when painting the expander",
+                                                           GTK_TYPE_EXPANDER_STYLE,
+                                                           GTK_EXPANDER_COLLAPSED,
+                                                           G_PARAM_READWRITE));
+
+       g_object_class_install_property (object_class,
+                                        PROP_EXPANDER_SIZE,
+                                        g_param_spec_int ("expander-size",
+                                                          "Expander Size",
+                                                          "The size of the expander",
+                                                          0,
+                                                          G_MAXINT,
+                                                          12,
+                                                          G_PARAM_READWRITE));
+
+       g_object_class_install_property (object_class,
+                                        PROP_ACTIVATABLE,
+                                        g_param_spec_boolean ("activatable",
+                                                              "Activatable",
+                                                              "The expander can be activated",
+                                                              TRUE,
+                                                              G_PARAM_READWRITE));
+
+       g_type_class_add_private (object_class, sizeof (EmpathyCellRendererExpanderPriv));
 }
 
 static void
@@ -165,29 +143,29 @@ gm_cell_renderer_expander_get_property (GObject    *object,
                                         GValue     *value,
                                         GParamSpec *pspec)
 {
-  GmCellRendererExpander     *expander;
-  GmCellRendererExpanderPriv *priv;
+       EmpathyCellRendererExpander     *expander;
+       EmpathyCellRendererExpanderPriv *priv;
 
-  expander = GM_CELL_RENDERER_EXPANDER (object);
-  priv = GET_PRIV (expander);
+       expander = GM_CELL_RENDERER_EXPANDER (object);
+       priv = expander->priv;
 
-  switch (param_id) {
-  case PROP_EXPANDER_STYLE:
-    g_value_set_enum (value, priv->expander_style);
-    break;
+       switch (param_id) {
+       case PROP_EXPANDER_STYLE:
+               g_value_set_enum (value, priv->expander_style);
+               break;
 
-  case PROP_EXPANDER_SIZE:
-    g_value_set_int (value, priv->expander_size);
-    break;
+       case PROP_EXPANDER_SIZE:
+               g_value_set_int (value, priv->expander_size);
+               break;
 
-  case PROP_ACTIVATABLE:
-    g_value_set_boolean (value, priv->activatable);
-    break;
+       case PROP_ACTIVATABLE:
+               g_value_set_boolean (value, priv->activatable);
+               break;
 
-  default:
-    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
-    break;
-  }
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+               break;
+       }
 }
 
 static void
@@ -196,307 +174,177 @@ gm_cell_renderer_expander_set_property (GObject      *object,
                                         const GValue *value,
                                         GParamSpec   *pspec)
 {
-  GmCellRendererExpander     *expander;
-  GmCellRendererExpanderPriv *priv;
+       EmpathyCellRendererExpander     *expander;
+       EmpathyCellRendererExpanderPriv *priv;
 
-  expander = GM_CELL_RENDERER_EXPANDER (object);
-  priv = GET_PRIV (expander);
+       expander = GM_CELL_RENDERER_EXPANDER (object);
+       priv = expander->priv;
 
-  switch (param_id) {
-  case PROP_EXPANDER_STYLE:
-    priv->expander_style = g_value_get_enum (value);
-    break;
+       switch (param_id) {
+       case PROP_EXPANDER_STYLE:
+               priv->expander_style = g_value_get_enum (value);
+               break;
 
-  case PROP_EXPANDER_SIZE:
-    priv->expander_size = g_value_get_int (value);
-    break;
+       case PROP_EXPANDER_SIZE:
+               priv->expander_size = g_value_get_int (value);
+               break;
 
-  case PROP_ACTIVATABLE:
-    priv->activatable = g_value_get_boolean (value);
-    break;
+       case PROP_ACTIVATABLE:
+               priv->activatable = g_value_get_boolean (value);
+               break;
 
-  default:
-    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
-    break;
-  }
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+               break;
+       }
 }
 
 static void
 gm_cell_renderer_expander_finalize (GObject *object)
 {
-  GmCellRendererExpanderPriv *priv;
-
-  priv = GET_PRIV (object);
-
-  if (priv->animation_timeout) {
-    g_source_remove (priv->animation_timeout);
-    priv->animation_timeout = 0;
-  }
-
-  if (priv->animation_node) {
-    gtk_tree_row_reference_free (priv->animation_node);
-  }
-
-  (* G_OBJECT_CLASS (gm_cell_renderer_expander_parent_class)->finalize) (object);
+       (* G_OBJECT_CLASS (gm_cell_renderer_expander_parent_class)->finalize) (object);
 }
 
 GtkCellRenderer *
 gm_cell_renderer_expander_new (void)
 {
-  return g_object_new (GM_TYPE_CELL_RENDERER_EXPANDER, NULL);
+       return g_object_new (GM_TYPE_CELL_RENDERER_EXPANDER, NULL);
 }
 
 static void
-gm_cell_renderer_expander_get_size (GtkCellRenderer *cell,
-                                    G_GNUC_UNUSED GtkWidget       *widget,
-                                    GdkRectangle    *cell_area,
-                                    gint            *x_offset,
-                                    gint            *y_offset,
-                                    gint            *width,
-                                    gint            *height)
+gm_cell_renderer_expander_get_size (GtkCellRenderer         *cell,
+                                    G_GNUC_UNUSED GtkWidget *widget,
+                                    const GdkRectangle      *cell_area,
+                                    gint                    *x_offset,
+                                    gint                    *y_offset,
+                                    gint                    *width,
+                                    gint                    *height)
 {
-  GmCellRendererExpander     *expander;
-  GmCellRendererExpanderPriv *priv;
-  gfloat xalign, yalign;
-  guint xpad, ypad;
-
-  expander = (GmCellRendererExpander*) cell;
-  priv = GET_PRIV (expander);
-  g_object_get (G_OBJECT (cell),
-               "xalign", &xalign,
-               "yalign", &yalign,
-               "xpad", &xpad,
-               "ypad", &ypad,
-               NULL);
-
-  if (cell_area) {
-    if (x_offset) {
-      *x_offset = xalign * (cell_area->width - (priv->expander_size + (2 * xpad)));
-      *x_offset = MAX (*x_offset, 0);
-    }
-
-    if (y_offset) {
-      *y_offset = yalign * (cell_area->height - (priv->expander_size + (2 * ypad)));
-      *y_offset = MAX (*y_offset, 0);
-    }
-  } else {
-    if (x_offset)
-      *x_offset = 0;
-
-    if (y_offset)
-      *y_offset = 0;
-  }
-
-  if (width)
-    *width = xpad * 2 + priv->expander_size;
-
-  if (height)
-    *height = ypad * 2 + priv->expander_size;
+       EmpathyCellRendererExpander     *expander;
+       EmpathyCellRendererExpanderPriv *priv;
+       gfloat xalign, yalign;
+       guint xpad, ypad;
+
+       expander = (EmpathyCellRendererExpander *) cell;
+       priv = expander->priv;
+
+       g_object_get (cell,
+                     "xalign", &xalign,
+                     "yalign", &yalign,
+                     "xpad", &xpad,
+                     "ypad", &ypad,
+                     NULL);
+
+       if (cell_area) {
+               if (x_offset) {
+                       *x_offset = xalign * (cell_area->width - (priv->expander_size + (2 * xpad)));
+                       *x_offset = MAX (*x_offset, 0);
+               }
+
+               if (y_offset) {
+                       *y_offset = yalign * (cell_area->height - (priv->expander_size + (2 * ypad)));
+                       *y_offset = MAX (*y_offset, 0);
+               }
+       } else {
+               if (x_offset)
+                       *x_offset = 0;
+
+               if (y_offset)
+                       *y_offset = 0;
+       }
+
+       if (width)
+               *width = xpad * 2 + priv->expander_size;
+
+       if (height)
+               *height = ypad * 2 + priv->expander_size;
 }
 
 static void
-gm_cell_renderer_expander_render (GtkCellRenderer      *cell,
-                                  GdkWindow            *window,
-                                  GtkWidget            *widget,
-                                  GdkRectangle         *background_area,
-                                  GdkRectangle         *cell_area,
-                                  GdkRectangle         *expose_area,
-                                  G_GNUC_UNUSED GtkCellRendererState  flags)
+gm_cell_renderer_expander_render (GtkCellRenderer                    *cell,
+                                 cairo_t                            *cr,
+                                 GtkWidget                          *widget,
+                                 G_GNUC_UNUSED const GdkRectangle   *background_area,
+                                 const GdkRectangle                 *cell_area,
+                                 GtkCellRendererState               flags)
 {
-  GmCellRendererExpander     *expander;
-  GmCellRendererExpanderPriv *priv;
-  GtkExpanderStyle                expander_style;
-  gint                            x_offset, y_offset;
-  guint xpad, ypad;
-  GtkAllocation allocation;
-
-  expander = (GmCellRendererExpander*) cell;
-  priv = GET_PRIV (expander);
-  g_object_get (G_OBJECT (cell),
-               "xpad", &xpad,
-               "ypad", &ypad,
-               NULL);
-  gtk_widget_get_allocation (widget, &allocation);
-
-  if (priv->animation_node) {
-    GtkTreePath *path;
-    GdkRectangle rect;
-
-    /* Not sure if I like this ... */
-    path = gtk_tree_row_reference_get_path (priv->animation_node);
-    gtk_tree_view_get_background_area (priv->animation_view, path,
-                                       NULL, &rect);
-    gtk_tree_path_free (path);
-
-    if (background_area->y == rect.y)
-      expander_style = priv->animation_style;
-    else
-      expander_style = priv->expander_style;
-  } else
-    expander_style = priv->expander_style;
-
-  gm_cell_renderer_expander_get_size (cell, widget, cell_area,
-                                      &x_offset, &y_offset,
-                                      NULL, NULL);
-
-  gtk_paint_expander (gtk_widget_get_style (widget),
-                      window,
-                      GTK_STATE_NORMAL,
-                      expose_area,
-                      widget,
-                      "treeview",
-                      cell_area->x + x_offset + xpad + priv->expander_size / 2,
-                      cell_area->y + y_offset + ypad + priv->expander_size / 2,
-                      expander_style);
-  gtk_paint_hline (gtk_widget_get_style (widget), window, GTK_STATE_NORMAL, NULL, widget, NULL, 0,
-                   allocation.width, cell_area->y + cell_area->height);
-}
+       EmpathyCellRendererExpander     *expander;
+       EmpathyCellRendererExpanderPriv *priv;
+       gint                            x_offset, y_offset;
+       guint                           xpad, ypad;
+       GtkStyleContext                 *style;
+       GtkStateFlags                    state;
 
-static void
-invalidate_node (GtkTreeView *tree_view,
-                 GtkTreePath *path)
-{
-  GdkWindow    *bin_window;
-  GdkRectangle  rect;
-  GtkAllocation allocation;
+       expander = (EmpathyCellRendererExpander *) cell;
+       priv = expander->priv;
 
-  bin_window = gtk_tree_view_get_bin_window (tree_view);
+       gm_cell_renderer_expander_get_size (cell, widget,
+                                               (GdkRectangle *) cell_area,
+                                               &x_offset, &y_offset,
+                                               NULL, NULL);
 
-  gtk_tree_view_get_background_area (tree_view, path, NULL, &rect);
-  gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation);
+       g_object_get (cell,
+                     "xpad", &xpad,
+                     "ypad", &ypad,
+                     NULL);
 
-  rect.x = 0;
-  rect.width = allocation.width;
+       style = gtk_widget_get_style_context (widget);
 
-  gdk_window_invalidate_rect (bin_window, &rect, TRUE);
-}
+       gtk_style_context_save (style);
+       gtk_style_context_add_class (style, GTK_STYLE_CLASS_EXPANDER);
 
-static gboolean
-do_animation (GmCellRendererExpander *expander)
-{
-  GmCellRendererExpanderPriv *priv;
-  GtkTreePath                    *path;
-  gboolean                        done = FALSE;
-
-  priv = GET_PRIV (expander);
-
-  if (priv->animation_expanding) {
-    if (priv->animation_style == GTK_EXPANDER_SEMI_COLLAPSED)
-      priv->animation_style = GTK_EXPANDER_SEMI_EXPANDED;
-    else if (priv->animation_style == GTK_EXPANDER_SEMI_EXPANDED) {
-      priv->animation_style = GTK_EXPANDER_EXPANDED;
-      done = TRUE;
-    }
-  } else {
-    if (priv->animation_style == GTK_EXPANDER_SEMI_EXPANDED)
-      priv->animation_style = GTK_EXPANDER_SEMI_COLLAPSED;
-    else if (priv->animation_style == GTK_EXPANDER_SEMI_COLLAPSED) {
-      priv->animation_style = GTK_EXPANDER_COLLAPSED;
-      done = TRUE;
-    }
-  }
-
-  path = gtk_tree_row_reference_get_path (priv->animation_node);
-  invalidate_node (priv->animation_view, path);
-  gtk_tree_path_free (path);
-
-  if (done) {
-    gtk_tree_row_reference_free (priv->animation_node);
-    priv->animation_node = NULL;
-    priv->animation_timeout = 0;
-  }
-
-  return !done;
-}
+       state = gtk_cell_renderer_get_state (cell, widget, flags);
 
-static gboolean
-animation_timeout (gpointer data)
-{
-  gboolean retval;
-
-  GDK_THREADS_ENTER ();
+       if (priv->expander_style == GTK_EXPANDER_COLLAPSED)
+               state |= GTK_STATE_FLAG_NORMAL;
+       else
+               state |= GTK_STATE_FLAG_ACTIVE;
 
-  retval = do_animation (data);
+       gtk_style_context_set_state (style, state);
 
-  GDK_THREADS_LEAVE ();
+       gtk_render_expander (style,
+                            cr,
+                            cell_area->x + x_offset + xpad,
+                            cell_area->y + y_offset + ypad,
+                            priv->expander_size,
+                            priv->expander_size);
 
-  return retval;
+       gtk_style_context_restore (style);
 }
 
-static void
-gm_cell_renderer_expander_start_animation (GmCellRendererExpander *expander,
-                                           GtkTreeView                *tree_view,
-                                           GtkTreePath                *path,
-                                           gboolean                    expanding,
-                                           G_GNUC_UNUSED GdkRectangle               *background_area)
+static gboolean
+gm_cell_renderer_expander_activate (GtkCellRenderer                    *cell,
+                                   G_GNUC_UNUSED GdkEvent             *event,
+                                    GtkWidget                          *widget,
+                                    const gchar                        *path_string,
+                                    G_GNUC_UNUSED const GdkRectangle   *background_area,
+                                    G_GNUC_UNUSED const GdkRectangle   *cell_area,
+                                    G_GNUC_UNUSED GtkCellRendererState flags)
 {
-  GmCellRendererExpanderPriv *priv;
+       EmpathyCellRendererExpander     *expander;
+       EmpathyCellRendererExpanderPriv *priv;
+       GtkTreePath                     *path;
 
-  priv = GET_PRIV (expander);
+       expander = (EmpathyCellRendererExpander *) cell;
+       priv = expander->priv;
 
-  if (expanding) {
-    priv->animation_style = GTK_EXPANDER_SEMI_COLLAPSED;
-  } else {
-    priv->animation_style = GTK_EXPANDER_SEMI_EXPANDED;
-  }
+       if (!GTK_IS_TREE_VIEW (widget) || !priv->activatable)
+               return FALSE;
 
-  invalidate_node (tree_view, path);
+       path = gtk_tree_path_new_from_string (path_string);
 
-  priv->animation_expanding = expanding;
-  priv->animation_view = tree_view;
-  priv->animation_node = gtk_tree_row_reference_new (gtk_tree_view_get_model (tree_view), path);
-  priv->animation_timeout = g_timeout_add (50, animation_timeout, expander);
-}
+       if (gtk_tree_path_get_depth (path) > 1) {
+               gtk_tree_path_free (path);
+               return TRUE;
+       }
 
-static gboolean
-gm_cell_renderer_expander_activate (GtkCellRenderer      *cell,
-                                    G_GNUC_UNUSED GdkEvent             *event,
-                                    GtkWidget            *widget,
-                                    const gchar          *path_string,
-                                    GdkRectangle         *background_area,
-                                    G_GNUC_UNUSED GdkRectangle         *cell_area,
-                                    G_GNUC_UNUSED GtkCellRendererState  flags)
-{
-  GmCellRendererExpander     *expander;
-  GmCellRendererExpanderPriv *priv;
-  GtkTreePath                    *path;
-  gboolean                        animate;
-  gboolean                        expanding;
-
-  expander = GM_CELL_RENDERER_EXPANDER (cell);
-  priv = GET_PRIV (cell);
-
-  if (!GTK_IS_TREE_VIEW (widget) || !priv->activatable)
-    return FALSE;
-
-  path = gtk_tree_path_new_from_string (path_string);
-
-  if (gtk_tree_path_get_depth (path) > 2) {
-    gtk_tree_path_free (path);
-    return TRUE;
-  }
-
-  g_object_get (gtk_widget_get_settings (GTK_WIDGET (widget)),
-                "gtk-enable-animations", &animate,
-                NULL);
-
-  if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (widget), path)) {
-    gtk_tree_view_collapse_row (GTK_TREE_VIEW (widget), path);
-    expanding = FALSE;
-  } else {
-    gtk_tree_view_expand_row (GTK_TREE_VIEW (widget), path, FALSE);
-    expanding = TRUE;
-  }
-
-  if (animate) {
-    gm_cell_renderer_expander_start_animation (expander,
-                                               GTK_TREE_VIEW (widget),
-                                               path,
-                                               expanding,
-                                               background_area);
-  }
-
-  gtk_tree_path_free (path);
-
-  return TRUE;
+       if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (widget), path)) {
+               gtk_tree_view_collapse_row (GTK_TREE_VIEW (widget), path);
+       } else {
+               gtk_tree_view_expand_row (GTK_TREE_VIEW (widget), path, FALSE);
+       }
+
+       gtk_tree_path_free (path);
+
+       return TRUE;
 }
diff --git a/lib/gui/gmcellrendererexpander.h b/lib/gui/gmcellrendererexpander.h
index b5e4aa1..a6e9f95 100644
--- a/lib/gui/gmcellrendererexpander.h
+++ b/lib/gui/gmcellrendererexpander.h
@@ -1,3 +1,4 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
  * Copyright (C) 2006-2007 Imendio AB
  *
@@ -13,9 +14,9 @@
  *
  * You should have received a copy of the GNU General Public
  * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- * 
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA  02110-1301  USA
+ *
  * Authors: Kristian Rietveld <kris imendio com>
  */
 
@@ -27,20 +28,21 @@
 G_BEGIN_DECLS
 
 #define GM_TYPE_CELL_RENDERER_EXPANDER         (gm_cell_renderer_expander_get_type ())
-#define GM_CELL_RENDERER_EXPANDER(obj)         (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GM_TYPE_CELL_RENDERER_EXPANDER, GmCellRendererExpander))
-#define GM_CELL_RENDERER_EXPANDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), 
GM_TYPE_CELL_RENDERER_EXPANDER, GmCellRendererExpanderClass))
+#define GM_CELL_RENDERER_EXPANDER(obj)         (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GM_TYPE_CELL_RENDERER_EXPANDER, EmpathyCellRendererExpander))
+#define GM_CELL_RENDERER_EXPANDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), 
GM_TYPE_CELL_RENDERER_EXPANDER, EmpathyCellRendererExpanderClass))
 #define GM_IS_CELL_RENDERER_EXPANDER(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GM_TYPE_CELL_RENDERER_EXPANDER))
 #define GM_IS_CELL_RENDERER_EXPANDER_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), 
GM_TYPE_CELL_RENDERER_EXPANDER))
-#define GM_CELL_RENDERER_EXPANDER_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), 
GM_TYPE_CELL_RENDERER_EXPANDER, GmCellRendererExpanderClass))
+#define GM_CELL_RENDERER_EXPANDER_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), 
GM_TYPE_CELL_RENDERER_EXPANDER, EmpathyCellRendererExpanderClass))
 
-typedef struct _GmCellRendererExpander GmCellRendererExpander;
-typedef struct _GmCellRendererExpanderClass GmCellRendererExpanderClass;
+typedef struct _EmpathyCellRendererExpander EmpathyCellRendererExpander;
+typedef struct _EmpathyCellRendererExpanderClass EmpathyCellRendererExpanderClass;
 
-struct _GmCellRendererExpander {
+struct _EmpathyCellRendererExpander {
   GtkCellRenderer parent;
+  gpointer priv;
 };
 
-struct _GmCellRendererExpanderClass {
+struct _EmpathyCellRendererExpanderClass {
   GtkCellRendererClass parent_class;
 
   /* Padding for future expansion */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]