# -*-coding: utf-8 -*-
# vim: sw=4 ts=4 expandtab ai
-import gtk
-import gobject
-from random import randint
+from random import random
+from math import pi, cos, sin, sqrt
-class Out_Diag_Control(object):
- def __init__(self, config):
- win_width = config.get('window_width')
- win_height = config.get('window_height')
- self.out_ui = Out_Diag_Presentation(win_width, win_height)
+#==============================================================================
- def show(self, filelist, fullsize):
- self.out_ui.get_data(filelist, fullsize)
+class Cli_Presentation(object):
+ pass
- def run(self):
- self.out_ui.run()
+#==============================================================================
+class Gtk_Presentation(object):
+ def __init__(self, filelist, maxdata=10):
+ import gtk
+ import cairo
-class Out_Diag_Abstraction(object):
- pass
+ 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))
-class Out_Diag_Presentation(gtk.Window):
-
- def __init__(self, win_width, win_height):
- gtk.Window.__init__(self)
- self.width = win_width
- self.height = win_height
- self.set_default_size(self.width, self.height)
- self.set_border_width(4)
- self.connect('delete_event', gtk.main_quit)
-
- scrollwind = gtk.ScrolledWindow()
- scrollwind.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-
- self.area = gtk.DrawingArea()
- self.area.set_size_request(win_width, win_height)
- self.area.set_events(gtk.gdk.POINTER_MOTION_MASK |
- gtk.gdk.POINTER_MOTION_HINT_MASK )
- self.area.connect("expose-event", self.expose_event)
- self.pixmap = None
-
- scrollwind.add_with_viewport(self.area)
- self.add(scrollwind)
-
-
- def expose_event(self, widget, event):
- if not self.pixmap:
- self.build_pixmap()
- x , y, width, height = event.area
- widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], \
- self.pixmap, x, y, x, y, width, height)
- return False
-
- def build_pixmap(self):
- self.pixmap=gtk.gdk.Pixmap(self.window, self.width, self.height)
- cm=self.pixmap.get_colormap()
- self.color={}
- self.color['black']=cm.alloc_color("black")
- self.color['white']=cm.alloc_color("white")
- self.gc=self.pixmap.new_gc()
- self.gc.set_foreground(self.color['white'])
- self.pixmap.draw_rectangle(self.gc, True, 0, 0, self.width, self.height)
-
- def draw_diag(self):
+ # sectors list
+ sectors = []
start_angle = 0
- for path, size, bsize in self.filelist:
- end_angle = (bsize*360*64)/self.fullsize
- print start_angle, end_angle
- gc=self.pixmap.new_gc()
- cm=self.pixmap.get_colormap()
- col1 = cm.alloc_color(self.rand_color())
- gc.set_foreground(col1)
- gc.set_line_attributes(1,gtk.gdk.LINE_SOLID,gtk.gdk.CAP_NOT_LAST,gtk.gdk.JOIN_MITER)
- self.pixmap.draw_arc(gc, True, 0, 0, self.width, self.height, start_angle, end_angle)
- start_angle = start_angle + end_angle
- self.area.queue_draw()
+ 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) + '. ' + name + ' (' + str(size) + ')'
+ cr.move_to(0, 20*i)
+ cr.set_source_rgb(0, 0, 0)
+ cr.show_text(text)
def rand_color(self):
- r = randint(0, 65535)
- g = randint(0, 65535)
- b = randint(0, 65535)
- return gtk.gdk.Color(r, g, b, 0)
-
- def run(self):
- self.show_all()
- gobject.timeout_add(1000, self.draw_diag)
- gtk.main()
-
- def get_data(self, filelist, fullsize):
- self.filelist = filelist
- self.fullsize = fullsize
+ return random(), random(), random()
#==============================================================================
-class Out_Table_Control(object):
- def __init__(self):
- self.out_ui = Out_Table_Presentation()
-
- def show(self, filelist, flsize):
- self.out_ui.show_result(filelist, flsize)
-
- def get_ui(self):
- return self.out_ui.get_ui()
-
-#==============================================================================
-
-class Out_Table_Abstraction(object):
- pass
+# 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 Gtk_Presentation(object):
- def __init__(self):
+ def __init__(self, filelist): ###
import gtk
import gobject
- scrollwind = gtk.ScrolledWindow()
- scrollwind.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-
# Определяем переменную в которой будет храниться выводимый список
self.liststore = gtk.ListStore(str, str, gobject.TYPE_INT64)
- self.treeview = gtk.TreeView(self.liststore)
+
+ for bsize, path, size in filelist:
+ self.liststore.append([path, size, bsize])
+
+ treeview = gtk.TreeView(self.liststore)
+
# На таблетке не отображаються заголовки столбцов по умолчанию -
# след строка заставляет их отображаться принудительно
- self.treeview.set_headers_visible(1)
- self.liststore.append(['', '', 0])
+ treeview.set_headers_visible(1)
# Создаем и настраиваем колонку с размером файла
size_col = gtk.TreeViewColumn( 'Size')
- cell = gtk.CellRendererText()
- cell.set_property('width', 90)
- size_col.pack_start(cell, True)
- size_col.add_attribute(cell, 'text', 1)
- self.treeview.append_column(size_col)
+ 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)
- self.treeview.append_column(path_col)
+ treeview.append_column(path_col)
# Добавляем сортировку для колонок
- self.treeview.set_search_column(1)
+ treeview.set_search_column(1)
path_col.set_sort_column_id(0)
size_col.set_sort_column_id(2)
- scrollwind.add(self.treeview)
- self.label = gtk.Label('full dir size = ')
-
- self.vbox = gtk.VBox(False, 5)
- self.vbox.pack_start(scrollwind, True, True, 0)
- self.vbox.pack_start(self.label, False, False,0)
-
- def show_result(self, filelist, fullsize):
- self.liststore.clear()
- for stroka in filelist:
- self.liststore.append(stroka)
- flsizestr = 'full dir size = %s' % size_hum_read(fullsize)
- self.label.set_text(flsizestr)
-
- def get_ui(self):
- return self.vbox
+ 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])
# -*-coding: utf-8 -*-
# vim: sw=4 ts=4 expandtab ai
-import gtk
-#import apt_pkg
+import apt_pkg
from heapq import nlargest
from misc import *
class Control(object):
def __init__(self, ui):
- count = 7
+ count = 12
print ui
if ui == 'cli':
self.abstrac = Abstraction(self.present)
def start_search(self, get_data):
- deblist = [0, 0]
-# for size, name in nlargest(count, self.abstrac.pkggetter()):
-# deblist.append([name, size_hum_read(psize), size])
-
- self.search_present.show_out_toplevel(None, 'outtable', deblist)
+ deblist = []
+ count, outtype = get_data()
+ search_func = self.abstrac.pkggetter()
+ for size, name in nlargest(count, search_func):
+ deblist.append([int(size), name, size_hum_read(size)])
+ self.present.show_out_toplevel(None, outtype, deblist)
def run(self):
return self.present.toplevel
class Abstraction(object):
def __init__(self, presentation):
self.presentation = presentation
-# apt_pkg.InitConfig()
-# apt_pkg.InitSystem()
-# self.cache = apt_pkg.GetCache()
-#
-# def pkggetter(self):
-# self.fullsize = 0
-# for pkg in self.cache.Packages:
-# # pkg is from a list of packages, sorted by name.
-# if pkg.CurrentState == apt_pkg.CurStateInstalled:
-# pkgsize = [version.InstalledSize for version in pkg.VersionList][0]
-# self.fullsize = self.fullsize + pkgsize
-# yield pkgsize, pkg.Name
-#
-# def full(self):
-# return self.fullsize
+ apt_pkg.InitConfig()
+ apt_pkg.InitSystem()
+ self.cache = apt_pkg.GetCache()
+
+ def pkggetter(self):
+ self.fullsize = 0
+ for pkg in self.cache.Packages:
+ # pkg is from a list of packages, sorted by name.
+ if pkg.CurrentState == apt_pkg.CurStateInstalled:
+ pkgsize = [version.InstalledSize for version in pkg.VersionList][0]
+ self.fullsize = self.fullsize + pkgsize
+ yield pkgsize, pkg.Name
+
+ def full(self):
+ return self.fullsize
#==============================================================================
qty_label = gtk.Label('Debian packages quantity')
# "Packages quantity" spin
- qty_spin = gtk.SpinButton()
- qty_spin.set_numeric(True)
- qty_spin.set_range(0, 65536)
- qty_spin.set_increments(1, 10)
+ self.qty_spin = gtk.SpinButton()
+ self.qty_spin.set_numeric(True)
+ self.qty_spin.set_range(0, 65536)
+ self.qty_spin.set_increments(1, 10)
+ self.qty_spin.set_value(count)
# "Start" button
start_btn = gtk.Button('Start')
- start_btn.connect('released', self.start_btn_released)
+ start_btn.connect('released', self.start_btn_released, start_func)
# Output selection
- outtable_rbtn = gtk.RadioButton(None, 'Table')
- outdiagram_rbtn = gtk.RadioButton(outtable_rbtn, 'Diagram')
- out1_rbtn = gtk.RadioButton(outtable_rbtn, 'Another 1')
- out_rbtns = [outtable_rbtn, outdiagram_rbtn, out1_rbtn]
+ self.outtable_rbtn = gtk.RadioButton(None, 'Table')
+ self.outtable_rbtn.set_name('outtable')
+ outdiagram_rbtn = gtk.RadioButton(self.outtable_rbtn, 'Diagram')
+ outdiagram_rbtn.set_name('outdiagram')
+ out1_rbtn = gtk.RadioButton(self.outtable_rbtn, 'Another 1')
+ out1_rbtn.set_name('outanother1')
+ out_rbtns = [self.outtable_rbtn, outdiagram_rbtn, out1_rbtn]
hbox = gtk.HBox(False, 4)
hbox.pack_start(qty_label, False, False, 0)
- hbox.pack_start(qty_spin, False, False, 0)
+ hbox.pack_start(self.qty_spin, False, False, 0)
hbox.pack_start(start_btn, False, False, 0)
for btn in reversed(out_rbtns):
hbox.pack_end(btn, False, False, 0)
#=== Functions ============================================================
def start_btn_released(self, btn, start_func):
self.stopit = False
- self.butt_stop.set_sensitive(True)
- self.butt_start.set_sensitive(False)
- start_func(self.get_data, self.get_stopit, self.currfilelbl, self.kill_wind)
+ start_func(self.get_data)
def get_data(self):
- return int(self.qty_spin.get_value())
+ for btn in self.outtable_rbtn.get_group():
+ if btn.get_active():
+ out = btn.get_name()
+ return int(self.qty_spin.get_value()), out
#=== Output type selecting ================================================
- def show_out_toplevel(self, btn, outtype):
+ def show_out_toplevel(self, btn, outtype, results):
print 'Entering <' + outtype + '> output mode...'
-
- out_present = __import__('files.' + outtype, None, None, outtype) ###
- toplevel = out_present.Gtk_Presentation().get_toplevel()
- ###self.vbox.remove(self.vbox.get_children()[2])
- #self.vbox.add(toplevel)
- self.vbox.pack_start(toplevel)
-
-# def run(self):
-# self.show_all()
-# gtk.main()
+ out_submodule = __import__('debs.' + outtype, None, None, outtype)
+
+ try:
+ self.current_outtoplevel.destroy()
+ except:
+ pass
+
+ out_toplevel = out_submodule.Gtk_Presentation(results).toplevel
+ self.current_outtoplevel = out_toplevel
+ self.vbox.add(out_toplevel)
+ out_toplevel.show_all()
+# out_submodule.Gtk_Presentation().show_results(results)
# -*-coding: utf-8 -*-
# vim: sw=4 ts=4 expandtab ai
-import gtk
-import gobject
-from random import randint
+from random import random
+from math import pi, cos, sin, sqrt
+import os.path
+#==============================================================================
-class Control(object):
- def __init__(self, config):
- win_width = config.get('window_width')
- win_height = config.get('window_height')
- self.out_ui = Out_Diag_Presentation(win_width, win_height)
-
- def show(self, filelist, fullsize):
- self.out_ui.get_data(filelist, fullsize)
-
- def run(self):
- self.out_ui.run()
-
-
-class Abstraction(object):
+class Cli_Presentation(object):
pass
+#==============================================================================
class Gtk_Presentation(object):
+ def __init__(self, filelist, maxdata=10):
+ import gtk
+ import cairo
- def __init__(self):
-
- self.area = gtk.DrawingArea()
- self.area.set_size_request(250, 200) ###
- self.area.set_events(gtk.gdk.POINTER_MOTION_MASK |
- gtk.gdk.POINTER_MOTION_HINT_MASK )
- self.area.connect('expose-event', self.expose_event)
- self.pixmap = None
-
- def expose_event(self, widget, event):
- if not self.pixmap:
- self.build_pixmap()
- x, y, width, height = event.area
- widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL],
- self.pixmap, x, y, x, y, width, height)
- return False
-
- def build_pixmap(self):
- #self.pixmap = gtk.gdk.Pixmap(self.window, self.width, self.height)
- self.pixmap = gtk.gdk.Pixmap(None, 250, 200, 8) ###
- cm = self.pixmap.get_colormap()
- self.color = {}
- self.color['black'] = cm.alloc_color('black')
- self.color['white'] = cm.alloc_color('white')
- self.gc = self.pixmap.new_gc()
- self.gc.set_foreground(self.color['white'])
- self.pixmap.draw_rectangle(self.gc, True, 0, 0, self.width, self.height)
-
- def draw_diag(self):
- start_angle = 0
- for path, size, bsize in self.filelist:
- end_angle = (bsize*360*64)/self.fullsize
- print start_angle, end_angle
- gc = self.pixmap.new_gc()
- cm = self.pixmap.get_colormap()
- col1 = cm.alloc_color(self.rand_color())
- gc.set_foreground(col1)
- gc.set_line_attributes(1,gtk.gdk.LINE_SOLID,gtk.gdk.CAP_NOT_LAST,gtk.gdk.JOIN_MITER)
- self.pixmap.draw_arc(gc, True, 0, 0, self.width, self.height, start_angle, end_angle)
- start_angle = start_angle + end_angle
- self.area.queue_draw()
+ drawing = gtk.DrawingArea()
- def rand_color(self):
- r = randint(0, 65535)
- g = randint(0, 65535)
- b = randint(0, 65535)
- return gtk.gdk.Color(r, g, b, 0)
+ # `maxdata` biggest files from list
+ filelist.sort(reverse=True)
+ del filelist[maxdata:]
+ self.filelist = filelist
- def run(self):
- self.show_all()
- gobject.timeout_add(1000, self.draw_diag)
- gtk.main()
+ # sum of sizes
+ fullsize = sum((f[0] for f in filelist))
- def get_data(self, filelist, fullsize):
- self.filelist = filelist
- self.fullsize = fullsize
+ # 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)
- #=== Toplevel widget for embedding to search area =========================
- def get_toplevel(self):
- return self.area
+ def rand_color(self):
+ return random(), random(), random()
# Определяем переменную в которой будет храниться выводимый список
self.liststore = gtk.ListStore(str, str, gobject.TYPE_INT64)
- for path, size, bsize in filelist:
+ for bsize, path, size in filelist:
self.liststore.append([path, size, bsize])
treeview = gtk.TreeView(self.liststore)
def start_search(self, get_data, get_stopit, label, kill_func):
filelist = []
- start_path, count = get_data()
+ start_path, count, outtype = get_data()
search_func = self.abstrac.filegetter(start_path, get_stopit, label)
for fsize, fpath in nlargest(count, search_func):
- filelist.append([fpath, size_hum_read(fsize), int(fsize)])
- self.present.show_out_toplevel(None, 'outtable', filelist)
+ filelist.append([int(fsize), fpath, size_hum_read(fsize)])
+ self.present.show_out_toplevel(None, outtype, filelist)
def run(self):
return self.present.toplevel
self.stop_btn.connect('clicked', self.stop_btn_clicked)
# Output selection
- outtable_rbtn = gtk.RadioButton(None, 'Table')
- outdiagram_rbtn = gtk.RadioButton(outtable_rbtn, 'Diagram')
- out1_rbtn = gtk.RadioButton(outtable_rbtn, 'Another 1')
- out2_rbtn = gtk.RadioButton(outtable_rbtn, 'Another 2')
- out_rbtns = [outtable_rbtn, outdiagram_rbtn, out1_rbtn, out2_rbtn]
+ self.outtable_rbtn = gtk.RadioButton(None, 'Table')
+ self.outtable_rbtn.set_name('outtable')
+ outdiagram_rbtn = gtk.RadioButton(self.outtable_rbtn, 'Diagram')
+ outdiagram_rbtn.set_name('outdiagram')
+ out1_rbtn = gtk.RadioButton(self.outtable_rbtn, 'Another 1')
+ out1_rbtn.set_name('outanother1')
+ out2_rbtn = gtk.RadioButton(self.outtable_rbtn, 'Another 2')
+ out2_rbtn.set_name('outanother2')
+ out_rbtns = [self.outtable_rbtn, outdiagram_rbtn, out1_rbtn, out2_rbtn]
hbox = gtk.HBox(False, 4)
hbox.pack_start(qty_label, False, False, 0)
self.start_btn.set_sensitive(True)
def get_data(self):
- return self.path_entry.get_text(), int(self.qty_spin.get_value())
+ for btn in self.outtable_rbtn.get_group():
+ if btn.get_active():
+ out = btn.get_name()
+ return self.path_entry.get_text(), int(self.qty_spin.get_value()), out
def get_stopit(self):
return self.stopit
def show_out_toplevel(self, btn, outtype, results):
print 'Entering <' + outtype + '> output mode...'
out_submodule = __import__('files.' + outtype, None, None, outtype)
- out_toplevel = out_submodule.Gtk_Presentation(results).toplevel
try:
- self.vbox.remove(self.vbox.get_children()[2])
+ self.current_outtoplevel.destroy()
except:
pass
+
+ out_toplevel = out_submodule.Gtk_Presentation(results).toplevel
+ self.current_outtoplevel = out_toplevel
self.vbox.add(out_toplevel)
out_toplevel.show_all()
# out_submodule.Gtk_Presentation().show_results(results)