3 # vim: sw=4 ts=4 expandtab ai
5 from random import random
6 from math import pi, cos, sin, sqrt
9 #==============================================================================
11 class Cli_Presentation(object):
14 #==============================================================================
16 class Gtk_Presentation(object):
17 def __init__(self, filelist, maxdata=10):
21 drawing = gtk.DrawingArea()
23 # `maxdata` biggest files from list
24 filelist.sort(reverse=True)
25 del filelist[maxdata:]
26 self.filelist = filelist
29 fullsize = sum((f[0] for f in filelist))
34 for bsize, name, size in filelist:
35 delta_angle = (float(bsize)/fullsize)*2*pi
36 end_angle = start_angle + delta_angle
37 color = self.rand_color()
38 sectors.append((start_angle, end_angle, color))
39 start_angle += delta_angle
41 drawing.connect('expose-event', self.expose_event, sectors)
43 self.toplevel = drawing
45 def expose_event(self, widget, event, sectors):
46 x, y, w, h, _ = widget.window.get_geometry()
47 R = min(w-w/3, h)/2 - 10
49 cr = widget.window.cairo_create() # cairo context
50 cr.rectangle(0, 0, w, h)
51 cr.set_source_rgb(1, 1, 1)
53 cr.set_source_rgb(0, 0, 0)
54 cr.rectangle(0, 0, w, h)
57 cr.translate(w/2-w/6, h/2) # moving coordinates
60 for i, (start_angle, end_angle, color) in enumerate(sectors):
63 cr.set_source_rgb(*color)
64 cr.arc(0, 0, R, start_angle, end_angle)
67 # to cartesian coordinates
68 delta_angle = end_angle - start_angle
69 x = R/1.7 * cos(start_angle+delta_angle/2)
70 y = R/1.7 * sin(start_angle+delta_angle/2)
71 area = 0.5*(delta_angle*R**2) # sector area
74 cr.set_font_size(sqrt(area)/2) # text size
75 text = str(i+1) # text string
76 xbearing, ybearing, textw, texth = cr.text_extents(text)[:4]
77 cr.move_to(x-(xbearing+textw/2), y-(ybearing+texth/2)) # text center
78 cr.set_source_rgb(.3, .3, .3) # text color
82 cr.translate(R+40, -h/2+40) # moving coordinates
86 for i, (bsize, name, size) in enumerate(self.filelist):
88 cr.set_source_rgb(*color)
89 cr.rectangle(-20, 20*i+3, 14, -14)
92 text = str(i+1) + '. ' + os.path.basename(name) + ' (' + str(size) + ')'
94 cr.set_source_rgb(0, 0, 0)
98 return random(), random(), random()