1 | #include <gtk/gtk.h> |
2 | |
3 | static void |
4 | on_button_clicked (GtkWidget *widget, gpointer data) |
5 | { |
6 | g_print (format: "Button %d clicked\n" , GPOINTER_TO_INT (data)); |
7 | } |
8 | |
9 | static gboolean done = FALSE; |
10 | |
11 | static void |
12 | quit_cb (GtkWidget *widget, |
13 | gpointer user_data) |
14 | { |
15 | gboolean *is_done = user_data; |
16 | |
17 | *is_done = TRUE; |
18 | |
19 | g_main_context_wakeup (NULL); |
20 | } |
21 | |
22 | static void |
23 | kinetic_scrolling (void) |
24 | { |
25 | GtkWidget *window, *swindow, *grid; |
26 | GtkWidget *label; |
27 | GtkWidget *button_grid, *button; |
28 | GtkWidget *treeview; |
29 | GtkCellRenderer *renderer; |
30 | GtkListStore *store; |
31 | GtkWidget *textview; |
32 | GdkContentFormats *targets; |
33 | int i; |
34 | |
35 | window = gtk_window_new (); |
36 | gtk_window_set_default_size (GTK_WINDOW (window), width: 400, height: 400); |
37 | g_signal_connect (window, "destroy" , G_CALLBACK (quit_cb), &done); |
38 | |
39 | grid = gtk_grid_new (); |
40 | |
41 | label = gtk_label_new (str: "Non scrollable widget using viewport" ); |
42 | gtk_grid_attach (GTK_GRID (grid), child: label, column: 0, row: 0, width: 1, height: 1); |
43 | gtk_widget_set_hexpand (widget: label, TRUE); |
44 | |
45 | label = gtk_label_new (str: "Scrollable widget: TreeView" ); |
46 | gtk_grid_attach (GTK_GRID (grid), child: label, column: 1, row: 0, width: 1, height: 1); |
47 | gtk_widget_set_hexpand (widget: label, TRUE); |
48 | |
49 | label = gtk_label_new (str: "Scrollable widget: TextView" ); |
50 | gtk_grid_attach (GTK_GRID (grid), child: label, column: 2, row: 0, width: 1, height: 1); |
51 | gtk_widget_set_hexpand (widget: label, TRUE); |
52 | |
53 | button_grid = gtk_grid_new (); |
54 | for (i = 0; i < 80; i++) |
55 | { |
56 | char *button_label = g_strdup_printf (format: "Button number %d" , i); |
57 | |
58 | button = gtk_button_new_with_label (label: button_label); |
59 | gtk_grid_attach (GTK_GRID (button_grid), child: button, column: 0, row: i, width: 1, height: 1); |
60 | gtk_widget_set_hexpand (widget: button, TRUE); |
61 | g_signal_connect (button, "clicked" , |
62 | G_CALLBACK (on_button_clicked), |
63 | GINT_TO_POINTER (i)); |
64 | g_free (mem: button_label); |
65 | } |
66 | |
67 | swindow = gtk_scrolled_window_new (); |
68 | gtk_scrolled_window_set_kinetic_scrolling (GTK_SCROLLED_WINDOW (swindow), TRUE); |
69 | gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (swindow), child: button_grid); |
70 | |
71 | gtk_grid_attach (GTK_GRID (grid), child: swindow, column: 0, row: 1, width: 1, height: 1); |
72 | |
73 | treeview = gtk_tree_view_new (); |
74 | targets = gdk_content_formats_new_for_gtype (GTK_TYPE_TREE_ROW_DATA); |
75 | gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (treeview), |
76 | start_button_mask: GDK_BUTTON1_MASK, |
77 | formats: targets, |
78 | actions: GDK_ACTION_MOVE | GDK_ACTION_COPY); |
79 | gtk_tree_view_enable_model_drag_dest (GTK_TREE_VIEW (treeview), |
80 | formats: targets, |
81 | actions: GDK_ACTION_MOVE | GDK_ACTION_COPY); |
82 | gdk_content_formats_unref (formats: targets); |
83 | |
84 | renderer = gtk_cell_renderer_text_new (); |
85 | g_object_set (object: renderer, first_property_name: "editable" , TRUE, NULL); |
86 | gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), |
87 | position: 0, title: "Title" , |
88 | cell: renderer, |
89 | "text" , 0, |
90 | NULL); |
91 | store = gtk_list_store_new (n_columns: 1, G_TYPE_STRING); |
92 | for (i = 0; i < 80; i++) |
93 | { |
94 | GtkTreeIter iter; |
95 | char *iter_label = g_strdup_printf (format: "Row number %d" , i); |
96 | |
97 | gtk_list_store_append (list_store: store, iter: &iter); |
98 | gtk_list_store_set (list_store: store, iter: &iter, 0, iter_label, -1); |
99 | g_free (mem: iter_label); |
100 | } |
101 | gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store)); |
102 | g_object_unref (object: store); |
103 | |
104 | swindow = gtk_scrolled_window_new (); |
105 | gtk_scrolled_window_set_kinetic_scrolling (GTK_SCROLLED_WINDOW (swindow), TRUE); |
106 | gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (swindow), child: treeview); |
107 | |
108 | gtk_grid_attach (GTK_GRID (grid), child: swindow, column: 1, row: 1, width: 1, height: 1); |
109 | gtk_widget_set_hexpand (widget: swindow, TRUE); |
110 | gtk_widget_set_vexpand (widget: swindow, TRUE); |
111 | |
112 | textview = gtk_text_view_new (); |
113 | swindow = gtk_scrolled_window_new (); |
114 | gtk_scrolled_window_set_kinetic_scrolling (GTK_SCROLLED_WINDOW (swindow), TRUE); |
115 | gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (swindow), child: textview); |
116 | |
117 | gtk_grid_attach (GTK_GRID (grid), child: swindow, column: 2, row: 1, width: 1, height: 1); |
118 | gtk_widget_set_hexpand (widget: swindow, TRUE); |
119 | gtk_widget_set_vexpand (widget: swindow, TRUE); |
120 | |
121 | gtk_window_set_child (GTK_WINDOW (window), child: grid); |
122 | |
123 | gtk_widget_show (widget: window); |
124 | } |
125 | |
126 | int |
127 | main (int argc, char **argv) |
128 | { |
129 | gtk_init (); |
130 | |
131 | kinetic_scrolling (); |
132 | |
133 | while (!done) |
134 | g_main_context_iteration (NULL, TRUE); |
135 | |
136 | return 0; |
137 | } |
138 | |