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"
24 #include "gtkcellareacontext.h"
25 #include "gtkcellareabox.h"
27 #include "gtkcellrenderertext.h"
28 #include "gtkcellrendererpixbuf.h"
29 #include "gtkprivate.h"
30 #include "gtksizerequest.h"
31 #include <gobject/gmarshal.h>
32 #include "gtkbuildable.h"
37 * @Short_description: A widget displaying a single row of a GtkTreeModel
40 * A #GtkCellView displays a single row of a #GtkTreeModel, using
41 * cell renderers just like #GtkTreeView. #GtkCellView doesn't support
42 * some of the more complex features of #GtkTreeView, like cell editing
46 struct _GtkCellViewPrivate
49 GtkTreeRowReference *displayed_row;
51 GtkCellArea *cell_area;
52 GtkCellAreaContext *cell_area_context;
55 gboolean background_set;
59 static void gtk_cell_view_cell_layout_init (GtkCellLayoutIface *iface);
60 static GObject *gtk_cell_view_constructor (GType type,
61 guint n_construct_properties,
62 GObjectConstructParam *construct_properties);
63 static void gtk_cell_view_get_property (GObject *object,
67 static void gtk_cell_view_set_property (GObject *object,
71 static void gtk_cell_view_finalize (GObject *object);
72 static void gtk_cell_view_dispose (GObject *object);
73 static void gtk_cell_view_size_allocate (GtkWidget *widget,
74 GtkAllocation *allocation);
75 static gboolean gtk_cell_view_draw (GtkWidget *widget,
77 static void gtk_cell_view_set_value (GtkCellView *cell_view,
78 GtkCellRenderer *renderer,
81 static void gtk_cell_view_set_cell_data (GtkCellView *cell_view);
84 static void gtk_cell_view_cell_layout_pack_start (GtkCellLayout *layout,
85 GtkCellRenderer *renderer,
87 static void gtk_cell_view_cell_layout_pack_end (GtkCellLayout *layout,
88 GtkCellRenderer *renderer,
90 static void gtk_cell_view_cell_layout_add_attribute (GtkCellLayout *layout,
91 GtkCellRenderer *renderer,
92 const gchar *attribute,
94 static void gtk_cell_view_cell_layout_clear (GtkCellLayout *layout);
95 static void gtk_cell_view_cell_layout_clear_attributes (GtkCellLayout *layout,
96 GtkCellRenderer *renderer);
97 static void gtk_cell_view_cell_layout_set_cell_data_func (GtkCellLayout *layout,
98 GtkCellRenderer *cell,
99 GtkCellLayoutDataFunc func,
101 GDestroyNotify destroy);
102 static void gtk_cell_view_cell_layout_reorder (GtkCellLayout *layout,
103 GtkCellRenderer *cell,
105 static GList * gtk_cell_view_cell_layout_get_cells (GtkCellLayout *layout);
106 static GtkCellArea *gtk_cell_view_cell_layout_get_area (GtkCellLayout *layout);
109 static void gtk_cell_view_buildable_init (GtkBuildableIface *iface);
110 static gboolean gtk_cell_view_buildable_custom_tag_start (GtkBuildable *buildable,
113 const gchar *tagname,
114 GMarkupParser *parser,
116 static void gtk_cell_view_buildable_custom_tag_end (GtkBuildable *buildable,
119 const gchar *tagname,
122 static void gtk_cell_view_get_preferred_width (GtkWidget *widget,
125 static void gtk_cell_view_get_preferred_height (GtkWidget *widget,
128 static void gtk_cell_view_get_preferred_width_for_height (GtkWidget *widget,
132 static void gtk_cell_view_get_preferred_height_for_width (GtkWidget *widget,
137 static GtkBuildableIface *parent_buildable_iface;
144 PROP_BACKGROUND_RGBA,
148 PROP_CELL_AREA_CONTEXT
151 G_DEFINE_TYPE_WITH_CODE (GtkCellView, gtk_cell_view, GTK_TYPE_WIDGET,
152 G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_LAYOUT,
153 gtk_cell_view_cell_layout_init)
154 G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
155 gtk_cell_view_buildable_init))
159 gtk_cell_view_class_init (GtkCellViewClass *klass)
161 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
162 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
164 gobject_class->constructor = gtk_cell_view_constructor;
165 gobject_class->get_property = gtk_cell_view_get_property;
166 gobject_class->set_property = gtk_cell_view_set_property;
167 gobject_class->finalize = gtk_cell_view_finalize;
168 gobject_class->dispose = gtk_cell_view_dispose;
170 widget_class->draw = gtk_cell_view_draw;
171 widget_class->size_allocate = gtk_cell_view_size_allocate;
172 widget_class->get_preferred_width = gtk_cell_view_get_preferred_width;
173 widget_class->get_preferred_height = gtk_cell_view_get_preferred_height;
174 widget_class->get_preferred_width_for_height = gtk_cell_view_get_preferred_width_for_height;
175 widget_class->get_preferred_height_for_width = gtk_cell_view_get_preferred_height_for_width;
178 g_object_class_install_property (gobject_class,
180 g_param_spec_string ("background",
181 P_("Background color name"),
182 P_("Background color as a string"),
184 GTK_PARAM_WRITABLE));
185 g_object_class_install_property (gobject_class,
187 g_param_spec_boxed ("background-gdk",
188 P_("Background color"),
189 P_("Background color as a GdkColor"),
191 GTK_PARAM_READWRITE));
193 * GtkCellView:background-rgba
195 * The background color as a #GdkRGBA
199 g_object_class_install_property (gobject_class,
200 PROP_BACKGROUND_RGBA,
201 g_param_spec_boxed ("background-rgba",
202 P_("Background RGBA color"),
203 P_("Background color as a GdkRGBA"),
205 GTK_PARAM_READWRITE));
210 * The model for cell view
214 g_object_class_install_property (gobject_class,
216 g_param_spec_object ("model",
217 P_("CellView model"),
218 P_("The model for cell view"),
220 GTK_PARAM_READWRITE));
224 * GtkCellView:cell-area
226 * The #GtkCellArea rendering cells
230 g_object_class_install_property (gobject_class,
232 g_param_spec_object ("cell-area",
234 P_("The GtkCellArea used to layout cells"),
236 GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
239 * GtkCellView:cell-area-context
241 * The #GtkCellAreaContext used to compute the geometry of the cell view.
245 g_object_class_install_property (gobject_class,
247 g_param_spec_object ("cell-area-context",
248 P_("Cell Area Context"),
249 P_("The GtkCellAreaContext used to "
250 "compute the geometry of the cell view"),
251 GTK_TYPE_CELL_AREA_CONTEXT,
252 GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
255 #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))
257 ADD_SET_PROP ("background-set", PROP_BACKGROUND_SET,
258 P_("Background set"),
259 P_("Whether this tag affects the background color"));
261 g_type_class_add_private (gobject_class, sizeof (GtkCellViewPrivate));
265 gtk_cell_view_buildable_init (GtkBuildableIface *iface)
267 parent_buildable_iface = g_type_interface_peek_parent (iface);
268 iface->add_child = _gtk_cell_layout_buildable_add_child;
269 iface->custom_tag_start = gtk_cell_view_buildable_custom_tag_start;
270 iface->custom_tag_end = gtk_cell_view_buildable_custom_tag_end;
274 gtk_cell_view_cell_layout_init (GtkCellLayoutIface *iface)
276 iface->pack_start = gtk_cell_view_cell_layout_pack_start;
277 iface->pack_end = gtk_cell_view_cell_layout_pack_end;
278 iface->clear = gtk_cell_view_cell_layout_clear;
279 iface->add_attribute = gtk_cell_view_cell_layout_add_attribute;
280 iface->set_cell_data_func = gtk_cell_view_cell_layout_set_cell_data_func;
281 iface->clear_attributes = gtk_cell_view_cell_layout_clear_attributes;
282 iface->reorder = gtk_cell_view_cell_layout_reorder;
283 iface->get_cells = gtk_cell_view_cell_layout_get_cells;
284 iface->get_area = gtk_cell_view_cell_layout_get_area;
288 gtk_cell_view_constructor (GType type,
289 guint n_construct_properties,
290 GObjectConstructParam *construct_properties)
294 GtkCellViewPrivate *priv;
296 object = G_OBJECT_CLASS (gtk_cell_view_parent_class)->constructor
297 (type, n_construct_properties, construct_properties);
299 view = GTK_CELL_VIEW (object);
302 if (!priv->cell_area)
304 GtkCellArea *area = gtk_cell_area_box_new ();
306 priv->cell_area = g_object_ref_sink (area);
309 if (!priv->cell_area_context)
310 priv->cell_area_context = gtk_cell_area_create_context (priv->cell_area);
316 gtk_cell_view_get_property (GObject *object,
321 GtkCellView *view = GTK_CELL_VIEW (object);
325 case PROP_BACKGROUND_GDK:
329 color.red = (guint) (view->priv->background.red * 65535);
330 color.green = (guint) (view->priv->background.green * 65535);
331 color.blue = (guint) (view->priv->background.blue * 65535);
334 g_value_set_boxed (value, &color);
337 case PROP_BACKGROUND_RGBA:
338 g_value_set_boxed (value, &view->priv->background);
340 case PROP_BACKGROUND_SET:
341 g_value_set_boolean (value, view->priv->background_set);
344 g_value_set_object (value, view->priv->model);
347 g_value_set_object (value, view->priv->cell_area);
349 case PROP_CELL_AREA_CONTEXT:
350 g_value_set_object (value, view->priv->cell_area_context);
353 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
359 gtk_cell_view_set_property (GObject *object,
364 GtkCellView *view = GTK_CELL_VIEW (object);
366 GtkCellAreaContext *context;
370 case PROP_BACKGROUND:
374 if (!g_value_get_string (value))
375 gtk_cell_view_set_background_color (view, NULL);
376 else if (gdk_color_parse (g_value_get_string (value), &color))
377 gtk_cell_view_set_background_color (view, &color);
379 g_warning ("Don't know color `%s'", g_value_get_string (value));
381 g_object_notify (object, "background-gdk");
384 case PROP_BACKGROUND_GDK:
385 gtk_cell_view_set_background_color (view, g_value_get_boxed (value));
387 case PROP_BACKGROUND_RGBA:
388 gtk_cell_view_set_background_rgba (view, g_value_get_boxed (value));
390 case PROP_BACKGROUND_SET:
391 view->priv->background_set = g_value_get_boolean (value);
394 gtk_cell_view_set_model (view, g_value_get_object (value));
397 /* Construct-only, can only be assigned once */
398 area = g_value_get_object (value);
401 view->priv->cell_area = g_object_ref_sink (area);
403 case PROP_CELL_AREA_CONTEXT:
404 /* Construct-only, can only be assigned once */
405 context = g_value_get_object (value);
408 view->priv->cell_area_context = g_object_ref (context);
412 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
418 gtk_cell_view_init (GtkCellView *cellview)
420 GtkCellViewPrivate *priv;
422 cellview->priv = G_TYPE_INSTANCE_GET_PRIVATE (cellview,
425 priv = cellview->priv;
427 gtk_widget_set_has_window (GTK_WIDGET (cellview), FALSE);
431 gtk_cell_view_finalize (GObject *object)
433 GtkCellView *cellview = GTK_CELL_VIEW (object);
435 if (cellview->priv->displayed_row)
436 gtk_tree_row_reference_free (cellview->priv->displayed_row);
438 G_OBJECT_CLASS (gtk_cell_view_parent_class)->finalize (object);
442 gtk_cell_view_dispose (GObject *object)
444 GtkCellView *cellview = GTK_CELL_VIEW (object);
446 gtk_cell_view_cell_layout_clear (GTK_CELL_LAYOUT (cellview));
448 if (cellview->priv->model)
450 g_object_unref (cellview->priv->model);
451 cellview->priv->model = NULL;
454 if (cellview->priv->cell_area)
456 g_object_unref (cellview->priv->cell_area);
457 cellview->priv->cell_area = NULL;
460 if (cellview->priv->cell_area_context)
462 g_object_unref (cellview->priv->cell_area_context);
463 cellview->priv->cell_area_context = NULL;
466 G_OBJECT_CLASS (gtk_cell_view_parent_class)->dispose (object);
470 gtk_cell_view_size_allocate (GtkWidget *widget,
471 GtkAllocation *allocation)
473 GtkCellView *cellview = GTK_CELL_VIEW (widget);
474 GtkCellViewPrivate *priv = cellview->priv;
475 gint alloc_width, alloc_height;
477 gtk_widget_set_allocation (widget, allocation);
479 gtk_cell_area_context_get_allocation (priv->cell_area_context, &alloc_width, &alloc_height);
481 /* Only allocate the GtkCellAreaContext if it has not been done for us by
482 * another widget (i.e. GtkTreeMenu)... in this case we assume that
483 * we own our GtkCellArea and GtkCellAreaContext and they are not shared with
484 * other cell views. */
485 if (alloc_width <= 0 && alloc_height <= 0)
487 gtk_cell_area_context_allocate_width (priv->cell_area_context, allocation->width);
488 gtk_cell_area_context_allocate_height (priv->cell_area_context, allocation->height);
493 gtk_cell_view_draw (GtkWidget *widget,
496 GtkCellView *cellview;
498 GtkCellRendererState state;
500 cellview = GTK_CELL_VIEW (widget);
505 area.width = gtk_widget_get_allocated_width (widget);
506 area.height = gtk_widget_get_allocated_height (widget);
508 /* "blank" background */
509 if (cellview->priv->background_set)
511 gdk_cairo_rectangle (cr, &area);
512 gdk_cairo_set_source_rgba (cr, &cellview->priv->background);
516 /* set cell data (if available) */
517 if (cellview->priv->displayed_row)
518 gtk_cell_view_set_cell_data (cellview);
519 else if (cellview->priv->model)
522 if (gtk_widget_get_state_flags (widget) & GTK_STATE_FLAG_PRELIGHT)
523 state = GTK_CELL_RENDERER_PRELIT;
524 else if (gtk_widget_get_state_flags (widget) & GTK_STATE_FLAG_INSENSITIVE)
525 state = GTK_CELL_RENDERER_INSENSITIVE;
529 /* Render the cells */
530 gtk_cell_area_render (cellview->priv->cell_area, cellview->priv->cell_area_context,
531 widget, cr, &area, &area, state, FALSE);
537 gtk_cell_view_set_cell_data (GtkCellView *cell_view)
542 g_return_if_fail (cell_view->priv->displayed_row != NULL);
544 path = gtk_tree_row_reference_get_path (cell_view->priv->displayed_row);
548 gtk_tree_model_get_iter (cell_view->priv->model, &iter, path);
549 gtk_tree_path_free (path);
551 gtk_cell_area_apply_attributes (cell_view->priv->cell_area,
552 cell_view->priv->model,
553 &iter, FALSE, FALSE);
556 /* GtkCellLayout implementation */
558 gtk_cell_view_cell_layout_pack_start (GtkCellLayout *layout,
559 GtkCellRenderer *renderer,
562 GtkCellView *cellview = GTK_CELL_VIEW (layout);
564 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview->priv->cell_area), renderer, expand);
566 gtk_widget_queue_resize (GTK_WIDGET (cellview));
570 gtk_cell_view_cell_layout_pack_end (GtkCellLayout *layout,
571 GtkCellRenderer *renderer,
574 GtkCellView *cellview = GTK_CELL_VIEW (layout);
576 gtk_cell_layout_pack_end (GTK_CELL_LAYOUT (cellview->priv->cell_area), renderer, expand);
578 gtk_widget_queue_resize (GTK_WIDGET (cellview));
582 gtk_cell_view_cell_layout_add_attribute (GtkCellLayout *layout,
583 GtkCellRenderer *renderer,
584 const gchar *attribute,
587 GtkCellView *cellview = GTK_CELL_VIEW (layout);
589 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (cellview->priv->cell_area), renderer,
594 gtk_cell_view_cell_layout_clear (GtkCellLayout *layout)
596 GtkCellView *cellview = GTK_CELL_VIEW (layout);
598 if (cellview->priv->cell_area)
599 gtk_cell_layout_clear (GTK_CELL_LAYOUT (cellview->priv->cell_area));
603 gtk_cell_view_cell_layout_set_cell_data_func (GtkCellLayout *layout,
604 GtkCellRenderer *cell,
605 GtkCellLayoutDataFunc func,
607 GDestroyNotify destroy)
609 GtkCellView *cellview = GTK_CELL_VIEW (layout);
611 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (cellview->priv->cell_area),
612 cell, func, func_data, destroy);
616 gtk_cell_view_cell_layout_clear_attributes (GtkCellLayout *layout,
617 GtkCellRenderer *renderer)
619 GtkCellView *cellview = GTK_CELL_VIEW (layout);
621 gtk_cell_layout_clear_attributes (GTK_CELL_LAYOUT (cellview->priv->cell_area), renderer);
625 gtk_cell_view_cell_layout_reorder (GtkCellLayout *layout,
626 GtkCellRenderer *cell,
629 GtkCellView *cellview = GTK_CELL_VIEW (layout);
631 gtk_cell_layout_reorder (GTK_CELL_LAYOUT (cellview->priv->cell_area), cell, position);
636 gtk_cell_view_cell_layout_get_cells (GtkCellLayout *layout)
638 GtkCellView *cellview = GTK_CELL_VIEW (layout);
640 return gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (cellview->priv->cell_area));
644 gtk_cell_view_cell_layout_get_area (GtkCellLayout *layout)
646 GtkCellView *cellview = GTK_CELL_VIEW (layout);
648 return cellview->priv->cell_area;
654 * Creates a new #GtkCellView widget.
656 * Return value: A newly created #GtkCellView widget.
661 gtk_cell_view_new (void)
663 GtkCellView *cellview;
665 cellview = g_object_new (gtk_cell_view_get_type (), NULL);
667 return GTK_WIDGET (cellview);
671 * gtk_cell_view_new_with_text:
672 * @text: the text to display in the cell view
674 * Creates a new #GtkCellView widget, adds a #GtkCellRendererText
675 * to it, and makes its show @text.
677 * Return value: A newly created #GtkCellView widget.
682 gtk_cell_view_new_with_text (const gchar *text)
684 GtkCellView *cellview;
685 GtkCellRenderer *renderer;
686 GValue value = {0, };
688 cellview = GTK_CELL_VIEW (gtk_cell_view_new ());
690 renderer = gtk_cell_renderer_text_new ();
691 gtk_cell_view_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
694 g_value_init (&value, G_TYPE_STRING);
695 g_value_set_string (&value, text);
696 gtk_cell_view_set_value (cellview, renderer, "text", &value);
697 g_value_unset (&value);
699 return GTK_WIDGET (cellview);
703 * gtk_cell_view_new_with_markup:
704 * @markup: the text to display in the cell view
706 * Creates a new #GtkCellView widget, adds a #GtkCellRendererText
707 * to it, and makes it show @markup. The text can be
708 * marked up with the <link linkend="PangoMarkupFormat">Pango text
709 * markup language</link>.
711 * Return value: A newly created #GtkCellView widget.
716 gtk_cell_view_new_with_markup (const gchar *markup)
718 GtkCellView *cellview;
719 GtkCellRenderer *renderer;
720 GValue value = {0, };
722 cellview = GTK_CELL_VIEW (gtk_cell_view_new ());
724 renderer = gtk_cell_renderer_text_new ();
725 gtk_cell_view_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
728 g_value_init (&value, G_TYPE_STRING);
729 g_value_set_string (&value, markup);
730 gtk_cell_view_set_value (cellview, renderer, "markup", &value);
731 g_value_unset (&value);
733 return GTK_WIDGET (cellview);
737 * gtk_cell_view_new_with_pixbuf:
738 * @pixbuf: the image to display in the cell view
740 * Creates a new #GtkCellView widget, adds a #GtkCellRendererPixbuf
741 * to it, and makes its show @pixbuf.
743 * Return value: A newly created #GtkCellView widget.
748 gtk_cell_view_new_with_pixbuf (GdkPixbuf *pixbuf)
750 GtkCellView *cellview;
751 GtkCellRenderer *renderer;
752 GValue value = {0, };
754 cellview = GTK_CELL_VIEW (gtk_cell_view_new ());
756 renderer = gtk_cell_renderer_pixbuf_new ();
757 gtk_cell_view_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
760 g_value_init (&value, GDK_TYPE_PIXBUF);
761 g_value_set_object (&value, pixbuf);
762 gtk_cell_view_set_value (cellview, renderer, "pixbuf", &value);
763 g_value_unset (&value);
765 return GTK_WIDGET (cellview);
769 * gtk_cell_view_set_value:
770 * @cell_view: a #GtkCellView widget
771 * @renderer: one of the renderers of @cell_view
772 * @property: the name of the property of @renderer to set
773 * @value: the new value to set the property to
775 * Sets a property of a cell renderer of @cell_view, and
776 * makes sure the display of @cell_view is updated.
781 gtk_cell_view_set_value (GtkCellView *cell_view,
782 GtkCellRenderer *renderer,
786 g_object_set_property (G_OBJECT (renderer), property, value);
788 /* force resize and redraw */
789 gtk_widget_queue_resize (GTK_WIDGET (cell_view));
790 gtk_widget_queue_draw (GTK_WIDGET (cell_view));
794 * gtk_cell_view_set_model:
795 * @cell_view: a #GtkCellView
796 * @model: (allow-none): a #GtkTreeModel
798 * Sets the model for @cell_view. If @cell_view already has a model
799 * set, it will remove it before setting the new model. If @model is
800 * %NULL, then it will unset the old model.
805 gtk_cell_view_set_model (GtkCellView *cell_view,
808 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
809 g_return_if_fail (model == NULL || GTK_IS_TREE_MODEL (model));
811 if (cell_view->priv->model)
813 if (cell_view->priv->displayed_row)
814 gtk_tree_row_reference_free (cell_view->priv->displayed_row);
815 cell_view->priv->displayed_row = NULL;
817 g_object_unref (cell_view->priv->model);
818 cell_view->priv->model = NULL;
821 cell_view->priv->model = model;
823 if (cell_view->priv->model)
824 g_object_ref (cell_view->priv->model);
828 * gtk_cell_view_get_model:
829 * @cell_view: a #GtkCellView
831 * Returns the model for @cell_view. If no model is used %NULL is
834 * Returns: (transfer none): a #GtkTreeModel used or %NULL
839 gtk_cell_view_get_model (GtkCellView *cell_view)
841 g_return_val_if_fail (GTK_IS_CELL_VIEW (cell_view), NULL);
843 return cell_view->priv->model;
847 * gtk_cell_view_set_displayed_row:
848 * @cell_view: a #GtkCellView
849 * @path: (allow-none): a #GtkTreePath or %NULL to unset.
851 * Sets the row of the model that is currently displayed
852 * by the #GtkCellView. If the path is unset, then the
853 * contents of the cellview "stick" at their last value;
854 * this is not normally a desired result, but may be
855 * a needed intermediate state if say, the model for
856 * the #GtkCellView becomes temporarily empty.
861 gtk_cell_view_set_displayed_row (GtkCellView *cell_view,
864 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
865 g_return_if_fail (GTK_IS_TREE_MODEL (cell_view->priv->model));
867 if (cell_view->priv->displayed_row)
868 gtk_tree_row_reference_free (cell_view->priv->displayed_row);
872 cell_view->priv->displayed_row =
873 gtk_tree_row_reference_new (cell_view->priv->model, path);
876 cell_view->priv->displayed_row = NULL;
878 /* force resize and redraw */
879 gtk_widget_queue_resize (GTK_WIDGET (cell_view));
880 gtk_widget_queue_draw (GTK_WIDGET (cell_view));
884 * gtk_cell_view_get_displayed_row:
885 * @cell_view: a #GtkCellView
887 * Returns a #GtkTreePath referring to the currently
888 * displayed row. If no row is currently displayed,
891 * Returns: the currently displayed row or %NULL
896 gtk_cell_view_get_displayed_row (GtkCellView *cell_view)
898 g_return_val_if_fail (GTK_IS_CELL_VIEW (cell_view), NULL);
900 if (!cell_view->priv->displayed_row)
903 return gtk_tree_row_reference_get_path (cell_view->priv->displayed_row);
907 * gtk_cell_view_get_size_of_row:
908 * @cell_view: a #GtkCellView
909 * @path: a #GtkTreePath
910 * @requisition: return location for the size
912 * Sets @requisition to the size needed by @cell_view to display
913 * the model row pointed to by @path.
915 * Return value: %TRUE
919 * Deprecated: 3.0: Use gtk_cell_view_get_desired_width_of_row() and
920 * gtk_cell_view_get_desired_height_for_width_of_row() instead.
923 gtk_cell_view_get_size_of_row (GtkCellView *cell_view,
925 GtkRequisition *requisition)
929 g_return_val_if_fail (GTK_IS_CELL_VIEW (cell_view), FALSE);
930 g_return_val_if_fail (path != NULL, FALSE);
932 /* Return the minimum height for the minimum width */
933 gtk_cell_view_get_desired_width_of_row (cell_view, path, &req.width, NULL);
934 gtk_cell_view_get_desired_height_for_width_of_row (cell_view, path, req.width, &req.height, NULL);
944 * gtk_cell_view_get_desired_width_of_row:
945 * @cell_view: a #GtkCellView
946 * @path: a #GtkTreePath
947 * @minimum_size: location to store the minimum size
948 * @natural_size: location to store the natural size
950 * Sets @minimum_size and @natural_size to the width desired by @cell_view
951 * to display the model row pointed to by @path.
956 gtk_cell_view_get_desired_width_of_row (GtkCellView *cell_view,
961 GtkTreeRowReference *tmp;
963 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
964 g_return_if_fail (path != NULL);
965 g_return_if_fail (minimum_size != NULL || natural_size != NULL);
967 tmp = cell_view->priv->displayed_row;
968 cell_view->priv->displayed_row =
969 gtk_tree_row_reference_new (cell_view->priv->model, path);
971 gtk_cell_view_get_preferred_width (GTK_WIDGET (cell_view), minimum_size, natural_size);
973 gtk_tree_row_reference_free (cell_view->priv->displayed_row);
974 cell_view->priv->displayed_row = tmp;
976 /* Restore active size (this will restore the cellrenderer info->width/requested_width's) */
977 gtk_cell_view_get_preferred_width (GTK_WIDGET (cell_view), NULL, NULL);
982 * gtk_cell_view_get_desired_height_for_width_of_row:
983 * @cell_view: a #GtkCellView
984 * @path: a #GtkTreePath
985 * @avail_size: available width
986 * @minimum_size: location to store the minimum height
987 * @natural_size: location to store the natural height
989 * Sets @minimum_size and @natural_size to the height desired by @cell_view
990 * if it were allocated a width of @avail_size to display the model row
991 * pointed to by @path.
996 gtk_cell_view_get_desired_height_for_width_of_row (GtkCellView *cell_view,
1002 GtkTreeRowReference *tmp;
1004 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
1005 g_return_if_fail (path != NULL);
1006 g_return_if_fail (minimum_size != NULL || natural_size != NULL);
1008 tmp = cell_view->priv->displayed_row;
1009 cell_view->priv->displayed_row =
1010 gtk_tree_row_reference_new (cell_view->priv->model, path);
1012 /* Then get the collective height_for_width based on the cached values */
1013 gtk_cell_view_get_preferred_height_for_width (GTK_WIDGET (cell_view), avail_size, minimum_size, natural_size);
1015 gtk_tree_row_reference_free (cell_view->priv->displayed_row);
1016 cell_view->priv->displayed_row = tmp;
1018 /* Restore active size (this will restore the cellrenderer info->width/requested_width's) */
1019 gtk_cell_view_get_preferred_width (GTK_WIDGET (cell_view), NULL, NULL);
1023 * gtk_cell_view_set_background_color:
1024 * @cell_view: a #GtkCellView
1025 * @color: the new background color
1027 * Sets the background color of @view.
1032 gtk_cell_view_set_background_color (GtkCellView *cell_view,
1033 const GdkColor *color)
1035 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
1039 if (!cell_view->priv->background_set)
1041 cell_view->priv->background_set = TRUE;
1042 g_object_notify (G_OBJECT (cell_view), "background-set");
1045 cell_view->priv->background.red = color->red / 65535.;
1046 cell_view->priv->background.green = color->green / 65535.;
1047 cell_view->priv->background.blue = color->blue / 65535.;
1048 cell_view->priv->background.alpha = 1;
1052 if (cell_view->priv->background_set)
1054 cell_view->priv->background_set = FALSE;
1055 g_object_notify (G_OBJECT (cell_view), "background-set");
1059 gtk_widget_queue_draw (GTK_WIDGET (cell_view));
1063 * gtk_cell_view_set_background_rgba:
1064 * @cell_view: a #GtkCellView
1065 * @rgba: the new background color
1067 * Sets the background color of @cell_view.
1072 gtk_cell_view_set_background_rgba (GtkCellView *cell_view,
1073 const GdkRGBA *rgba)
1075 g_return_if_fail (GTK_IS_CELL_VIEW (cell_view));
1079 if (!cell_view->priv->background_set)
1081 cell_view->priv->background_set = TRUE;
1082 g_object_notify (G_OBJECT (cell_view), "background-set");
1085 cell_view->priv->background = *rgba;
1089 if (cell_view->priv->background_set)
1091 cell_view->priv->background_set = FALSE;
1092 g_object_notify (G_OBJECT (cell_view), "background-set");
1096 gtk_widget_queue_draw (GTK_WIDGET (cell_view));
1100 gtk_cell_view_buildable_custom_tag_start (GtkBuildable *buildable,
1101 GtkBuilder *builder,
1103 const gchar *tagname,
1104 GMarkupParser *parser,
1107 if (parent_buildable_iface->custom_tag_start &&
1108 parent_buildable_iface->custom_tag_start (buildable, builder, child,
1109 tagname, parser, data))
1112 return _gtk_cell_layout_buildable_custom_tag_start (buildable, builder, child,
1113 tagname, parser, data);
1117 gtk_cell_view_buildable_custom_tag_end (GtkBuildable *buildable,
1118 GtkBuilder *builder,
1120 const gchar *tagname,
1123 if (strcmp (tagname, "attributes") == 0)
1124 _gtk_cell_layout_buildable_custom_tag_end (buildable, builder, child, tagname,
1126 else if (parent_buildable_iface->custom_tag_end)
1127 parent_buildable_iface->custom_tag_end (buildable, builder, child, tagname,
1132 gtk_cell_view_get_preferred_width (GtkWidget *widget,
1136 GtkCellView *cellview = GTK_CELL_VIEW (widget);
1137 GtkCellViewPrivate *priv = cellview->priv;
1139 if (cellview->priv->displayed_row)
1140 gtk_cell_view_set_cell_data (cellview);
1142 gtk_cell_area_get_preferred_width (priv->cell_area, priv->cell_area_context, widget, NULL, NULL);
1143 gtk_cell_area_context_sum_preferred_width (priv->cell_area_context);
1144 gtk_cell_area_context_get_preferred_width (priv->cell_area_context, minimum_size, natural_size);
1148 gtk_cell_view_get_preferred_height (GtkWidget *widget,
1152 GtkCellView *cellview = GTK_CELL_VIEW (widget);
1153 GtkCellViewPrivate *priv = cellview->priv;
1155 if (cellview->priv->displayed_row)
1156 gtk_cell_view_set_cell_data (cellview);
1158 gtk_cell_area_get_preferred_height (priv->cell_area, priv->cell_area_context, widget, NULL, NULL);
1159 gtk_cell_area_context_sum_preferred_height (priv->cell_area_context);
1160 gtk_cell_area_context_get_preferred_height (priv->cell_area_context, minimum_size, natural_size);
1164 gtk_cell_view_get_preferred_width_for_height (GtkWidget *widget,
1169 GtkCellView *cellview = GTK_CELL_VIEW (widget);
1170 GtkCellViewPrivate *priv = cellview->priv;
1172 if (cellview->priv->displayed_row)
1173 gtk_cell_view_set_cell_data (cellview);
1175 gtk_cell_area_get_preferred_width_for_height (priv->cell_area, priv->cell_area_context, widget,
1176 for_size, minimum_size, natural_size);
1180 gtk_cell_view_get_preferred_height_for_width (GtkWidget *widget,
1185 GtkCellView *cellview = GTK_CELL_VIEW (widget);
1186 GtkCellViewPrivate *priv = cellview->priv;
1188 if (cellview->priv->displayed_row)
1189 gtk_cell_view_set_cell_data (cellview);
1191 gtk_cell_area_get_preferred_height_for_width (priv->cell_area, priv->cell_area_context, widget,
1192 for_size, minimum_size, natural_size);