File: gnome-canvas.rb

package info (click to toggle)
ruby-gnome2 0.15.0-1.1
  • links: PTS
  • area: main
  • in suites: etch-m68k
  • size: 7,692 kB
  • ctags: 8,558
  • sloc: ansic: 69,912; ruby: 19,511; makefile: 97; xml: 35; sql: 13
file content (124 lines) | stat: -rw-r--r-- 3,245 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
=begin header

  gnome-canvas.rb - Affine transformation sample using Ruby/GnomeCanvas2.

  $Author: mutoh $
  $Date: 2006/06/29 18:24:23 $

  Copyright (C) 2003-2006  Ruby-GNOME2 Project Team
  Copyright (C) 2002,2003  KUBO Takehiro <kubo@jiubao.org>

=end

require 'gnomecanvas2'

class AffineApp < Gtk::Window
  CANVAS_SIZE_X = 200
  CANVAS_SIZE_Y = 100
  TRANSLATE_X = 20
  TRANSLATE_Y = 20
  ITEM_SIZE_X = 20
  ITEM_SIZE_Y = 20

  # affine transformation to move to the center of the Canvas.
  TRANS = Art::Affine.translate(CANVAS_SIZE_X / 2, CANVAS_SIZE_Y / 2)

  def setup_canvas_frame(table, x, y, title, affine)
    frame = Gtk::Frame.new(title)
    frame.set_shadow_type(Gtk::SHADOW_IN)
    table.attach(frame,
		 x, x + 1,
		 y, y + 1,
		 Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK,
		 Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK,
		 0, 0)
    frame.show

    canvas = Gnome::Canvas.new()
    canvas.set_size_request(CANVAS_SIZE_X, CANVAS_SIZE_Y)
    canvas.set_scroll_region(0, 0, CANVAS_SIZE_X, CANVAS_SIZE_Y)
    frame.add(canvas)
    canvas.show()

    points = [[CANVAS_SIZE_X / 2, 0], [CANVAS_SIZE_X / 2, CANVAS_SIZE_Y]]
    Gnome::CanvasLine.new(canvas.root,
			  {:points => points,
			    :fill_color => "gray",
			    :width_pixels => 1})
    points = [[0, CANVAS_SIZE_Y / 2], [CANVAS_SIZE_X, CANVAS_SIZE_Y / 2]]
    Gnome::CanvasLine.new(canvas.root,
			  {:points => points,
			    :fill_color => "gray",
			    :width_pixels => 1})

    group = Gnome::CanvasGroup.new(canvas.root, {})
    Gnome::CanvasRect.new(group,
			  {:x1 => 0, :y1 => 0,
			    :x2 => - ITEM_SIZE_X / 2, :y2 => - ITEM_SIZE_Y / 2,
			    :fill_color => "blue"})
    Gnome::CanvasRect.new(group,
			  {:x1 => 0, :y1 => 0,
			    :x2 => ITEM_SIZE_X / 2, :y2 => - ITEM_SIZE_Y / 2,
			    :fill_color => "red"})
    Gnome::CanvasRect.new(group,
			  {:x1 => 0, :y1 => 0,
			    :x2 => - ITEM_SIZE_X / 2, :y2 => ITEM_SIZE_Y / 2,
			    :fill_color => "green"})
    Gnome::CanvasRect.new(group,
			  {:x1 => 0, :y1 => 0,
			    :x2 => ITEM_SIZE_X / 2, :y2 => ITEM_SIZE_Y / 2,
			    :fill_color => "yellow"})
    group.affine_relative(TRANS * affine)
  end

  def initialize
    super(Gtk::Window::TOPLEVEL)

    self.signal_connect("delete_event") do
      Gtk::main_quit()
    end

    sw = Gtk::ScrolledWindow.new
    sw.set_size_request(600, 400)
    self.add(sw)
    sw.show

    affine = Array.new(5)
    text = Array.new(5)
    affine[0] = Art::Affine.identity
    text[0] = 'No Conversion'
    affine[1] = Art::Affine.scale(1, 2)
    text[1] = 'Scale(1,2)'
    affine[2] = Art::Affine.rotate(45)
    text[2] = 'Rotate(45)'
    affine[3] = Art::Affine.shear(45)
    text[3] = 'Shear(45)'
    affine[4] = Art::Affine.translate(TRANSLATE_X, TRANSLATE_Y)
    text[4] = "Translate(#{TRANSLATE_X}, #{TRANSLATE_Y})"
    
    table = Gtk::Table.new(affine.size, affine.size, false)
    sw.add_with_viewport(table)
    table.show

    0.upto(affine.size - 1) do |x|
      0.upto(affine.size - 1) do |y|
	if x == 0
	  label = text[y]
	elsif y == 0
	  label = text[x]
	else
	  label = text[x] + ' * ' + text[y]
	end
	setup_canvas_frame(table, x, y, label, affine[x] * affine[y])
      end
    end
    self.show
  end
end

def main
  AffineApp.new
  Gtk::main
end

main