From 6318dc2b0a054bc428265cf771e6e5dbc040308c Mon Sep 17 00:00:00 2001 From: Frederic Back Date: Fri, 6 Oct 2006 09:57:24 +0000 Subject: * 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 --- src/fringlib/fringdata.py | 8 ++++++- src/fringlib/fringrenderer.py | 22 +++++++++++------- src/fringlib/fringui.py | 17 +++++++++----- src/fringlib/fringwalker.py | 53 +++++++++++++++++++++++++------------------ 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)" -- cgit