[Ocfs2-tools-commits] manish commits r822 - trunk/ocfs2console/ocfs2interface

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Tue Apr 19 01:37:01 CDT 2005


Author: manish
Date: 2005-04-19 01:36:59 -0500 (Tue, 19 Apr 2005)
New Revision: 822

Modified:
   trunk/ocfs2console/ocfs2interface/bosa.py
Log:
Use new Idle sources


Modified: trunk/ocfs2console/ocfs2interface/bosa.py
===================================================================
--- trunk/ocfs2console/ocfs2interface/bosa.py	2005-04-19 06:36:12 UTC (rev 821)
+++ trunk/ocfs2console/ocfs2interface/bosa.py	2005-04-19 06:36:59 UTC (rev 822)
@@ -21,6 +21,8 @@
 
 import ocfs2
 
+import gidle
+
 from guiutil import set_props
 
 from ls import fields
@@ -69,6 +71,8 @@
 
 class Browser(gtk.VBox):
     def __init__(self, device=None):
+        self.device = device
+
         gtk.VBox.__init__(self, spacing=4)
 
         label = gtk.Label('/')
@@ -88,18 +92,10 @@
 
         self.make_ls_fields()
 
-        self.fs = None
+        self.connect('destroy', self.destroy_handler)
 
-        if device:
-            try:
-                self.fs = ocfs2.Filesystem(device)
-            except ocfs2.error:
-                self.make_error_node()
-        else:
-            self.make_empty_node()
+        self.refresh()
 
-        self.connect('destroy', self.destroy_handler)
-
     def make_file_view(self):
         tv = gtk.TreeView(self.store)
         self.scrl_win.add(tv)
@@ -121,9 +117,9 @@
 
         tv.append_column(column)
 
-        #tv.connect('test_expand_row', self.test_expand_row)
-        #tv.connect('test_collapse_row', self.test_collapse_row)
-        #tv.connect('row_activated', self.row_activated)
+        tv.connect('test_expand_row', self.tree_expand_row)
+        tv.connect('test_collapse_row', self.tree_collapse_row)
+        #tv.connect('row_activated', self.tree_row_activated)
 
         #sel = tv.get_selection()
         #sel.connect('changed', self.select)
@@ -152,17 +148,17 @@
             column += 1
 
     def destroy_handler(self, obj):
-        pass
+        self.cleanup()
 
     def make_dentry_node(self, dentry, stock_id, parent=None):
-        self.store.append(parent, (dentry.name, dentry, stock_id, False))
+        return self.store.append(parent, (dentry.name, dentry, stock_id, False))
 
     def make_file_node(self, dentry, parent=None):
         self.make_dentry_node(dentry, STOCK_FILE, parent)
 
     def make_dir_node(self, dentry, parent=None):
         iter = self.make_dentry_node(dentry, STOCK_DIRECTORY, parent)
-        self.store_append(iter, ('.', dentry, None, False))
+        self.store.append(iter, ('.', dentry, None, False))
 
     def make_loading_node(self, parent=None):
         self.store.append(parent, ('Loading...', None, STOCK_LOADING, True))
@@ -173,8 +169,31 @@
     def make_error_node(self, parent=None):
         self.store.append(parent, ('Error', None, STOCK_ERROR, True))
 
+    def cleanup(self):
+        if hasattr(self, 'levels'):
+            for level in self.levels:
+                level.destroy()
+
+        self.levels = []
+
     def refresh(self):
-        pass
+        self.cleanup()
+
+        self.store.clear()
+
+        self.fs = None
+
+        if self.device:
+            try:
+                self.fs = ocfs2.Filesystem(self.device)
+            except ocfs2.error:
+                self.make_error_node()
+
+            if self.fs:
+                self.add_level()
+        else:
+            self.make_empty_node()
+
         
     def add_level(self, dentry=None, parent=None):
         if parent:
@@ -187,22 +206,97 @@
             del self.store[iter]
 
         try:
-            level = TreeLevel(self, dentry)
+            diriter = self.fs.iterdir(dentry)
         except ocfs2.error:
-            self.make_erro_node(parent)
+            self.make_error_node(parent)
             return
 
         self.make_loading_node(parent)
 
+        level = TreeLevel(diriter, dentry, parent)
+        self.levels.append(level)
+
+        if parent: 
+            self.store[parent][COLUMN_INFO_OBJECT] = level
+      
+        level.set_callback(self.populate_level, level)
+        level.attach()
+
+    def populate_level(self, level):
+        try:
+            dentry = level.diriter.next()
+        except (StopIteration, ocfs2.error), e:
+             print e
+             self.destroy_level(level, isinstance(e, ocfs2.error))
+             return False
+
+        print dentry
+
+        if dentry.file_type == ocfs2.FT_DIR:
+            self.make_dir_node(dentry, level.parent)
+        else:
+            self.make_file_node(dentry, level.parent)
+
+        return True
+
+    def destroy_level(self, level, error=False):
+        if error:
+            self.make_error_node(level.parent)
+        else:
+            children = self.store.iter_n_children(level.parent)
+
+            if children < 2:
+                self.make_empty_node(level.parent)
+
+        if level.parent:
+            self.store[level.parent][COLUMN_INFO_OBJECT] = level.dentry
+
+        iter = self.store.iter_children(level.parent)
+        self.store.remove(iter)
+
+        self.levels.remove(level)
+
+        del level.diriter
+
+    def tree_expand_row(self, tv, iter, path):
+        info_obj = self.store[iter][COLUMN_INFO_OBJECT]
+
+        if isinstance(info_obj, TreeLevel):
+            level.collapsed = False
+            level.foreground(level)
+        else:
+            self.add_level(info_obj, iter)
+
+    def tree_collapse_row(self, tv, iter, path):
+        info_obj = self.store[iter][COLUMN_INFO_OBJECT]
+
+        if isinstance(info_obj, TreeLevel):
+            level = info_obj
+
+            level.collapsed = True
+            level.background()
         
-        #self.levels.append(TreeLevel(self, dentry))
+class TreeLevel(gidle.Idle):
+    def __init__(self, diriter, dentry=None, parent=None):
+        gidle.Idle.__init__(self)
 
-class TreeLevel:
-    def __init__(self, browser, dentry=None):
+        self.diriter = diriter
         self.dentry = dentry
-        self.browser = browser
-        self.diriter = dentry.fs.iterdir(dentry)
-        
+
+        if parent:
+            self.parent = parent.copy()
+        else:
+            self.parent = None
+
+        self.collapsed = False
+
+    def foreground(self):
+        if not self.collapsed:
+            self.set_priority(gobject.PRIORITY_DEFAULT_IDLE)
+
+    def background(self):
+        level.set_priority(gobject.PRIORITY_LOW)
+
 def main():
     import sys
 
@@ -210,6 +304,7 @@
         gtk.main_quit()
 
     window = gtk.Window()
+    window.set_default_size(400, 300)
     window.connect('delete_event', dummy)
 
     browser = Browser(sys.argv[1])



More information about the Ocfs2-tools-commits mailing list