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
{
13 private double height
;
15 private Rsvg
.Handle rsvg_handle
;
17 public SVGItem (double px
, double py
, Rsvg
.Handle handle
) {
18 stdout
.printf("SVGItem::SVGItem\n");
22 height
= handle
.height
;
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");
30 cr
.get_matrix(out matrix
);
31 matrix
.translate(x
, y
);
32 cr
.set_matrix(matrix
);
33 rsvg_handle
.render_cairo(cr
);
35 cr
.line_to(x
, y
+ height
);
36 cr
.line_to(x
+ width
, y
+ height
);
37 cr
.line_to(x
+ width
, y
);
41 public override void simple_update (Cairo
.Context cr
) {
42 stdout
.printf("SVGItem::simple_update\n");
44 bounds
.x2
= x
+ width
;
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
))
60 int main (string[] 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
);
73 var canvas
= new
Canvas ();
74 canvas
.automatic_bounds
= true;
77 var root
= canvas
.get_root_item ();
80 root
.set_simple_transform(0, 0, zoom
, 0);
82 canvas
.button_press_event
.connect ((target
, event
) => {
86 canvas
.button_release_event
.connect ((target
, event
) => {
90 canvas
.motion_notify_event
.connect ((target
, event
) => {
94 canvas
.scroll_event
.connect ((target
, event
) => {
95 if (event
.direction
== Gdk
.ScrollDirection
.UP
|| event
.direction
== Gdk
.ScrollDirection
.LEFT
)
101 root
.set_simple_transform(0, 0, zoom
, 0);
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,
115 "stroke-color", "yellow",
116 "fill-color", "red");
118 bool dragging
= false;
122 rect_item
.button_press_event
.connect ((target
, event
) => {
123 stdout
.printf("Pressed\n");
124 if (event
.button
== 1)
134 rect_item
.button_release_event
.connect ((target
, event
) => {
135 stdout
.printf("Released\n");
140 rect_item
.motion_notify_event
.connect ((target
, event
) => {
143 double new_x
= event
.x
;
144 double new_y
= event
.y
;
145 target
.translate(new_x
- drag_x
, new_y
- drag_y
);