import gobject
import pango
from os import walk
-from os.path import getsize, join, isdir, abspath, normcase
+from os.path import join, abspath, normcase, basename, \
+ isdir, getsize, getatime, getmtime
from heapq import nlargest
import gettext
import sys
+import time
try: import hildon; hildonFound = True
except: hildonFound = False
def _(text): return text
+if hildonFound:
+ winType = hildon.Window
+else:
+ winType = gtk.Window
+
+
### Common functions ###########################################################
# Функция которая возвращает строку из числа и единиц для столбца "Размер"("Size")
ignore_dirs.remove(ign_dir)
for fname in fnames:
- flpath = join(dirpath, fname)
+ flpath = abspath(join(dirpath, fname))
# Выводим текущий опрашиваемый файл в строку статуса
- obj.currFileLbl.set_text(abspath(flpath))
+ obj.currFileLbl.set_text(flpath)
# обновляем окно
gtk.main_iteration()
# Останавливаем цикл по нажатию кнопки стоп
# Fullscreen
def toggle_fullscreen(obj):
if obj.fullscreen:
- obj.window.unfullscreen()
- else:
- obj.window.fullscreen()
+ obj.window.unfullscreen()
+ else: obj.window.fullscreen()
obj.fullscreen = not obj.fullscreen
# Нажатие на кнопку клавиатуры
if hildonFound and event.keyval == gtk.keysyms.F6:
toggle_fullscreen(obj)
+### Properties dialog ##########################################################
+
+class PropertiesDialog(gtk.Dialog):
+ def __init__(self, path, size, bytesize):
+ gtk.Dialog.__init__(self)
+ self.set_title( _('File properties') )
+ self.set_transient_for(app)
+ self.set_wmclass('PropertiesDialog', 'FindIT')
+ self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK)
+ self.set_resizable(False)
+
+ # Достаем свойства выбранного файла
+ name = basename(path)
+ access = time.strftime('%x %X', time.localtime(getatime(path)))
+ modified = time.strftime('%x %X', time.localtime(getmtime(path)))
+
+ # Таблица надписей
+ table = gtk.Table()
+ table.set_border_width(10)
+ table.set_col_spacings(10)
+ table.set_row_spacings(10)
+
+ # Надписи (подпись: значение)
+ nameLbl = gtk.Label( _('Name') )
+ nameValueLbl = gtk.Label(name)
+
+ sizeLbl = gtk.Label( _('Size') )
+ sizeValueLbl = gtk.Label(size + ' (' + `bytesize` + ' b)')
+
+ accessLbl = gtk.Label( _('Opened') )
+ accessValueLbl = gtk.Label(access)
+
+ modifiedLbl = gtk.Label( _('Modified') )
+ modifiedValueLbl = gtk.Label(modified)
+
+ # Список надписей
+ lbls = [(nameLbl, nameValueLbl), (sizeLbl, sizeValueLbl),
+ (accessLbl, accessValueLbl), (modifiedLbl, modifiedValueLbl)]
+
+ # Упаковка надписей в таблицу и выравнивание
+ for i, lbl in enumerate(lbls):
+ name, value = lbl
+ table.attach(name, 0, 1, i, i+1)
+ table.attach(value, 1, 2, i, i+1)
+ name.set_alignment(1, 0.5)
+ value.set_alignment(0, 0.5)
+
+ # Упаковка таблицы в vbox диалога
+ self.vbox.add(table)
+ self.show_all()
+ self.run()
+ self.destroy()
+
### Main window ################################################################
-class MainWindow(gtk.Window):
+class MainWindow(winType):
# Окно сообщения заданного типа с заданным текстом
def mess_window(self, mestype, content):
- dialog = gtk.MessageDialog(parent=self, flags=gtk.DIALOG_MODAL, \
- type=mestype, buttons=gtk.BUTTONS_OK, message_format=content)
+ dialog = gtk.MessageDialog(parent=self, flags=gtk.DIALOG_MODAL,
+ type=mestype, buttons=gtk.BUTTONS_OK,
+ message_format=content)
+ dialog.set_wmclass('ErrorDialog', 'FindIT')
+ dialog.set_title( _('Error!') )
dialog.run()
dialog.destroy()
# Функция выполняющаяся при нажатии на кнопку "Показать"
def start_print(self, widget):
- self.butt_start.set_sensitive(False)
- self.butt_stop.set_sensitive(True)
- self.fl_cnt = int( self.file_cnt.get_value() )
self.start_path = self.srch_p_entr.get_text()
- # Очищаем список
- self.treestore.clear()
# Проверяем правильное ли значение введено
if isdir(self.start_path):
+ self.butt_start.set_sensitive(False)
+ self.butt_stop.set_sensitive(True)
+ self.propertiesBtn.set_sensitive(False)
+ # Получаем значение количества файлов из SpinButton
+ self.fl_cnt = int( self.file_cnt.get_value() )
+ # Очищаем список
+ self.treestore.clear()
# Получаем нужное количество самых больших файлов
for fsize, fpath in nlargest(self.fl_cnt, filegetter(self.start_path, self)):
# Возвращаем значения в treeview в таком порядке - путь,
# размер в Мб строкой и размер в байтах
- # self.treestore.append(None, [fpath.replace(self.start_path,'', 1),\
+ # self.treestore.append(None, [fpath.replace(self.start_path,'', 1),
# size_convert(fsize), fsize])
# Выдает какую-то перманентную ошибку при присвоении значений treestore -
except: 'error', fpath, size_convert(fsize), fsize
self.butt_start.set_sensitive(True)
self.butt_stop.set_sensitive(False)
+ self.propertiesBtn.set_sensitive(True)
else:
# Иначе выводим окошко с ошибкой
- self.mess_window(gtk.MESSAGE_ERROR, _('Invalid directory') )
+ self.mess_window('error', _('Invalid directory') )
+ # Функция выполняющаяся при нажатии на кнопку "Стоп"
def stop_print(self, widget):
self.stopit = True
+ # Функция выполняющаяся при нажатии на кнопку "Свойства файла"
+ def show_properties_dialog(self, btn):
+ selection = self.treeview.get_selection()
+ (model, it) = selection.get_selected()
+ try:
+ path = model.get_value(it, 0)
+ size = model.get_value(it, 1)
+ bytesize = model.get_value(it, 2)
+ except:
+ self.mess_window('error', _('Please select file') )
+ return
+ PropertiesDialog(path, size, bytesize)
+
### Window initialization ##################################################
def __init__(self, win_width, win_height, st_path):
self.fullscreen = False
self.connect('delete_event', gtk.main_quit)
self.connect("key-press-event", on_key_press)
+ self.set_wmclass('MainWindow', 'FindIT')
######### Добавляем элементы ################
# 1. Строка ввода каталога с которого начинать поиск
# данные храняться в переменной self.fl_cnt
self.fl_cnt = 10
if hildonFound:
- self.file_cnt = hildon.NumberEditor(1, 65536)
+ self.file_cnt = hildon.NumberEditor(1, 99)
self.file_cnt.set_value(self.fl_cnt)
else:
adj = gtk.Adjustment(self.fl_cnt, 1, 65536, 1, 5, 0)
self.butt_stop.connect('clicked', self.stop_print)
self.stopit = False
+ # 5.3 Кнопка "Свойства файла"
+ self.propertiesBtn = gtk.Button( _('File properties') )
+ self.propertiesBtn.connect('clicked', self.show_properties_dialog)
+ self.propertiesBtn.set_sensitive(False)
+
# 6. Закладки
# 6.1 Список файлов
# Определяем переменную в которой будет храниться выводимый список
self.treestore = gtk.TreeStore(str, str, int)
- treeview = gtk.TreeView(self.treestore)
+ self.treeview = gtk.TreeView(self.treestore)
# На таблетке не отображаються заголовки столбцов по умолчанию -
# след строка заставляет их отображаться принудительно
- treeview.set_headers_visible(1)
+ self.treeview.set_headers_visible(1)
self.treestore.append(None, ['','', 0])
cell.set_property('width', 90)
size_col.pack_start(cell, True)
size_col.add_attribute(cell, 'text', 1)
- treeview.append_column(size_col)
+ self.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)
+ self.treeview.append_column(path_col)
# Добавляем сортировку для колонок
- treeview.set_search_column(1)
+ self.treeview.set_search_column(1)
path_col.set_sort_column_id(0)
size_col.set_sort_column_id(2)
# 6.3 Строка выводящая текущий осматриваемый файл
self.currFileLbl = gtk.Label()
self.currFileLbl.set_alignment(0, 0.5)
- self.currFileLbl.set_text('---')
self.currFileLbl.set_ellipsize(pango.ELLIPSIZE_MIDDLE)
######### Упаковываем элементы ################
hbox1.pack_start(self.file_cnt, False, False, 0)
hbox1.pack_start(self.butt_start, True, True, 0)
hbox1.pack_start(self.butt_stop, True, True, 0)
+ hbox1.pack_start(self.propertiesBtn, True, True, 0)
# Добавляем элементы в основной контейнер
main_Vbox.pack_start(self.srch_p_entr, False, False, 0)
main_Vbox.pack_start(hbox1, False, False, 0)
- scrollwind.add(treeview)
+ scrollwind.add(self.treeview)
main_Vbox.pack_start(scrollwind, True, True, 0)
main_Vbox.pack_start(self.currFileLbl, False, False, 0)
if __name__ == '__main__':
# gobject.set_application_name( _('FindIT') )
- MainWindow(575, 345, '/').run()
+ app = MainWindow(575, 345, '.')
+ app.run()