From ea97aefad7f3dd527ef910aedcb73f4b5b7f48dc Mon Sep 17 00:00:00 2001 From: Frederic Back Date: Sun, 24 Sep 2006 10:10:55 +0000 Subject: * 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 --- src/fringlib/fringrenderer.py | 35 +++++++---- src/fringlib/fringui.py | 4 +- src/fringlib/fringwalker.py | 142 ++++++++++++++++-------------------------- 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 -- cgit