summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Back <fredericback@gmail.com>2006-10-06 09:57:24 +0000
committerFrederic Back <fredericback@gmail.com>2006-10-06 09:57:24 +0000
commit6318dc2b0a054bc428265cf771e6e5dbc040308c (patch)
tree5c8ef0902d8e6cda1c32ec655ed25575f7572aec
parent5df72aab9a1064a1b008c58d5adaf11abe85fcbb (diff)
* Display state every 250ms
* Changed parent button size to SMALL_TOOLBAR * Added progress bar * The progress signal now also emits the path getting parsed * Path in status bar is now relative to current path (shorter) git-svn-id: file:///home/lennart/svn/public/fring/trunk@66 d0d2c35f-0a1e-0410-abeb-dabff30a67ee
-rw-r--r--src/fringlib/fringdata.py8
-rw-r--r--src/fringlib/fringrenderer.py22
-rw-r--r--src/fringlib/fringui.py17
-rw-r--r--src/fringlib/fringwalker.py53
4 files changed, 63 insertions, 37 deletions
diff --git a/src/fringlib/fringdata.py b/src/fringlib/fringdata.py
index 1da49c0..db9c0d4 100644
--- a/src/fringlib/fringdata.py
+++ b/src/fringlib/fringdata.py
@@ -74,19 +74,25 @@ class SumListCollection:
def set_sumlist(self, uri, sumlist):
if not isinstance(sumlist,SumList): raise ValueError
- if not isinstance(uri,unicode): raise ValueError
+ if not (isinstance(uri,unicode) or isinstance(uri,str)): raise ValueError
if not sumlist.has_children(): return # skip files
self.collection[uri] = sumlist
if uri in self.versionControl:
self.versionControl[uri] += 1
else:
self.versionControl[uri] = 0
+
+ def rem_sumlist(self, uri):
+ if not (isinstance(uri,unicode) or isinstance(uri,str)): raise ValueError
+ del self.collection[uri]
def get_sumlist(self, uri):
+ if not (isinstance(uri,unicode) or isinstance(uri,str)): raise ValueError
if uri in self.collection:
return self.collection[uri]
def has_changed(self, uri, version):
+ if not (isinstance(uri,unicode) or isinstance(uri,str)): raise ValueError
if uri in self.versionControl:
if version != self.versionControl[uri]:
return True
diff --git a/src/fringlib/fringrenderer.py b/src/fringlib/fringrenderer.py
index 63b719b..2c6825b 100644
--- a/src/fringlib/fringrenderer.py
+++ b/src/fringlib/fringrenderer.py
@@ -75,12 +75,12 @@ class FringRenderer:
ctx.move_to(CENTERX, CENTERY)
n = len(data.children)
- i = 0
accumulated = 0
last = start_angle
- for entry in data.children:
+ for i in range(len(data.children)):
+ entry = data.children[i]
hasContents = entry.has_children()
@@ -88,14 +88,16 @@ class FringRenderer:
accumulated += entry.size
if data.size == 0: continue
- end = start_angle+(end_angle - start_angle)*1.0*accumulated/data.size
-
+ end = start_angle+(end_angle - start_angle)*1.0*accumulated/data.size
+
if end-start >= .005:
p = previouspath+os.sep+entry.name
self.lookup_data[ring].append( Segment(hasContents , p, entry, start, end) )
- color = self._choose_color(start_hue + (end_hue-start_hue)*1.0*i/n, ring)
+ #c = start_hue + (end_hue-start_hue)*1.0*i/n # old implementation
+ c = start_hue + (end_hue-start_hue)*start
+ color = self._choose_color(c, ring)
r = self.INNER_RADIUS + ring * (self.RING_RADIUS + self.RING_SPACE)
ctx.move_to(CENTERX+r*cos(start*2*pi), CENTERY+r*sin(start*2*pi))
@@ -112,8 +114,12 @@ class FringRenderer:
if hasContents and ring+1 < self.RINGS_MAX:
self.draw_segment(ctx, ring+1, start, end,
- start_hue + (end_hue-start_hue)*1.0*i/n,
- start_hue + (end_hue-start_hue)*1.0*(i+1)/n, entry,
+ #start_hue + (end_hue-start_hue)*1.0*i/n,
+ #start_hue + (end_hue-start_hue)*1.0*(i+1)/n, entry,
+
+ start_hue + (end_hue-start_hue)*start,
+ start_hue + (end_hue-start_hue)*end,
+ entry,
previouspath+os.sep+entry.name)
r += self.RING_RADIUS/2
@@ -192,7 +198,7 @@ class FringRenderer:
self._draw_centered_text(ctx, "%.0f%%" %percent)
last = end
- i += 1
+
if ring == 0:
ctx.set_source_rgb(.3,.3,.3)
diff --git a/src/fringlib/fringui.py b/src/fringlib/fringui.py
index 7a59660..19beba3 100644
--- a/src/fringlib/fringui.py
+++ b/src/fringlib/fringui.py
@@ -69,7 +69,7 @@ class UI( gtk.Window ):
self.walker.connect("list-changed",self.__event_walker_changed)
self.walker.connect("progress",self.__event_walker_progress)
self.walker.connect("finished", self.__event_walker_finished)
- self.walker.connect("manually-stopped", lambda w: self.__show_busy_cursor(-1))
+ self.walker.connect("manually-stopped", self.__event_walker_stopped)
self.open_folder(uri)
@@ -255,7 +255,7 @@ class UI( gtk.Window ):
self.__show_busy_cursor(-1)
d.destroy()
- def refresh_tree(self,widget):
+ def refresh_tree(self,widget=None):
""" Refresh the current folder """
self.walker.stop()
self.collection.clear()
@@ -270,13 +270,14 @@ class UI( gtk.Window ):
d = self.collection.get_sumlist(uri)
if d is not None:
print "(load from collection)"
+ self.walker.stop()
self.data = self.collection.get_sumlist(uri)
self.uri = uri
self.redraw()
else:
print "(walk)"
- self.uri = uri
self.walker.stop()
+ self.uri = uri
if uri:
self.walker.walk(uri)
self.scan_active = True
@@ -350,11 +351,17 @@ class UI( gtk.Window ):
self.__show_busy_cursor(-1)
self.scan_active = False
self.pbar.set_text( _("Done") )
+ self.pbar.set_fraction( 1 )
+
+ def __event_walker_stopped(self, widget):
+ self.__show_busy_cursor(-1)
+ self.scan_active = False
+ self.pbar.set_text( _("Stopped") )
def __event_walker_progress(self, widget, c, total, uri):
self.pbar.set_sensitive(True)
self.pbar.set_text( _("reading %s")%uri )
- self.pbar.set_fraction( float(c) / float(total) )
+ self.pbar.set_fraction( 1.0*c/total )
def __event_resized(self, widget, event):
r = self.eventbox.get_allocation()
@@ -372,5 +379,3 @@ class UI( gtk.Window ):
def __event_walker_changed(self,widget,data):
self.data = data
self.redraw()
-
-
diff --git a/src/fringlib/fringwalker.py b/src/fringlib/fringwalker.py
index d328627..f04858a 100644
--- a/src/fringlib/fringwalker.py
+++ b/src/fringlib/fringwalker.py
@@ -1,6 +1,6 @@
import os, sys
import threading
-import time
+from time import time
import gobject, gtk
import posixpath
from gnomevfs import *
@@ -34,6 +34,8 @@ class FringWalker( gobject.GObject ):
if self.thread:
self.emit("manually-stopped")
self.thread.stopsignal = True
+ # remove unfinished sumlist from collection
+ self.collection.rem_sumlist(unicode(self.thread.uri))
self.thread = None
def _progress_fn(self, walkthread, c, l, r, currentlyScanning):
@@ -64,8 +66,8 @@ class WalkThread( threading.Thread ):
self.master = master
self.uri = URI(uri)
self.showhidden = showhidden
-
- self.max_recursion_sort = 3
+ self.max_recursion_sort = 3
+ self.progresstimer = 0
def build_tree_gnomevfs(self, uri, recursionlvl=0):
result = SumList(self.__uri_tail(uri), None, 0)
@@ -89,16 +91,21 @@ class WalkThread( threading.Thread ):
result.sort_by_size()
self.master.collection.set_sumlist(unicode(uri),result)
+ if recursionlvl <= 1:
+ self.__check_progress()
+
return result
def run(self):
""" Parse the root directory """
+ self.progresstimer = time()
+
self.result = SumList(self.__uri_tail(self.uri), None, 0)
self.master._progress_fn(self, 0, 1, self.result, self.uri)
# write some debug information
- starttime = time.time()
+ starttime = time()
print "start walking",self.uri
# scan root directory first (using gnomevfs)
@@ -115,28 +122,29 @@ class WalkThread( threading.Thread ):
else: self.result.append_child( SumList(d.name, None, d.size) )
except StopIteration: pass
- # emit an intermediate version to fill up the screen while waiting
- self.result.sort()
- self.master.collection.set_sumlist(unicode(self.uri),self.result)
-
# walk the subdirectories
- c = 0
- for directory in subdirectories:
- c += 1
-
- sub = self.build_tree_gnomevfs(self.uri.append_path(directory))
+ self.progress_total = len(subdirectories)
+ self.progress_count = 0
+ for self.directory in subdirectories:
+ sub = self.build_tree_gnomevfs(self.uri.append_path(self.directory))
self.result.append_child( sub )
if self.stopsignal: return
-
- self.result.sort()
- self.master.collection.set_sumlist(unicode(self.uri),self.result)
-
- self.master._progress_fn(self, c, len(subdirectories), self.result, sub.name)
+ self.progress_count += 1
# emit final signal
self.master._finished_fn(self,self.result)
- print "finished walking",self.uri,"(time=%s)"%round(time.time()-starttime,2)
-
+ self.master.collection.set_sumlist(unicode(self.uri),self.result)
+ print "finished walking",self.uri,"(time=%s)"%round(time()-starttime,2)
+
+ def __check_progress(self):
+ if time()-self.progresstimer > .25:
+ self.progresstimer = time()
+ #self.result.sort_by_size()
+ self.master._progress_fn(self,
+ self.progress_count, self.progress_total,
+ self.result,
+ self.directory)
+
def __uri_tail(self, uri):
""" Return the tail (the filename) of a gnomevfs uri """
f = format_uri_for_display(str(uri))
@@ -145,5 +153,6 @@ class WalkThread( threading.Thread ):
def __open_directory(self, uri):
try: return DirectoryHandle(uri)
- except InvalidURIError: print uri,"is not a valid uri, skipped"
- except NotFoundError: print uri,"not found, skipped"
+ except InvalidURIError: print "Could not open",uri,"(not a valid uri)"
+ except NotFoundError: print "Could not open",uri,"(not found)"
+ except AccessDeniedError: print "Could not open",uri,"(access denied)"