3 # vim: sw=4 ts=4 expandtab ai
8 from os.path import join, abspath, normcase, basename, \
10 from heapq import nlargest
12 from misc import size_hum_read
14 class Search_File_Control(object):
16 def __init__(self, get_start_data, ignore_dirs, show_func):
17 self.start_data = get_start_data
18 self.srch_abs = Search_File_Abstraction(ignore_dirs)
19 self.srch_present = Search_File_Presentation(self.start_search, show_func)
22 return self.srch_present.get_ui()
24 def start_search(self, stopit, label, show_func):
26 start_path, count = self.start_data()
27 for fsize, fpath in nlargest(count, \
28 self.srch_abs.filegetter(start_path, stopit, label) ):
29 self.filelist.append([fpath, size_hum_read(fsize), fsize])
30 show_func(self.filelist)
33 class Search_File_Abstraction(object):
35 def __init__(self, ignore_dirs):
36 self.ignore_dirs = ignore_dirs
38 def size_convert(self, size):
39 """Return string with file size in b or Kb or Mb or Gb or Tb."""
40 for i, unit in enumerate(['%d b', '%.1f Kb', '%.2f Mb', '%.3f Gb', '%.4f Tb']):
41 if size < 1024**(i+1):
42 return unit % (size/1024.**i)
45 def filegetter(self, startdir, get_stopit, label):
46 """Generator of file sizes and paths based on os.walk."""
47 # Проходим по всем папкам вглубь от заданного пути
48 for dirpath, dirnames, fnames in walk(startdir):
49 # Исключаем каталоги из поиска в соответствии со списком исключений
50 ignore_dirs = self.ignore_dirs
51 for ign_dir in ignore_dirs[:]:
52 for dirname in dirnames[:]:
53 if ign_dir == normcase(join(abspath(dirpath), dirname)):
54 dirnames.remove(dirname)
55 ignore_dirs.remove(ign_dir)
58 flpath = abspath(join(dirpath, fname))
59 # Выводим текущий опрашиваемый файл в строку статуса
60 label.set_text(flpath)
63 # Останавливаем цикл по нажатию кнопки стоп
68 # Проверяем можем ли мы определить размер файла - иначе пропускаем его
70 # Возвращаем размер и полный путь файла
71 yield getsize(flpath), flpath
75 class Search_File_Presentation(object):
77 def __init__(self, st_func, show_func):
79 # Строка вывода текущего осматриваемого файла
80 self.currfilelbl = gtk.Label('---')
81 self.currfilelbl.set_alignment(0, 0.5)
82 self.currfilelbl.set_ellipsize(pango.ELLIPSIZE_MIDDLE)
83 self.currfilelbl.set_padding(2, 2)
84 currfilefrm = gtk.Frame()
85 currfilefrm.add(self.currfilelbl)
88 self.butt_start = gtk.Button('Go')
89 self.butt_start.connect('released', self.start_srch, st_func, show_func)
92 self.butt_stop = gtk.Button('Stop')
93 self.butt_stop.set_sensitive(False)
95 self.butt_stop.connect('clicked', self.stop_srch)
98 self.search_hbox = gtk.HBox(False, 10)
99 self.search_hbox.pack_start(currfilefrm, True, True, 0)
100 self.search_hbox.pack_end(self.butt_start, False, False, 0)
101 self.search_hbox.pack_end(self.butt_stop, False, False, 0)
104 return self.search_hbox
106 def start_srch(self, widget, start_func, show_func):
108 self.butt_stop.set_sensitive(True)
109 self.butt_start.set_sensitive(False)
110 start_func(self.get_stopit, self.currfilelbl, show_func)
111 self.butt_stop.set_sensitive(False)
112 self.butt_start.set_sensitive(True)
114 def stop_srch(self, widget):
116 self.butt_stop.set_sensitive(False)
117 self.butt_start.set_sensitive(True)
119 def get_stopit(self):