Fixed sizes axis range in files.out_diabar
[findit] / src / files / out_diabar.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, ceil
7 import os.path
8
9 from misc import size_hum_read
10
11 #==============================================================================
12
13 class Cli_Presentation(object):
14     pass
15
16 #==============================================================================
17
18 class Gtk_Presentation(object):
19
20     def _create_toolbar(self):
21         toolbar = gtk.Toolbar()
22         toolbar.set_property('icon-size', 'small-toolbar')
23
24         saveresults_tbtn = gtk.ToolButton('gtk-save')
25         saveresults_tbtn.connect('clicked', self.save_results)
26
27         toolbar.insert(saveresults_tbtn, -1)
28
29         return toolbar
30
31     def __init__(self, results, maxdata=10):
32         import gtk
33         global gtk  # for _create_toolbar()
34         import cairo
35         global cairo    # for expose_event()
36         import pycha.bar
37         global pycha    # for expose_event()
38
39         filelist, start_path = results
40
41         # `maxdata` biggest files from list
42         filelist.sort(reverse=True)
43         filelist = filelist[:maxdata]
44
45         # Maximum size
46         maximum = max([bsize for bsize, path, size in filelist])
47
48         #====================
49         # Diagram
50         #====================
51
52         # Only byte sizes
53         self.data = (
54             ('sizes',
55                 [(i, d[0]) for i, d in enumerate(filelist)]),
56         )
57
58         # Labels for bar chart
59         ticks = [dict(v=i, label=os.path.basename(d[1])) for i, d in enumerate(filelist)]
60
61         # Calculate sizes axis range
62         max_ticks = 10
63
64         multiplier = 10**(len(`maximum`) - 2)
65         interval_2 = 2*multiplier
66         interval_5 = 5*multiplier
67
68         ticks_2 = range(0, maximum + interval_2, interval_2)
69         ticks_5 = range(0, maximum + interval_5, interval_5)
70
71         ticks_count2 = len(ticks_2) - 1
72         if ticks_count2 > max_ticks:
73             interval = interval_5
74             ticks_range = [0, max(ticks_5)]
75         else:
76             interval = interval_2
77             ticks_range = [0, max(ticks_2)]
78
79         #print multiplier, interval, ticks_range
80         #yticks = [dict(v=i*1000, label=`i` + 'Kb') for i in range(maximum/1000)]
81
82         # Chart properties
83         self.options = {
84             'axis': {
85                 'tickSize' : 0,
86                 'tickFontSize' : 11,
87                 'x': {
88                     'ticks': ticks,
89                     'rotate': 90,
90                 },
91                 'y': {
92                     #'ticks': yticks,
93                     'tickPrecision' : 0,
94                     'interval' : interval,
95                     'range' : ticks_range,
96                 },
97             },
98             'background': {
99                 'chartColor': '#d8e7ec',
100                 'baseColor': '#ffffff',
101                 'lineColor': '#444444',
102                 'lineWidth ' : 1,
103             },
104             'padding': {
105                 'left': 100,
106                 'right': 20,
107                 'top': 20,
108                 'bottom': 60,
109             },
110             'legend': {
111                 'hide': True,
112             },
113             'yvals' : {
114                 'show' : True,
115                 'inside' : True,
116                 'fontColor' : '#ffffff',
117             },
118         }
119
120         drawing = gtk.DrawingArea()
121         drawing.connect('expose-event', self.expose_event)
122
123         #====================
124         # Packing
125         #====================
126
127         toolbar = self._create_toolbar()
128
129         vbox = gtk.VBox(False, 0)
130         vbox.pack_start(drawing, True, True, 0)
131         vbox.pack_start(toolbar, False, False, 0)
132
133         self.toplevel = vbox
134
135     def expose_event(self, widget, event):
136         x, y, w, h, _ = widget.window.get_geometry()
137         self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)
138
139         chart = pycha.bar.HorizontalBarChart(self.surface, self.options)
140         chart.addDataset(self.data)
141         chart.render()
142
143         cr = widget.window.cairo_create()   # cairo context
144         cr.set_source_surface(self.surface, 0, 0)
145         cr.paint()
146
147         # Outline rectangle
148         cr.set_source_rgb(0, 0, 0)
149         cr.rectangle(0, 0, w, h)
150         cr.stroke()
151
152     def save_results(self, btn):
153         """Show 'Save to file' dialog."""
154         dialog = gtk.FileChooserDialog(title='Save to...',
155                                        action='save',
156                                        buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
157                                                 gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
158         dialog.show_all()
159         response = dialog.run()
160         if response == gtk.RESPONSE_OK:
161             filepath = dialog.get_filename()
162             if not filepath.endswith('.png'):
163                 filepath += '.png'
164             # Saving results in png file
165             self.surface.write_to_png(filepath)
166         dialog.destroy()