2008-09-22 Claudio Saavedra <csaavedra@igalia.com>
[hildon] / examples / hildon-pannable-area-touch-list-example.c
1 /*
2  * This file is a part of hildon examples
3  *
4  * Copyright (C) 2008 Nokia Corporation, all rights reserved.
5  *
6  * Author: Karl Lattimer <karl.lattimer@nokia.com>
7  *
8  * Based on testhildontreeview.c by Kristian Rietveld <kris@imendio.com>
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public License
12  * as published by the Free Software Foundation; version 2.1 of
13  * the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
23  * 02110-1301 USA
24  *
25  */
26
27 #include <gtk/gtk.h>
28 #include <hildon.h>
29
30 enum
31 {
32   MULTI_SELECT  = 1 << 0,
33   NORMAL_MODE   = 1 << 1,
34   EDIT_MODE     = 1 << 2
35 };
36
37
38 static GtkTreeModel *
39 create_model (void)
40 {
41   int i;
42   GtkListStore *store;
43
44   store = gtk_list_store_new (1, G_TYPE_STRING);
45
46   for (i = 0; i < 50; i++)
47     {
48       gchar *str;
49
50       str = g_strdup_printf ("\nRow %d\n", i);
51       gtk_list_store_insert_with_values (store, NULL, i, 0, str, -1);
52       g_free (str);
53     }
54
55   return GTK_TREE_MODEL (store);
56 }
57
58 static void
59 row_activated_callback (GtkWidget         *tree_view,
60                         GtkTreePath       *path,
61                         GtkTreeViewColumn *column,
62                         gpointer           user_data)
63 {
64   g_print ("row-activated emitted.\n");
65 }
66
67 static void
68 row_insensitive_callback (GtkWidget         *tree_view,
69                           GtkTreePath       *path,
70                           gpointer           user_data)
71 {
72   g_print ("row-insensitive emitted.\n");
73 }
74
75 static GtkWidget *
76 create_tree_view (HildonUIMode  mode,
77                   const char   *name,
78                   gboolean      multi_select)
79 {
80   GtkWidget *tree_view;
81   GtkCellRenderer *renderer;
82   GtkTreeSelection *selection;
83   GtkTreeModel *model;
84
85   if (name && g_str_equal (name, "fremantle-widget"))
86       tree_view = hildon_gtk_tree_view_new (mode);
87   else
88       tree_view = gtk_tree_view_new ();
89
90   if (name)
91     gtk_widget_set_name (tree_view, name);
92
93   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
94
95   model = create_model ();
96   gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), model);
97   g_object_unref (model);
98
99   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
100   if (multi_select)
101     gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
102   else if (mode != HILDON_UI_MODE_NORMAL)
103     gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
104
105   renderer = gtk_cell_renderer_text_new ();
106   g_object_set (renderer,
107                 "xalign", 0.5,
108                 "weight", PANGO_WEIGHT_BOLD,
109                 NULL);
110
111   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
112                                                0, "Column 0",
113                                                renderer,
114                                                "text", 0,
115                                                NULL);
116
117   return tree_view;
118 }
119
120 static void
121 create_tree_view_window (GtkWidget *button,
122                          gpointer   user_data)
123 {
124   const char *name;
125   GtkWidget *window;
126   GtkWidget *sw;
127   GtkWidget *tree_view;
128   HildonUIMode mode = 0;
129
130   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
131   g_signal_connect (window, "delete-event",
132                     G_CALLBACK (gtk_widget_destroy), window);
133   gtk_container_set_border_width (GTK_CONTAINER (window), 6);
134
135   sw = hildon_pannable_area_new ();
136   gtk_container_add (GTK_CONTAINER (window), sw);
137
138   if ((GPOINTER_TO_INT (user_data) & NORMAL_MODE) == NORMAL_MODE)
139     {
140       mode = HILDON_UI_MODE_NORMAL;
141       name = "fremantle-widget";
142     }
143   else if ((GPOINTER_TO_INT (user_data) & EDIT_MODE) == EDIT_MODE)
144     {
145       mode = HILDON_UI_MODE_EDIT;
146       name = "fremantle-widget";
147     }
148   else
149     name = NULL;
150
151   tree_view = create_tree_view (mode, name,
152                                 (GPOINTER_TO_INT (user_data) & MULTI_SELECT) == MULTI_SELECT);
153
154   /* Some signals doing printfs() to see if the behavior is correct. */
155   g_signal_connect (tree_view, "row-activated",
156                     G_CALLBACK (row_activated_callback), NULL);
157   g_signal_connect (tree_view, "row-insensitive",
158                     G_CALLBACK (row_insensitive_callback), NULL);
159
160   gtk_widget_set_size_request (tree_view, 480, 800);
161   gtk_container_add (GTK_CONTAINER (sw), tree_view);
162
163   gtk_widget_show_all (window);
164 }
165
166 int
167 main (int argc, char **argv)
168 {
169   GtkWidget *window;
170   GtkWidget *mainbox;
171   GtkWidget *label;
172   GtkWidget *vbox;
173   GtkWidget *padbox;
174   GtkWidget *button;
175
176   gtk_init (&argc, &argv);
177
178   gtk_rc_parse_string ("style \"fremantle-widget\" {\n"
179                        "  GtkWidget::hildon-mode = 1\n"
180                        "} widget \"*.fremantle-widget\" style \"fremantle-widget\"");
181
182   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
183   g_signal_connect (window, "delete-event",
184                     G_CALLBACK (gtk_main_quit), NULL);
185   gtk_container_set_border_width (GTK_CONTAINER (window), 6);
186
187   mainbox = gtk_vbox_new (FALSE, 6);
188   gtk_container_add (GTK_CONTAINER (window), mainbox);
189
190   /* old-style */
191   label = gtk_label_new (NULL);
192   gtk_label_set_markup (GTK_LABEL (label), "<b>Old-style behavior</b>");
193   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
194   gtk_box_pack_start (GTK_BOX (mainbox), label, FALSE, FALSE, 0);
195
196   padbox = gtk_hbox_new (FALSE, 6);
197   gtk_box_pack_start (GTK_BOX (mainbox), padbox, FALSE, FALSE, 6);
198
199   gtk_box_pack_start (GTK_BOX (padbox), gtk_label_new ("   "),
200                       FALSE, FALSE, 6);
201
202   vbox = gtk_vbox_new (FALSE, 6);
203   gtk_box_pack_start (GTK_BOX (padbox), vbox, TRUE, TRUE, 6);
204
205   button = gtk_button_new_with_label ("Single selection");
206   g_signal_connect (button, "clicked",
207                     G_CALLBACK (create_tree_view_window), 0x0);
208   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
209
210   button = gtk_button_new_with_label ("Multiple selections");
211   g_signal_connect (button, "clicked",
212                     G_CALLBACK (create_tree_view_window),
213                     GINT_TO_POINTER (MULTI_SELECT));
214   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
215
216   /* normal-mode */
217   label = gtk_label_new (NULL);
218   gtk_label_set_markup (GTK_LABEL (label), "<b>Fremantle Normal mode</b>");
219   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
220   gtk_box_pack_start (GTK_BOX (mainbox), label, FALSE, FALSE, 0);
221
222   padbox = gtk_hbox_new (FALSE, 6);
223   gtk_box_pack_start (GTK_BOX (mainbox), padbox, FALSE, FALSE, 6);
224
225   gtk_box_pack_start (GTK_BOX (padbox), gtk_label_new ("   "),
226                       FALSE, FALSE, 6);
227
228   vbox = gtk_vbox_new (FALSE, 6);
229   gtk_box_pack_start (GTK_BOX (padbox), vbox, TRUE, TRUE, 6);
230
231   button = gtk_button_new_with_label ("Direct activation");
232   g_signal_connect (button, "clicked",
233                     G_CALLBACK (create_tree_view_window),
234                     GINT_TO_POINTER (NORMAL_MODE));
235   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
236
237   /* edit-mode */
238   label = gtk_label_new (NULL);
239   gtk_label_set_markup (GTK_LABEL (label), "<b>Fremantle Edit mode</b>");
240   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
241   gtk_box_pack_start (GTK_BOX (mainbox), label, FALSE, FALSE, 0);
242
243   padbox = gtk_hbox_new (FALSE, 6);
244   gtk_box_pack_start (GTK_BOX (mainbox), padbox, FALSE, FALSE, 6);
245
246   gtk_box_pack_start (GTK_BOX (padbox), gtk_label_new ("   "),
247                       FALSE, FALSE, 6);
248
249   vbox = gtk_vbox_new (FALSE, 6);
250   gtk_box_pack_start (GTK_BOX (padbox), vbox, TRUE, TRUE, 6);
251
252   button = gtk_button_new_with_label ("Single selection");
253   g_signal_connect (button, "clicked",
254                     G_CALLBACK (create_tree_view_window),
255                     GINT_TO_POINTER (EDIT_MODE));
256   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
257
258   button = gtk_button_new_with_label ("Multiple selections");
259   g_signal_connect (button, "clicked",
260                     G_CALLBACK (create_tree_view_window),
261                     GINT_TO_POINTER (EDIT_MODE | MULTI_SELECT));
262   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
263
264
265   button = gtk_button_new_with_label ("Close");
266   g_signal_connect (button, "clicked",
267                     G_CALLBACK (gtk_main_quit), NULL);
268   gtk_box_pack_end (GTK_BOX (mainbox), button, FALSE, FALSE, 0);
269
270   gtk_box_pack_end (GTK_BOX (mainbox), gtk_hseparator_new (),
271                     FALSE, FALSE, 6);
272
273   gtk_widget_show_all (window);
274
275   gtk_main ();
276
277   return 0;
278 }