2 * Copyright (C) 2002, 2003 Kristian Rietveld <kris@gtk.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 #include "gtkcellview.h"
22 #include "gtkcelllayout.h"
24 #include "gtksignal.h"
25 #include "gtkcellrenderertext.h"
26 #include "gtkcellrendererpixbuf.h"
27 #include "gtkprivate.h"
28 #include <gobject/gmarshal.h>
31 typedef struct _GtkCellViewCellInfo GtkCellViewCellInfo;
32 struct _GtkCellViewCellInfo
34 GtkCellRenderer *cell;
43 GtkCellLayoutDataFunc func;
45 GDestroyNotify destroy;
48 struct _GtkCellViewPrivate
51 GtkTreeRowReference *displayed_row;
56 gboolean background_set;
60 static void gtk_cell_view_cell_layout_init (GtkCellLayoutIface *iface);
61 static void gtk_cell_view_get_property (GObject *object,
65 static void gtk_cell_view_set_property (GObject *object,
69 static void gtk_cell_view_finalize (GObject *object);
70 static void gtk_cell_view_size_request (GtkWidget *widget,
71 GtkRequisition *requisition);
72 static void gtk_cell_view_size_allocate (GtkWidget *widget,
73 GtkAllocation *allocation);
74 static gboolean gtk_cell_view_expose (GtkWidget *widget,
75 GdkEventExpose *event);
76 static void gtk_cell_view_set_value (GtkCellView *cell_view,
77 GtkCellRenderer *renderer,
80 static GtkCellViewCellInfo *gtk_cell_view_get_cell_info (GtkCellView *cellview,
81 GtkCellRenderer *renderer);
82 static void gtk_cell_view_set_cell_data (GtkCellView *cell_view);
85 static void gtk_cell_view_cell_layout_pack_start (GtkCellLayout *layout,
86 GtkCellRenderer *renderer,
88 static void gtk_cell_view_cell_layout_pack_end (GtkCellLayout *layout,
89 GtkCellRenderer *renderer,
91 static void gtk_cell_view_cell_layout_add_attribute (GtkCellLayout *layout,
92 GtkCellRenderer *renderer,
93 const gchar *attribute,
95 static void gtk_cell_view_cell_layout_clear (GtkCellLayout *layout);
96 static void gtk_cell_view_cell_layout_clear_attributes (GtkCellLayout *layout,
97 GtkCellRenderer *renderer);
98 static void gtk_cell_view_cell_layout_set_cell_data_func (GtkCellLayout *layout,
99 GtkCellRenderer *cell,
100 GtkCellLayoutDataFunc func,
102 GDestroyNotify destroy);
103 static void gtk_cell_view_cell_layout_reorder (GtkCellLayout *layout,
104 GtkCellRenderer *cell,
106 static GList * gtk_cell_view_cell_layout_get_cells (GtkCellLayout *layout);
108 #define GTK_CELL_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_CELL_VIEW, GtkCellViewPrivate))
119 G_DEFINE_TYPE_WITH_CODE (GtkCellView, gtk_cell_view, GTK_TYPE_WIDGET,
120 G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_LAYOUT,
121 gtk_cell_view_cell_layout_init))
124 gtk_cell_view_class_init (GtkCellViewClass *klass)
126 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
127 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
129 gobject_class->get_property = gtk_cell_view_get_property;
130 gobject_class->set_property = gtk_cell_view_set_property;
131 gobject_class->finalize = gtk_cell_view_finalize;
133 widget_class->expose_event = gtk_cell_view_expose;
134 widget_class->size_allocate = gtk_cell_view_size_allocate;
135 widget_class->size_request = gtk_cell_view_size_request;
138 g_object_class_install_property (gobject_class,
140 g_param_spec_string ("background",
141 P_("Background color name"),
142 P_("Background color as a string"),
144 GTK_PARAM_WRITABLE));
145 g_object_class_install_property (gobject_class,
147 g_param_spec_boxed ("background-gdk",
148 P_("Background color"),
149 P_("Background color as a GdkColor"),
151 GTK_PARAM_READWRITE));
156 * The model for cell view
160 g_object_class_install_property (gobject_class,
162 g_param_spec_object ("model",
163 P_("CellView model"),
164 P_("The model for cell view"),
166 GTK_PARAM_READWRITE));
168 #define ADD_SET_PROP(propname, propval, nick, blurb) g_object_class_install_property (gobject_class, propval, g_param_spec_boolean (propname, nick, blurb, FALSE, GTK_PARAM_READWRITE))
170 ADD_SET_PROP ("background-set", PROP_BACKGROUND_SET,
171 P_("Background set"),
172 P_("Whether this tag affects the background color"));
174 g_type_class_add_private (gobject_class, sizeof (GtkCellViewPrivate));
178 gtk_cell_view_cell_layout_init (GtkCellLayoutIface *iface)
180 iface->pack_start = gtk_cell_view_cell_layout_pack_start;
181 iface->pack_end = gtk_cell_view_cell_layout_pack_end;
182 iface->clear = gtk_cell_view_cell_layout_clear;
183 iface->add_attribute = gtk_cell_view_cell_layout_add_attribute;
184 iface->set_cell_data_func = gtk_cell_view_cell_layout_set_cell_data_func;
185 iface->clear_attributes = gtk_cell_view_cell_layout_clear_attributes;
186 iface->reorder = gtk_cell_view_cell_layout_reorder;
187 iface->get_cells = gtk_cell_view_cell_layout_get_cells;
191 gtk_cell_view_get_property (GObject *object,
196 GtkCellView *view = GTK_CELL_VIEW (object);
200 case PROP_BACKGROUND_GDK:
204 color = view->priv->background;
206 g_value_set_boxed (value, &color);
209 case PROP_BACKGROUND_SET:
210 g_value_set_boolean (value, view->priv->background_set);
213 g_value_set_object (value, view->priv->model);
216 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
222 gtk_cell_view_set_property (GObject *object,
227 GtkCellView *view = GTK_CELL_VIEW (object);
231 case PROP_BACKGROUND:
235 if (!g_value_get_string (value))
236 gtk_cell_view_set_background_color (view, NULL);
237 else if (gdk_color_parse (g_value_get_string (value), &color))
238 gtk_cell_view_set_background_color (view, &color);
240 g_warning ("Don't know color `%s'", g_value_get_string (value));
242 g_object_notify (object, "background-gdk");
245 case PROP_BACKGROUND_GDK:
246 gtk_cell_view_set_background_color (view, g_value_get_boxed (value));
248 case PROP_BACKGROUND_SET:
249 view->priv->background_set = g_value_get_boolean (value);
252 gtk_cell_view_set_model (view, g_value_get_object (value));
255 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
261 gtk_cell_view_init (GtkCellView *cellview)
263 GTK_WIDGET_SET_FLAGS (cellview, GTK_NO_WINDOW);
265 cellview->priv = GTK_CELL_VIEW_GET_PRIVATE (cellview);
269 gtk_cell_view_finalize (GObject *object)
271 GtkCellView *cellview = GTK_CELL_VIEW (object);
273 gtk_cell_view_cell_layout_clear (GTK_CELL_LAYOUT (cellview));
275 if (cellview->priv->model)
276 g_object_unref (cellview->priv->model);
278 if (cellview->priv->displayed_row)
279 gtk_tree_row_reference_free (cellview->priv->displayed_row);
281 (* G_OBJECT_CLASS (gtk_cell_view_parent_class)->finalize) (object);
285 gtk_cell_view_size_request (GtkWidget *widget,
286 GtkRequisition *requisition)
289 gboolean first_cell = TRUE;
290 GtkCellView *cellview;
292 cellview = GTK_CELL_VIEW (widget);
294 requisition->width = 0;
295 requisition->height = 0;
297 if (cellview->priv->displayed_row)
298 gtk_cell_view_set_cell_data (cellview);
300 for (i = cellview->priv->cell_list; i; i = i->next)
303 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
305 if (!info->cell->visible)
309 requisition->width += cellview->priv->spacing;
311 gtk_cell_renderer_get_size (info->cell, widget, NULL, NULL, NULL,
314 info->requested_width = width;
315 requisition->width += width;
316 requisition->height = MAX (requisition->height, height);
323 gtk_cell_view_size_allocate (GtkWidget *widget,
324 GtkAllocation *allocation)
327 gint expand_cell_count = 0;
328 gint full_requested_width = 0;
330 GtkCellView *cellview;
332 widget->allocation = *allocation;
334 cellview = GTK_CELL_VIEW (widget);
336 /* checking how much extra space we have */
337 for (i = cellview->priv->cell_list; i; i = i->next)
339 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
341 if (!info->cell->visible)
347 full_requested_width += info->requested_width;
350 extra_space = widget->allocation.width - full_requested_width;
353 else if (extra_space > 0 && expand_cell_count > 0)
354 extra_space /= expand_cell_count;
356 /* iterate list for PACK_START cells */
357 for (i = cellview->priv->cell_list; i; i = i->next)
359 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
361 if (info->pack == GTK_PACK_END)
364 if (!info->cell->visible)
367 info->real_width = info->requested_width + (info->expand?extra_space:0);
370 /* iterate list for PACK_END cells */
371 for (i = cellview->priv->cell_list; i; i = i->next)
373 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
375 if (info->pack == GTK_PACK_START)
378 if (!info->cell->visible)
381 info->real_width = info->requested_width + (info->expand?extra_space:0);
386 gtk_cell_view_expose (GtkWidget *widget,
387 GdkEventExpose *event)
390 GtkCellView *cellview;
392 GtkCellRendererState state;
393 gboolean rtl = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL);
395 cellview = GTK_CELL_VIEW (widget);
397 if (! GTK_WIDGET_DRAWABLE (widget))
400 /* "blank" background */
401 if (cellview->priv->background_set)
403 cairo_t *cr = gdk_cairo_create (GTK_WIDGET (cellview)->window);
405 gdk_cairo_rectangle (cr, &widget->allocation);
406 cairo_set_source_rgb (cr,
407 cellview->priv->background.red / 65535.,
408 cellview->priv->background.green / 65535.,
409 cellview->priv->background.blue / 65535.);
415 /* set cell data (if available) */
416 if (cellview->priv->displayed_row)
417 gtk_cell_view_set_cell_data (cellview);
418 else if (cellview->priv->model)
422 area = widget->allocation;
424 /* we draw on our very own window, initialize x and y to zero */
425 area.x = widget->allocation.x + (rtl ? widget->allocation.width : 0);
426 area.y = widget->allocation.y;
428 if (GTK_WIDGET_STATE (widget) == GTK_STATE_PRELIGHT)
429 state = GTK_CELL_RENDERER_PRELIT;
434 for (i = cellview->priv->cell_list; i; i = i->next)
436 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
438 if (info->pack == GTK_PACK_END)
441 if (!info->cell->visible)
444 area.width = info->real_width;
446 area.x -= area.width;
448 gtk_cell_renderer_render (info->cell,
452 &area, &area, &event->area, state);
455 area.x += info->real_width;
458 area.x = rtl ? widget->allocation.x : (widget->allocation.x + widget->allocation.width);
461 for (i = cellview->priv->cell_list; i; i = i->next)
463 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
465 if (info->pack == GTK_PACK_START)
468 if (!info->cell->visible)
471 area.width = info->real_width;
473 area.x -= area.width;
475 gtk_cell_renderer_render (info->cell,
479 &area, &area, &event->area, state);
481 area.x += info->real_width;
487 static GtkCellViewCellInfo *
488 gtk_cell_view_get_cell_info (GtkCellView *cellview,
489 GtkCellRenderer *renderer)
493 for (i = cellview->priv->cell_list; i; i = i->next)
495 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
497 if (info->cell == renderer)
505 gtk_cell_view_set_cell_data (GtkCellView *cell_view)
511 g_return_if_fail (cell_view->priv->displayed_row != NULL);
513 path = gtk_tree_row_reference_get_path (cell_view->priv->displayed_row);
517 gtk_tree_model_get_iter (cell_view->priv->model, &iter, path);
518 gtk_tree_path_free (path);
520 for (i = cell_view->priv->cell_list; i; i = i->next)
523 GtkCellViewCellInfo *info = i->data;
525 g_object_freeze_notify (G_OBJECT (info->cell));
527 for (j = info->attributes; j && j->next; j = j->next->next)
529 gchar *property = j->data;
530 gint column = GPOINTER_TO_INT (j->next->data);
531 GValue value = {0, };
533 gtk_tree_model_get_value (cell_view->priv->model, &iter,
535 g_object_set_property (G_OBJECT (info->cell),
537 g_value_unset (&value);
541 (* info->func) (GTK_CELL_LAYOUT (cell_view),
543 cell_view->priv->model,
547 g_object_thaw_notify (G_OBJECT (info->cell));
551 /* GtkCellLayout implementation */
553 gtk_cell_view_cell_layout_pack_start (GtkCellLayout *layout,
554 GtkCellRenderer *renderer,
557 GtkCellViewCellInfo *info;
558 GtkCellView *cellview = GTK_CELL_VIEW (layout);
560 g_return_if_fail (GTK_IS_CELL_VIEW (cellview));
561 g_return_if_fail (GTK_IS_CELL_RENDERER (renderer));
562 g_return_if_fail (!gtk_cell_view_get_cell_info (cellview, renderer));
564 g_object_ref_sink (renderer);
566 info = g_new0 (GtkCellViewCellInfo, 1);
567 info->cell = renderer;
568 info->expand = expand ? TRUE : FALSE;
569 info->pack = GTK_PACK_START;
571 cellview->priv->cell_list = g_list_append (cellview->priv->cell_list, info);
575 gtk_cell_view_cell_layout_pack_end (GtkCellLayout *layout,
576 GtkCellRenderer *renderer,
579 GtkCellViewCellInfo *info;
580 GtkCellView *cellview = GTK_CELL_VIEW (layout);
582 g_return_if_fail (GTK_IS_CELL_VIEW (cellview));
583 g_return_if_fail (GTK_IS_CELL_RENDERER (renderer));
584 g_return_if_fail (!gtk_cell_view_get_cell_info (cellview, renderer));
586 g_object_ref_sink (renderer);
588 info = g_new0 (GtkCellViewCellInfo, 1);
589 info->cell = renderer;
590 info->expand = expand ? TRUE : FALSE;
591 info->pack = GTK_PACK_END;
593 cellview->priv->cell_list = g_list_append (cellview->priv->cell_list, info);
597 gtk_cell_view_cell_layout_add_attribute (GtkCellLayout *layout,
598 GtkCellRenderer *renderer,
599 const gchar *attribute,
602 GtkCellViewCellInfo *info;
603 GtkCellView *cellview = GTK_CELL_VIEW (layout);
605 g_return_if_fail (GTK_IS_CELL_VIEW (cellview));
606 info = gtk_cell_view_get_cell_info (cellview, renderer);
607 g_return_if_fail (info != NULL);
609 info->attributes = g_slist_prepend (info->attributes,
610 GINT_TO_POINTER (column));
611 info->attributes = g_slist_prepend (info->attributes,
612 g_strdup (attribute));
616 gtk_cell_view_cell_layout_clear (GtkCellLayout *layout)
618 GtkCellView *cellview = GTK_CELL_VIEW (layout);
620 g_return_if_fail (GTK_IS_CELL_VIEW (cellview));
622 while (cellview->priv->cell_list)
624 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)cellview->priv->cell_list->data;
626 gtk_cell_view_cell_layout_clear_attributes (layout, info->cell);
627 g_object_unref (info->cell);
629 cellview->priv->cell_list = g_list_delete_link (cellview->priv->cell_list,
630 cellview->priv->cell_list);
635 gtk_cell_view_cell_layout_set_cell_data_func (GtkCellLayout *layout,
636 GtkCellRenderer *cell,
637 GtkCellLayoutDataFunc func,
639 GDestroyNotify destroy)
641 GtkCellView *cellview = GTK_CELL_VIEW (layout);
642 GtkCellViewCellInfo *info;
644 g_return_if_fail (GTK_IS_CELL_VIEW (cellview));
646 info = gtk_cell_view_get_cell_info (cellview, cell);
647 g_return_if_fail (info != NULL);
651 GDestroyNotify d = info->destroy;
653 info->destroy = NULL;
658 info->func_data = func_data;
659 info->destroy = destroy;
663 gtk_cell_view_cell_layout_clear_attributes (GtkCellLayout *layout,
664 GtkCellRenderer *renderer)
666 GtkCellViewCellInfo *info;
667 GtkCellView *cellview = GTK_CELL_VIEW (layout);
670 g_return_if_fail (GTK_IS_CELL_VIEW (cellview));
671 g_return_if_fail (GTK_IS_CELL_RENDERER (renderer));
673 info = gtk_cell_view_get_cell_info (cellview, renderer);
676 list = info->attributes;
677 while (list && list->next)
680 list = list->next->next;
683 g_slist_free (info->attributes);
684 info->attributes = NULL;
689 gtk_cell_view_cell_layout_reorder (GtkCellLayout *layout,
690 GtkCellRenderer *cell,
694 GtkCellViewCellInfo *info;
695 GtkCellView *cellview = GTK_CELL_VIEW (layout);
697 g_return_if_fail (GTK_IS_CELL_VIEW (cellview));
698 g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
700 info = gtk_cell_view_get_cell_info (cellview, cell);
702 g_return_if_fail (info != NULL);
703 g_return_if_fail (position >= 0);
705 link = g_list_find (cellview->priv->cell_list, info);
707 g_return_if_fail (link != NULL);
709 cellview->priv->cell_list = g_list_remove_link (cellview->priv->cell_list,
711 cellview->priv->cell_list = g_list_insert (cellview->priv->cell_list,
714 gtk_widget_queue_draw (GTK_WIDGET (cellview));
720 * Creates a new #GtkCellView widget.
722 * Return value: A newly created #GtkCellView widget.
727 gtk_cell_view_new (void)
729 GtkCellView *cellview;
731 cellview = g_object_new (gtk_cell_view_get_type (), NULL);
733 return GTK_WIDGET (cellview);
737 * gtk_cell_view_new_with_text:
738 * @text: the text to display in the cell view
740 * Creates a new #GtkCellView widget, adds a #GtkCellRendererText
741 * to it, and makes its show @text.
743 * Return value: A newly created #GtkCellView widget.
748 gtk_cell_view_new_with_text (const gchar *text)
750 GtkCellView *cellview;
751 GtkCellRenderer *renderer;
752 GValue value = {0, };
754 cellview = GTK_CELL_VIEW (gtk_cell_view_new ());
756 renderer = gtk_cell_renderer_text_new ();
757 gtk_cell_view_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
760 g_value_init (&value, G_TYPE_STRING);
761 g_value_set_string (&value, text);
762 gtk_cell_view_set_value (cellview, renderer, "text", &value);
763 g_value_unset (&value);
765 return GTK_WIDGET (cellview);
769 * gtk_cell_view_new_with_markup:
770 * @markup: the text to display in the cell view
772 * Creates a new #GtkCellView widget, adds a #GtkCellRendererText
773 * to it, and makes its show @markup. The text can text can be
774 * marked up with the <link linkend="PangoMarkupFormat">Pango text
775 * markup language</link>.
777 * Return value: A newly created #GtkCellView widget.
782 gtk_cell_view_new_with_markup (const gchar *markup)
784 GtkCellView *cellview;
785 GtkCellRenderer *renderer;
786 GValue value = {0, };
788 cellview = GTK_CELL_VIEW (gtk_cell_view_new ());
790 renderer = gtk_cell_renderer_text_new ();
791 gtk_cell_view_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
794 g_value_init (&value, G_TYPE_STRING);
795 g_value_set_string (&value, markup);
796 gtk_cell_view_set_value (cellview, renderer, "markup", &value);
797 g_value_unset (&value);
799 return GTK_WIDGET (cellview);
803 * gtk_cell_view_new_with_pixbuf:
804 * @pixbuf: the image to display in the cell view
806 * Creates a new #GtkCellView widget, adds a #GtkCellRendererPixbuf
807 * to it, and makes its show @pixbuf.
809 * Return value: A newly created #GtkCellView widget.
814 gtk_cell_view_new_with_pixbuf (GdkPixbuf *pixbuf)
816 GtkCellView *cellview;
817 GtkCellRenderer *renderer;
818 GValue value = {0, };
820 cellview = GTK_CELL_VIEW (gtk_cell_view_new ());
822 renderer = gtk_cell_renderer_pixbuf_new ();
823 gtk_cell_view_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
826 g_value_init (&value, GDK_TYPE_PIXBUF);
827 g_value_set_object (&value, pixbuf);
828 gtk_cell_view_set_value (cellview, renderer, "pixbuf", &value);
829 g_value_unset (&value);
831 return GTK_WIDGET (cellview);
835 * gtk_cell_view_set_value:
836 * @cell_view: a #GtkCellView widget
837 * @renderer: one of the renderers of @cell_view
838 * @property: the name of the property of @renderer to set
839 * @value: the new value to set the property to
841 * Sets a property of a cell renderer of @cell_view, and
842 * makes sure the display of @cell_view is updated.
847 gtk_cell_view_set_value (GtkCellView *cell_view,
848 GtkCellRenderer *renderer,
852 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
853 g_return_if_fail (GTK_IS_CELL_RENDERER (renderer));
855 g_object_set_property (G_OBJECT (renderer), property, value);
857 /* force resize and redraw */
858 gtk_widget_queue_resize (GTK_WIDGET (cell_view));
859 gtk_widget_queue_draw (GTK_WIDGET (cell_view));
863 * gtk_cell_view_set_model:
864 * @cell_view: a #GtkCellView
865 * @model: a #GtkTreeModel
867 * Sets the model for @cell_view. If @cell_view already has a model
868 * set, it will remove it before setting the new model. If @model is
869 * %NULL, then it will unset the old model.
874 gtk_cell_view_set_model (GtkCellView *cell_view,
877 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
878 g_return_if_fail (model == NULL || GTK_IS_TREE_MODEL (model));
880 if (cell_view->priv->model)
882 if (cell_view->priv->displayed_row)
883 gtk_tree_row_reference_free (cell_view->priv->displayed_row);
884 cell_view->priv->displayed_row = NULL;
886 g_object_unref (cell_view->priv->model);
887 cell_view->priv->model = NULL;
890 cell_view->priv->model = model;
892 if (cell_view->priv->model)
893 g_object_ref (cell_view->priv->model);
897 * gtk_cell_view_set_displayed_row:
898 * @cell_view: a #GtkCellView
899 * @path: a #GtkTreePath or %NULL to unset.
901 * Sets the row of the model that is currently displayed
902 * by the #GtkCellView. If the path is unset, then the
903 * contents of the cellview "stick" at their last value;
904 * this is not normally a desired result, but may be
905 * a needed intermediate state if say, the model for
906 * the #GtkCellView becomes temporarily empty.
911 gtk_cell_view_set_displayed_row (GtkCellView *cell_view,
914 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
915 g_return_if_fail (GTK_IS_TREE_MODEL (cell_view->priv->model));
917 if (cell_view->priv->displayed_row)
918 gtk_tree_row_reference_free (cell_view->priv->displayed_row);
922 cell_view->priv->displayed_row =
923 gtk_tree_row_reference_new (cell_view->priv->model, path);
926 cell_view->priv->displayed_row = NULL;
928 /* force resize and redraw */
929 gtk_widget_queue_resize (GTK_WIDGET (cell_view));
930 gtk_widget_queue_draw (GTK_WIDGET (cell_view));
934 * gtk_cell_view_get_displayed_row:
935 * @cell_view: a #GtkCellView
937 * Returns a #GtkTreePath referring to the currently
938 * displayed row. If no row is currently displayed,
941 * Returns: the currently displayed row or %NULL
946 gtk_cell_view_get_displayed_row (GtkCellView *cell_view)
948 g_return_val_if_fail (GTK_IS_CELL_VIEW (cell_view), NULL);
950 if (!cell_view->priv->displayed_row)
953 return gtk_tree_row_reference_get_path (cell_view->priv->displayed_row);
957 * gtk_cell_view_get_size_of_row:
958 * @cell_view: a #GtkCellView
959 * @path: a #GtkTreePath
960 * @requisition: return location for the size
962 * Sets @requisition to the size needed by @cell_view to display
963 * the model row pointed to by @path.
965 * Return value: %TRUE
970 gtk_cell_view_get_size_of_row (GtkCellView *cell_view,
972 GtkRequisition *requisition)
974 GtkTreeRowReference *tmp;
977 g_return_val_if_fail (GTK_IS_CELL_VIEW (cell_view), FALSE);
978 g_return_val_if_fail (path != NULL, FALSE);
979 g_return_val_if_fail (requisition != NULL, FALSE);
981 tmp = cell_view->priv->displayed_row;
982 cell_view->priv->displayed_row =
983 gtk_tree_row_reference_new (cell_view->priv->model, path);
985 gtk_cell_view_size_request (GTK_WIDGET (cell_view), requisition);
987 gtk_tree_row_reference_free (cell_view->priv->displayed_row);
988 cell_view->priv->displayed_row = tmp;
990 /* restore actual size info */
991 gtk_cell_view_size_request (GTK_WIDGET (cell_view), &req);
997 * gtk_cell_view_set_background_color:
998 * @cell_view: a #GtkCellView
999 * @color: the new background color
1001 * Sets the background color of @view.
1006 gtk_cell_view_set_background_color (GtkCellView *cell_view,
1007 const GdkColor *color)
1009 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
1013 if (!cell_view->priv->background_set)
1015 cell_view->priv->background_set = TRUE;
1016 g_object_notify (G_OBJECT (cell_view), "background-set");
1019 cell_view->priv->background = *color;
1023 if (cell_view->priv->background_set)
1025 cell_view->priv->background_set = FALSE;
1026 g_object_notify (G_OBJECT (cell_view), "background-set");
1030 gtk_widget_queue_draw (GTK_WIDGET (cell_view));
1034 * gtk_cell_view_get_cell_renderers:
1035 * @cell_view: a #GtkCellView
1037 * Returns the cell renderers which have been added to @cell_view.
1039 * Return value: a list of cell renderers. The list, but not the
1040 * renderers has been newly allocated and should be freed with
1041 * g_list_free() when no longer needed.
1046 gtk_cell_view_get_cell_renderers (GtkCellView *cell_view)
1048 GList *retval = NULL, *list;
1050 g_return_val_if_fail (cell_view != NULL, NULL);
1052 gtk_cell_view_set_cell_data (cell_view);
1054 for (list = cell_view->priv->cell_list; list; list = list->next)
1056 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)list->data;
1058 retval = g_list_prepend (retval, info->cell);
1061 return g_list_reverse (retval);
1065 gtk_cell_view_cell_layout_get_cells (GtkCellLayout *layout)
1067 return gtk_cell_view_get_cell_renderers (GTK_CELL_VIEW (layout));
1071 #define __GTK_CELL_VIEW_C__
1072 #include "gtkaliasdef.c"