--- /dev/null
+#!/usr/bin/env python
+# -*-coding: utf-8 -*-
+# vim: sw=4 ts=4 expandtab ai
+
+from random import random
+from math import pi, cos, sin, sqrt
+import os.path
+
+#==============================================================================
+
+class Cli_Presentation(object):
+ pass
+
+#==============================================================================
+
+class Gtk_Presentation(object):
+ def __init__(self, filelist, maxdata=10):
+ import gtk
+ import cairo
+
+ drawing = gtk.DrawingArea()
+
+ # `maxdata` biggest files from list
+ filelist.sort(reverse=True)
+ del filelist[maxdata:]
+ self.filelist = filelist
+
+ # sum of sizes
+ fullsize = sum((f[0] for f in filelist))
+
+ # sectors list
+ sectors = []
+ start_angle = 0
+ for bsize, name, size in filelist:
+ color = self.rand_color()
+ delta_angle = (float(bsize)/fullsize)*2*pi
+ end_angle = start_angle + delta_angle
+ color = self.rand_color()
+ sectors.append((start_angle, end_angle, color))
+ start_angle += delta_angle
+
+ drawing.connect('expose-event', self.expose_event, sectors)
+
+ self.toplevel = drawing
+
+ def expose_event(self, widget, event, sectors):
+ x, y, w, h, _ = widget.window.get_geometry()
+ R = min(w-w/3, h)/2 - 20
+
+ cr = widget.window.cairo_create() # cairo context
+ cr.translate(w/2-w/6, h/2) # moving coordinates
+
+ # drawing pie chart
+ for i, (start_angle, end_angle, color) in enumerate(sectors):
+ # drawing sector
+ cr.move_to(0, 0)
+ cr.set_source_rgb(*color)
+ cr.arc(0, 0, R, start_angle, end_angle)
+ cr.fill()
+
+ # to cartesian coordinates
+ delta_angle = end_angle - start_angle
+ x = R/1.7 * cos(start_angle+delta_angle/2)
+ y = R/1.7 * sin(start_angle+delta_angle/2)
+ area = 0.5*(delta_angle*R**2) # sector area
+
+ # drawing text
+ cr.set_font_size(sqrt(area)/3) # text size
+ text = str(i+1) # text string
+ xbearing, ybearing, textw, texth = cr.text_extents(text)[:4]
+ cr.move_to(x-(xbearing+textw/2), y-(ybearing+texth/2)) # text center
+ cr.set_source_rgb(.3, .3, .3) # text color
+ cr.show_text(text)
+
+ cr.set_font_size(14)
+ cr.translate(w/2-w/6, -h/2+40) # moving coordinates
+ cr.move_to(0, 0)
+
+ # drawing files list
+ for i, (bsize, name, size) in enumerate(self.filelist):
+ color = sectors[i][2]
+ cr.set_source_rgb(*color)
+ cr.rectangle(-20, 20*i+3, 14, -14)
+ cr.fill()
+
+ text = str(i+1) + '. ' + os.path.basename(name) + ' (' + str(size) + ')'
+ cr.move_to(0, 20*i)
+ cr.set_source_rgb(0, 0, 0)
+ cr.show_text(text)
+
+ def rand_color(self):
+ return random(), random(), random()