8
#define N_GROUP_COLS 25
9
#define N_GROUP_ROWS 20
13
#define N_TOTAL_ID_ITEMS (N_GROUP_COLS * N_GROUP_ROWS) * (N_COLS * N_ROWS)
15
/* The maximum length of a string identifying an item (i.e. its coords). */
28
double total_width, total_height;
29
double left_offset, top_offset;
30
char ids[N_TOTAL_ID_ITEMS][MAX_ID_LEN];
35
on_motion_notify (GooCanvasItem *item,
36
GooCanvasItem *target,
37
GdkEventMotion *event,
40
gchar *id = g_object_get_data (G_OBJECT (item), "id");
42
g_print ("%s item received 'motion-notify' signal\n", id ? id : "Unknown");
49
setup_canvas (GtkWidget *canvas)
51
GooCanvasItemModel *root, *group, *model;
53
GdkPixbuf *pixbuf = NULL;
54
cairo_pattern_t *pattern = NULL;
55
int group_i, group_j, i, j;
56
double item_width, item_height;
57
double cell_width, cell_height;
58
double group_width, group_height;
59
int total_items = 0, id_item_num = 0;;
60
GdkColor color = { 0, 0, 0, 0, };
61
GooCanvasStyle *style, *style2;
62
GValue tmpval = { 0 };
64
root = goo_canvas_group_model_new (NULL,
67
goo_canvas_set_root_item_model (GOO_CANVAS (canvas), root);
68
g_object_unref (root);
71
pixbuf = gdk_pixbuf_new_from_file("toroid.png", NULL);
72
item_width = gdk_pixbuf_get_width (pixbuf);
73
item_height = gdk_pixbuf_get_height (pixbuf);
74
pattern = goo_canvas_cairo_pattern_from_pixbuf (pixbuf);
77
item_width = 400/*80*/;
81
cell_width = item_width + PADDING * 2;
82
cell_height = item_height + PADDING * 2;
84
group_width = N_COLS * cell_width;
85
group_height = N_ROWS * cell_height;
87
total_width = N_GROUP_COLS * group_width;
88
total_height = N_GROUP_ROWS * group_height;
90
/* We use -ve offsets to test if -ve coords are handled correctly. */
91
left_offset = -total_width / 2;
92
top_offset = -total_height / 2;
94
style = goo_canvas_style_new ();
95
gdk_color_parse ("mediumseagreen", &color);
96
pattern = cairo_pattern_create_rgb (color.red / 65535.0,
97
color.green / 65535.0,
98
color.blue / 65535.0);
99
g_value_init (&tmpval, GOO_TYPE_CAIRO_PATTERN);
100
g_value_take_boxed (&tmpval, pattern);
101
goo_canvas_style_set_property (style, goo_canvas_style_fill_pattern_id, &tmpval);
102
g_value_unset (&tmpval);
104
style2 = goo_canvas_style_new ();
105
gdk_color_parse ("steelblue", &color);
106
pattern = cairo_pattern_create_rgb (color.red / 65535.0,
107
color.green / 65535.0,
108
color.blue / 65535.0);
109
g_value_init (&tmpval, GOO_TYPE_CAIRO_PATTERN);
110
g_value_take_boxed (&tmpval, pattern);
111
goo_canvas_style_set_property (style2, goo_canvas_style_fill_pattern_id, &tmpval);
112
g_value_unset (&tmpval);
114
for (group_i = 0; group_i < N_GROUP_COLS; group_i++)
116
for (group_j = 0; group_j < N_GROUP_ROWS; group_j++)
118
double group_x = left_offset + (group_i * group_width);
119
double group_y = top_offset + (group_j * group_height);
121
group = goo_canvas_group_model_new (root, NULL);
123
goo_canvas_item_model_translate (group, group_x, group_y);
125
for (i = 0; i < N_COLS; i++)
127
for (j = 0; j < N_ROWS; j++)
129
double item_x = (i * cell_width) + PADDING;
130
double item_y = (j * cell_height) + PADDING;
131
double rotation = i % 10 * 2;
132
double rotation_x = item_x + item_width / 2;
133
double rotation_y = item_y + item_height / 2;
135
sprintf (ids[id_item_num], "%g, %g",
136
group_x + item_x, group_y + item_y);
139
model = goo_canvas_image_model_new (group, NULL,
143
"height", item_height,
146
model = goo_canvas_rect_model_new (group, item_x, item_y,
147
item_width, item_height,
149
goo_canvas_item_model_set_style (model, (j % 2) ? style : style2);
150
goo_canvas_item_model_rotate (model, rotation, rotation_x, rotation_y);
153
item = goo_canvas_get_item (GOO_CANVAS (canvas), model);
154
g_object_set_data (G_OBJECT (item), "id",
156
g_signal_connect (item, "motion_notify_event",
157
(GtkSignalFunc) on_motion_notify, NULL);
159
model = goo_canvas_text_model_new (group, ids[id_item_num],
160
item_x + item_width / 2,
161
item_y + item_height / 2,
162
-1, GTK_ANCHOR_CENTER,
164
goo_canvas_item_model_rotate (model, rotation, rotation_x,
188
cairo_pattern_destroy (pattern);
190
g_print ("Total items: %i\n", total_items);
196
on_expose_event (GtkWidget *canvas,
198
gpointer unused_data)
200
static gboolean first_time = TRUE;
204
printf ("Update Canvas Time Used: %g\n",
205
(double) (clock() - start) / CLOCKS_PER_SEC);
218
/* Create the canvas. */
219
canvas = goo_canvas_new ();
220
gtk_widget_set_size_request (canvas, 600, 450);
223
setup_canvas (canvas);
224
printf ("Create Canvas Time Used: %g\n",
225
(double) (clock() - start) / CLOCKS_PER_SEC);
228
goo_canvas_set_bounds (GOO_CANVAS (canvas), left_offset, top_offset,
229
left_offset + total_width, top_offset + total_height);
230
gtk_widget_show (canvas);
232
g_signal_connect (canvas, "expose_event",
233
(GtkSignalFunc) on_expose_event, NULL);
240
on_delete_event (GtkWidget *window,
242
gpointer unused_data)
250
main (int argc, char *argv[])
252
GtkWidget *window, *scrolled_win, *canvas;
255
gtk_init (&argc, &argv);
257
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
258
gtk_window_set_default_size (GTK_WINDOW (window), 640, 600);
259
gtk_widget_show (window);
260
g_signal_connect (window, "delete_event", (GtkSignalFunc) on_delete_event,
263
scrolled_win = gtk_scrolled_window_new (NULL, NULL);
264
gtk_widget_show (scrolled_win);
265
gtk_container_add (GTK_CONTAINER (window), scrolled_win);
267
canvas = create_canvas ();
268
gtk_container_add (GTK_CONTAINER (scrolled_win), canvas);