summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Back <fredericback@gmail.com>2006-09-24 10:10:55 +0000
committerFrederic Back <fredericback@gmail.com>2006-09-24 10:10:55 +0000
commitea97aefad7f3dd527ef910aedcb73f4b5b7f48dc (patch)
treef1a824139a308a2e85da78f6d93c7111f0e2191f
parent32b21d985658e3f8987535bde1a1fc1ba5a716fc (diff)
* Replaced SumList by tuple arrays in the renderer
* Created ugly walker that uses the extension git-svn-id: file:///home/lennart/svn/public/fring/branches/c_walker@18 d0d2c35f-0a1e-0410-abeb-dabff30a67ee
-rw-r--r--src/fringlib/fringrenderer.py35
-rw-r--r--src/fringlib/fringui.py4
-rw-r--r--src/fringlib/fringwalker.py142
3 files changed, 78 insertions, 103 deletions
diff --git a/src/fringlib/fringrenderer.py b/src/fringlib/fringrenderer.py
index 60256e5..f69a0a2 100644
--- a/src/fringlib/fringrenderer.py
+++ b/src/fringlib/fringrenderer.py
@@ -1,9 +1,10 @@
import cairo
import pango
from math import *
-from fringwalker import sum_list
+#from fringwalker import sum_list
from fringutil import *
import os
+from fringwalker import print_tree
class Hotspot:
@@ -51,7 +52,11 @@ class FringRenderer:
def draw_segment(self,ctx, ring, start_angle, end_angle, start_hue, end_hue, data, previouspath=""):
- assert isinstance(data, sum_list)
+ if data is None: return
+
+ dataname = data[0]
+ datadata = data[1]
+ datathe_sum = data[2]
if ring == 0:
self.lookup_data = []
@@ -64,25 +69,31 @@ class FringRenderer:
ctx.move_to(CENTERX, CENTERY)
if ring == 0:
- self._draw_centered_text(ctx, pretty_size(data.the_sum))
+ self._draw_centered_text(ctx, pretty_size(datathe_sum))
- n = len(data.data)
+ n = len(datadata)
i = 0
accumulated = 0
last = start_angle
- for fn, d in data.data:
+ if datadata is None: return
+ for fn, contents, d in datadata:
+ if contents == None: hasContents = False
+ else: hasContents = True
+
start = last
- value = self._list_value(d)
+
+ value = d # third tuple element now *always* contains the size
+
accumulated += value
- end = start_angle+(end_angle - start_angle)*1.0*accumulated/data.the_sum
+ end = start_angle+(end_angle - start_angle)*1.0*accumulated/datathe_sum
if end-start >= .01:
p = previouspath+os.sep+fn
- self.lookup_data[ring].append(Segment(isinstance(d, sum_list), p, value, start, end))
+ self.lookup_data[ring].append( Segment(hasContents , p, value, start, end) )
v = start_hue + (end_hue-start_hue)*1.0*i/n
color = self._choose_color(start_hue + (end_hue-start_hue)*1.0*i/n, ring)
@@ -100,9 +111,9 @@ class FringRenderer:
ctx.set_source_rgb(0, 0, 0)
ctx.stroke()
- if isinstance(d, sum_list) and ring+1 < self.RINGS_MAX:
+ if hasContents and ring+1 < self.RINGS_MAX:
self.draw_segment(ctx, ring+1, start, end, v,
- start_hue + (end_hue-start_hue)*1.0*(i+1)/n, d,
+ start_hue + (end_hue-start_hue)*1.0*(i+1)/n, (fn, contents, d),
previouspath+os.sep+fn)
r += self.RING_RADIUS/2
@@ -137,7 +148,7 @@ class FringRenderer:
ctx.move_to(x+xmod,y)
# draw the side link label
- if isinstance(d, sum_list):
+ if hasContents:
ctx.set_source_rgb(0,0,1)
width,height = self._draw_centered_text(ctx, fn + "/", align_x)
else:
@@ -147,7 +158,7 @@ class FringRenderer:
if align_x == 0:
width *= -1
- self.__register_side_link(isinstance(d, sum_list),p,value,end-start,x,y+(height/2),x+(width),y-(height/2))
+ self.__register_side_link(hasContents,p,value,end-start,x,y+(height/2),x+(width),y-(height/2))
if ring <= self.LABEL_UNTIL_RING:
ctx.move_to(*middle)
diff --git a/src/fringlib/fringui.py b/src/fringlib/fringui.py
index 1fe187d..71b2d67 100644
--- a/src/fringlib/fringui.py
+++ b/src/fringlib/fringui.py
@@ -3,7 +3,7 @@ import cairo
import sys
import os
-from fringwalker import FringWalker
+from fringwalker import FringWalker, print_tree
from fringrenderer import FringRenderer
from fringutil import *
@@ -287,9 +287,9 @@ class UI( gtk.Window ):
self.renderer.prepare_layouts(self.ctx)
def __list_changed(self,widget,data):
+ #print_tree(data)
self.data = data
self.redraw()
- #print data.name
def __walker_finished(self, widget, data):
self.__list_changed(widget, data)
diff --git a/src/fringlib/fringwalker.py b/src/fringlib/fringwalker.py
index bb6195b..5137306 100644
--- a/src/fringlib/fringwalker.py
+++ b/src/fringlib/fringwalker.py
@@ -1,40 +1,18 @@
-import os, os.path, stat, sys, time
+import os, os.path, stat, sys
import gobject, gtk
from threading import Thread
+import time
+import fringtools
-class sum_list:
- def __init__(self, l, name = None):
- self.the_sum = 0
- self.data = list(l)
- self.name = name
+def print_tree( t, tab=0 ):
+ """ An utility function to print out the tree returned by FringWalker::_parse """
- for fn, i in self.data:
-
- if isinstance(i, sum_list):
- self.the_sum += i.the_sum
- else:
- self.the_sum += i
-
- def __str__(self):
- return self.name+": "+str(self.data)
-
- def sort(self):
-
- def cmp_fn(a, b):
- a_dir = isinstance(a[1], sum_list)
- b_dir = isinstance(b[1], sum_list)
-
- if a_dir and not b_dir:
- return 1
- elif b_dir and not a_dir:
- return -1
- elif a_dir:
- return cmp(a[1].the_sum, b[1].the_sum)
- else:
- return cmp(a[1], b[1])
-
- self.data.sort(cmp_fn)
+ fn, data, size = t
+ print " "*tab,"%s (%i)"%(fn,size)
+ if not data: return
+ for e in data:
+ print_tree(e,tab+1)
class FringWalker( gobject.GObject ):
@@ -50,11 +28,13 @@ class FringWalker( gobject.GObject ):
self.stopsignal = False
self.showhidden = False
+
def walk(self,path):
self.thread = Thread(None,self._parse,None,(path,))
self.stopsignal = False
print "start thread (%s)"%path
self.thread.start()
+
def stop(self):
if self.thread is None:
@@ -69,79 +49,63 @@ class FringWalker( gobject.GObject ):
#self.thread.join()
print "ok"
+
def _parse(self,path):
""" Parse the root directory """
- def progress_fn(c, l, r):
- # emit signals
- gtk.gdk.threads_enter()
- self.emit("progress", c, l)
- self.emit("list-changed", r)
- gtk.gdk.threads_leave()
-
- r = self._build_tree(path, progress_fn)
+ l = []
+ i = 0
+ subdirectories = {}
- gtk.gdk.threads_enter()
- self.emit("finished", r)
- gtk.gdk.threads_leave()
+ total = 0
- print "finished walking", path
-
- def _build_tree(self, path, progress_fn = None):
- """ Parse directories recursively """
-
- ret = []
- tmp_dirs = []
-
try:
- # walk files in directory
for fn in os.listdir(path):
- if self.stopsignal:
- return sum_list([])
+ if not self.showhidden and fn[0] == '.': continue
- if not self.showhidden and fn[0] == '.':
- continue
+ try: p = os.path.join(path, fn)
+ except: continue
- try:
- p = os.path.join(path, fn)
- s = os.lstat(p)
- except:
- continue
+ s = os.lstat(p)
if stat.S_ISDIR(s.st_mode):
- tmp_dirs.append(fn);
+ subdirectories[i] = (fn,p);
+ l.append((fn, None, s.st_size))
elif stat.S_ISREG(s.st_mode):
- ret.append((fn, s.st_size))
- except OSError:
+ l.append((fn, None, s.st_size))
+
+ total += s.st_size
+ i += 1
+
+ except:
pass
- try:
- c = 0
+ gtk.gdk.threads_enter()
+ self.emit("list-changed",(os.path.split(path)[-1], l, total))
+ gtk.gdk.threads_leave()
+
+ c = 0
+ for n in subdirectories:
+ c += 1
+
+ fn,p = subdirectories[n]
+ sub = fringtools.build_tree(p,True) # call faster c++ extension
+ total += sub[2]
- for fn in tmp_dirs:
- c += 1
-
- if self.stopsignal:
- return sum_list([])
-
- try:
- p = os.path.join(path, fn)
- except:
- continue
-
- ret.append((fn, self._build_tree(p)))
-
- if not (progress_fn is None):
- r = sum_list(ret, os.path.split(path)[-1])
- r.sort()
- progress_fn(c, len(tmp_dirs), r)
-
- except OSError:
- pass
+ l[n] = (fn,sub[1],sub[2]);
+
+ if self.stopsignal: return
- r = sum_list(ret, os.path.split(path)[-1])
- r.sort()
+ # emit signals
+ gtk.gdk.threads_enter()
+ self.emit("list-changed",(os.path.split(path)[-1], l, total))
+ print "%s parsed"%fn
+ gtk.gdk.threads_leave()
+
- return r
+ gtk.gdk.threads_enter()
+ self.emit("finished",(os.path.split(path)[-1], l, total))
+ gtk.gdk.threads_leave()
+ print "finished walking",path