Merge branch 'master' of https://git.maemo.org/projects/findit into mosfet/master
[findit] / src / findit.py
index dabd68d..a286fca 100755 (executable)
@@ -1,19 +1,22 @@
 #!/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 time
+from sys import platform
 
 try: 
-    import hildon; hildonFound = True
+    import hildon
+    hildonFound = True
 except ImportError:
     hildonFound = False
 
@@ -33,17 +36,19 @@ except IOError:
 
 # Функция которая возвращает строку из числа и единиц для столбца "Размер"("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[:]:
@@ -63,14 +68,14 @@ def filegetter(startpath, obj):
                 raise StopIteration
             # Проверяем можем ли мы определить размер файла - иначе пропускаем его
             try:
-                flsize = getsize(flpath)
+                # Возвращаем размер и полный путь файла
+                yield getsize(flpath), flpath
             except OSError:
                 continue
-            # Возвращаем размер и полный путь файла
-            yield flsize, flpath
 
 # Fullscreen
 def toggle_fullscreen(obj):
+    """Switch fullscreen on/off."""
     if obj.fullscreen:
         obj.window.unfullscreen()
     else: 
@@ -79,13 +84,18 @@ def toggle_fullscreen(obj):
 
 # Нажатие на кнопку клавиатуры
 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)
@@ -138,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)
@@ -151,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):
@@ -178,16 +191,19 @@ class MainWindow(gtk.Window):
             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:
@@ -202,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)
@@ -267,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') )
@@ -298,6 +315,33 @@ class MainWindow(gtk.Window):
         currFileFrm = gtk.Frame()
         currFileFrm.add(self.currFileLbl)
 
+        # 7 Меню
+        if not hildonFound:
+            menubar = gtk.MenuBar()
+    
+            menubaritem0 = gtk.MenuItem('menubaritem0')
+            menu0 = gtk.Menu()
+            menuitem00 = gtk.MenuItem('item00')
+            menuitem01 = gtk.MenuItem('item01')
+            menuitem02 = gtk.MenuItem('item02')
+            menu0.add(menuitem00)
+            menu0.add(menuitem01)
+            menu0.add(menuitem02)
+            menubaritem0.set_submenu(menu0)
+    
+            menubaritem1 = gtk.MenuItem('menubaritem1')
+            menu1 = gtk.Menu()
+            menuitem10 = gtk.MenuItem('item10')
+            menuitem11 = gtk.MenuItem('item11')
+            menuitem12 = gtk.MenuItem('item12')
+            menu1.add(menuitem10)
+            menu1.add(menuitem11)
+            menu1.add(menuitem12)
+            menubaritem1.set_submenu(menu1)
+    
+            menubar.add(menubaritem0)
+            menubar.add(menubaritem1)
+
         #########  Упаковываем элементы ################
         # Создаем основной вертикальный контейнер
         main_Vbox = gtk.VBox(False, 4)
@@ -313,6 +357,7 @@ class MainWindow(gtk.Window):
         hbox1.pack_start(self.propertiesBtn, True, True, 0)
 
         # Добавляем элементы в основной контейнер
+        main_Vbox.pack_start(menubar, False, False, 0)
         main_Vbox.pack_start(self.srch_p_entr, False, False, 0)
         main_Vbox.pack_start(hbox1, False, False, 0)
         scrollwind.add(self.treeview)
@@ -322,6 +367,7 @@ class MainWindow(gtk.Window):
         self.add(main_Vbox)
 
     def run(self):
+        """Show all widgets and run gtk.main()."""
         self.show_all()
         gtk.main()
 
@@ -330,6 +376,11 @@ class MainWindow(gtk.Window):
 
 if __name__ == '__main__':
     gobject.set_application_name( _('FindIT') )
-    app = MainWindow(575, 345, '/home')
-    app.run()
 
+    if platform == 'win32':
+        startpath = 'c:\\'
+    else:
+        startpath = expanduser('~')
+
+    app = MainWindow(575, 345, startpath)
+    app.run()