Merge commit 'origin/mosfet/master' into alex2ndr/master
[findit] / src / files / outdiagram.py
diff --git a/src/files/outdiagram.py b/src/files/outdiagram.py
new file mode 100755 (executable)
index 0000000..b333057
--- /dev/null
@@ -0,0 +1,92 @@
+#!/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()