1 <!-- ##### SECTION Title ##### -->
4 <!-- ##### SECTION Short_Description ##### -->
5 #HildonGrid is intended to be used where ever a number of single tap
6 activatable items need to be presented (e.g. Control Panel applets).
8 <!-- ##### SECTION Long_Description ##### -->
10 HildonGrid is a set of application-defineable items that are presented in a
11 table. The form of this table is selected from two modes; large icon mode and
14 In large icon mode, the Grid View items are presented with a large icon and a
15 label underneath it. In small icon mode, the items are presented with a small
16 icon and a label on the right side of the icon.
18 The label of an item is displayed within a band of colour displayed as a
19 background colour as wide as the maximum text width. This allows the text to
20 have focus as well as be legible when displayed upon a black or dark background
21 image. Long names are truncated with an ellipsis ("...") appended.
28 <!-- hildon-tests/wt/hildon-widgets-combo/testgrid.c -->
29 ##include <hildon-widgets/hildon-app.h>
30 ##include <hildon-widgets/hildon-appview.h>
31 ##include <hildon-widgets/hildon-grid.h>
32 ##include <hildon-widgets/hildon-grid-item.h>
33 ##include <gtk/gtk.h>
34 ##include <pango/pango.h>
35 ##include <libintl.h>
36 ##include <locale.h>
37 ##include <string.h>
38 ##include <gtk/gtktoolbar.h>
39 ##include <gtk/gtkwidget.h>
42 ##include <config.h>
45 ##include <stdio.h>
46 ##include <stdlib.h>
48 ##define _(String) gettext (String)
50 ##define ICONFILE "Help"
58 static int action = ACTIVATE;
61 static GtkWidget *w_add_one = NULL;
62 static GtkWidget *w_add_eight = NULL;
63 static GtkWidget *w_disable_next = NULL;
64 static GtkWidget *w_emblem_next = NULL;
66 static GtkWidget *menu_small_icons;
67 static GtkWidget *menu_big_icons;
69 static GtkWidget *standard_icons;
70 static GtkWidget *alt_empty_label;
71 static GtkWidget *dim_selected;
72 static GtkWidget *undim_all;
75 GtkWidget *create_layout(void);
76 static void activate (HildonGrid *grid, HildonGridItem *item, gpointer data);
77 static void generate_name (char *target, size_t len);
78 static void update_dim (HildonGrid *grid);
80 static void add_one (HildonGrid *grid);
81 static void add_eight (HildonGrid *grid);
82 static void disable_this (GtkWidget *widget);
83 static void emblem_this (GtkWidget *widget);
85 static void create_basic_icons (HildonGrid *grid);
86 static void remove_all_icons (HildonGrid *grid);
87 static void show_standard_icons_signal (GtkMenuItem *widget, gpointer data);
88 static void set_empty_label_signal (GtkMenuItem *widget, gpointer data);
89 static void dim_selected_signal (GtkMenuItem *widget, gpointer data);
90 static void undim_all_signal (GtkMenuItem *widget, gpointer data);
91 static void set_icon_size (GtkMenuItem *item, gpointer data);
93 void _testGrid(GtkWidget *parent, gchar **help);
96 _testGrid(GtkWidget *parent, gchar **help)
99 GtkIconTheme *icon_theme;
103 GSList *group = NULL;
105 icon_theme = gtk_icon_theme_get_default ();
107 grid = create_layout ();
108 gtk_container_add (GTK_CONTAINER (parent), grid);
110 g_signal_connect (grid, "activate-child", G_CALLBACK (activate), NULL);
112 /* Create context menu. */
113 popup = gtk_menu_new ();
114 menu_small_icons = gtk_radio_menu_item_new_with_label (group,
116 menu_big_icons = gtk_radio_menu_item_new_with_label (
117 gtk_radio_menu_item_get_group (
118 GTK_RADIO_MENU_ITEM (menu_small_icons)),
120 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_big_icons),
123 gtk_widget_show (menu_small_icons);
124 gtk_widget_show (menu_big_icons);
125 gtk_menu_shell_append (GTK_MENU_SHELL (popup), menu_small_icons);
126 gtk_menu_shell_append (GTK_MENU_SHELL (popup), menu_big_icons);
127 gtk_widget_tap_and_hold_setup (grid, popup, NULL, TRUE);
129 g_signal_connect (G_OBJECT (menu_small_icons), "activate",
130 G_CALLBACK (set_icon_size), HILDON_GRID (grid));
131 g_signal_connect (G_OBJECT (menu_big_icons), "activate",
132 G_CALLBACK (set_icon_size), HILDON_GRID (grid));
134 /* Add menuitem for showing/hiding standard icons. */
135 menu = hildon_appview_get_menu (HILDON_APPVIEW (
136 gtk_widget_get_ancestor (parent, HILDON_TYPE_APPVIEW)));
137 standard_icons = gtk_check_menu_item_new_with_label (
138 _("Show standard icons"));
139 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (standard_icons), TRUE);
140 alt_empty_label = gtk_check_menu_item_new_with_label (
141 _("Alternative empty label"));
142 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (alt_empty_label),
145 dim_selected = gtk_menu_item_new_with_label (_("Dim current"));
146 undim_all = gtk_menu_item_new_with_label (_("Undim all"));
149 gtk_menu_shell_append (GTK_MENU_SHELL (menu), standard_icons);
150 gtk_widget_show (standard_icons);
151 gtk_menu_shell_append (GTK_MENU_SHELL (menu), alt_empty_label);
152 gtk_widget_show (alt_empty_label);
153 gtk_menu_shell_append (GTK_MENU_SHELL (menu), dim_selected);
154 gtk_widget_show (dim_selected);
155 gtk_menu_shell_append (GTK_MENU_SHELL (menu), undim_all);
156 gtk_widget_show (undim_all);
158 g_signal_connect (G_OBJECT (standard_icons), "toggled",
159 G_CALLBACK (show_standard_icons_signal),
161 g_signal_connect (G_OBJECT (alt_empty_label), "toggled",
162 G_CALLBACK (set_empty_label_signal),
164 g_signal_connect (G_OBJECT (dim_selected), "activate",
165 G_CALLBACK (dim_selected_signal),
167 g_signal_connect (G_OBJECT (undim_all), "activate",
168 G_CALLBACK (undim_all_signal),
171 create_basic_icons (HILDON_GRID (grid));
172 update_dim (HILDON_GRID (grid));
174 hildon_grid_set_style (HILDON_GRID (grid), "bigicons");
175 gtk_widget_show (GTK_WIDGET (grid));
180 show_standard_icons_signal (GtkMenuItem *widget,
184 grid = HILDON_GRID (data);
186 if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
187 create_basic_icons (grid);
189 remove_all_icons (grid);
195 set_empty_label_signal (GtkMenuItem *widget,
200 grid = HILDON_GRID (data);
202 g_value_init (&val, G_TYPE_STRING);
204 if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
205 g_value_set_string (&val, _("Alternative empty label here"));
207 g_value_set_string (&val, _("No icons"));
209 g_object_set_property (G_OBJECT (grid), "empty_label", &val);
213 create_basic_icons (HildonGrid *grid)
215 w_add_one = hildon_grid_item_new_with_label (
216 "Calendar", _("Add one"));
217 w_add_eight = hildon_grid_item_new_with_label (
218 "Clock", _("Add eight"));
219 w_disable_next = hildon_grid_item_new_with_label (
220 "Calculator", _("Disable next"));
221 w_emblem_next = hildon_grid_item_new_with_label (
222 "Paint", _("Set emblem"));
223 emblem_this (w_emblem_next);
225 gtk_container_add (GTK_CONTAINER (grid), w_add_one);
226 gtk_container_add (GTK_CONTAINER (grid), w_add_eight);
227 gtk_container_add (GTK_CONTAINER (grid), w_disable_next);
228 gtk_container_add (GTK_CONTAINER (grid), w_emblem_next);
232 remove_all_icons (HildonGrid *grid)
234 gtk_container_remove (GTK_CONTAINER (grid), w_add_one);
235 gtk_container_remove (GTK_CONTAINER (grid), w_add_eight);
236 gtk_container_remove (GTK_CONTAINER (grid), w_disable_next);
237 gtk_container_remove (GTK_CONTAINER (grid), w_emblem_next);
241 generate_name (gchar *target, size_t len)
245 for (i = 0; i < len; i++)
246 target[i] = (rand() & 0x0f) + 'a';
254 grid = hildon_grid_new ();
255 return GTK_WIDGET (grid);
259 activate (HildonGrid *grid, HildonGridItem *item, gpointer data)
262 widget = GTK_WIDGET (item);
267 if (widget == w_add_one)
269 else if (widget == w_add_eight)
271 else if (widget == w_disable_next)
272 action = DISABLE_NEXT;
273 else if (widget == w_emblem_next)
274 action = EMBLEM_NEXT;
277 gtk_container_remove (GTK_CONTAINER (grid), widget);
283 disable_this (widget);
288 emblem_this (widget);
295 add_one (HildonGrid *grid)
297 #define LABEL_WIDTH 64
298 static gchar foo[LABEL_WIDTH];
300 generate_name (foo, rand () % (LABEL_WIDTH - 1) + 1);
301 t = hildon_grid_item_new_with_label (ICONFILE, foo);
302 gtk_container_add (GTK_CONTAINER (grid), t);
309 add_eight (HildonGrid *grid)
312 for (i = 0; i < 8; i++)
317 emblem_this (GtkWidget *widget)
320 emblem = hildon_grid_item_get_emblem_type (HILDON_GRID_ITEM (widget));
322 hildon_grid_item_set_emblem_type (HILDON_GRID_ITEM (widget),
323 emblem == NULL ? "gnome-mime-image-png" : NULL);
327 disable_this (GtkWidget *widget)
329 gtk_widget_set_sensitive (widget, FALSE);
333 dim_selected_signal (GtkMenuItem *widget,
338 selected = GTK_CONTAINER (data)->focus_child;
339 gtk_widget_set_sensitive (selected, FALSE);
343 undim_all_signal (GtkMenuItem *widget,
346 gtk_container_foreach (GTK_CONTAINER (data),
347 (GtkCallback) gtk_widget_set_sensitive,
352 update_dim (HildonGrid *grid)
355 selected = GTK_CONTAINER (grid)->focus_child;
356 gtk_widget_set_sensitive (dim_selected, selected != NULL);
360 set_icon_size (GtkMenuItem *item, gpointer data)
363 grid = HILDON_GRID (data);
365 if (GTK_WIDGET (item) == menu_small_icons)
366 hildon_grid_set_style (grid, "smallicons");
367 else if (GTK_WIDGET (item) == menu_big_icons)
368 hildon_grid_set_style (grid, "bigicons");
374 <!-- ##### SECTION See_Also ##### -->
379 <!-- ##### STRUCT HildonGrid ##### -->
385 <!-- ##### FUNCTION hildon_grid_new ##### -->
393 <!-- ##### FUNCTION hildon_grid_set_style ##### -->
402 <!-- ##### FUNCTION hildon_grid_get_style ##### -->
411 <!-- ##### FUNCTION hildon_grid_set_scrollbar_pos ##### -->
420 <!-- ##### FUNCTION hildon_grid_get_scrollbar_pos ##### -->
429 <!-- ##### FUNCTION hildon_grid_activate_child ##### -->
438 <!-- ##### SIGNAL HildonGrid::activate-child ##### -->
443 @hildongrid: the object which received the signal.
446 <!-- ##### SIGNAL HildonGrid::popup-context-menu ##### -->
451 @hildongrid: the object which received the signal.
457 <!-- ##### ARG HildonGrid:empty-label ##### -->
462 <!-- ##### ARG HildonGrid:emblem-size ##### -->
467 <!-- ##### ARG HildonGrid:icon-size ##### -->
472 <!-- ##### ARG HildonGrid:item-height ##### -->
477 <!-- ##### ARG HildonGrid:item-hspacing ##### -->
482 <!-- ##### ARG HildonGrid:item-vspacing ##### -->
487 <!-- ##### ARG HildonGrid:item-width ##### -->
492 <!-- ##### ARG HildonGrid:label-height ##### -->
497 <!-- ##### ARG HildonGrid:label-hspacing ##### -->
502 <!-- ##### ARG HildonGrid:label-pos ##### -->
507 <!-- ##### ARG HildonGrid:label-vspacing ##### -->
512 <!-- ##### ARG HildonGrid:n-columns ##### -->