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.
22 #include "gtkcellview.h"
23 #include "gtkcelllayout.h"
25 #include "gtkcellrenderertext.h"
26 #include "gtkcellrendererpixbuf.h"
27 #include "gtkextendedlayout.h"
28 #include "gtkprivate.h"
29 #include <gobject/gmarshal.h>
30 #include "gtkbuildable.h"
33 typedef struct _GtkCellViewCellInfo GtkCellViewCellInfo;
34 struct _GtkCellViewCellInfo
36 GtkCellRenderer *cell;
46 GtkCellLayoutDataFunc func;
48 GDestroyNotify destroy;
51 struct _GtkCellViewPrivate
54 GtkTreeRowReference *displayed_row;
59 gboolean background_set;
63 static void gtk_cell_view_cell_layout_init (GtkCellLayoutIface *iface);
64 static void gtk_cell_view_get_property (GObject *object,
68 static void gtk_cell_view_set_property (GObject *object,
72 static void gtk_cell_view_finalize (GObject *object);
73 static void gtk_cell_view_size_request (GtkWidget *widget,
74 GtkRequisition *requisition);
75 static void gtk_cell_view_size_allocate (GtkWidget *widget,
76 GtkAllocation *allocation);
77 static gboolean gtk_cell_view_expose (GtkWidget *widget,
78 GdkEventExpose *event);
79 static void gtk_cell_view_set_value (GtkCellView *cell_view,
80 GtkCellRenderer *renderer,
83 static GtkCellViewCellInfo *gtk_cell_view_get_cell_info (GtkCellView *cellview,
84 GtkCellRenderer *renderer);
85 static void gtk_cell_view_set_cell_data (GtkCellView *cell_view);
88 static void gtk_cell_view_cell_layout_pack_start (GtkCellLayout *layout,
89 GtkCellRenderer *renderer,
91 static void gtk_cell_view_cell_layout_pack_end (GtkCellLayout *layout,
92 GtkCellRenderer *renderer,
94 static void gtk_cell_view_cell_layout_add_attribute (GtkCellLayout *layout,
95 GtkCellRenderer *renderer,
96 const gchar *attribute,
98 static void gtk_cell_view_cell_layout_clear (GtkCellLayout *layout);
99 static void gtk_cell_view_cell_layout_clear_attributes (GtkCellLayout *layout,
100 GtkCellRenderer *renderer);
101 static void gtk_cell_view_cell_layout_set_cell_data_func (GtkCellLayout *layout,
102 GtkCellRenderer *cell,
103 GtkCellLayoutDataFunc func,
105 GDestroyNotify destroy);
106 static void gtk_cell_view_cell_layout_reorder (GtkCellLayout *layout,
107 GtkCellRenderer *cell,
109 static GList * gtk_cell_view_cell_layout_get_cells (GtkCellLayout *layout);
112 static void gtk_cell_view_buildable_init (GtkBuildableIface *iface);
113 static gboolean gtk_cell_view_buildable_custom_tag_start (GtkBuildable *buildable,
116 const gchar *tagname,
117 GMarkupParser *parser,
119 static void gtk_cell_view_buildable_custom_tag_end (GtkBuildable *buildable,
122 const gchar *tagname,
125 static void gtk_cell_view_extended_layout_init (GtkExtendedLayoutIface *iface);
127 static GtkBuildableIface *parent_buildable_iface;
129 #define GTK_CELL_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_CELL_VIEW, GtkCellViewPrivate))
140 G_DEFINE_TYPE_WITH_CODE (GtkCellView, gtk_cell_view, GTK_TYPE_WIDGET,
141 G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_LAYOUT,
142 gtk_cell_view_cell_layout_init)
143 G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
144 gtk_cell_view_buildable_init)
145 G_IMPLEMENT_INTERFACE (GTK_TYPE_EXTENDED_LAYOUT,
146 gtk_cell_view_extended_layout_init))
150 gtk_cell_view_class_init (GtkCellViewClass *klass)
152 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
153 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
155 gobject_class->get_property = gtk_cell_view_get_property;
156 gobject_class->set_property = gtk_cell_view_set_property;
157 gobject_class->finalize = gtk_cell_view_finalize;
159 widget_class->expose_event = gtk_cell_view_expose;
160 widget_class->size_allocate = gtk_cell_view_size_allocate;
161 widget_class->size_request = gtk_cell_view_size_request;
164 g_object_class_install_property (gobject_class,
166 g_param_spec_string ("background",
167 P_("Background color name"),
168 P_("Background color as a string"),
170 GTK_PARAM_WRITABLE));
171 g_object_class_install_property (gobject_class,
173 g_param_spec_boxed ("background-gdk",
174 P_("Background color"),
175 P_("Background color as a GdkColor"),
177 GTK_PARAM_READWRITE));
182 * The model for cell view
186 g_object_class_install_property (gobject_class,
188 g_param_spec_object ("model",
189 P_("CellView model"),
190 P_("The model for cell view"),
192 GTK_PARAM_READWRITE));
194 #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))
196 ADD_SET_PROP ("background-set", PROP_BACKGROUND_SET,
197 P_("Background set"),
198 P_("Whether this tag affects the background color"));
200 g_type_class_add_private (gobject_class, sizeof (GtkCellViewPrivate));
204 gtk_cell_view_buildable_init (GtkBuildableIface *iface)
206 parent_buildable_iface = g_type_interface_peek_parent (iface);
207 iface->add_child = _gtk_cell_layout_buildable_add_child;
208 iface->custom_tag_start = gtk_cell_view_buildable_custom_tag_start;
209 iface->custom_tag_end = gtk_cell_view_buildable_custom_tag_end;
213 gtk_cell_view_cell_layout_init (GtkCellLayoutIface *iface)
215 iface->pack_start = gtk_cell_view_cell_layout_pack_start;
216 iface->pack_end = gtk_cell_view_cell_layout_pack_end;
217 iface->clear = gtk_cell_view_cell_layout_clear;
218 iface->add_attribute = gtk_cell_view_cell_layout_add_attribute;
219 iface->set_cell_data_func = gtk_cell_view_cell_layout_set_cell_data_func;
220 iface->clear_attributes = gtk_cell_view_cell_layout_clear_attributes;
221 iface->reorder = gtk_cell_view_cell_layout_reorder;
222 iface->get_cells = gtk_cell_view_cell_layout_get_cells;
226 gtk_cell_view_get_property (GObject *object,
231 GtkCellView *view = GTK_CELL_VIEW (object);
235 case PROP_BACKGROUND_GDK:
239 color = view->priv->background;
241 g_value_set_boxed (value, &color);
244 case PROP_BACKGROUND_SET:
245 g_value_set_boolean (value, view->priv->background_set);
248 g_value_set_object (value, view->priv->model);
251 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
257 gtk_cell_view_set_property (GObject *object,
262 GtkCellView *view = GTK_CELL_VIEW (object);
266 case PROP_BACKGROUND:
270 if (!g_value_get_string (value))
271 gtk_cell_view_set_background_color (view, NULL);
272 else if (gdk_color_parse (g_value_get_string (value), &color))
273 gtk_cell_view_set_background_color (view, &color);
275 g_warning ("Don't know color `%s'", g_value_get_string (value));
277 g_object_notify (object, "background-gdk");
280 case PROP_BACKGROUND_GDK:
281 gtk_cell_view_set_background_color (view, g_value_get_boxed (value));
283 case PROP_BACKGROUND_SET:
284 view->priv->background_set = g_value_get_boolean (value);
287 gtk_cell_view_set_model (view, g_value_get_object (value));
290 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
296 gtk_cell_view_init (GtkCellView *cellview)
298 GTK_WIDGET_SET_FLAGS (cellview, GTK_NO_WINDOW);
300 cellview->priv = GTK_CELL_VIEW_GET_PRIVATE (cellview);
304 gtk_cell_view_finalize (GObject *object)
306 GtkCellView *cellview = GTK_CELL_VIEW (object);
308 gtk_cell_view_cell_layout_clear (GTK_CELL_LAYOUT (cellview));
310 if (cellview->priv->model)
311 g_object_unref (cellview->priv->model);
313 if (cellview->priv->displayed_row)
314 gtk_tree_row_reference_free (cellview->priv->displayed_row);
316 G_OBJECT_CLASS (gtk_cell_view_parent_class)->finalize (object);
320 gtk_cell_view_size_request (GtkWidget *widget,
321 GtkRequisition *requisition)
324 gboolean first_cell = TRUE;
325 GtkCellView *cellview;
327 cellview = GTK_CELL_VIEW (widget);
329 requisition->width = 0;
330 requisition->height = 0;
332 if (cellview->priv->displayed_row)
333 gtk_cell_view_set_cell_data (cellview);
335 for (i = cellview->priv->cell_list; i; i = i->next)
338 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
340 if (!info->cell->visible)
344 requisition->width += cellview->priv->spacing;
346 gtk_cell_renderer_get_size (info->cell, widget, NULL, NULL, NULL,
349 info->requested_width = width;
351 if (GTK_IS_EXTENDED_LAYOUT (info->cell))
353 GtkRequisition nat_rec;
355 gtk_extended_layout_get_desired_size (GTK_EXTENDED_LAYOUT (info->cell),
357 info->natural_width = nat_rec.width;
360 info->natural_width = info->requested_width;
362 requisition->width += width;
363 requisition->height = MAX (requisition->height, height);
370 gtk_cell_view_size_allocate (GtkWidget *widget,
371 GtkAllocation *allocation)
373 GtkCellView *cellview;
375 gint nexpand_cells = 0;
376 gint requested_width = 0;
377 gint natural_width = 0;
378 gint available, natural, extra;
380 widget->allocation = *allocation;
382 cellview = GTK_CELL_VIEW (widget);
384 /* checking how much extra space we have */
385 for (i = cellview->priv->cell_list; i; i = i->next)
387 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
389 if (!info->cell->visible)
395 requested_width += info->requested_width;
396 natural_width += info->natural_width - info->requested_width;
399 available = MAX (0, widget->allocation.width - requested_width);
400 natural = MIN (available, natural_width);
401 available -= natural;
403 if (nexpand_cells > 0)
404 extra = available / nexpand_cells;
408 for (i = cellview->priv->cell_list; i; i = i->next)
410 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
412 if (!info->cell->visible)
415 info->real_width = info->requested_width;
417 if (natural_width > 0)
418 info->real_width += natural * (info->natural_width - info->requested_width) / natural_width;
422 if (nexpand_cells == 1)
423 info->real_width += available;
425 info->real_width += extra;
434 gtk_cell_view_expose (GtkWidget *widget,
435 GdkEventExpose *event)
438 GtkCellView *cellview;
440 GtkCellRendererState state;
441 gboolean rtl = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL);
443 cellview = GTK_CELL_VIEW (widget);
445 if (!gtk_widget_is_drawable (widget))
448 /* "blank" background */
449 if (cellview->priv->background_set)
451 cairo_t *cr = gdk_cairo_create (GTK_WIDGET (cellview)->window);
453 gdk_cairo_rectangle (cr, &widget->allocation);
454 cairo_set_source_rgb (cr,
455 cellview->priv->background.red / 65535.,
456 cellview->priv->background.green / 65535.,
457 cellview->priv->background.blue / 65535.);
463 /* set cell data (if available) */
464 if (cellview->priv->displayed_row)
465 gtk_cell_view_set_cell_data (cellview);
466 else if (cellview->priv->model)
470 area = widget->allocation;
472 /* we draw on our very own window, initialize x and y to zero */
473 area.x = widget->allocation.x + (rtl ? widget->allocation.width : 0);
474 area.y = widget->allocation.y;
476 if (GTK_WIDGET_STATE (widget) == GTK_STATE_PRELIGHT)
477 state = GTK_CELL_RENDERER_PRELIT;
478 else if (GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE)
479 state = GTK_CELL_RENDERER_INSENSITIVE;
484 for (i = cellview->priv->cell_list; i; i = i->next)
486 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
488 if (info->pack == GTK_PACK_END)
491 if (!info->cell->visible)
494 area.width = info->real_width;
496 area.x -= area.width;
498 gtk_cell_renderer_render (info->cell,
502 &area, &area, &event->area, state);
505 area.x += info->real_width;
508 area.x = rtl ? widget->allocation.x : (widget->allocation.x + widget->allocation.width);
511 for (i = cellview->priv->cell_list; i; i = i->next)
513 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
515 if (info->pack == GTK_PACK_START)
518 if (!info->cell->visible)
521 area.width = info->real_width;
523 area.x -= area.width;
525 gtk_cell_renderer_render (info->cell,
529 &area, &area, &event->area, state);
531 area.x += info->real_width;
537 static GtkCellViewCellInfo *
538 gtk_cell_view_get_cell_info (GtkCellView *cellview,
539 GtkCellRenderer *renderer)
543 for (i = cellview->priv->cell_list; i; i = i->next)
545 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
547 if (info->cell == renderer)
555 gtk_cell_view_set_cell_data (GtkCellView *cell_view)
561 g_return_if_fail (cell_view->priv->displayed_row != NULL);
563 path = gtk_tree_row_reference_get_path (cell_view->priv->displayed_row);
567 gtk_tree_model_get_iter (cell_view->priv->model, &iter, path);
568 gtk_tree_path_free (path);
570 for (i = cell_view->priv->cell_list; i; i = i->next)
573 GtkCellViewCellInfo *info = i->data;
575 g_object_freeze_notify (G_OBJECT (info->cell));
577 for (j = info->attributes; j && j->next; j = j->next->next)
579 gchar *property = j->data;
580 gint column = GPOINTER_TO_INT (j->next->data);
581 GValue value = {0, };
583 gtk_tree_model_get_value (cell_view->priv->model, &iter,
585 g_object_set_property (G_OBJECT (info->cell),
587 g_value_unset (&value);
591 (* info->func) (GTK_CELL_LAYOUT (cell_view),
593 cell_view->priv->model,
597 g_object_thaw_notify (G_OBJECT (info->cell));
601 /* GtkCellLayout implementation */
603 gtk_cell_view_cell_layout_pack_start (GtkCellLayout *layout,
604 GtkCellRenderer *renderer,
607 GtkCellViewCellInfo *info;
608 GtkCellView *cellview = GTK_CELL_VIEW (layout);
610 g_return_if_fail (!gtk_cell_view_get_cell_info (cellview, renderer));
612 g_object_ref_sink (renderer);
614 info = g_slice_new0 (GtkCellViewCellInfo);
615 info->cell = renderer;
616 info->expand = expand ? TRUE : FALSE;
617 info->pack = GTK_PACK_START;
619 cellview->priv->cell_list = g_list_append (cellview->priv->cell_list, info);
623 gtk_cell_view_cell_layout_pack_end (GtkCellLayout *layout,
624 GtkCellRenderer *renderer,
627 GtkCellViewCellInfo *info;
628 GtkCellView *cellview = GTK_CELL_VIEW (layout);
630 g_return_if_fail (!gtk_cell_view_get_cell_info (cellview, renderer));
632 g_object_ref_sink (renderer);
634 info = g_slice_new0 (GtkCellViewCellInfo);
635 info->cell = renderer;
636 info->expand = expand ? TRUE : FALSE;
637 info->pack = GTK_PACK_END;
639 cellview->priv->cell_list = g_list_append (cellview->priv->cell_list, info);
643 gtk_cell_view_cell_layout_add_attribute (GtkCellLayout *layout,
644 GtkCellRenderer *renderer,
645 const gchar *attribute,
648 GtkCellViewCellInfo *info;
649 GtkCellView *cellview = GTK_CELL_VIEW (layout);
651 info = gtk_cell_view_get_cell_info (cellview, renderer);
652 g_return_if_fail (info != NULL);
654 info->attributes = g_slist_prepend (info->attributes,
655 GINT_TO_POINTER (column));
656 info->attributes = g_slist_prepend (info->attributes,
657 g_strdup (attribute));
661 gtk_cell_view_cell_layout_clear (GtkCellLayout *layout)
663 GtkCellView *cellview = GTK_CELL_VIEW (layout);
665 while (cellview->priv->cell_list)
667 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)cellview->priv->cell_list->data;
669 gtk_cell_view_cell_layout_clear_attributes (layout, info->cell);
670 g_object_unref (info->cell);
671 g_slice_free (GtkCellViewCellInfo, info);
672 cellview->priv->cell_list = g_list_delete_link (cellview->priv->cell_list,
673 cellview->priv->cell_list);
678 gtk_cell_view_cell_layout_set_cell_data_func (GtkCellLayout *layout,
679 GtkCellRenderer *cell,
680 GtkCellLayoutDataFunc func,
682 GDestroyNotify destroy)
684 GtkCellView *cellview = GTK_CELL_VIEW (layout);
685 GtkCellViewCellInfo *info;
687 info = gtk_cell_view_get_cell_info (cellview, cell);
688 g_return_if_fail (info != NULL);
692 GDestroyNotify d = info->destroy;
694 info->destroy = NULL;
699 info->func_data = func_data;
700 info->destroy = destroy;
704 gtk_cell_view_cell_layout_clear_attributes (GtkCellLayout *layout,
705 GtkCellRenderer *renderer)
707 GtkCellView *cellview = GTK_CELL_VIEW (layout);
708 GtkCellViewCellInfo *info;
711 info = gtk_cell_view_get_cell_info (cellview, renderer);
714 list = info->attributes;
715 while (list && list->next)
718 list = list->next->next;
721 g_slist_free (info->attributes);
722 info->attributes = NULL;
727 gtk_cell_view_cell_layout_reorder (GtkCellLayout *layout,
728 GtkCellRenderer *cell,
731 GtkCellView *cellview = GTK_CELL_VIEW (layout);
732 GtkCellViewCellInfo *info;
735 info = gtk_cell_view_get_cell_info (cellview, cell);
737 g_return_if_fail (info != NULL);
738 g_return_if_fail (position >= 0);
740 link = g_list_find (cellview->priv->cell_list, info);
742 g_return_if_fail (link != NULL);
744 cellview->priv->cell_list = g_list_delete_link (cellview->priv->cell_list,
746 cellview->priv->cell_list = g_list_insert (cellview->priv->cell_list,
749 gtk_widget_queue_draw (GTK_WIDGET (cellview));
755 * Creates a new #GtkCellView widget.
757 * Return value: A newly created #GtkCellView widget.
762 gtk_cell_view_new (void)
764 GtkCellView *cellview;
766 cellview = g_object_new (gtk_cell_view_get_type (), NULL);
768 return GTK_WIDGET (cellview);
772 * gtk_cell_view_new_with_text:
773 * @text: the text to display in the cell view
775 * Creates a new #GtkCellView widget, adds a #GtkCellRendererText
776 * to it, and makes its show @text.
778 * Return value: A newly created #GtkCellView widget.
783 gtk_cell_view_new_with_text (const gchar *text)
785 GtkCellView *cellview;
786 GtkCellRenderer *renderer;
787 GValue value = {0, };
789 cellview = GTK_CELL_VIEW (gtk_cell_view_new ());
791 renderer = gtk_cell_renderer_text_new ();
792 gtk_cell_view_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
795 g_value_init (&value, G_TYPE_STRING);
796 g_value_set_string (&value, text);
797 gtk_cell_view_set_value (cellview, renderer, "text", &value);
798 g_value_unset (&value);
800 return GTK_WIDGET (cellview);
804 * gtk_cell_view_new_with_markup:
805 * @markup: the text to display in the cell view
807 * Creates a new #GtkCellView widget, adds a #GtkCellRendererText
808 * to it, and makes its show @markup. The text can text can be
809 * marked up with the <link linkend="PangoMarkupFormat">Pango text
810 * markup language</link>.
812 * Return value: A newly created #GtkCellView widget.
817 gtk_cell_view_new_with_markup (const gchar *markup)
819 GtkCellView *cellview;
820 GtkCellRenderer *renderer;
821 GValue value = {0, };
823 cellview = GTK_CELL_VIEW (gtk_cell_view_new ());
825 renderer = gtk_cell_renderer_text_new ();
826 gtk_cell_view_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
829 g_value_init (&value, G_TYPE_STRING);
830 g_value_set_string (&value, markup);
831 gtk_cell_view_set_value (cellview, renderer, "markup", &value);
832 g_value_unset (&value);
834 return GTK_WIDGET (cellview);
838 * gtk_cell_view_new_with_pixbuf:
839 * @pixbuf: the image to display in the cell view
841 * Creates a new #GtkCellView widget, adds a #GtkCellRendererPixbuf
842 * to it, and makes its show @pixbuf.
844 * Return value: A newly created #GtkCellView widget.
849 gtk_cell_view_new_with_pixbuf (GdkPixbuf *pixbuf)
851 GtkCellView *cellview;
852 GtkCellRenderer *renderer;
853 GValue value = {0, };
855 cellview = GTK_CELL_VIEW (gtk_cell_view_new ());
857 renderer = gtk_cell_renderer_pixbuf_new ();
858 gtk_cell_view_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
861 g_value_init (&value, GDK_TYPE_PIXBUF);
862 g_value_set_object (&value, pixbuf);
863 gtk_cell_view_set_value (cellview, renderer, "pixbuf", &value);
864 g_value_unset (&value);
866 return GTK_WIDGET (cellview);
870 * gtk_cell_view_set_value:
871 * @cell_view: a #GtkCellView widget
872 * @renderer: one of the renderers of @cell_view
873 * @property: the name of the property of @renderer to set
874 * @value: the new value to set the property to
876 * Sets a property of a cell renderer of @cell_view, and
877 * makes sure the display of @cell_view is updated.
882 gtk_cell_view_set_value (GtkCellView *cell_view,
883 GtkCellRenderer *renderer,
887 g_object_set_property (G_OBJECT (renderer), property, value);
889 /* force resize and redraw */
890 gtk_widget_queue_resize (GTK_WIDGET (cell_view));
891 gtk_widget_queue_draw (GTK_WIDGET (cell_view));
895 * gtk_cell_view_set_model:
896 * @cell_view: a #GtkCellView
897 * @model: (allow-none): a #GtkTreeModel
899 * Sets the model for @cell_view. If @cell_view already has a model
900 * set, it will remove it before setting the new model. If @model is
901 * %NULL, then it will unset the old model.
906 gtk_cell_view_set_model (GtkCellView *cell_view,
909 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
910 g_return_if_fail (model == NULL || GTK_IS_TREE_MODEL (model));
912 if (cell_view->priv->model)
914 if (cell_view->priv->displayed_row)
915 gtk_tree_row_reference_free (cell_view->priv->displayed_row);
916 cell_view->priv->displayed_row = NULL;
918 g_object_unref (cell_view->priv->model);
919 cell_view->priv->model = NULL;
922 cell_view->priv->model = model;
924 if (cell_view->priv->model)
925 g_object_ref (cell_view->priv->model);
929 * gtk_cell_view_get_model:
930 * @cell_view: a #GtkCellView
932 * Returns the model for @cell_view. If no model is used %NULL is
935 * Returns: a #GtkTreeModel used or %NULL
940 gtk_cell_view_get_model (GtkCellView *cell_view)
942 g_return_val_if_fail (GTK_IS_CELL_VIEW (cell_view), NULL);
944 return cell_view->priv->model;
948 * gtk_cell_view_set_displayed_row:
949 * @cell_view: a #GtkCellView
950 * @path: (allow-none): a #GtkTreePath or %NULL to unset.
952 * Sets the row of the model that is currently displayed
953 * by the #GtkCellView. If the path is unset, then the
954 * contents of the cellview "stick" at their last value;
955 * this is not normally a desired result, but may be
956 * a needed intermediate state if say, the model for
957 * the #GtkCellView becomes temporarily empty.
962 gtk_cell_view_set_displayed_row (GtkCellView *cell_view,
965 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
966 g_return_if_fail (GTK_IS_TREE_MODEL (cell_view->priv->model));
968 if (cell_view->priv->displayed_row)
969 gtk_tree_row_reference_free (cell_view->priv->displayed_row);
973 cell_view->priv->displayed_row =
974 gtk_tree_row_reference_new (cell_view->priv->model, path);
977 cell_view->priv->displayed_row = NULL;
979 /* force resize and redraw */
980 gtk_widget_queue_resize (GTK_WIDGET (cell_view));
981 gtk_widget_queue_draw (GTK_WIDGET (cell_view));
985 * gtk_cell_view_get_displayed_row:
986 * @cell_view: a #GtkCellView
988 * Returns a #GtkTreePath referring to the currently
989 * displayed row. If no row is currently displayed,
992 * Returns: the currently displayed row or %NULL
997 gtk_cell_view_get_displayed_row (GtkCellView *cell_view)
999 g_return_val_if_fail (GTK_IS_CELL_VIEW (cell_view), NULL);
1001 if (!cell_view->priv->displayed_row)
1004 return gtk_tree_row_reference_get_path (cell_view->priv->displayed_row);
1008 * gtk_cell_view_get_size_of_row:
1009 * @cell_view: a #GtkCellView
1010 * @path: a #GtkTreePath
1011 * @requisition: return location for the size
1013 * Sets @requisition to the size needed by @cell_view to display
1014 * the model row pointed to by @path.
1016 * Return value: %TRUE
1021 gtk_cell_view_get_size_of_row (GtkCellView *cell_view,
1023 GtkRequisition *requisition)
1025 GtkTreeRowReference *tmp;
1028 g_return_val_if_fail (GTK_IS_CELL_VIEW (cell_view), FALSE);
1029 g_return_val_if_fail (path != NULL, FALSE);
1030 g_return_val_if_fail (requisition != NULL, FALSE);
1032 tmp = cell_view->priv->displayed_row;
1033 cell_view->priv->displayed_row =
1034 gtk_tree_row_reference_new (cell_view->priv->model, path);
1036 gtk_cell_view_size_request (GTK_WIDGET (cell_view), requisition);
1038 gtk_tree_row_reference_free (cell_view->priv->displayed_row);
1039 cell_view->priv->displayed_row = tmp;
1041 /* restore actual size info */
1042 gtk_cell_view_size_request (GTK_WIDGET (cell_view), &req);
1048 * gtk_cell_view_set_background_color:
1049 * @cell_view: a #GtkCellView
1050 * @color: the new background color
1052 * Sets the background color of @view.
1057 gtk_cell_view_set_background_color (GtkCellView *cell_view,
1058 const GdkColor *color)
1060 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
1064 if (!cell_view->priv->background_set)
1066 cell_view->priv->background_set = TRUE;
1067 g_object_notify (G_OBJECT (cell_view), "background-set");
1070 cell_view->priv->background = *color;
1074 if (cell_view->priv->background_set)
1076 cell_view->priv->background_set = FALSE;
1077 g_object_notify (G_OBJECT (cell_view), "background-set");
1081 gtk_widget_queue_draw (GTK_WIDGET (cell_view));
1085 gtk_cell_view_cell_layout_get_cells (GtkCellLayout *layout)
1087 GtkCellView *cell_view = GTK_CELL_VIEW (layout);
1088 GList *retval = NULL, *list;
1090 g_return_val_if_fail (cell_view != NULL, NULL);
1092 gtk_cell_view_set_cell_data (cell_view);
1094 for (list = cell_view->priv->cell_list; list; list = list->next)
1096 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)list->data;
1098 retval = g_list_prepend (retval, info->cell);
1101 return g_list_reverse (retval);
1105 * gtk_cell_view_get_cell_renderers:
1106 * @cell_view: a #GtkCellView
1108 * Returns the cell renderers which have been added to @cell_view.
1110 * Return value: a list of cell renderers. The list, but not the
1111 * renderers has been newly allocated and should be freed with
1112 * g_list_free() when no longer needed.
1116 * Deprecated: 2.18: use gtk_cell_layout_get_cells() instead.
1119 gtk_cell_view_get_cell_renderers (GtkCellView *cell_view)
1121 return gtk_cell_view_cell_layout_get_cells (GTK_CELL_LAYOUT (cell_view));
1125 gtk_cell_view_buildable_custom_tag_start (GtkBuildable *buildable,
1126 GtkBuilder *builder,
1128 const gchar *tagname,
1129 GMarkupParser *parser,
1132 if (parent_buildable_iface->custom_tag_start &&
1133 parent_buildable_iface->custom_tag_start (buildable, builder, child,
1134 tagname, parser, data))
1137 return _gtk_cell_layout_buildable_custom_tag_start (buildable, builder, child,
1138 tagname, parser, data);
1142 gtk_cell_view_buildable_custom_tag_end (GtkBuildable *buildable,
1143 GtkBuilder *builder,
1145 const gchar *tagname,
1148 if (strcmp (tagname, "attributes") == 0)
1149 _gtk_cell_layout_buildable_custom_tag_end (buildable, builder, child, tagname,
1151 else if (parent_buildable_iface->custom_tag_end)
1152 parent_buildable_iface->custom_tag_end (buildable, builder, child, tagname,
1157 gtk_cell_view_extended_layout_get_desired_size (GtkExtendedLayout *layout,
1158 GtkRequisition *minimal_size,
1159 GtkRequisition *desired_size)
1162 gint min_width, nat_width;
1167 for (i = GTK_CELL_VIEW (layout)->priv->cell_list; i; i = i->next)
1169 GtkCellViewCellInfo *info = (GtkCellViewCellInfo *)i->data;
1171 if (info->cell->visible)
1173 min_width += info->requested_width;
1174 nat_width += info->natural_width;
1180 minimal_size->width = min_width;
1181 minimal_size->height = GTK_WIDGET (layout)->requisition.height;
1185 desired_size->width = nat_width;
1186 desired_size->height = GTK_WIDGET (layout)->requisition.height;
1191 gtk_cell_view_extended_layout_init (GtkExtendedLayoutIface *iface)
1193 iface->get_desired_size = gtk_cell_view_extended_layout_get_desired_size;
1197 #define __GTK_CELL_VIEW_C__
1198 #include "gtkaliasdef.c"