1 #include <stdlib.h>
2 #include <goocanvas.h>
3
4 cairo_pattern_t *flower_pattern;
5 gdouble flower_width, flower_height;
6
7
8 static gboolean
on_motion_notify(GooCanvasItem * item,GooCanvasItem * target,GdkEventMotion * event,gpointer data)9 on_motion_notify (GooCanvasItem *item,
10 GooCanvasItem *target,
11 GdkEventMotion *event,
12 gpointer data)
13 {
14 gchar *id = g_object_get_data (G_OBJECT (item), "id");
15
16 g_print ("%s item received 'motion-notify' signal\n", id ? id : "Unknown");
17
18 return FALSE;
19 }
20
21
22 static void
setup_canvas(GtkWidget * canvas,GtkUnit units,gchar * units_name)23 setup_canvas (GtkWidget *canvas,
24 GtkUnit units,
25 gchar *units_name)
26 {
27 GooCanvasItem *root, *item;
28 gchar buffer[256], font_desc[64];
29 double *d;
30 double data[4][12] = {
31 /* Pixels */
32 { 100, 100, 200, 20, 10,
33 200, 310, 24,
34 310, 100, 20, 20
35 },
36
37 /* Points */
38 { 100, 100, 200, 20, 10,
39 200, 310, 24,
40 310, 100, 20, 20
41 },
42
43 /* Inches */
44 { 1, 1, 3, 0.5, 0.16,
45 3, 4, 0.3,
46 4.2, 1, 0.5, 0.5
47 },
48
49 /* MM */
50 { 30, 30, 100, 10, 5,
51 80, 60, 10,
52 135, 30, 10, 10
53 }
54 };
55
56 d = data[units];
57
58 root = goo_canvas_get_root_item (GOO_CANVAS (canvas));
59
60 item = goo_canvas_rect_new (root, d[0], d[1], d[2], d[3],
61 NULL);
62 g_signal_connect (item, "motion_notify_event",
63 G_CALLBACK (on_motion_notify), NULL);
64
65 sprintf (buffer, "This box is %gx%g %s", d[2], d[3], units_name);
66 sprintf (font_desc, "Sans %gpx", d[4]);
67 item = goo_canvas_text_new (root, buffer, d[0] + d[2] / 2, d[1] + d[3] / 2,
68 -1, GTK_ANCHOR_CENTER,
69 "font", font_desc,
70 NULL);
71
72
73 sprintf (buffer, "This font is %g %s high", d[7], units_name);
74 sprintf (font_desc, "Sans %gpx", d[7]);
75 item = goo_canvas_text_new (root, buffer, d[5], d[6], -1,
76 GTK_ANCHOR_CENTER,
77 "font", font_desc,
78 NULL);
79
80 item = goo_canvas_image_new (root, NULL, d[8], d[9],
81 "pattern", flower_pattern,
82 "width", d[10],
83 "height", d[11],
84 "scale-to-fit", TRUE,
85 NULL);
86 }
87
88
89 static void
zoom_changed(GtkAdjustment * adj,GooCanvas * canvas)90 zoom_changed (GtkAdjustment *adj, GooCanvas *canvas)
91 {
92 goo_canvas_set_scale (canvas, adj->value);
93 }
94
95
96 GtkWidget *
create_canvas(GtkUnit units,gchar * units_name)97 create_canvas (GtkUnit units,
98 gchar *units_name)
99 {
100 GtkWidget *vbox, *hbox, *w, *scrolled_win, *canvas;
101 GtkAdjustment *adj;
102
103 vbox = gtk_vbox_new (FALSE, 4);
104 gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
105 gtk_widget_show (vbox);
106
107 hbox = gtk_hbox_new (FALSE, 4);
108 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
109 gtk_widget_show (hbox);
110
111 canvas = goo_canvas_new ();
112
113 w = gtk_label_new ("Zoom:");
114 gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
115 gtk_widget_show (w);
116
117 adj = GTK_ADJUSTMENT (gtk_adjustment_new (1.00, 0.05, 100.00, 0.05, 0.50, 0.0));
118 w = gtk_spin_button_new (adj, 0.0, 2);
119 g_signal_connect (adj, "value_changed",
120 G_CALLBACK (zoom_changed),
121 canvas);
122 gtk_widget_set_size_request (w, 50, -1);
123 gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
124 gtk_widget_show (w);
125
126 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
127 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
128 gtk_widget_show (scrolled_win);
129
130 /* Create the canvas. */
131 gtk_widget_set_size_request (canvas, 600, 450);
132 setup_canvas (canvas, units, units_name);
133
134 goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 1000, 1000);
135 g_object_set (canvas,
136 "units", units,
137 "anchor", GTK_ANCHOR_CENTER,
138 NULL);
139
140 gtk_widget_show (canvas);
141 gtk_container_add (GTK_CONTAINER (scrolled_win), canvas);
142
143 return vbox;
144 }
145
146
147 static gboolean
on_delete_event(GtkWidget * window,GdkEvent * event,gpointer unused_data)148 on_delete_event (GtkWidget *window,
149 GdkEvent *event,
150 gpointer unused_data)
151 {
152 gtk_main_quit ();
153 return FALSE;
154 }
155
156
157 int
main(int argc,char * argv[])158 main (int argc, char *argv[])
159 {
160 GtkWidget *window, *notebook;
161 cairo_surface_t *surface;
162
163 gtk_set_locale ();
164 gtk_init (&argc, &argv);
165
166 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
167 gtk_window_set_default_size (GTK_WINDOW (window), 640, 600);
168 gtk_widget_show (window);
169 g_signal_connect (window, "delete_event", G_CALLBACK (on_delete_event),
170 NULL);
171
172 notebook = gtk_notebook_new ();
173 gtk_widget_show (notebook);
174 gtk_container_add (GTK_CONTAINER (window), notebook);
175
176 surface = cairo_image_surface_create_from_png ("flower.png");
177 flower_width = cairo_image_surface_get_width (surface);
178 flower_height = cairo_image_surface_get_height (surface);
179 flower_pattern = cairo_pattern_create_for_surface (surface);
180 cairo_surface_destroy (surface);
181
182 gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
183 create_canvas (GTK_UNIT_PIXEL, "pixels"),
184 gtk_label_new ("Pixels"));
185
186 gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
187 create_canvas (GTK_UNIT_POINTS, "points"),
188 gtk_label_new ("Points"));
189
190 gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
191 create_canvas (GTK_UNIT_INCH, "inches"),
192 gtk_label_new ("Inches"));
193
194 gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
195 create_canvas (GTK_UNIT_MM, "millimeters"),
196 gtk_label_new ("Millimeters"));
197
198 gtk_main ();
199
200 return 0;
201 }
202
203
204