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, config, show_func):
17 win_width = config.get('window_width')
18 win_height = config.get('window_height')
19 count = config.get('default_file_count')
20 start_path = config.get('default_start_dir')
21 ignore_dirs = config.get('ignore_dir_list')
22 self.srch_abs = Search_File_Abstraction(ignore_dirs)
23 self.srch_present = Search_File_Presentation(win_width, win_height, start_path, count, self.start_search)
24 self.result_out = show_func
27 self.srch_present.run()
29 def start_search(self, get_data, get_stopit, label, kill_func):
31 start_path, count = get_data()
32 for fsize, fpath in nlargest(count, \
33 self.srch_abs.filegetter(start_path, get_stopit, label) ):
34 filelist.append([fpath, size_hum_read(fsize), int(fsize)])
37 self.result_out.show(filelist, self.srch_abs.full())
41 class Search_File_Abstraction(object):
43 def __init__(self, ignore_dirs):
44 self.ignore_dirs = ignore_dirs
46 def filegetter(self, startdir, get_stopit, label):
47 """Generator of file sizes and paths based on os.walk."""
48 # Проходим по всем папкам вглубь от заданного пути
49 self.full_dir_size = 0
50 for dirpath, dirnames, fnames in walk(startdir):
51 # Исключаем каталоги из поиска в соответствии со списком исключений
52 ignore_dirs = self.ignore_dirs
53 for ign_dir in ignore_dirs[:]:
54 for dirname in dirnames[:]:
55 if ign_dir == normcase(join(abspath(dirpath), dirname)):
56 dirnames.remove(dirname)
57 ignore_dirs.remove(ign_dir)
60 flpath = abspath(join(dirpath, fname))
61 # Выводим текущий опрашиваемый файл в строку статуса
62 label.set_text(flpath)
65 # Останавливаем цикл по нажатию кнопки стоп
70 # Проверяем можем ли мы определить размер файла - иначе пропускаем его
72 # Возвращаем размер и полный путь файла
73 self.full_dir_size = getsize(flpath) + self.full_dir_size
74 yield getsize(flpath), flpath
79 return self.full_dir_size
81 class Search_File_Presentation(gtk.Window):
83 #def __init__(self, win_width, win_height, count, st_func, show_func):
84 def __init__(self, win_width, win_height, start_path, count, st_func):
85 """Create MainWindow."""
87 gtk.Window.__init__(self)
88 self.set_default_size(win_width, win_height)
89 self.set_border_width(4)
90 self.connect('delete_event', gtk.main_quit)
92 # Строка ввода каталога
93 self.srch_p_entr = gtk.Entry()
94 self.srch_p_entr.set_text(start_path)
96 label1 = gtk.Label('Files quantity')
97 # Окошко ввода количества файлов, мин значение=1 макс=65536 по умолчанию 10
98 adj = gtk.Adjustment(count, 1, 65536, 1, 5, 0)
99 self.file_cnt = gtk.SpinButton(adj, 0, 0)
101 # Строка вывода текущего осматриваемого файла
102 self.currfilelbl = gtk.Label('---')
103 self.currfilelbl.set_alignment(0, 0.5)
104 self.currfilelbl.set_ellipsize(pango.ELLIPSIZE_MIDDLE)
105 self.currfilelbl.set_padding(2, 2)
106 currfilefrm = gtk.Frame()
107 currfilefrm.add(self.currfilelbl)
110 self.butt_start = gtk.Button('Go >')
111 self.butt_start.connect('released', self.start_srch, st_func)
113 # Кнопка "Остановить"
114 self.butt_stop = gtk.Button('Stop')
115 self.butt_stop.set_sensitive(False)
117 self.butt_stop.connect('clicked', self.stop_srch)
119 self.butt_prev = gtk.Button('< Previous')
121 main_vbox = gtk.VBox(False, 0)
122 hbox1 = gtk.HBox(False, 0)
123 hbox1.pack_start(label1, True, True, 0)
124 hbox1.pack_start(self.file_cnt, False, False, 0)
126 hbox2 = gtk.HBox(False, 0)
127 hbox2.pack_start(currfilefrm, True, True, 0)
128 hbox2.pack_end(self.butt_stop, False, False, 0)
130 hbox3 = gtk.HBox(False, 0)
131 hbox3.pack_start(self.butt_prev, False, False, 0)
132 hbox3.pack_start(self.butt_start, False, False, 0)
134 main_vbox.pack_start(self.srch_p_entr, False, False, 0)
135 main_vbox.pack_start(hbox1, False, False, 0)
136 main_vbox.pack_start(hbox2, False, False, 0)
137 main_vbox.pack_start(hbox3, False, False, 0)
141 def start_srch(self, widget, start_func):
143 self.butt_stop.set_sensitive(True)
144 self.butt_start.set_sensitive(False)
145 start_func(self.get_data, self.get_stopit, self.currfilelbl, self.kill_wind)
151 def stop_srch(self, widget):
153 self.butt_stop.set_sensitive(False)
154 self.butt_start.set_sensitive(True)
156 def get_stopit(self):
164 return self.srch_p_entr.get_text(), int( self.file_cnt.get_value() )