diff options
-rw-r--r-- | libempathy-gtk/empathy-cell-renderer-expander.c | 177 |
1 files changed, 13 insertions, 164 deletions
diff --git a/libempathy-gtk/empathy-cell-renderer-expander.c b/libempathy-gtk/empathy-cell-renderer-expander.c index d6fa87748..53588d6fc 100644 --- a/libempathy-gtk/empathy-cell-renderer-expander.c +++ b/libempathy-gtk/empathy-cell-renderer-expander.c @@ -1,6 +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 @@ -20,15 +21,6 @@ * 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 <libempathy/empathy-utils.h> @@ -39,14 +31,7 @@ typedef struct { 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; } EmpathyCellRendererExpanderPriv; enum { @@ -98,7 +83,6 @@ empathy_cell_renderer_expander_init (EmpathyCellRendererExpander *expander) priv->expander_style = GTK_EXPANDER_COLLAPSED; priv->expander_size = 12; priv->activatable = TRUE; - priv->animation_node = NULL; g_object_set (expander, "xpad", 2, @@ -224,15 +208,6 @@ empathy_cell_renderer_expander_finalize (GObject *object) 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 (empathy_cell_renderer_expander_parent_class)->finalize) (object); } @@ -301,31 +276,13 @@ empathy_cell_renderer_expander_render (GtkCellRenderer *cell, { EmpathyCellRendererExpander *expander; EmpathyCellRendererExpanderPriv *priv; - GtkExpanderStyle expander_style; gint x_offset, y_offset; guint xpad, ypad; - + GtkStyleContext *style; expander = (EmpathyCellRendererExpander *) cell; priv = GET_PRIV (expander); - 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; - empathy_cell_renderer_expander_get_size (cell, widget, (GdkRectangle *) cell_area, &x_offset, &y_offset, @@ -336,115 +293,23 @@ empathy_cell_renderer_expander_render (GtkCellRenderer *cell, "ypad", &ypad, NULL); - gtk_render_expander (gtk_widget_get_style_context (widget), + style = gtk_widget_get_style_context (widget); + + gtk_style_context_save (style); + + if (priv->expander_style == GTK_EXPANDER_COLLAPSED) + gtk_style_context_set_state (style, GTK_STATE_NORMAL); + else + gtk_style_context_set_state (style, GTK_STATE_ACTIVE); + + gtk_render_expander (style, cr, cell_area->x + x_offset + xpad, cell_area->y + y_offset + ypad, priv->expander_size, priv->expander_size); -} - -static void -invalidate_node (GtkTreeView *tree_view, - GtkTreePath *path) -{ - GdkWindow *bin_window; - GdkRectangle rect; - GtkAllocation allocation; - - bin_window = gtk_tree_view_get_bin_window (tree_view); - - gtk_tree_view_get_background_area (tree_view, path, NULL, &rect); - - rect.x = 0; - gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation); - rect.width = allocation.width; - - gdk_window_invalidate_rect (bin_window, &rect, TRUE); -} - -static gboolean -do_animation (EmpathyCellRendererExpander *expander) -{ - EmpathyCellRendererExpanderPriv *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; -} - -static gboolean -animation_timeout (gpointer data) -{ - gboolean retval; - - GDK_THREADS_ENTER (); - - retval = do_animation (data); - - GDK_THREADS_LEAVE (); - - return retval; -} - -static void -empathy_cell_renderer_expander_start_animation (EmpathyCellRendererExpander *expander, - GtkTreeView *tree_view, - GtkTreePath *path, - gboolean expanding, - const GdkRectangle *background_area) -{ - EmpathyCellRendererExpanderPriv *priv; - - priv = GET_PRIV (expander); - - if (priv->animation_timeout != 0) { - g_source_remove (priv->animation_timeout); - priv->animation_timeout = 0; - gtk_tree_row_reference_free (priv->animation_node); - priv->animation_node = NULL; - } - - if (expanding) { - priv->animation_style = GTK_EXPANDER_SEMI_COLLAPSED; - } else { - priv->animation_style = GTK_EXPANDER_SEMI_EXPANDED; - } - - invalidate_node (tree_view, path); - - 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); + gtk_style_context_restore (style); } static gboolean @@ -459,8 +324,6 @@ empathy_cell_renderer_expander_activate (GtkCellRenderer *cell, EmpathyCellRendererExpander *expander; EmpathyCellRendererExpanderPriv *priv; GtkTreePath *path; - gboolean animate; - gboolean expanding; expander = EMPATHY_CELL_RENDERER_EXPANDER (cell); priv = GET_PRIV (cell); @@ -475,24 +338,10 @@ empathy_cell_renderer_expander_activate (GtkCellRenderer *cell, 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) { - empathy_cell_renderer_expander_start_animation (expander, - GTK_TREE_VIEW (widget), - path, - expanding, - background_area); } gtk_tree_path_free (path); |