Try to use PyCha chart library
[findit] / src / files / out_diaold.py
1 #!/usr/bin/env python
2 # -*-coding: utf-8 -*-
3 # vim: sw=4 ts=4 expandtab ai
4
5 from random import random
6 from math import pi, cos, sin, sqrt
7 import os.path
8
9 #==============================================================================
10
11 class Cli_Presentation(object):
12     pass
13
14 #==============================================================================
15
16 class Gtk_Presentation(object):
17     def __init__(self, filelist, maxdata=10):
18         import gtk
19         import cairo
20
21         drawing = gtk.DrawingArea()
22
23         # `maxdata` biggest files from list
24         filelist.sort(reverse=True)
25         del filelist[maxdata:]
26         self.filelist = filelist
27
28         # sum of sizes
29         fullsize = sum((f[0] for f in filelist))
30
31         # sectors list
32         sectors = []
33         start_angle = 0
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
40
41         drawing.connect('expose-event', self.expose_event, sectors)
42
43         self.toplevel = drawing
44
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
48
49         cr = widget.window.cairo_create()   # cairo context
50         cr.rectangle(0, 0, w, h)
51         cr.set_source_rgb(1, 1, 1)
52         cr.fill()
53         cr.set_source_rgb(0, 0, 0)
54         cr.rectangle(0, 0, w, h)
55         cr.stroke()
56
57         cr.translate(w/2-w/6, h/2)          # moving coordinates
58
59         # drawing pie chart
60         for i, (start_angle, end_angle, color) in enumerate(sectors):
61             # drawing sector
62             cr.move_to(0, 0)
63             cr.set_source_rgb(*color)
64             cr.arc(0, 0, R, start_angle, end_angle)
65             cr.fill()
66
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
72
73             # drawing text
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
79             cr.show_text(text)
80
81         cr.set_font_size(14)
82         cr.translate(R+40, -h/2+40)  # moving coordinates
83         cr.move_to(0, 0)
84
85         # drawing files list
86         for i, (bsize, name, size) in enumerate(self.filelist):
87             color = sectors[i][2]
88             cr.set_source_rgb(*color)
89             cr.rectangle(-20, 20*i+3, 14, -14)
90             cr.fill()
91
92             text = str(i+1) + '. ' + os.path.basename(name) + ' (' + str(size) + ')'
93             cr.move_to(0, 20*i)
94             cr.set_source_rgb(0, 0, 0)
95             cr.show_text(text)
96
97     def rand_color(self):
98         return random(), random(), random()