2 * This file is part of hildon-libs
4 * Copyright (C) 2005 Nokia Corporation.
6 * Contact: Luc Pionchon <luc.pionchon@nokia.com>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; either version 2.1 of
11 * the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 * @file hildon-grid-item.c
28 * This file contains the implementation of HildonGridItem.
29 * HildonGridItem is an item mainly used in HildonGrid. It has an icon,
36 * - play with libtool to get _-functions private but accesable from grid
47 #include <gtk/gtklabel.h>
48 #include <gtk/gtkicontheme.h>
49 #include <gtk/gtkimage.h>
50 #include <gtk/gtkmisc.h>
51 #include <gtk/gtkwidget.h>
52 #include <gtk/gtkenums.h>
53 #include <pango/pango.h>
55 #include "hildon-grid-item-private.h"
56 #include <hildon-widgets/hildon-grid-item.h>
59 #define _(String) dgettext(PACKAGE, String)
61 #define HILDON_GRID_ITEM_GET_PRIVATE(obj) \
62 (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HILDON_TYPE_GRID_ITEM, \
63 HildonGridItemPrivate))
65 typedef struct _HildonGridItemPrivate HildonGridItemPrivate;
69 #define DEFAULT_ICON_BASENAME "qgn_list_gene_unknown_file"
70 #define HILDON_GRID_ICON_SIZE 26
71 #define HILDON_GRID_EMBLEM_SIZE 16
73 /* Use some alpha-thing for emblems. */
74 #define USE_DIRTY_ALPHA
76 struct _HildonGridItemPrivate {
81 gchar *emblem_basename;
84 GtkWidget *label; /* TODO use pango! */
85 HildonGridPositionType label_pos;
89 gint label_icon_margin;
95 gint pending_icon_size;
96 gint pending_emblem_size;
97 HildonGridPositionType pending_label_pos;
98 gint pending_focus_margin;
99 gint pending_label_height;
100 gint pending_label_icon_margin;
101 gint pending_icon_width;
102 gint pending_icon_height;
110 static void hildon_grid_item_class_init(HildonGridItemClass * klass);
111 static void hildon_grid_item_init(HildonGridItem * item);
112 static gboolean hildon_grid_item_expose(GtkWidget * widget,
113 GdkEventExpose * event);
114 static void hildon_grid_item_size_request(GtkWidget * widget,
115 GtkRequisition * requisition);
116 static void hildon_grid_item_size_allocate(GtkWidget * widget,
117 GtkAllocation * allocation);
118 static void hildon_grid_item_forall(GtkContainer * container,
119 gboolean include_int,
120 GtkCallback callback,
121 gpointer callback_data);
122 static void hildon_grid_item_remove(GtkContainer * container,
125 static void hildon_grid_item_finalize(GObject * object);
127 static void update_icon(HildonGridItem * item);
128 static void set_label_justify(HildonGridItem * item);
130 static void hildon_grid_item_set_icon_size(HildonGridItem *item,
131 HildonGridItemIconSizeType icon_size);
134 static GtkContainerClass *parent_class = NULL;
138 hildon_grid_item_get_type(void)
140 static GType grid_item_type = 0;
142 if (!grid_item_type) {
143 static const GTypeInfo grid_item_info = {
144 sizeof(HildonGridItemClass),
145 NULL, /* base_init */
146 NULL, /* base_finalize */
147 (GClassInitFunc) hildon_grid_item_class_init,
148 NULL, /* class_finalize */
149 NULL, /* class_data */
150 sizeof(HildonGridItem),
152 (GInstanceInitFunc) hildon_grid_item_init,
154 grid_item_type = g_type_register_static(GTK_TYPE_CONTAINER,
159 return grid_item_type;
163 hildon_grid_item_class_init(HildonGridItemClass *klass)
165 GtkWidgetClass *widget_class;
166 GtkContainerClass *container_class;
167 GObjectClass *gobject_class;
169 widget_class = GTK_WIDGET_CLASS(klass);
170 gobject_class = G_OBJECT_CLASS(klass);
171 container_class = GTK_CONTAINER_CLASS(klass);
173 parent_class = g_type_class_peek_parent(klass);
175 g_type_class_add_private(klass, sizeof(HildonGridItemPrivate));
177 gobject_class->finalize = hildon_grid_item_finalize;
179 widget_class->expose_event = hildon_grid_item_expose;
180 widget_class->size_request = hildon_grid_item_size_request;
181 widget_class->size_allocate = hildon_grid_item_size_allocate;
183 container_class->forall = hildon_grid_item_forall;
184 container_class->remove = hildon_grid_item_remove;
188 hildon_grid_item_init(HildonGridItem *item)
190 HildonGridItemPrivate *priv;
192 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
194 priv->icon_basename = NULL;
195 priv->pending_icon_size = priv->icon_size = HILDON_GRID_ICON_SIZE;
198 priv->emblem_basename = NULL;
199 priv->pending_emblem_size = priv->emblem_size = HILDON_GRID_EMBLEM_SIZE;
202 priv->pending_label_pos = priv->label_pos =
203 HILDON_GRID_ITEM_LABEL_POS_BOTTOM;
205 priv->selected = FALSE;
207 priv->pending_focus_margin = priv->focus_margin = 6;
208 priv->pending_label_height = priv->label_height = 30;
209 priv->pending_label_icon_margin = priv->label_icon_margin = 6;
210 priv->pending_icon_width = priv->icon_width = 64;
211 priv->pending_icon_height = priv->icon_height = 54;
212 priv->pending_label_height = priv->label_height = 30;
216 * hildon_grid_item_new:
217 * @icon_basename: Icon base name
219 * Creates a new #HildonGridItem.
221 * Return value: A new #HildonGridItem
224 hildon_grid_item_new(const gchar *icon_basename)
226 HildonGridItem *item;
227 HildonGridItemPrivate *priv;
229 item = g_object_new(HILDON_TYPE_GRID_ITEM, NULL);
230 GTK_WIDGET_SET_FLAGS(GTK_WIDGET(item), GTK_CAN_FOCUS);
232 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
233 priv->icon_basename = g_strdup(icon_basename);
235 priv->label = gtk_label_new("");
236 gtk_widget_set_parent(priv->label, GTK_WIDGET(item));
237 gtk_widget_set_name(priv->label, "hildon-grid-item-label");
240 set_label_justify(item);
242 gtk_widget_show(priv->label);
244 return GTK_WIDGET(item);
248 * hildon_grid_item_new_with_label:
249 * @icon_basename: Icon base name
250 * @label: Text label for icon
252 * Creates a new #HildonGridItem.
254 * Return value: A new #HildonGridItem
257 hildon_grid_item_new_with_label(const gchar *icon_basename,
260 HildonGridItem *item;
261 HildonGridItemPrivate *priv;
264 item = g_object_new(HILDON_TYPE_GRID_ITEM, NULL);
265 GTK_WIDGET_SET_FLAGS(GTK_WIDGET(item), GTK_CAN_FOCUS);
267 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
268 priv->icon_basename = g_strdup(icon_basename);
270 priv->label = gtk_label_new(label != NULL ? label : "");
271 gtk_widget_set_name(priv->label, "hildon-grid-item-label");
272 gtk_widget_set_parent(priv->label, GTK_WIDGET(item));
275 set_label_justify(item);
277 gtk_widget_show(priv->label);
279 return GTK_WIDGET(item);
284 update_icon(HildonGridItem *item)
286 GtkIconTheme *icon_theme;
288 GdkPixbuf *emblem_icon;
289 HildonGridItemPrivate *priv;
292 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
294 if (priv->icon != NULL) {
295 if (GTK_WIDGET_VISIBLE(priv->icon))
296 gtk_widget_hide(priv->icon);
297 gtk_widget_unparent(priv->icon);
300 icon_theme = gtk_icon_theme_get_default();
302 /* Load icon. Fall to default it loading fails. */
304 icon = gtk_icon_theme_load_icon(icon_theme,
306 priv->icon_size, 0, &error);
308 g_warning("Couldn't load icon \"%s\": %s", priv->icon_basename,
313 icon = gtk_icon_theme_load_icon(icon_theme,
314 DEFAULT_ICON_BASENAME,
315 priv->icon_size, 0, &error);
317 g_warning("Couldn't load default icon: %s!\n", error->message);
321 priv->icon_width = gdk_pixbuf_get_width(icon);
322 priv->icon_height = gdk_pixbuf_get_height(icon);
325 /* Load and merge emblem if one is specified. */
326 if (priv->emblem_basename != NULL) {
328 emblem_icon = gtk_icon_theme_load_icon(icon_theme,
329 priv->emblem_basename,
332 if (emblem_icon == NULL) {
333 g_warning("Couldn't load emblem \"%s\": %s",
334 priv->emblem_basename, error->message);
338 gint width, height, y;
340 #ifdef USE_DIRTY_ALPHA
344 icon_height = gdk_pixbuf_get_height(icon);
345 width = MIN(gdk_pixbuf_get_width(emblem_icon),
346 gdk_pixbuf_get_width(icon));
347 height = MIN(gdk_pixbuf_get_height(emblem_icon), icon_height);
348 y = icon_height - height;
349 #ifndef USE_DIRTY_ALPHA
350 gdk_pixbuf_copy_area(emblem_icon, 0, 0, width, height,
354 * Using composite to copy emblem to lower left corner creates
355 * some garbage on top of emblem. This way it can be avoided.
357 tmp = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE,
358 8, width, icon_height);
359 gdk_pixbuf_fill(tmp, 0x00000000);
360 gdk_pixbuf_copy_area(emblem_icon, 0, 0, width, height,
362 gdk_pixbuf_composite(tmp, icon,
363 0, 0, width, icon_height,
365 GDK_INTERP_NEAREST, 255);
367 #endif /* ifndef else USE_DIRTY_ALPHA */
368 g_object_unref(emblem_icon);
372 priv->icon = gtk_image_new_from_pixbuf(icon);
373 g_object_unref(icon);
375 gtk_widget_set_parent(priv->icon, GTK_WIDGET(item));
376 gtk_widget_show(priv->icon);
378 gtk_widget_queue_draw(priv->icon);
382 _hildon_grid_item_set_label(HildonGridItem *item, const gchar *label)
384 HildonGridItemPrivate *priv;
386 g_return_if_fail(HILDON_IS_GRID_ITEM(item));
388 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
389 if ((priv->label == NULL && label == NULL) ||
390 (priv->label != NULL && label != NULL &&
391 strcmp((char *) priv->label, (char *) label) == 0)) {
394 gtk_label_set_label(GTK_LABEL(priv->label), label);
398 hildon_grid_item_set_icon_size(HildonGridItem *item,
399 HildonGridItemIconSizeType icon_size)
401 HildonGridItemPrivate *priv;
403 g_return_if_fail(HILDON_IS_GRID_ITEM(item));
405 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
406 if (priv->pending_icon_size == icon_size) {
409 priv->pending_icon_size = icon_size;
414 _hildon_grid_item_set_label_pos(HildonGridItem *item,
415 HildonGridPositionType label_pos)
417 HildonGridItemPrivate *priv;
419 g_return_if_fail(HILDON_IS_GRID_ITEM(item));
421 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
422 if (priv->pending_label_pos == label_pos) {
425 priv->pending_label_pos = label_pos;
430 _hildon_grid_item_set_emblem_size(HildonGridItem *item, gint emblem_size)
432 HildonGridItemPrivate *priv;
434 g_return_if_fail(HILDON_IS_GRID_ITEM(item));
436 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
437 if (priv->pending_emblem_size == emblem_size) {
440 priv->pending_emblem_size = emblem_size;
445 _hildon_grid_item_set_focus_margin(HildonGridItem *item,
446 const gint focus_margin)
448 HildonGridItemPrivate *priv;
450 g_return_if_fail(HILDON_IS_GRID_ITEM(item));
452 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
453 if (priv->pending_focus_margin == focus_margin) {
456 priv->pending_focus_margin = focus_margin;
461 _hildon_grid_item_set_label_height(HildonGridItem *item,
462 const gint label_height)
464 HildonGridItemPrivate *priv;
466 g_return_if_fail(HILDON_IS_GRID_ITEM(item));
468 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
469 if (priv->pending_label_height == label_height) {
472 priv->pending_label_height = label_height;
477 _hildon_grid_item_set_label_icon_margin(HildonGridItem *item,
478 const gint label_icon_margin)
480 HildonGridItemPrivate *priv;
482 g_return_if_fail(HILDON_IS_GRID_ITEM(item));
484 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
485 if (priv->pending_label_icon_margin == label_icon_margin) {
488 priv->pending_label_icon_margin = label_icon_margin;
493 _hildon_grid_item_set_icon_height(HildonGridItem *item,
494 const gint icon_height)
496 HildonGridItemPrivate *priv;
498 g_return_if_fail(HILDON_IS_GRID_ITEM(item));
500 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
501 if (priv->pending_icon_height == icon_height) {
504 priv->pending_icon_height = icon_height;
509 _hildon_grid_item_set_icon_width(HildonGridItem *item,
510 const gint icon_width)
512 HildonGridItemPrivate *priv;
514 g_return_if_fail(HILDON_IS_GRID_ITEM(item));
516 hildon_grid_item_set_icon_size(item, icon_width);
518 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
519 if (priv->pending_icon_width == icon_width) {
522 priv->pending_icon_width = icon_width;
527 set_label_justify(HildonGridItem *item)
529 HildonGridItemPrivate *priv;
531 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
533 if (priv->label != NULL) {
534 switch (priv->label_pos) {
535 case HILDON_GRID_ITEM_LABEL_POS_BOTTOM:
536 gtk_misc_set_alignment(GTK_MISC(priv->label), 0.5, 0.5);
539 case HILDON_GRID_ITEM_LABEL_POS_RIGHT:
540 gtk_misc_set_alignment(GTK_MISC(priv->label), 0.0, 0.5);
544 g_warning("Invalid position!");
551 hildon_grid_item_remove(GtkContainer *container, GtkWidget *child)
553 HildonGridItem *item;
554 HildonGridItemPrivate *priv;
556 item = HILDON_GRID_ITEM(container);
557 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
559 g_return_if_fail(GTK_IS_WIDGET(child));
560 g_return_if_fail(child == priv->label || child == priv->icon);
562 if (child == priv->label) {
563 gtk_widget_unparent(child);
565 } else if (child == priv->icon) {
566 gtk_widget_unparent(child);
572 hildon_grid_item_expose(GtkWidget *widget, GdkEventExpose *event)
574 HildonGridItem *item;
575 HildonGridItemPrivate *priv;
577 g_return_val_if_fail(widget, FALSE);
578 g_return_val_if_fail(HILDON_IS_GRID_ITEM(widget), FALSE);
579 g_return_val_if_fail(event, FALSE);
581 item = HILDON_GRID_ITEM(widget);
582 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
584 if (priv->label == NULL && priv->icon == NULL) {
587 if (GTK_WIDGET_HAS_FOCUS(GTK_WIDGET(item))) {
591 if (priv->label != NULL) {
592 focused = priv->label;
594 focused = priv->icon;
597 switch (priv->label_pos) {
598 case HILDON_GRID_ITEM_LABEL_POS_BOTTOM:
599 clip.x = focused->allocation.x - priv->focus_margin;
600 clip.y = focused->allocation.y;
601 clip.width = focused->allocation.width + priv->focus_margin * 2;
602 clip.height = focused->allocation.height;
603 if (clip.x < widget->allocation.x ||
604 clip.width > widget->allocation.width) {
605 clip.x = widget->allocation.x;
606 clip.width = widget->allocation.width;
608 if (clip.y + clip.height >
609 widget->allocation.y + widget->allocation.height) {
610 clip.height = widget->allocation.y +
611 widget->allocation.height - clip.y;
615 case HILDON_GRID_ITEM_LABEL_POS_RIGHT:
616 clip.x = widget->allocation.x;
617 clip.y = widget->allocation.y;
618 clip.width = widget->allocation.width;
619 clip.height = widget->allocation.height;
623 gtk_paint_box(focused->style,
624 gtk_widget_get_toplevel(focused)->window,
627 &clip, focused, "selected",
628 clip.x, clip.y, clip.width, clip.height);
632 * Items are not exposed unless they are visible.
633 * -> No need to "optimize" by checking if they need exposing.
635 gtk_container_propagate_expose(GTK_CONTAINER(widget),
637 gtk_container_propagate_expose(GTK_CONTAINER(widget),
644 hildon_grid_item_size_request(GtkWidget *widget, GtkRequisition *requisition)
646 HildonGridItem *item;
647 HildonGridItemPrivate *priv;
648 GtkRequisition label_req;
651 item = HILDON_GRID_ITEM(widget);
652 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
654 label_margin = priv->focus_margin;
656 gtk_widget_size_request(priv->icon, requisition);
657 gtk_widget_size_request(priv->label, &label_req);
659 switch (priv->label_pos) {
660 case HILDON_GRID_ITEM_LABEL_POS_BOTTOM:
661 requisition->width = MAX(requisition->width, label_req.width);
662 requisition->height += label_req.height + label_margin;
665 case HILDON_GRID_ITEM_LABEL_POS_RIGHT:
666 requisition->width += label_req.width + label_margin;
667 requisition->height = MAX(requisition->height, label_req.height);
670 g_warning("bad position");
677 hildon_grid_item_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
679 HildonGridItem *item;
680 HildonGridItemPrivate *priv;
681 GtkRequisition l_req;
682 GtkAllocation i_alloc, l_alloc;
684 g_return_if_fail(widget);
685 g_return_if_fail(allocation);
687 item = HILDON_GRID_ITEM(widget);
688 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
689 widget->allocation = *allocation;
691 /* If creating label and icon failed, don't show a thing... */
692 if (priv->label == NULL && priv->icon == NULL) {
695 if (priv->label != NULL) {
696 gtk_widget_get_child_requisition(priv->label, &l_req);
698 l_req.width = l_req.height = 0;
701 switch (priv->label_pos) {
702 case HILDON_GRID_ITEM_LABEL_POS_BOTTOM:
703 i_alloc.x = (allocation->width - priv->icon_width) / 2 +
705 if (priv->label != NULL) {
706 i_alloc.y = allocation->y + (allocation->height -
708 priv->label_icon_margin -
709 priv->icon_height) / 2;
711 i_alloc.y = (allocation->height - priv->icon_height) / 2 +
715 if (priv->label != NULL) {
716 l_alloc.x = allocation->x + priv->focus_margin;
717 l_alloc.y = i_alloc.y + priv->icon_height +
718 priv->label_icon_margin;
719 l_alloc.width = allocation->width - priv->focus_margin * 2;
720 l_alloc.height = priv->label_height;
724 case HILDON_GRID_ITEM_LABEL_POS_RIGHT:
725 i_alloc.x = allocation->x + priv->focus_margin;
726 i_alloc.y = allocation->y +
727 (priv->label_height - priv->icon_height) / 2;
729 if (priv->label != NULL) {
730 l_alloc.x = allocation->x + priv->focus_margin +
731 priv->icon_width + priv->label_icon_margin;
732 l_alloc.y = allocation->y;
733 l_alloc.width = allocation->width - priv->focus_margin * 2 -
734 priv->label_icon_margin - priv->icon_width;
735 l_alloc.height = priv->label_height;
739 g_warning("bad label position");
744 if (i_alloc.y < allocation->y) {
745 i_alloc.height -= i_alloc.height - allocation->height;
746 i_alloc.y = allocation->y;
748 if (i_alloc.y + i_alloc.height > allocation->y + allocation->height) {
749 i_alloc.height-= i_alloc.y + i_alloc.height -
750 allocation->y - allocation->height;
754 i_alloc.width = priv->icon_width;
755 i_alloc.height = priv->icon_height;
757 if (priv->label != NULL) {
758 gtk_widget_size_allocate(priv->label, &l_alloc);
760 if (priv->icon != NULL) {
761 gtk_widget_size_allocate(priv->icon, &i_alloc);
766 hildon_grid_item_forall(GtkContainer *container,
767 gboolean include_int,
768 GtkCallback callback,
769 gpointer callback_data)
771 HildonGridItem *item;
772 HildonGridItemPrivate *priv;
774 g_return_if_fail(container);
775 g_return_if_fail(callback);
777 item = HILDON_GRID_ITEM(container);
778 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
780 if (priv->icon != NULL) {
781 (*callback) (priv->icon, callback_data);
783 if (priv->label != NULL) {
784 (*callback) (priv->label, callback_data);
789 hildon_grid_item_finalize(GObject *object)
791 HildonGridItem *item;
792 HildonGridItemPrivate *priv;
794 item = HILDON_GRID_ITEM(object);
795 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
797 g_free(priv->icon_basename);
798 if (priv->emblem_basename != NULL) {
799 g_free(priv->emblem_basename);
802 G_OBJECT_CLASS(parent_class)->finalize(object);
806 static int hildon_time_get_font_width(GtkWidget * widget)
808 PangoContext *context;
809 PangoFontMetrics *metrics;
812 context = gtk_widget_get_pango_context(widget);
813 metrics = pango_context_get_metrics(context,
814 widget->style->font_desc,
815 pango_context_get_language
818 digit_width = pango_font_metrics_get_approximate_digit_width(metrics);
819 digit_width = PANGO_PIXELS(digit_width);
821 pango_font_metrics_unref(metrics);
829 * hildon_grid_item_set_emblem_type:
830 * @item: #HildonGridItem
831 * @emblem_basename: Emblem's basename
833 * Sets item emblem type.
836 hildon_grid_item_set_emblem_type(HildonGridItem *item,
837 const gchar *emblem_basename)
839 HildonGridItemPrivate *priv;
841 g_return_if_fail(HILDON_IS_GRID_ITEM(item));
843 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
845 if (priv->emblem_basename != NULL) {
846 g_free(priv->emblem_basename);
849 priv->emblem_basename = g_strdup(emblem_basename);
855 * hildon_grid_item_get_emblem_type:
856 * @item: #HildonGridItem
858 * Returns emblem's basename. Must not be changed or freed.
860 * Return value: Emblem's basename
863 hildon_grid_item_get_emblem_type(HildonGridItem *item)
865 g_return_val_if_fail(HILDON_IS_GRID_ITEM(item), NULL);
867 return HILDON_GRID_ITEM_GET_PRIVATE(item)->emblem_basename;
873 _hildon_grid_item_done_updating_settings(HildonGridItem *item)
875 gboolean need_update_icon;
876 gboolean need_resize;
878 HildonGridItemPrivate *priv;
879 g_return_if_fail(HILDON_IS_GRID_ITEM(item));
880 priv = HILDON_GRID_ITEM_GET_PRIVATE(item);
882 need_update_icon = need_resize = FALSE;
884 if (priv->pending_icon_size != priv->icon_size) {
885 if (priv->pending_icon_size > 0) {
886 priv->icon_size = priv->pending_icon_size;
890 need_update_icon = TRUE;
892 if (priv->pending_emblem_size != priv->emblem_size) {
893 priv->emblem_size = priv->pending_emblem_size;
894 need_update_icon = TRUE;
896 if (priv->pending_label_pos != priv->label_pos) {
897 priv->label_pos = priv->pending_label_pos;
898 /* No refresh here, grid will do it. */
899 set_label_justify(item);
902 * grid will take care of this
904 if (priv->pending_focus_margin != priv->focus_margin) {
905 priv->focus_margin = priv->pending_focus_margin;
908 if (priv->pending_label_height != priv->label_height) {
909 priv->label_height = priv->pending_label_height;
912 if (priv->pending_label_icon_margin != priv->label_icon_margin) {
913 priv->label_icon_margin = priv->pending_label_icon_margin;
916 if (priv->pending_icon_height != priv->icon_height) {
917 priv->icon_height = priv->pending_icon_height;
920 if (priv->pending_icon_width != priv->icon_width) {
921 priv->icon_width = priv->pending_icon_width;
926 if (need_update_icon == TRUE) {
927 update_icon(HILDON_GRID_ITEM(item));
930 if (need_resize == TRUE) {
931 gtk_widget_queue_resize(GTK_WIDGET(item));