3 # vim: sw=4 ts=4 expandtab ai
5 from random import random
6 from math import pi, cos, sin, sqrt
8 #==============================================================================
10 class Cli_Presentation(object):
13 #==============================================================================
15 class Gtk_Presentation(object):
16 def __init__(self, filelist, maxdata=10):
20 drawing = gtk.DrawingArea()
22 # `maxdata` biggest files from list
23 filelist.sort(reverse=True)
24 del filelist[maxdata:]
25 self.filelist = filelist
28 fullsize = sum((f[0] for f in filelist))
33 for bsize, name, size in filelist:
34 color = self.rand_color()
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 - 20
49 cr = widget.window.cairo_create() # cairo context
50 cr.translate(w/2-w/6, h/2) # moving coordinates
53 for i, (start_angle, end_angle, color) in enumerate(sectors):
56 cr.set_source_rgb(*color)
57 cr.arc(0, 0, R, start_angle, end_angle)
60 # to cartesian coordinates
61 delta_angle = end_angle - start_angle
62 x = R/1.7 * cos(start_angle+delta_angle/2)
63 y = R/1.7 * sin(start_angle+delta_angle/2)
64 area = 0.5*(delta_angle*R**2) # sector area
67 cr.set_font_size(sqrt(area)/2) # text size
68 text = str(i+1) # text string
69 xbearing, ybearing, textw, texth = cr.text_extents(text)[:4]
70 cr.move_to(x-(xbearing+textw/2), y-(ybearing+texth/2)) # text center
71 cr.set_source_rgb(.3, .3, .3) # text color
75 cr.translate(w/2-w/6, -h/2+40) # moving coordinates
79 for i, (bsize, name, size) in enumerate(self.filelist):
81 cr.set_source_rgb(*color)
82 cr.rectangle(-20, 20*i+3, 14, -14)
85 text = str(i+1) + '. ' + name + ' (' + str(size) + ')'
87 cr.set_source_rgb(0, 0, 0)
91 return random(), random(), random()