From: Eugene Gagarin Date: Mon, 4 May 2009 14:03:26 +0000 (+0400) Subject: Try to use PyCha chart library X-Git-Url: http://git.maemo.org/git/?p=findit;a=commitdiff_plain;h=61a4936c2cb43e89cb66d4bac3208ceee4ce41aa Try to use PyCha chart library --- diff --git a/src/config.py b/src/config.py index ffd81c3..9e78a33 100755 --- a/src/config.py +++ b/src/config.py @@ -9,7 +9,7 @@ Config = {} Config['search'] = 'files' -Config['outtype'] = 'outtable' +Config['outtype'] = 'out_table' # files Config['ignore_dirs'] = ['/dev', '/proc', '/sys', '/mnt'] diff --git a/src/files/out_diabar.py b/src/files/out_diabar.py new file mode 100755 index 0000000..e83d3ed --- /dev/null +++ b/src/files/out_diabar.py @@ -0,0 +1,80 @@ +#!/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; global cairo + import pycha.bar; global pycha + + drawing = gtk.DrawingArea() + drawing.connect('expose-event', self.expose_event) + + # `maxdata` biggest files from list + filelist.sort(reverse=True) + filelist = filelist[:maxdata] + + # only byte sizes + self.data = ( + ('sizes', + [(i, d[0]) for i, d in enumerate(filelist)]), + ) + + # labels for bar chart + ticks = [dict(v=i, label=os.path.basename(d[1])) for i, d in enumerate(filelist)] + + self.options = { + 'axis': { + 'x': { + 'ticks': ticks, + 'tickCount': 7, + 'rotate': 90, + }, + 'y': { + 'tickCount': 5, + 'tickPrecision' : 0, + }, + }, + 'background': { + 'chartColor': '#d8e7ec', + 'baseColor': '#efebe7', + 'lineColor': '#444444' +# 'hide': True, + }, + 'padding': { + 'left': 40, + 'right': 10, + 'top': 20, + 'bottom': 60, + }, + 'legend': { + 'hide': True, + }, + } + + self.toplevel = drawing + + def expose_event(self, widget, event): + x, y, w, h, _ = widget.window.get_geometry() + surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) + + cr = widget.window.cairo_create() # cairo context + cr.set_source_surface(surface, 0, 0) + + chart = pycha.bar.VerticalBarChart(surface, self.options) + chart.addDataset(self.data) + chart.render() + + cr.paint() diff --git a/src/files/out_diaold.py b/src/files/out_diaold.py new file mode 100755 index 0000000..2356bbd --- /dev/null +++ b/src/files/out_diaold.py @@ -0,0 +1,98 @@ +#!/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: + 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 - 10 + + cr = widget.window.cairo_create() # cairo context + cr.rectangle(0, 0, w, h) + cr.set_source_rgb(1, 1, 1) + cr.fill() + cr.set_source_rgb(0, 0, 0) + cr.rectangle(0, 0, w, h) + cr.stroke() + + 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)/2) # 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(R+40, -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() diff --git a/src/files/out_diapie.py b/src/files/out_diapie.py new file mode 100755 index 0000000..5ca8666 --- /dev/null +++ b/src/files/out_diapie.py @@ -0,0 +1,76 @@ +#!/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; global cairo + import pycha.pie; global pycha + + drawing = gtk.DrawingArea() + drawing.connect('expose-event', self.expose_event) + + # `maxdata` biggest files from list + filelist.sort(reverse=True) + filelist = filelist[:maxdata] + + # only byte sizes + self.data = [(path, [[0, bsize]]) for bsize, path, size in filelist] + + # labels for pie chart + ticks = [dict(v=i, label=os.path.basename(d[0])) for i, d in enumerate(self.data)] + + self.options = { + 'axis': { + 'x': { + 'ticks': ticks, + } + }, + 'background': { + 'hide': True, + }, + 'padding': { + 'left': 10, + 'right': 10, + 'top': 10, + 'bottom': 10, + }, + 'legend': { + 'hide': True, + } + } + + self.toplevel = drawing + + def expose_event(self, widget, event): + x, y, w, h, _ = widget.window.get_geometry() + surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) + + cr = widget.window.cairo_create() # cairo context + + cr.rectangle(0, 0, w, h) + cr.set_source_rgb(1, 1, 1) + cr.fill() + cr.set_source_rgb(0, 0, 0) + cr.rectangle(0, 0, w, h) + cr.stroke() + + cr.set_source_surface(surface, 0, 0) + + chart = pycha.pie.PieChart(surface, self.options) + chart.addDataset(self.data) + chart.render() + + cr.paint() diff --git a/src/files/out_table.py b/src/files/out_table.py new file mode 100755 index 0000000..b7219dc --- /dev/null +++ b/src/files/out_table.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +# -*-coding: utf-8 -*- +# vim: sw=4 ts=4 expandtab ai + +from misc import _ + +#============================================================================== + +# class OutTable_Control(object): +# def __init__(self): +# self.table_present = Gtk_Presentation() +# +# def show(self, filelist, flsize): +# self.table_present.show_result(filelist, flsize) +# +# def get_ui(self): +# return self.table_present.get_toplevel() +# +# +# #============================================================================== +# +# class OutTable_Abstraction(object): +# pass + +#============================================================================== + +class Cli_Presentation(object): + def __init__(self, filelist): ### + self.toplevel = self.print_results(filelist) + + def print_results(self, filelist): + for bsize, path, size in filelist: + print '%10d' % bsize, path + +#============================================================================== + +class Gtk_Presentation(object): + def __init__(self, filelist): ### + import gtk + import gobject + + # Определяем переменную в которой будет храниться выводимый список + self.liststore = gtk.ListStore(str, str, gobject.TYPE_INT64) + + for bsize, path, size in filelist: + self.liststore.append([path, size, bsize]) + + treeview = gtk.TreeView(self.liststore) + + # Создаем и настраиваем колонку с размером файла + size_col = gtk.TreeViewColumn(_('Size')) + cell1 = gtk.CellRendererText() + cell1.set_property('width', 90) + size_col.pack_start(cell1, True) + size_col.add_attribute(cell1, 'text', 1) + treeview.append_column(size_col) + # Создаем и настраиваем колонку с именем файла + path_col = gtk.TreeViewColumn(_('Path')) + cell2 = gtk.CellRendererText() + path_col.pack_start(cell2, True) + path_col.add_attribute(cell2, 'text', 0) + treeview.append_column(path_col) + + # Добавляем сортировку для колонок + treeview.set_search_column(1) + path_col.set_sort_column_id(0) + size_col.set_sort_column_id(2) + + self.swin = gtk.ScrolledWindow() + self.swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + self.swin.add(treeview) +### self.swin.show_all() + self.toplevel = self.swin + +# #=== Functions ============================================================ +# def show_results(self, filelist): +# self.liststore.clear() +# for path, size, bsize in filelist: +# print path, size, bsize +# self.liststore.append([path, size, bsize]) + +#============================================================================== + +class Hildon_Presentation(object): + def __init__(self, filelist): ### + import gtk + import gobject + import hildon + + # На таблетке не отображаються заголовки столбцов по умолчанию - + # след строка заставляет их отображаться принудительно + treeview.set_headers_visible(1) diff --git a/src/files/outdiagram.py b/src/files/outdiagram.py deleted file mode 100755 index 2356bbd..0000000 --- a/src/files/outdiagram.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/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: - 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 - 10 - - cr = widget.window.cairo_create() # cairo context - cr.rectangle(0, 0, w, h) - cr.set_source_rgb(1, 1, 1) - cr.fill() - cr.set_source_rgb(0, 0, 0) - cr.rectangle(0, 0, w, h) - cr.stroke() - - 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)/2) # 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(R+40, -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() diff --git a/src/files/outtable.py b/src/files/outtable.py deleted file mode 100755 index b7219dc..0000000 --- a/src/files/outtable.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python -# -*-coding: utf-8 -*- -# vim: sw=4 ts=4 expandtab ai - -from misc import _ - -#============================================================================== - -# class OutTable_Control(object): -# def __init__(self): -# self.table_present = Gtk_Presentation() -# -# def show(self, filelist, flsize): -# self.table_present.show_result(filelist, flsize) -# -# def get_ui(self): -# return self.table_present.get_toplevel() -# -# -# #============================================================================== -# -# class OutTable_Abstraction(object): -# pass - -#============================================================================== - -class Cli_Presentation(object): - def __init__(self, filelist): ### - self.toplevel = self.print_results(filelist) - - def print_results(self, filelist): - for bsize, path, size in filelist: - print '%10d' % bsize, path - -#============================================================================== - -class Gtk_Presentation(object): - def __init__(self, filelist): ### - import gtk - import gobject - - # Определяем переменную в которой будет храниться выводимый список - self.liststore = gtk.ListStore(str, str, gobject.TYPE_INT64) - - for bsize, path, size in filelist: - self.liststore.append([path, size, bsize]) - - treeview = gtk.TreeView(self.liststore) - - # Создаем и настраиваем колонку с размером файла - size_col = gtk.TreeViewColumn(_('Size')) - cell1 = gtk.CellRendererText() - cell1.set_property('width', 90) - size_col.pack_start(cell1, True) - size_col.add_attribute(cell1, 'text', 1) - treeview.append_column(size_col) - # Создаем и настраиваем колонку с именем файла - path_col = gtk.TreeViewColumn(_('Path')) - cell2 = gtk.CellRendererText() - path_col.pack_start(cell2, True) - path_col.add_attribute(cell2, 'text', 0) - treeview.append_column(path_col) - - # Добавляем сортировку для колонок - treeview.set_search_column(1) - path_col.set_sort_column_id(0) - size_col.set_sort_column_id(2) - - self.swin = gtk.ScrolledWindow() - self.swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - self.swin.add(treeview) -### self.swin.show_all() - self.toplevel = self.swin - -# #=== Functions ============================================================ -# def show_results(self, filelist): -# self.liststore.clear() -# for path, size, bsize in filelist: -# print path, size, bsize -# self.liststore.append([path, size, bsize]) - -#============================================================================== - -class Hildon_Presentation(object): - def __init__(self, filelist): ### - import gtk - import gobject - import hildon - - # На таблетке не отображаються заголовки столбцов по умолчанию - - # след строка заставляет их отображаться принудительно - treeview.set_headers_visible(1) diff --git a/src/files/search.py b/src/files/search.py index 0df7faf..6c3af66 100755 --- a/src/files/search.py +++ b/src/files/search.py @@ -136,13 +136,17 @@ class Gtk_Presentation(object): self.stop_btn.connect('clicked', self.stop_btn_clicked) # Output selection - outtable_rbtn = gtk.RadioButton(None, _('Table')) - outtable_rbtn.set_name('outtable') - outdiagram_rbtn = gtk.RadioButton(outtable_rbtn, _('Diagram')) - outdiagram_rbtn.set_name('outdiagram') - out1_rbtn = gtk.RadioButton(outtable_rbtn, 'Another 1') - out1_rbtn.set_name('outanother1') - self.out_rbtns = [outtable_rbtn, outdiagram_rbtn, out1_rbtn] + out_table_rbtn = gtk.RadioButton(None, _('Table')) + out_table_rbtn.set_name('out_table') + out_diabar_rbtn = gtk.RadioButton(out_table_rbtn, _('Bar chart')) + out_diabar_rbtn.set_name('out_diabar') + out_diapie_rbtn = gtk.RadioButton(out_table_rbtn, _('Pie chart')) + out_diapie_rbtn.set_name('out_diapie') + out_diaold_rbtn = gtk.RadioButton(out_table_rbtn, _('Old chart')) + out_diaold_rbtn.set_name('out_diaold') + self.out_rbtns = [ + out_table_rbtn, out_diabar_rbtn, out_diapie_rbtn, out_diaold_rbtn + ] hbox = gtk.HBox(False, 4) hbox.pack_start(qty_label, False, False, 0)