Updated Danish translation
[tbo.git] / test / cairotest.py
1 # -*- coding: utf-8 -*-
2 import pygtk
3 pygtk.require('2.0')
4 import gtk, gobject, cairo
5 import math
6 import rsvg
7 pi = math.pi
8
9 BLACK = (0.0,0.0,0.0)
10 WHITE = (1.0,1.0,1.0)
11
12 class TBObject:
13     def __init__(self, x=0, y=0, w=0, h=0):
14         self.width = w
15         self.height = h
16         self.x = x
17         self.y = y
18
19     def scale(self, w=0, h=0):
20         self.width = w
21         self.height = h
22
23     def move(self, x, y):
24         self.x = x
25         self.y = y
26
27 class Text(TBObject):
28     def __init__(self, text, color=BLACK, font="Sans", fontsize=12, **kwargs):
29         TBObject.__init__(self, **kwargs)
30         self.text = text.split("\n")
31         self.color = color
32         self.font = font
33         self.fontsize = fontsize
34
35     def draw(self, cr):
36         x, y = self.x, self.y
37         for line in self.text:
38             cr.set_source_rgb(*self.color)
39             cr.select_font_face(self.font, cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
40             cr.set_font_size(self.fontsize)
41             x_bearing, y_bearing, width, height = cr.text_extents(line)[:4]
42             cr.move_to(x - width / 2 - x_bearing, y - height / 2 - y_bearing)
43             cr.show_text(line)
44             y -= y_bearing - 5
45
46 class SVG(TBObject):
47     def __init__(self, file, **kwargs):
48         TBObject.__init__(self, **kwargs)
49         self.file = file 
50         self.svg = rsvg.Handle(file)
51
52     def draw(self, cr):
53         x, y = self.x, self.y
54         ws, hs = self.scale_svg()
55         cr.translate(x, y)
56         cr.scale(ws, hs)
57         self.svg.render_cairo(cr)
58         cr.scale(1/ws,1/hs)
59         cr.translate(-x, -y)
60
61     def scale_svg(self):
62         w, h = self.svg.props.width, self.svg.props.height
63         if not self.width or not self.height:
64             self.width, self.height = w, h
65
66         w_scale = self.width / float(w)
67         h_scale = self.height / float(h)
68         return w_scale, h_scale
69
70 class Rectangle(TBObject):
71     def __init__(self, color=BLACK, fill=WHITE, line_width=1, **kwargs):
72         TBObject.__init__(self, **kwargs)
73         self.color = color
74         self.fill = fill
75         self.line_width = line_width
76
77     def draw(self, cr):
78         cr.set_line_width(self.line_width)
79         cr.set_source_rgb(*self.color)
80         cr.rectangle(self.x, self.y, self.width, self.height)
81         cr.stroke()
82         cr.set_source_rgb(*self.fill)
83         cr.rectangle(self.x, self.y, self.width, self.height)
84         cr.fill()
85
86 class DArea(gtk.DrawingArea):
87     def __init__(self):
88         gtk.DrawingArea.__init__(self)
89         self.connect("expose-event", self.expose)
90
91         self.add_events(gtk.gdk.BUTTON_PRESS_MASK |
92                         gtk.gdk.BUTTON1_MOTION_MASK)
93
94         self.connect("expose_event", self.expose)
95         self.connect("button_press_event", self.pressing)
96         self.connect("motion_notify_event", self.moving)
97
98     def expose(self, widget, event):
99         self.context = self.window.cairo_create()
100
101         self.context.rectangle(event.area.x, event.area.y,
102                         event.area.width, event.area.height)
103         self.context.clip()
104
105         self.draw(self.context, *self.window.get_size())
106     
107     def draw(self, cr, width, height):
108         r = Rectangle(x=10, y=10, w=width-20, h=height-20, line_width=10)
109         r.draw(cr)
110
111         # draw lines
112         cr.set_source_rgb(0.0, 0.0, 0.8)
113         cr.move_to(width / 3.0, height / 3.0)
114         cr.rel_line_to(0, height / 6.0)
115         cr.move_to(2 * width / 3.0, height / 3.0)
116         cr.rel_line_to(0, height / 6.0)
117         cr.stroke()
118
119         # and a circle
120         cr.set_source_rgb(1.0, 0.0, 0.0)
121         radius = min(width, height)
122         cr.arc(width / 2.0, height / 2.0, radius / 2.0 - 20, 0, 2 * pi)
123         cr.stroke()
124         cr.arc(width / 2.0, height / 2.0, radius / 3.0 - 10, pi / 3, 2 * pi / 3)
125         cr.stroke()
126
127         globo = SVG("globo.svg", x=width-300, y=40, w=200, h=120)
128         globo.draw(cr)
129
130         text = '''
131 este texto
132 está escrito
133 en varias
134 líneas
135         '''
136
137         tbotext = Text(text, x=width-200, y=60, fontsize=12, font="Kid Kosmic")
138         tbotext.draw(cr)
139
140     def pressing(self, widget, event):
141         print "pressing", event.x, event.y
142
143     def moving(self, widget, event):
144         print "moving", event.x, event.y
145
146 def main():
147     w = gtk.Window()
148     w.set_title("TBO")
149     w.set_default_size(800, 500)
150     darea = DArea()
151     w.add(darea)
152     w.show_all()
153     w.connect('destroy', gtk.main_quit)
154     gtk.main()
155
156 if __name__ == '__main__':
157     main()