From 4d2abb77fff1df3e64a71c6135d613025d044769 Mon Sep 17 00:00:00 2001 From: Eugene Gagarin Date: Wed, 25 Feb 2009 17:46:22 +0300 Subject: [PATCH 1/1] file properties dialog by treeview double click --- data/findit | 2 + data/findit.desktop | 12 ++ data/icons/26x26/findit.png | Bin 0 -> 1266 bytes data/icons/64x64/findit.png | Bin 0 -> 3373 bytes po/ru.po | 65 +++++++++ src/findit.py | 327 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 406 insertions(+) create mode 100755 data/findit create mode 100644 data/findit.desktop create mode 100644 data/icons/26x26/findit.png create mode 100644 data/icons/64x64/findit.png create mode 100755 po/ru.po create mode 100755 src/findit.py diff --git a/data/findit b/data/findit new file mode 100755 index 0000000..c198574 --- /dev/null +++ b/data/findit @@ -0,0 +1,2 @@ +#!/bin/sh +exec python -O /usr/share/findit/findit.py diff --git a/data/findit.desktop b/data/findit.desktop new file mode 100644 index 0000000..e627894 --- /dev/null +++ b/data/findit.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Encoding=UTF-8 +Name=FindIT +Exec=/usr/bin/findit +Icon=findit +Type=Application +StartupWMClass=MainWindow +X-Icon-path=/usr/share/icons +X-Window-Icon=findit +X-HildonDesk-ShowInToolbar=true +X-Osso-Type=application/x-executable diff --git a/data/icons/26x26/findit.png b/data/icons/26x26/findit.png new file mode 100644 index 0000000000000000000000000000000000000000..a99ade5f114899ad397cd2c97659607c6eae717c GIT binary patch literal 1266 zcmVez zVrWt{f~}Dt5fiCczR*N55tWFNK*Z4S2qZ-OfPs)&(Fg`n64XMwwzfc#(5$76ly+(9 z&bIrQ;|HvkcH6Cq;Uwq7O#c7#yZ6qWdoD3E?nDT8gaSbNFJhPG*&dDRYY3n*3(E4f zNdL{JnE8B4kVJl`84GiC>~CV`#K;0fq*`tES57y!ONvDub1>^)d(m;?*wGmPZUYG( zI$W7Wm;UhLT$hG@^;u|Z&!phd4En0dL2u6+rY-UZ@?+yc0HF2!Zw%n_=$T^ndI^E- zp%)^2nIe28GUk++QT%=;ojo>)Q#$};=H?a10PyAEgS7R%DxCy@B~fBgl312aMm!!D z`g+5i%>3&p5J9>QAR7SUXgF>l{6iA$mjrmcA~NR^YO$~$L zp6(3*4gipcB{Oqps+mejbRHKmZB7hlYHwg|X^hXsM~a-ZX^yOhYNq;@2}Tlhx%FZU zzy)TGjJuA*LWtq#&l!FFG1OJ3f&f4-zY{dXR^8{%F+j|rD;;(ls%B0U0sz7dels|T zA3tF9M#mElMD;1zKEELdWQ4<^n1Th5OrjI}R9dc02m}D#cy>zy7bcG-A|j{BY=)v( z5bn7SS(d|Hy!eGALZ_`*U87O;!gL@Bxb+1^(rQg~Z&8fv8dK;3le2w;0F+SMWs2&N zNiNOP1{Yv}Bw~B5)3*0YU!;C6GpAhse}32`hkF%z(yUV1GddqUHbR%16UdhUAiuDP zYrbz3@b^v~in67T=Q<+qegvR073j9JZh*h76W~lbXyfy@jYg8D2l5N80H7!qOquHA z;iHM{LV@Qu%ZT1KNc|0F8L&iNm5nk_vK+Fs)UM+Hq zA1BsTG$&65Lvfqk(Us0K%)45_5|x?LH@*mVvpcZA*Q@|lFNH*tkl&Ne^Y2d6F4$1H zdDN~OBLe>1e4)I;Z_In*q9OKgn&hQlYFxB!aXO<2Uxo<}y{^&D;5OS!tEqg!vl?7RiMBOVhS;htoCN=MRVg`1gw~ zdLpSeckzNF4yxK^#?xel3iKU5;V};z|gM=aOK(Y)_oFk3jsiYcTrl9Ac|8m zyjcK%rr=osXaayf{;(Oq8aq{PQBYDLqu^x;g^#AH!H9^I?z-i0x^~(f&N9WKCjacb z+R=ZrFJ*f$)5DsI@tVl1p>`mFIZ)h6#xJL07*qoM6N<$f)ph^SpWb4 literal 0 HcmV?d00001 diff --git a/data/icons/64x64/findit.png b/data/icons/64x64/findit.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab3f4da7efae7f1efefcbade4a3251a43bab945 GIT binary patch literal 3373 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, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2009-02-17 15:19+Russian Standard Time\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: findit.py:83 findit.py:231 +msgid "File properties" +msgstr "Свойства файла" + +#: findit.py:96 +msgid "Name" +msgstr "Имя" + +#: findit.py:99 findit.py:251 +msgid "Size" +msgstr "Размер" + +#: findit.py:102 +msgid "Opened" +msgstr "Открыт" + +#: findit.py:105 +msgid "Modified" +msgstr "Изменен" + +#: findit.py:131 +msgid "Error!" +msgstr "Ошибка!" + +#: findit.py:163 +msgid "Invalid directory" +msgstr "Каталог не существует" + +#: findit.py:178 +msgid "Please select file" +msgstr "Выберите файл в списке" + +#: findit.py:208 +msgid "Files quantity" +msgstr "Количество файлов" + +#: findit.py:221 +msgid "Go" +msgstr "Пуск" + +#: findit.py:225 +msgid "Stop" +msgstr "Стоп" + +#: findit.py:258 +msgid "Path" +msgstr "Путь" + diff --git a/src/findit.py b/src/findit.py new file mode 100755 index 0000000..768a6e9 --- /dev/null +++ b/src/findit.py @@ -0,0 +1,327 @@ +#!/usr/bin/env python +# -*-coding: utf-8 -*- +# vim: sw=4 ts=4 expandtab ai + +import gtk +import gobject +import pango +from os import walk +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 + +try: + # Подразумевается, что ru/LC_MESSAGES/program.mo находится в текущем каталоге (sys.path[0]) + # Для стандартного /usr/share/locale писать gettext.translation('findit') + #langRU = gettext.translation('findit', sys.path[0], languages=['ru']) + langRU = gettext.translation('findit') + langRU.install() +except: + # Закомментировать перед использованием pygettext + def _(text): return text + + +### Common functions ########################################################### + +# Функция которая возвращает строку из числа и единиц для столбца "Размер"("Size") +def size_convert(size): + for i, unit in enumerate(['%d b', '%.1f Kb', '%.2f Mb', '%.3f Gb', '%.4f Tb']): + if size < 1024**(i+1): + return unit % (size/1024.**i) + return '>1024 Tb' + +# Функция поставляющая размер файла и путь к нему +def filegetter(startpath, obj): + # Список игнорируемых каталогов: + ignore_dirs = ['/dev', '/proc', '/sys', '/mnt'] + # Проходим по всем папкам вглубь от заданного пути + for dirpath, dirnames, fnames in walk(startpath): + # Исключаем каталоги из поиска в соответствии со списком исключений + for ign_dir in ignore_dirs[:]: + for dirname in dirnames[:]: + if ign_dir == normcase(join(abspath(dirpath), dirname)): + dirnames.remove(dirname) + ignore_dirs.remove(ign_dir) + + for fname in fnames: + flpath = abspath(join(dirpath, fname)) + # Выводим текущий опрашиваемый файл в строку статуса + obj.currFileLbl.set_text(flpath) + # обновляем окно + gtk.main_iteration() + # Останавливаем цикл по нажатию кнопки стоп + if obj.stopit: + obj.stopit = False + raise StopIteration + # Проверяем можем ли мы определить размер файла - иначе пропускаем его + try: flsize = getsize(flpath) + except: continue + # Возвращаем размер и полный путь файла + yield flsize, flpath + +# Fullscreen +def toggle_fullscreen(obj): + if obj.fullscreen: + obj.window.unfullscreen() + else: obj.window.fullscreen() + obj.fullscreen = not obj.fullscreen + +# Нажатие на кнопку клавиатуры +def on_key_press(obj, event): + 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): + + # Окно сообщения заданного типа с заданным текстом + 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.set_wmclass('ErrorDialog', 'FindIT') + dialog.set_title( _('Error!') ) + dialog.run() + dialog.destroy() + + # Функция выполняющаяся при нажатии на кнопку "Показать" + def start_print(self, widget): + self.start_path = self.srch_p_entr.get_text() + # Проверяем правильное ли значение введено + 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), + # size_convert(fsize), fsize]) + + # Выдает какую-то перманентную ошибку при присвоении значений treestore - + # кто увидит скажите - нужна статистика + try: self.treestore.append(None, [fpath, size_convert(fsize), fsize]) + 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('error', _('Invalid directory') ) + + # Функция выполняющаяся при нажатии на кнопку "Стоп" + def stop_print(self, widget): + self.stopit = True + + # Функция выполняющаяся при нажатии на кнопку "Свойства файла" + def show_properties_dialog(self, *args): + 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): + # Создаем новое окно + gtk.Window.__init__(self) + self.set_default_size(win_width, win_height) + self.set_border_width(4) + 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.start_path + self.srch_p_entr = gtk.Entry() + self.start_path = st_path + self.srch_p_entr.set_text(self.start_path) + # Отключаем автокапитализацию(ввод первой буквы заглавной) на таблетке + if hildonFound: + self.srch_p_entr.set_property("hildon-input-mode", 'full') + # Нажатие Enter в поле ввода + self.srch_p_entr.connect("activate", self.start_print) + + # 2. Кнопка "Обзор" + + # 3. Надпись1 "Количество отображаемых файлов:" + label1 = gtk.Label( _('Files quantity') ) + + # 4. Окошко ввода количества файлов, мин значение=1 макс=65536 по умолчанию 10 + # данные храняться в переменной self.fl_cnt + self.fl_cnt = 10 + if hildonFound: + 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.file_cnt = gtk.SpinButton(adj, 0, 0) + + # 5.1 Кнопка "Показать" + self.butt_start = gtk.Button( _('Go') ) + self.butt_start.connect('clicked', self.start_print) + + # 5.2 Кнопка "Остановить" + self.butt_stop = gtk.Button( _('Stop') ) + self.butt_stop.set_sensitive(False) + 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 Список файлов + scrollwind = gtk.ScrolledWindow() + scrollwind.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + + # Определяем переменную в которой будет храниться выводимый список + self.treestore = gtk.TreeStore(str, str, int) + self.treeview = gtk.TreeView(self.treestore) + # На таблетке не отображаються заголовки столбцов по умолчанию - + # след строка заставляет их отображаться принудительно + self.treeview.set_headers_visible(1) + self.treeview.connect('row-activated', self.show_properties_dialog) + + self.treestore.append(None, ['','', 0]) + + # Создаем и настраиваем колонку с размером файла + 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) + # Создаем и настраиваем колонку с именем файла + 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) + + # Добавляем сортировку для колонок + self.treeview.set_search_column(1) + path_col.set_sort_column_id(0) + size_col.set_sort_column_id(2) + + # 6.2 Надпись "Найти" + + # 6.3 Строка выводящая текущий осматриваемый файл + self.currFileLbl = gtk.Label() + self.currFileLbl.set_alignment(0, 0.5) + self.currFileLbl.set_ellipsize(pango.ELLIPSIZE_MIDDLE) + self.currFileLbl.set_padding(2, 2) + currFileFrm = gtk.Frame() + currFileFrm.add(self.currFileLbl) + + ######### Упаковываем элементы ################ + # Создаем основной вертикальный контейнер + main_Vbox = gtk.VBox(False, 4) + + # Создаем вспомогательный горизонтальный контейнер для Надписи1, + # окошка ввода количества файлов и кнопки "Показать" + hbox1 = gtk.HBox(False, 5) + # Добавляем вышеперечисленные элементы во вспомогат. контейнер + hbox1.pack_start(label1, False, False, 5) + 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(self.treeview) + main_Vbox.pack_start(scrollwind, True, True, 0) + main_Vbox.pack_start(currFileFrm, False, False, 0) + + self.add(main_Vbox) + + def run(self): + self.show_all() + gtk.main() + return 0 + + +### Main call ################################################################## + +if __name__ == '__main__': + gobject.set_application_name( _('FindIT') ) + app = MainWindow(575, 345, '.') + app.run() -- 1.7.9.5