Added 'Save to file' dialog to files.out_diabar and files.out_diapie
[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
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         #yticks = [dict(v=i*1000, label=`i` + 'Kb') for i in range(maximum/1000)]
62         #interval = (maximum/1024)*100
63 #         print 'maximum:', maximum
64 #         print 'interval:', interval
65
66         self.options = {
67             'axis': {
68                 'tickSize' : 0,
69                 'tickFontSize' : 11,
70                 'x': {
71                     'ticks': ticks,
72                     'tickCount': 7,
73                     'rotate': 90,
74                 },
75                 'y': {
76                     #'ticks': yticks,
77                     #'tickCount': maximum/(1000*10),
78                     'tickCount': 10,
79                     #'tickPrecision' : 0,
80                     #'interval' : interval,
81                 },
82             },
83             'background': {
84                 'chartColor': '#d8e7ec',
85                 'baseColor': '#ffffff',
86                 'lineColor': '#444444',
87                 'lineWidth ' : 1,
88             },
89             'padding': {
90                 'left': 100,
91                 'right': 20,
92                 'top': 20,
93                 'bottom': 60,
94             },
95             'legend': {
96                 'hide': True,
97             },
98             'yvals' : {
99                 'show' : True,
100                 'inside' : True,
101                 'fontColor' : '#ffffff',
102             },
103         }
104
105         drawing = gtk.DrawingArea()
106         drawing.connect('expose-event', self.expose_event)
107
108         #====================
109         # Packing
110         #====================
111
112         toolbar = self._create_toolbar()
113
114         vbox = gtk.VBox(False, 0)
115         vbox.pack_start(drawing, True, True, 0)
116         vbox.pack_start(toolbar, False, False, 0)
117
118         self.toplevel = vbox
119
120     def expose_event(self, widget, event):
121         x, y, w, h, _ = widget.window.get_geometry()
122         self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)
123
124         chart = pycha.bar.HorizontalBarChart(self.surface, self.options)
125         chart.addDataset(self.data)
126         chart.render()
127
128         cr = widget.window.cairo_create()   # cairo context
129         cr.set_source_surface(self.surface, 0, 0)
130         cr.paint()
131
132         # outline rectangle
133         cr.set_source_rgb(0, 0, 0)
134         cr.rectangle(0, 0, w, h)
135         cr.stroke()
136
137     def save_results(self, btn):
138         """Show 'Save to file' dialog."""
139         dialog = gtk.FileChooserDialog(title='Save to...',
140                                        action='save',
141                                        buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
142                                                 gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
143         dialog.show_all()
144         response = dialog.run()
145         if response == gtk.RESPONSE_OK:
146             filepath = dialog.get_filename()
147             if not filepath.endswith('.png'):
148                 filepath += '.png'
149             # Saving results in png file
150             self.surface.write_to_png(filepath)
151         dialog.destroy()