goocanvas 0.90.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/ChangeLog +87 -0
  2. data/README +37 -0
  3. data/Rakefile +14 -0
  4. data/ext/goocanvas/Makefile +162 -0
  5. data/ext/goocanvas/depend +5 -0
  6. data/ext/goocanvas/extconf.rb +66 -0
  7. data/ext/goocanvas/goocanvas.def +2 -0
  8. data/ext/goocanvas/goocanvas.so +0 -0
  9. data/ext/goocanvas/rbgoo_canvasversion.h +25 -0
  10. data/ext/goocanvas/rbgoocairo.c +74 -0
  11. data/ext/goocanvas/rbgoocairo.o +0 -0
  12. data/ext/goocanvas/rbgoocanvas.c +236 -0
  13. data/ext/goocanvas/rbgoocanvas.h +66 -0
  14. data/ext/goocanvas/rbgoocanvas.o +0 -0
  15. data/ext/goocanvas/rbgoocanvasellipse.c +50 -0
  16. data/ext/goocanvas/rbgoocanvasellipse.o +0 -0
  17. data/ext/goocanvas/rbgoocanvasgroup.c +41 -0
  18. data/ext/goocanvas/rbgoocanvasgroup.o +0 -0
  19. data/ext/goocanvas/rbgoocanvasimage.c +45 -0
  20. data/ext/goocanvas/rbgoocanvasimage.o +0 -0
  21. data/ext/goocanvas/rbgoocanvasitem.c +358 -0
  22. data/ext/goocanvas/rbgoocanvasitem.o +0 -0
  23. data/ext/goocanvas/rbgoocanvaspolyline.c +102 -0
  24. data/ext/goocanvas/rbgoocanvaspolyline.o +0 -0
  25. data/ext/goocanvas/rbgoocanvasrect.c +47 -0
  26. data/ext/goocanvas/rbgoocanvasrect.o +0 -0
  27. data/ext/goocanvas/rbgoocanvasstyle.c +61 -0
  28. data/ext/goocanvas/rbgoocanvasstyle.o +0 -0
  29. data/ext/goocanvas/rbgoocanvastable.c +41 -0
  30. data/ext/goocanvas/rbgoocanvastable.o +0 -0
  31. data/ext/goocanvas/rbgoocanvastext.c +58 -0
  32. data/ext/goocanvas/rbgoocanvastext.o +0 -0
  33. data/ext/goocanvas/rbgoocanvaswidget.c +48 -0
  34. data/ext/goocanvas/rbgoocanvaswidget.o +0 -0
  35. data/ext/goocanvas/rbgooutils.c +44 -0
  36. data/ext/goocanvas/rbgooutils.o +0 -0
  37. data/ext/goocanvas/ruby-goocanvas.pc +3 -0
  38. data/extconf.rb +49 -0
  39. data/lib/goocanvas.rb +145 -0
  40. data/sample/demo-arrowhead.rb +315 -0
  41. data/sample/demo-fifteen.rb +218 -0
  42. data/sample/demo-primitives.rb +720 -0
  43. data/sample/demo.rb +84 -0
  44. data/sample/flower.png +0 -0
  45. data/sample/scalability-demo.rb +130 -0
  46. data/sample/simple-demo.rb +35 -0
  47. data/sample/table-demo.rb +137 -0
  48. data/sample/toroid.png +0 -0
  49. data/sample/units-demo.rb +80 -0
  50. data/sample/widgets-demo.rb +197 -0
  51. metadata +133 -0
@@ -0,0 +1,720 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -*- indent-tabs-mode: nil -*-
3
+ =begin header
4
+
5
+ Rewritten by Emmanuel Pinault <seatmanu@yahoo.com>
6
+
7
+ Original Copyright:
8
+
9
+ Author : Richard Hestilow <hestgray@ionet.net>
10
+
11
+ Copyright (C) 1998 Free Software Foundation
12
+
13
+ This program is free software; you can redistribute it and/or modify
14
+ it under the terms of the GNU General Public License as published by
15
+ the Free Software Foundation; either version 2, or (at your option)
16
+ any later version.
17
+
18
+ This program is distributed in the hope that it will be useful,
19
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
+ GNU General Public License for more details.
22
+
23
+ You should have received a copy of the GNU General Public License
24
+ along with this program; if not, write to the Free Software
25
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26
+ 02111-1307, USA.
27
+
28
+ =end
29
+ class CanvasSamplePrimitives < Gtk::VBox
30
+ VERTICES = 10
31
+ RADIUS = 60.0
32
+
33
+ def initialize(aa)
34
+ super(false, 4)
35
+ @dragging = false
36
+ self.border_width = 4
37
+ show
38
+
39
+ label = Gtk::Label.new("Drag an item with button 1. " +
40
+ "Click button 2 on an item to lower it, " +
41
+ "or button 3 to raise it.")
42
+ pack_start(label, false, false, 0)
43
+ label.show
44
+
45
+ hbox = Gtk::HBox.new(false, 4)
46
+ pack_start(hbox, false, false, 0)
47
+ hbox.show
48
+
49
+ # Create the canvas
50
+ canvas = Goo::Canvas.new
51
+ canvas.automatic_bounds = true
52
+ canvas.bounds_from_origin = false
53
+ canvas.bounds_padding = 4.0
54
+ canvas.background_color_rgb = 0xc3c3ff
55
+ canvas.set_bounds(0, 0, 604, 454)
56
+
57
+ # Scale
58
+ label = Gtk::Label.new("Scale:")
59
+ hbox.pack_start(label, false, false, 0)
60
+ label.show
61
+
62
+ adjustment = Gtk::Adjustment.new(1.00, 0.05, 50.00, 0.05, 0.50, 0.50)
63
+ button = Gtk::SpinButton.new(adjustment, 0.0, 2)
64
+ adjustment.signal_connect('value_changed') do |adj,|
65
+ canvas.scale = adj.value
66
+ end
67
+ button.set_size_request(50, -1)
68
+ hbox.pack_start(button, false, false, 0)
69
+ button.show
70
+
71
+ label = Gtk::Label.new("Scale X:")
72
+ hbox.pack_start(label, false, false, 0)
73
+ label.show
74
+
75
+ adjustment = Gtk::Adjustment.new(1.00, 0.05, 50.00, 0.05, 0.50, 0.50)
76
+ button = Gtk::SpinButton.new(adjustment, 0.0, 2)
77
+ adjustment.signal_connect('value_changed') do |adj,|
78
+ canvas.scale_x = adj.value
79
+ end
80
+ button.set_size_request(50, -1)
81
+ hbox.pack_start(button, false, false, 0)
82
+ button.show
83
+
84
+ label = Gtk::Label.new("Scale Y:")
85
+ hbox.pack_start(label, false, false, 0)
86
+ label.show
87
+
88
+ adjustment = Gtk::Adjustment.new(1.00, 0.05, 50.00, 0.05, 0.50, 0.50)
89
+ button = Gtk::SpinButton.new(adjustment, 0.0, 2)
90
+ adjustment.signal_connect('value_changed') do |adj,|
91
+ canvas.scale_y = adj.value
92
+ end
93
+ button.set_size_request(50, -1)
94
+ hbox.pack_start(button, false, false, 0)
95
+ button.show
96
+
97
+ hbox = Gtk::HBox.new(false, 4)
98
+ pack_start(hbox, false, false, 0)
99
+ hbox.show
100
+
101
+ # Center
102
+ button = Gtk::CheckButton.new('Center scroll region')
103
+ hbox.pack_start(button, false, false, 0)
104
+ button.signal_connect("toggled") do |_button,|
105
+ canvas.center_scroll_region = _button.active
106
+ end
107
+ # button.show
108
+
109
+ # Move Ellipse
110
+ button = Gtk::Button.new("Move Ellipse")
111
+ hbox.pack_start(button, false, false, 0)
112
+ button.show
113
+ last_state = 0
114
+ button.signal_connect("clicked") do |_button,|
115
+ $ellipse2.transform = nil
116
+
117
+ case last_state
118
+ when 0
119
+ $ellipse2.center_x = 300.0
120
+ $ellipse2.center_y = 70.0
121
+ $ellipse2.radius_x = 45.0
122
+ $ellipse2.radius_y = 30.0
123
+ $ellipse2.fill_color = 'red'
124
+ $ellipse2.stroke_color = 'midnightblue'
125
+ $ellipse2.line_width = 4.0
126
+ $ellipse2.title = 'A red ellipse'
127
+ when 1
128
+ $ellipse2.center_x = 390.0
129
+ $ellipse2.center_y = 150.0
130
+ $ellipse2.radius_x = 45.0
131
+ $ellipse2.radius_y = 40.0
132
+ $ellipse2.fill_color = 'brown'
133
+ $ellipse2.stroke_color = 'midnightblue'
134
+ $ellipse2.line_width = 4.0
135
+ $ellipse2.title = 'A brown ellipse'
136
+ when 2
137
+ $ellipse2.center_x = 0.0
138
+ $ellipse2.center_y = 0.0
139
+ $ellipse2.radius_y = 30.0
140
+ $ellipse2.set_simple_transform(100, 100, 1, 0)
141
+ when 3
142
+ $ellipse2.set_simple_transform(200, 100, 2, 0)
143
+ when 4
144
+ $ellipse2.set_simple_transform(200, 200, 1, 45)
145
+ when 5
146
+ $ellipse2.set_simple_transform(50, 50, 0.2, 225)
147
+ else
148
+ $ellipse2.center_x = 335.0
149
+ $ellipse2.center_y = 70.0
150
+ $ellipse2.radius_x = 45.0
151
+ $ellipse2.radius_y = 30.0
152
+ $ellipse2.fill_color = 'purple'
153
+ $ellipse2.stroke_color = 'midnightblue'
154
+ $ellipse2.line_width = 4.0
155
+ $ellipse2.title = 'A purple ellipse'
156
+ end
157
+ last_state = (last_state + 1) % 7
158
+ end
159
+
160
+ # Animate Ellipse
161
+ button = Gtk::Button.new("Animate Ellipse")
162
+ hbox.pack_start(button, false, false, 0)
163
+ button.show
164
+ button.signal_connect('clicked') do
165
+ $ellipse2.animate(100, 100, 1, 90, true,
166
+ 1000, 40, Goo::CanvasItem::ANIMATE_BOUNCE)
167
+ end
168
+
169
+ # Stop Animation
170
+ button = Gtk::Button.new("Stop Animation")
171
+ hbox.pack_start(button, false, false, 0)
172
+ button.show
173
+ button.signal_connect('clicked') do
174
+ $ellipse2.stop_animation
175
+ end
176
+
177
+ # Create PDF
178
+ button = Gtk::Button.new("Write PDF")
179
+ hbox.pack_start(button, false, false, 0)
180
+ button.show
181
+ button.signal_connect('clicked') do
182
+ puts "In write_pdf_clicked"
183
+
184
+ Cairo::PDFSurface.new("demo.pdf", 9 * 72, 10 * 72) do |surface|
185
+ Cairo::Context.new(surface) do |context|
186
+
187
+ # Place it in the middle of our 9x10 page.
188
+ context.translate(20, 130)
189
+
190
+ canvas.render(context, nil, 1.0)
191
+
192
+ context.show_page
193
+ end
194
+ end
195
+ end
196
+
197
+ button = Gtk::Button.new("Change Bounds")
198
+ hbox.pack_start(button, false, false, 0)
199
+ button.show
200
+ bounds = [
201
+ [-100, -100, 200, 200],
202
+ [100, 100, 200, 200],
203
+ [0, 0, 300, 300],
204
+ [0, 0, 604, 454],
205
+ ]
206
+ bounds_n = 0
207
+ button.signal_connect("clicked") do |_button,|
208
+ if bounds_n < 4
209
+ automatic_bounds = false
210
+ bounds_from_origin = false
211
+ canvas.set_bounds(*bounds[bounds_n])
212
+ elsif bounds_n == 4
213
+ automatic_bounds = true
214
+ bounds_from_origin = true
215
+ end
216
+
217
+ canvas.automatic_bounds = automatic_bounds
218
+ canvas.bounds_from_origin = bounds_from_origin
219
+ canvas.bounds_padding = 50
220
+ bounds_n = (bounds_n + 1) % 6
221
+ end
222
+
223
+ hbox = Gtk::HBox.new(false, 4)
224
+ pack_start(hbox, false, false, 0)
225
+ hbox.show
226
+
227
+ # Scroll to
228
+ label = Gtk::Label.new("Scroll To:")
229
+ hbox.pack_start(label, false, false, 0)
230
+ label.show
231
+
232
+ button = Gtk::Button.new("50,50")
233
+ hbox.pack_start(button, false, false, 0)
234
+ button.show
235
+ button.signal_connect('clicked') {canvas.scroll_to(50, 50)}
236
+
237
+ button = Gtk::Button.new("250,250")
238
+ hbox.pack_start(button, false, false, 0)
239
+ button.show
240
+ button.signal_connect('clicked') {canvas.scroll_to(250, 250)}
241
+
242
+ button = Gtk::Button.new("500,500")
243
+ hbox.pack_start(button, false, false, 0)
244
+ button.show
245
+ button.signal_connect('clicked') {canvas.scroll_to(500, 500)}
246
+
247
+ # Scroll anchor
248
+ label = Gtk::Label.new("Anchor:")
249
+ hbox.pack_start(label, false, false, 0)
250
+ label.show
251
+
252
+ group = nil
253
+ [
254
+ ['NW', Gtk::ANCHOR_NW],
255
+ ['NE', Gtk::ANCHOR_NE],
256
+ ['W', Gtk::ANCHOR_W],
257
+ ['C', Gtk::ANCHOR_CENTER],
258
+ ['E', Gtk::ANCHOR_E],
259
+ ['SW', Gtk::ANCHOR_SW],
260
+ ['S', Gtk::ANCHOR_S],
261
+ ['SE', Gtk::ANCHOR_SE],
262
+ ].each do |name, anchor|
263
+ if group
264
+ button = Gtk::RadioButton.new(group, name)
265
+ else
266
+ button = Gtk::RadioButton.new(name)
267
+ end
268
+ group, = button.group
269
+ hbox.pack_start(button, false, false, 0)
270
+ button.show
271
+ button.signal_connect('toggled') do |_button|
272
+ canvas.anchor = anchor if _button.active?
273
+ end
274
+ end
275
+
276
+ # Layout the stuff
277
+ scrolled_window = Gtk::ScrolledWindow.new
278
+ scrolled_window.show
279
+ pack_start(scrolled_window, true, true, 0)
280
+
281
+ canvas.show
282
+ scrolled_window.add(canvas)
283
+
284
+ # Add all the canvas items.
285
+ setup_canvas(canvas)
286
+ end
287
+
288
+ def image_path(name)
289
+ File.join(File.dirname(__FILE__), name)
290
+ end
291
+
292
+ def setup_item_signals(item)
293
+ dragging = false
294
+ drag_x = nil
295
+ drag_y = nil
296
+
297
+ item.signal_connect('motion_notify_event') do |item, target, event|
298
+ if dragging && (event.state & Gdk::Window::BUTTON1_MASK == Gdk::Window::BUTTON1_MASK)
299
+ item.translate(event.x - drag_x, event.y - drag_y)
300
+ end
301
+ true
302
+ end
303
+
304
+ item.signal_connect('button_press_event') do |item, target, event|
305
+ case event.button
306
+ when 1
307
+ if event.state & Gdk::Window::SHIFT_MASK == Gdk::Window::SHIFT_MASK
308
+ item.parent.remove_child(item)
309
+ else
310
+ drag_x = event.x
311
+ drag_y = event.y
312
+
313
+ fleur = Gdk::Cursor.new(Gdk::Cursor::FLEUR)
314
+ canvas = item.canvas
315
+ canvas.pointer_grab(item, Gdk::Event::POINTER_MOTION_MASK | Gdk::Event::BUTTON_RELEASE_MASK, fleur, event.time)
316
+ dragging = true
317
+ end
318
+ when 2
319
+ item.lower(nil)
320
+ when 3
321
+ item.raise(nil)
322
+ end
323
+ true
324
+ end
325
+
326
+ item.signal_connect('button_release_event') do |item, target, event|
327
+ canvas = item.canvas
328
+ canvas.pointer_ungrab(item, event.time) if canvas
329
+ dragging = false
330
+ true
331
+ end
332
+ end
333
+
334
+ def setup_heading(root, text, pos)
335
+ x = (pos % 3) * 200 + 100
336
+ y = (pos / 3) * 150 + 5
337
+
338
+ item = Goo::CanvasText.new(root, text, x, y, -1, Gtk::ANCHOR_N, :font => "Sans 12")
339
+ item.skew_y(30, x, y)
340
+ end
341
+
342
+ def setup_divisions(root)
343
+ group = Goo::CanvasGroup.new(root, nil)
344
+ group.translate(2, 2)
345
+
346
+ item = Goo::CanvasRect.new(group, 0, 0, 600, 450, :line_width => 4.0)
347
+ item = Goo::CanvasPolyline.new_line(group, 0, 150, 600, 150, :line_width => 4.0)
348
+ item = Goo::CanvasPolyline.new_line(group, 0, 300, 600, 300, :line_width => 4.0)
349
+ item = Goo::CanvasPolyline.new_line(group, 200, 0, 200, 450, :line_width => 4.0)
350
+ item = Goo::CanvasPolyline.new_line(group, 400, 0, 400, 450, :line_width => 4.0)
351
+
352
+ setup_heading(group, 'Rectangles', 0)
353
+ setup_heading(group, 'Ellipses', 1)
354
+ setup_heading(group, 'Texts', 2)
355
+ setup_heading(group, 'Images', 3)
356
+ setup_heading(group, 'Lines', 4)
357
+ setup_heading(group, 'Polygons', 7)
358
+ end
359
+
360
+ # FIXME: I think we may need to check byte order.
361
+ def create_stipple(color_name, stipple_data)
362
+ color = Gdk::Color.parse(color_name)
363
+ stipple_data[2] = stipple_data[14] = (color.red >> 8)
364
+ stipple_data[1] = stipple_data[13] = (color.green >> 8)
365
+ stipple_data[0] = stipple_data[12] = (color.blue >> 8)
366
+ surface = Cairo::ImageSurface.new(stipple_data.pack('C*'), Cairo::FORMAT_ARGB32, 2, 2, 8)
367
+ pattern = Cairo::SurfacePattern.new(surface)
368
+ pattern.extend = Cairo::EXTEND_REPEAT
369
+
370
+ return pattern
371
+ end
372
+
373
+ def setup_rectangles(root)
374
+ stipple_data = [ 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255 ]
375
+
376
+ item = Goo::CanvasRect.new(root, 20, 30, 50, 30,
377
+ :stroke_color => "red",
378
+ :line_width => 8.0)
379
+ setup_item_signals(item)
380
+
381
+ pattern = create_stipple("mediumseagreen", stipple_data)
382
+ item = Goo::CanvasRect.new(root, 90, 40, 90, 60,
383
+ :fill_pattern => pattern,
384
+ :stroke_color => 'black',
385
+ :line_width => 4.0)
386
+ setup_item_signals(item)
387
+
388
+ item = Goo::CanvasRect.new(root, 10, 80, 70, 60, :fill_color => "steelblue")
389
+ setup_item_signals(item)
390
+
391
+ item = Goo::CanvasRect.new(root, 20, 90, 70, 60,
392
+ :fill_color_rgba => 0x3cb37180,
393
+ :stroke_color => "blue",
394
+ :line_width => 2.0)
395
+ setup_item_signals(item)
396
+
397
+ item = Goo::CanvasRect.new(root, 110, 80, 50, 30,
398
+ :radius_x => 20.0,
399
+ :radius_y => 10.0,
400
+ :stroke_color => "yellow",
401
+ :fill_color_rgba => 0x3cb3f180)
402
+ setup_item_signals(item)
403
+
404
+ #TODO
405
+ # item = goo_demo_item_new(root, 30, 20, 50, 30,
406
+ # :fill_color => "yellow")
407
+ # setup_item_signals(item)
408
+ end
409
+
410
+ def setup_ellipses(root)
411
+ stipple_data = [ 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255 ]
412
+
413
+ ellipse1 = Goo::CanvasEllipse.new(root, 245, 45, 25, 15,
414
+ :stroke_color => 'goldenrod',
415
+ :line_width => 8.0)
416
+ setup_item_signals(ellipse1)
417
+
418
+ $ellipse2 = Goo::CanvasEllipse.new(root, 335, 70, 45, 30,
419
+ :fill_color => 'wheat',
420
+ :stroke_color => 'midnightblue',
421
+ :line_width => 4.0,
422
+ :title => 'An ellipse')
423
+ setup_item_signals($ellipse2)
424
+
425
+ pattern = create_stipple('cadetblue', stipple_data)
426
+ ellipse3 = Goo::CanvasEllipse.new(root, 245, 110, 35, 30,
427
+ :fill_pattern => pattern,
428
+ :stroke_color => 'black',
429
+ :line_width => 1.0)
430
+ setup_item_signals(ellipse3)
431
+ end
432
+
433
+
434
+
435
+ def polish_diamond(root)
436
+ group = Goo::CanvasGroup.new(root,
437
+ :line_width => 1.0,
438
+ :line_cap => Cairo::LINE_CAP_ROUND)
439
+ group.translate(270, 230)
440
+ setup_item_signals(group)
441
+
442
+ VERTICES.times do |i|
443
+ a = 2.0 * Math::PI * i / VERTICES
444
+ x1 = RADIUS * Math.cos(a)
445
+ y1 = RADIUS * Math.sin(a)
446
+
447
+ ((i + 1)...VERTICES).each do |j|
448
+ a = 2.0 * Math::PI * j / VERTICES
449
+ x2 = RADIUS * Math.cos(a)
450
+ y2 = RADIUS * Math.sin(a)
451
+ item = Goo::CanvasPolyline.new_line(group, x1, y1, x2, y2)
452
+ end
453
+ end
454
+ end
455
+
456
+ SCALE = 7.0
457
+
458
+ def make_hilbert(root)
459
+ hilbert = "urdrrulurulldluuruluurdrurddldrrruluurdrurddldrddlulldrdldrrurd".split(//)
460
+ stipple_data = [ 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255 ]
461
+
462
+ points = [ 340.0, 290.0 ]
463
+
464
+ i = 0
465
+ hilbert.each do |c|
466
+ case c
467
+ when 'u'
468
+ points[i+2] = points[i+0]
469
+ points[i+3] = points[i+1] - SCALE
470
+ when 'd'
471
+ points[i+2] = points[i+0]
472
+ points[i+3] = points[i+1] + SCALE
473
+ when 'l'
474
+ points[i+2] = points[i+0] - SCALE
475
+ points[i+3] = points[i+1]
476
+ when 'r'
477
+ points[i+2] = points[i+0] + SCALE
478
+ points[i+3] = points[i+1]
479
+ end
480
+ i += 2
481
+ end
482
+
483
+ pattern = create_stipple("red", stipple_data)
484
+ item = Goo::CanvasPolyline.new(root, false, points,
485
+ :line_width => 4.0,
486
+ :stroke_pattern => pattern,
487
+ :line_cap => Cairo::LINE_CAP_SQUARE,
488
+ :line_join => Cairo::LINE_JOIN_MITER)
489
+ setup_item_signals(item)
490
+ end
491
+
492
+ def setup_lines(root)
493
+ polish_diamond(root)
494
+ make_hilbert(root)
495
+
496
+ # Arrow tests
497
+
498
+ polyline1 = Goo::CanvasPolyline.new(root, false,
499
+ [ 340.0, 170.0,
500
+ 340.0, 230.0,
501
+ 390.0, 230.0,
502
+ 390.0, 170.0,
503
+ ],
504
+ :stroke_color => 'midnightblue',
505
+ :line_width => 3.0,
506
+ :start_arrow => true,
507
+ :end_arrow => true,
508
+ :arrow_tip_length => 3.0,
509
+ :arrow_length => 4.0,
510
+ :arrow_width => 3.5)
511
+ setup_item_signals(polyline1)
512
+
513
+ polyline2 = Goo::CanvasPolyline.new(root, false,
514
+ [ 356.0, 180.0,
515
+ 374.0, 220.0,
516
+ ] ,
517
+ :stroke_color => "blue",
518
+ :line_width => 1.0,
519
+ :start_arrow => true,
520
+ :end_arrow => true,
521
+ :arrow_tip_length => 5.0,
522
+ :arrow_length => 6.0,
523
+ :arrow_width => 6.0)
524
+ setup_item_signals(polyline2)
525
+
526
+ polyline3 = Goo::CanvasPolyline.new(root, false,
527
+ [ 356.0, 220.0,
528
+ 374.0, 180.0,
529
+ ],
530
+ :stroke_color => "blue",
531
+ :line_width => 1.0,
532
+ :start_arrow => true,
533
+ :end_arrow => true,
534
+ :arrow_tip_length => 5.0,
535
+ :arrow_length => 6.0,
536
+ :arrow_width => 6.0)
537
+ setup_item_signals(polyline3)
538
+
539
+ # Test polyline without any coords.
540
+ polyline4 = Goo::CanvasPolyline.new(root, false, [])
541
+ setup_item_signals(polyline4)
542
+
543
+ # Test polyline with 1 coord and arrows.
544
+ polyline5 = Goo::CanvasPolyline.new(root, false,
545
+ [ 356.0, 220.0 ],
546
+ :start_arrow => true,
547
+ :end_arrow => true)
548
+ setup_item_signals(polyline5)
549
+ end
550
+
551
+ def setup_polygons(root)
552
+ stipple_data = [ 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255 ]
553
+
554
+ points =
555
+ [ 210.0, 320.0,
556
+ 210.0, 380.0,
557
+ 260.0, 350.0,
558
+ ]
559
+ pattern = create_stipple("blue", stipple_data)
560
+ polyline1 = Goo::CanvasPolyline.new(root, true, points,
561
+ :line_width => 1.0,
562
+ :fill_pattern => pattern,
563
+ :stroke_color => "black")
564
+ setup_item_signals(polyline1)
565
+
566
+ points =
567
+ [ 270.0, 330.0,
568
+ 270.0, 430.0,
569
+ 390.0, 430.0,
570
+ 390.0, 330.0,
571
+ 310.0, 330.0,
572
+ 310.0, 390.0,
573
+ 350.0, 390.0,
574
+ 350.0, 370.0,
575
+ 330.0, 370.0,
576
+ 330.0, 350.0,
577
+ 370.0, 350.0,
578
+ 370.0, 410.0,
579
+ 290.0, 410.0,
580
+ 290.0, 330.0,
581
+ ]
582
+ polyline2 = Goo::CanvasPolyline.new(root, true, points,
583
+ :fill_color => 'tan',
584
+ :stroke_color => 'black',
585
+ :line_width => 3.0)
586
+ setup_item_signals(polyline2)
587
+ end
588
+
589
+ def make_anchor(root, x, y)
590
+ transform = Cairo::Matrix.new(0.8, 0.2, -0.3, 0.5, x, y)
591
+
592
+ group = Goo::CanvasGroup.new(root)
593
+ group.translate(x, y)
594
+ group.transform = transform
595
+ $transforms ||= []
596
+ $transforms << transform
597
+
598
+ item = Goo::CanvasRect.new(group, -2.5, -2.5, 4, 4, :line_width => 1.0)
599
+ setup_item_signals(item)
600
+
601
+ group
602
+ end
603
+
604
+ def setup_texts(root)
605
+ stipple_data = [ 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255 ]
606
+
607
+ pattern = create_stipple('blue', stipple_data)
608
+ item = Goo::CanvasText.new(make_anchor(root, 420, 20),
609
+ 'Anchor NW', 0, 0, -1, Gtk::ANCHOR_NW,
610
+ :font => 'Sans Bold 24',
611
+ :fill_pattern => pattern)
612
+ setup_item_signals(item)
613
+
614
+ item = Goo::CanvasText.new(make_anchor(root, 470, 75),
615
+ "Anchor center\nJustify center\nMultiline text\nb8bit text ÅÄÖåäö",
616
+ 0, 0, -1, Gtk::ANCHOR_CENTER,
617
+ :font => "monospace bold 14",
618
+ :alignment => Pango::ALIGN_CENTER,
619
+ :fill_color => 'firebrick')
620
+ setup_item_signals(item)
621
+
622
+ textitem = Goo::CanvasText.new(make_anchor(root, 420, 240),
623
+ "This is a very long paragraph that will need to be wrapped over several lines so we can see what happens to line-breaking as the view is zoomed in and out.",
624
+ 0, 0, 180, Gtk::ANCHOR_W,
625
+ :font => 'Sans 12',
626
+ :fill_color => 'goldenrod')
627
+ setup_item_signals(textitem)
628
+
629
+ textitem = Goo::CanvasText.new(root,
630
+ "Ellipsized text.",
631
+ 20, 420, 115, Gtk::ANCHOR_W,
632
+ :font => 'Sans 12',
633
+ :fill_color => "blue",
634
+ :ellipsize => Pango::ELLIPSIZE_END)
635
+ setup_item_signals(textitem)
636
+ end
637
+
638
+ def setup_invisible_texts(root)
639
+ Goo::CanvasText.new(root, "Visible above 0.8x", 500, 330, -1,
640
+ Gtk::ANCHOR_CENTER,
641
+ :visibility => Goo::CanvasItem::VISIBLE_ABOVE_THRESHOLD,
642
+ :visibility_threshold => 0.8)
643
+ Goo::CanvasRect.new(root, 410.5, 322.5, 180, 15,
644
+ :line_width => 1.0,
645
+ :visibility => Goo::CanvasItem::VISIBLE_ABOVE_THRESHOLD,
646
+ :visibility_threshold => 0.8)
647
+
648
+ Goo::CanvasText.new(root, "Visible above 1.5x", 500, 350, -1,
649
+ Gtk::ANCHOR_CENTER,
650
+ :visibility => Goo::CanvasItem::VISIBLE_ABOVE_THRESHOLD,
651
+ :visibility_threshold => 1.5)
652
+ Goo::CanvasRect.new(root, 410.5, 342.5, 180, 15,
653
+ :line_width => 1.0,
654
+ :visibility => Goo::CanvasItem::VISIBLE_ABOVE_THRESHOLD,
655
+ :visibility_threshold => 1.5)
656
+
657
+ Goo::CanvasText.new(root, "Visible above 3.0x", 500, 370, -1,
658
+ Gtk::ANCHOR_CENTER,
659
+ :visibility => Goo::CanvasItem::VISIBLE_ABOVE_THRESHOLD,
660
+ :visibility_threshold => 3.0)
661
+ Goo::CanvasRect.new(root, 410.5, 362.5, 180, 15,
662
+ :line_width => 1.0,
663
+ :visibility => Goo::CanvasItem::VISIBLE_ABOVE_THRESHOLD,
664
+ :visibility_threshold => 3.0)
665
+
666
+ # This should never be seen.
667
+ Goo::CanvasText.new(root, "Always Invisible", 500, 390, -1,
668
+ Gtk::ANCHOR_CENTER,
669
+ :visibility => Goo::CanvasItem::INVISIBLE)
670
+ Goo::CanvasRect.new(root, 410.5, 350.5, 180, 15,
671
+ :line_width => 1.0,
672
+ :visibility => Goo::CanvasItem::INVISIBLE)
673
+ end
674
+
675
+ def plant_flower(root, x, y, anchor)
676
+ surface = Cairo::ImageSurface.from_png(image_path('flower.png'))
677
+ w = surface.width
678
+ h = surface.height
679
+
680
+ pattern = Cairo::SurfacePattern.new(surface)
681
+
682
+ image = Goo::CanvasImage.new(root, nil, x, y,
683
+ :pattern => pattern,
684
+ :width => w,
685
+ :height => h)
686
+ setup_item_signals(image)
687
+ end
688
+
689
+ def setup_images(root)
690
+ im = Gdk::Pixbuf.new(image_path('toroid.png'))
691
+
692
+ w = im.width
693
+ h = im.height
694
+ image = Goo::CanvasImage.new(root, im, 100.0 - w / 2, 225.0 - h / 2,
695
+ :width => w, :height => h)
696
+ setup_item_signals(image)
697
+
698
+ plant_flower(root, 20.0, 170.0, Gtk::ANCHOR_NW)
699
+ plant_flower(root, 180.0, 170.0, Gtk::ANCHOR_NE)
700
+ plant_flower(root, 20.0, 280.0, Gtk::ANCHOR_SW)
701
+ plant_flower(root, 180.0, 280.0, Gtk::ANCHOR_SE)
702
+ end
703
+
704
+ def setup_canvas(canvas)
705
+ root = canvas.root_item
706
+ root.signal_connect("button_press_event") {
707
+ puts "background received 'button-press' signal"
708
+ }
709
+
710
+ # Setup canvas items
711
+ setup_divisions(root)
712
+ setup_rectangles(root)
713
+ setup_ellipses(root)
714
+ setup_lines(root)
715
+ setup_polygons(root)
716
+ setup_texts(root)
717
+ setup_images(root)
718
+ setup_invisible_texts(root)
719
+ end
720
+ end