removed flsize variable
[findit] / src / findit.py
index 79b52ec..c04b5d2 100755 (executable)
@@ -1,20 +1,24 @@
 #!/usr/bin/env python
 # -*-coding: utf-8 -*-
 # vim: sw=4 ts=4 expandtab ai
+# pylint: disable-msg=C0301
 
 import gtk
 import gobject
 import pango
 from os import walk
 from os.path import join, abspath, normcase, basename, \
-                    isdir, getsize, getatime, getmtime
+                    isdir, getsize, getatime, getmtime, expanduser
 from heapq import nlargest
 import gettext
-import sys
 import time
+from sys import platform
 
-try: import hildon; hildonFound = True
-except: hildonFound = False
+try: 
+    import hildon
+    hildonFound = True
+except ImportError:
+    hildonFound = False
 
 try:
     # Подразумевается, что ru/LC_MESSAGES/program.mo находится в текущем каталоге (sys.path[0])
@@ -22,26 +26,29 @@ try:
     #langRU = gettext.translation('findit', sys.path[0], languages=['ru'])
     langRU = gettext.translation('findit')
     langRU.install()
-except:
+except IOError:
     # Закомментировать перед использованием pygettext
-    def _(text): return text
+    def _(text): 
+        return text
 
 
 ### Common functions ###########################################################
 
 # Функция которая возвращает строку из числа и единиц для столбца "Размер"("Size")
 def size_convert(size):
+    """Return string with file size in b or Kb or Mb or Gb or Tb."""
     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):
+def filegetter(startdir, obj):
+    """Generator of file sizes and paths based on os.walk."""
     # Список игнорируемых каталогов:
     ignore_dirs = ['/dev', '/proc', '/sys', '/mnt']
     # Проходим по всем папкам вглубь от заданного пути
-    for dirpath, dirnames, fnames in walk(startpath):
+    for dirpath, dirnames, fnames in walk(startdir):
     # Исключаем каталоги из поиска в соответствии со списком исключений
         for ign_dir in ignore_dirs[:]:
             for dirname in dirnames[:]:
@@ -60,27 +67,35 @@ def filegetter(startpath, obj):
                 obj.stopit = False
                 raise StopIteration
             # Проверяем можем ли мы определить размер файла - иначе пропускаем его
-            try:    flsize = getsize(flpath)
-            except: continue
-            # Возвращаем размер и полный путь файла
-            yield flsize, flpath
+            try:
+                # Возвращаем размер и полный путь файла
+                yield getsize(flpath), flpath
+            except OSError:
+                continue
 
 # Fullscreen
 def toggle_fullscreen(obj):
+    """Switch fullscreen on/off."""
     if obj.fullscreen:
-          obj.window.unfullscreen()
-    else: obj.window.fullscreen()
+        obj.window.unfullscreen()
+    else: 
+        obj.window.fullscreen()
     obj.fullscreen = not obj.fullscreen
 
 # Нажатие на кнопку клавиатуры
 def on_key_press(obj, event):
+    """Key press callback."""
+    # Toggle fullscreen on Maemo when hw key is pressed
     if hildonFound and event.keyval == gtk.keysyms.F6:
         toggle_fullscreen(obj)
 
 ### Properties dialog ##########################################################
 
 class PropertiesDialog(gtk.Dialog):
+    """File property dialog window."""
+
     def __init__(self, path, size, bytesize):
+        """Create&show file properties dialog."""
         gtk.Dialog.__init__(self)
         self.set_title( _('File properties') )
         self.set_transient_for(app)
@@ -133,9 +148,11 @@ class PropertiesDialog(gtk.Dialog):
 ### Main window ################################################################
 
 class MainWindow(gtk.Window):
+    """Main window class."""
 
     # Окно сообщения заданного типа с заданным текстом
     def mess_window(self, mestype, content):
+        """Show popup message window."""
         dialog = gtk.MessageDialog(parent=self, flags=gtk.DIALOG_MODAL,
                                    type=mestype, buttons=gtk.BUTTONS_OK,
                                    message_format=content)
@@ -146,6 +163,7 @@ class MainWindow(gtk.Window):
 
     # Функция выполняющаяся при нажатии на кнопку "Показать"
     def start_print(self, widget):
+        """Start file search. Button "Go" activate callback."""         
         self.start_path = self.srch_p_entr.get_text()
         # Проверяем правильное ли значение введено
         if isdir(self.start_path):
@@ -165,28 +183,34 @@ class MainWindow(gtk.Window):
 
                 # Выдает какую-то перманентную ошибку при присвоении значений treestore -
                 # кто увидит скажите - нужна статистика
-                try: self.treestore.append(None, [fpath, size_convert(fsize), fsize])
-                except: 'error', fpath, size_convert(fsize), fsize
+                try: 
+                    self.treestore.append(None, [fpath, size_convert(fsize), fsize])
+                except SystemError:
+#                    print 'error', fpath, size_convert(fsize), fsize
+                    self.mess_window('error','Error in %s' % fpath)
             self.butt_start.set_sensitive(True)
             self.butt_stop.set_sensitive(False)
             self.propertiesBtn.set_sensitive(True)
+            self.srch_p_entr.grab_focus()
         else:
             # Иначе выводим окошко с ошибкой
             self.mess_window('error', _('Invalid directory') )
 
     # Функция выполняющаяся при нажатии на кнопку "Стоп"
     def stop_print(self, widget):
+        """Stop search. "Stop" button clicked callback."""
         self.stopit = True
 
     # Функция выполняющаяся при нажатии на кнопку "Свойства файла"
     def show_properties_dialog(self, *args):
+        """Show property dialog window."""
         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:
+        except (TypeError, ValueError):
             self.mess_window('error', _('Please select file') )
             return
         PropertiesDialog(path, size, bytesize)
@@ -194,6 +218,7 @@ class MainWindow(gtk.Window):
     ### Window initialization ##################################################
 
     def __init__(self, win_width, win_height, st_path):
+        """Create MainWindow."""
         # Создаем новое окно
         gtk.Window.__init__(self)
         self.set_default_size(win_width, win_height)
@@ -259,7 +284,7 @@ class MainWindow(gtk.Window):
         self.treeview.set_headers_visible(1)
         self.treeview.connect('row-activated', self.show_properties_dialog)
 
-        self.treestore.append(None, ['','', 0])
+        self.treestore.append(None, ['', '', 0])
 
         # Создаем и настраиваем колонку с размером файла
         size_col = gtk.TreeViewColumn( _('Size') )
@@ -314,14 +339,20 @@ class MainWindow(gtk.Window):
         self.add(main_Vbox)
 
     def run(self):
+        """Show all widgets and run gtk.main()."""
         self.show_all()
         gtk.main()
-        return 0
 
 
 ### Main call ##################################################################
 
 if __name__ == '__main__':
     gobject.set_application_name( _('FindIT') )
-    app = MainWindow(575, 345, '.')
+
+    if platform == 'win32':
+        startpath = 'c:\\'
+    else:
+        startpath = expanduser('~')
+
+    app = MainWindow(575, 345, startpath)
     app.run()