2008-07-31 Alberto Garcia <agarcia@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-pannable-area.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
84   tree_view = g_object_new (GTK_TYPE_TREE_VIEW,
85                             "model", create_model (),
86                             "name", name,
87                             "hildon-ui-mode", mode,
88                             "rules-hint", TRUE,
89                             NULL);
90
91   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
92   if (multi_select)
93     gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
94   else if (mode != HILDON_UI_MODE_NORMAL)
95     gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
96
97   renderer = gtk_cell_renderer_text_new ();
98   g_object_set (renderer,
99                 "xalign", 0.5,
100                 "weight", PANGO_WEIGHT_BOLD,
101                 NULL);
102
103   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
104                                                0, "Column 0",
105                                                renderer,
106                                                "text", 0,
107                                                NULL);
108
109   return tree_view;
110 }
111
112 static void
113 create_tree_view_window (GtkWidget *button,
114                          gpointer   user_data)
115 {
116   const char *name;
117   GtkWidget *window;
118   GtkWidget *sw;
119   GtkWidget *tree_view;
120   HildonUIMode mode = 0;
121
122   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
123   g_signal_connect (window, "delete-event",
124                     G_CALLBACK (gtk_widget_destroy), window);
125   gtk_container_set_border_width (GTK_CONTAINER (window), 6);
126
127   sw = hildon_pannable_area_new ();
128   gtk_container_add (GTK_CONTAINER (window), sw);
129
130   if ((GPOINTER_TO_INT (user_data) & NORMAL_MODE) == NORMAL_MODE)
131     {
132       mode = HILDON_UI_MODE_NORMAL;
133       name = "fremantle-widget";
134     }
135   else if ((GPOINTER_TO_INT (user_data) & EDIT_MODE) == EDIT_MODE)
136     {
137       mode = HILDON_UI_MODE_EDIT;
138       name = "fremantle-widget";
139     }
140   else
141     name = NULL;
142
143   tree_view = create_tree_view (mode, name,
144                                 (GPOINTER_TO_INT (user_data) & MULTI_SELECT) == MULTI_SELECT);
145
146   /* Some signals doing printfs() to see if the behavior is correct. */
147   g_signal_connect (tree_view, "row-activated",
148                     G_CALLBACK (row_activated_callback), NULL);
149   g_signal_connect (tree_view, "row-insensitive",
150                     G_CALLBACK (row_insensitive_callback), NULL);
151
152   gtk_widget_set_size_request (tree_view, 480, 800);
153   gtk_container_add (GTK_CONTAINER (sw), tree_view);
154
155   gtk_widget_show_all (window);
156 }
157
158 int
159 main (int argc, char **argv)
160 {
161   GtkWidget *window;
162   GtkWidget *mainbox;
163   GtkWidget *label;
164   GtkWidget *vbox;
165   GtkWidget *padbox;
166   GtkWidget *button;
167
168   gtk_init (&argc, &argv);
169
170   gtk_rc_parse_string ("style \"fremantle-widget\" {\n"
171                        "  GtkWidget::hildon-mode = 1\n"
172                        "} widget \"*.fremantle-widget\" style \"fremantle-widget\"");
173
174   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
175   g_signal_connect (window, "delete-event",
176                     G_CALLBACK (gtk_main_quit), NULL);
177   gtk_container_set_border_width (GTK_CONTAINER (window), 6);
178
179   mainbox = gtk_vbox_new (FALSE, 6);
180   gtk_container_add (GTK_CONTAINER (window), mainbox);
181
182   /* old-style */
183   label = gtk_label_new (NULL);
184   gtk_label_set_markup (GTK_LABEL (label), "<b>Old-style behavior</b>");
185   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
186   gtk_box_pack_start (GTK_BOX (mainbox), label, FALSE, FALSE, 0);
187
188   padbox = gtk_hbox_new (FALSE, 6);
189   gtk_box_pack_start (GTK_BOX (mainbox), padbox, FALSE, FALSE, 6);
190
191   gtk_box_pack_start (GTK_BOX (padbox), gtk_label_new ("   "),
192                       FALSE, FALSE, 6);
193
194   vbox = gtk_vbox_new (FALSE, 6);
195   gtk_box_pack_start (GTK_BOX (padbox), vbox, TRUE, TRUE, 6);
196
197   button = gtk_button_new_with_label ("Single selection");
198   g_signal_connect (button, "clicked",
199                     G_CALLBACK (create_tree_view_window), 0x0);
200   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
201
202   button = gtk_button_new_with_label ("Multiple selections");
203   g_signal_connect (button, "clicked",
204                     G_CALLBACK (create_tree_view_window),
205                     GINT_TO_POINTER (MULTI_SELECT));
206   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
207
208   /* normal-mode */
209   label = gtk_label_new (NULL);
210   gtk_label_set_markup (GTK_LABEL (label), "<b>Fremantle Normal mode</b>");
211   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
212   gtk_box_pack_start (GTK_BOX (mainbox), label, FALSE, FALSE, 0);
213
214   padbox = gtk_hbox_new (FALSE, 6);
215   gtk_box_pack_start (GTK_BOX (mainbox), padbox, FALSE, FALSE, 6);
216
217   gtk_box_pack_start (GTK_BOX (padbox), gtk_label_new ("   "),
218                       FALSE, FALSE, 6);
219
220   vbox = gtk_vbox_new (FALSE, 6);
221   gtk_box_pack_start (GTK_BOX (padbox), vbox, TRUE, TRUE, 6);
222
223   button = gtk_button_new_with_label ("Direct activation");
224   g_signal_connect (button, "clicked",
225                     G_CALLBACK (create_tree_view_window),
226                     GINT_TO_POINTER (NORMAL_MODE));
227   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
228
229   /* edit-mode */
230   label = gtk_label_new (NULL);
231   gtk_label_set_markup (GTK_LABEL (label), "<b>Fremantle Edit mode</b>");
232   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
233   gtk_box_pack_start (GTK_BOX (mainbox), label, FALSE, FALSE, 0);
234
235   padbox = gtk_hbox_new (FALSE, 6);
236   gtk_box_pack_start (GTK_BOX (mainbox), padbox, FALSE, FALSE, 6);
237
238   gtk_box_pack_start (GTK_BOX (padbox), gtk_label_new ("   "),
239                       FALSE, FALSE, 6);
240
241   vbox = gtk_vbox_new (FALSE, 6);
242   gtk_box_pack_start (GTK_BOX (padbox), vbox, TRUE, TRUE, 6);
243
244   button = gtk_button_new_with_label ("Single selection");
245   g_signal_connect (button, "clicked",
246                     G_CALLBACK (create_tree_view_window),
247                     GINT_TO_POINTER (EDIT_MODE));
248   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
249
250   button = gtk_button_new_with_label ("Multiple selections");
251   g_signal_connect (button, "clicked",
252                     G_CALLBACK (create_tree_view_window),
253                     GINT_TO_POINTER (EDIT_MODE | MULTI_SELECT));
254   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
255
256
257   button = gtk_button_new_with_label ("Close");
258   g_signal_connect (button, "clicked",
259                     G_CALLBACK (gtk_main_quit), NULL);
260   gtk_box_pack_end (GTK_BOX (mainbox), button, FALSE, FALSE, 0);
261
262   gtk_box_pack_end (GTK_BOX (mainbox), gtk_hseparator_new (),
263                     FALSE, FALSE, 6);
264
265   gtk_widget_show_all (window);
266
267   gtk_main ();
268
269   return 0;
270 }