Yay! The SVG file is shown!
[gbricks.git] / test.vala
blobc773276d22470e40049b25ec9eea80a70ff5e1a4
1 using Gtk;
2 using Goo;
3 using Rsvg;
4 using Cairo;
6 // https://live.gnome.org/Vala/Tutorial
7 // https://live.gnome.org/Vala/GTKSample
8 // http://www.vala-project.org/doc/docu/goocanvas.vapi/index.html
10 public class SVGItem : Goo.CanvasItemSimple {
11 private double x;
12 private double y;
13 private double height;
14 private double width;
15 private Rsvg.Handle rsvg_handle;
17 public SVGItem (double px, double py, Rsvg.Handle handle) {
18 stdout.printf("SVGItem::SVGItem\n");
19 x = px;
20 y = py;
21 width = handle.width;
22 height = handle.height;
23 rsvg_handle = handle;
24 stdout.printf(" h=%lf, w=%lf\n", height, width);
27 public override void simple_paint (Cairo.Context cr, Goo.CanvasBounds bounds) {
28 stdout.printf("SVGItem::simple_paint\n");
29 Cairo.Matrix matrix;
30 cr.get_matrix(out matrix);
31 matrix.translate(x, y);
32 cr.set_matrix(matrix);
33 rsvg_handle.render_cairo(cr);
34 cr.move_to(x, y);
35 cr.line_to(x, y + height);
36 cr.line_to(x + width, y + height);
37 cr.line_to(x + width, y);
38 cr.close_path();
41 public override void simple_update (Cairo.Context cr) {
42 stdout.printf("SVGItem::simple_update\n");
43 bounds.x1 = x;
44 bounds.x2 = x + width;
45 bounds.y1 = y;
46 bounds.y1 = y + height;
49 public override bool simple_is_item_at (double px, double py, Cairo.Context cr, bool is_pointer_event) {
50 stdout.printf("SVGItem::simple_is_item_at\n");
51 if (px < x || (px > x + width) || py < y || (py > y + height))
53 return false;
54 } else {
55 return true;
60 int main (string[] args) {
61 Gtk.init (ref args);
63 var window = new Window ();
64 window.title = "Test Program";
65 window.window_position = WindowPosition.CENTER;
66 window.set_default_size (640, 600);
67 window.destroy.connect (Gtk.main_quit);
69 var scroll = new ScrolledWindow (null, null);
70 scroll.set_policy (PolicyType.AUTOMATIC, PolicyType.AUTOMATIC);
71 window.add (scroll);
73 var canvas = new Canvas ();
74 canvas.automatic_bounds = true;
75 scroll.add (canvas);
77 var root = canvas.get_root_item ();
79 double zoom = 1.0;
80 root.set_simple_transform(0, 0, zoom, 0);
82 canvas.button_press_event.connect ((target, event) => {
83 return false;
84 });
86 canvas.button_release_event.connect ((target, event) => {
87 return false;
88 });
90 canvas.motion_notify_event.connect ((target, event) => {
91 return false;
92 });
94 canvas.scroll_event.connect ((target, event) => {
95 if (event.direction == Gdk.ScrollDirection.UP || event.direction == Gdk.ScrollDirection.LEFT)
97 zoom *= 0.9;
98 } else {
99 zoom /= 0.9;
101 root.set_simple_transform(0, 0, zoom, 0);
102 return false;
105 var red_svg = new Rsvg.Handle.from_file("images/redCircle.svg");
107 var red_item = new SVGItem (10, 10, red_svg);
108 red_item.set_parent(root);
109 root.add_child(red_item, 0);
111 var rect_item = CanvasRect.create(root, 100, 100, 400, 400,
112 "line-width", 10.0,
113 "radius-x", 20.0,
114 "radius-y", 10.0,
115 "stroke-color", "yellow",
116 "fill-color", "red");
118 bool dragging = false;
119 double drag_x = 0;
120 double drag_y = 0;
122 rect_item.button_press_event.connect ((target, event) => {
123 stdout.printf("Pressed\n");
124 if (event.button == 1)
126 drag_x = event.x;
127 drag_y = event.y;
128 dragging = true;
129 return true;
131 return false;
134 rect_item.button_release_event.connect ((target, event) => {
135 stdout.printf("Released\n");
136 dragging = false;
137 return true;
140 rect_item.motion_notify_event.connect ((target, event) => {
141 if (dragging)
143 double new_x = event.x;
144 double new_y = event.y;
145 target.translate(new_x - drag_x, new_y - drag_y);
146 return true;
148 return false;
151 window.show_all ();
153 Gtk.main ();
154 return 0;