From b82508ca8938265529c1678a16d7d19f39e2d58d Mon Sep 17 00:00:00 2001 From: Frederic Back Date: Thu, 28 Sep 2006 17:37:35 +0000 Subject: * Side link now sticks to the window border git-svn-id: file:///home/lennart/svn/public/fring/trunk@46 d0d2c35f-0a1e-0410-abeb-dabff30a67ee --- src/fringlib/fringrenderer.py | 63 ++++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/src/fringlib/fringrenderer.py b/src/fringlib/fringrenderer.py index 4c385f0..548cc12 100644 --- a/src/fringlib/fringrenderer.py +++ b/src/fringlib/fringrenderer.py @@ -30,6 +30,13 @@ class Segment(Hotspot): class FringRenderer: def __init__(self): + self.side_links = [] + self.lookup_data = [] + self.reset() + + def reset(self): + + # set ring layout self.MAX_LEVEL = 1 self.WIDTH, self.HEIGHT = 1024, 768 self.INNER_RADIUS = 100 @@ -37,12 +44,11 @@ class FringRenderer: self.RING_SPACE = 0 self.RINGS_MAX = 4 self.LINE_WIDTH = .5 - self.LEG_LINE_WIDTH = 1 - self.LABEL_UNTIL_RING = 0 + self.RING_OUTLINE_COLOR = (.2,.2,.2) + self.LEG_LINE_WIDTH = 1 + self.LEG_LINE_COLOR = (.3,.3,.3) - self.side_links = [] - self.lookup_data = [] def prepare_layouts(self,ctx): self.linklayout = ctx.create_layout() @@ -103,7 +109,7 @@ class FringRenderer: ctx.set_source_rgb(*color) ctx.fill_preserve() - ctx.set_source_rgb(0, 0, 0) + ctx.set_source_rgb(*self.RING_OUTLINE_COLOR) ctx.stroke() if hasContents and ring+1 < self.RINGS_MAX: @@ -115,34 +121,30 @@ class FringRenderer: middle = CENTERX+r*cos((start+end)*pi), CENTERY+r*sin((start+end)*pi) if ring <= 0: - ctx.move_to(*middle) + # compute the points of the link line + e = self.INNER_RADIUS + self.RING_RADIUS - self.RING_RADIUS/4 leg_radius = self.INNER_RADIUS + (self.RINGS_MAX+1) * (self.RING_RADIUS + self.RING_SPACE) leg_radius -= (self.RING_RADIUS + self.RING_SPACE) / 2 - ctx.line_to(CENTERX+leg_radius*cos((start+end)*pi), CENTERY+leg_radius*sin((start+end)*pi)) if cos((start+end)*pi) >= 0: - x = self.WIDTH/2 + leg_radius - align_x = 1 - else: - x = self.WIDTH/2 - leg_radius + x = self.WIDTH align_x = 0 + else: + x = 0 + align_x = 1 - # get line target point y = CENTERY+leg_radius*sin((start+end)*pi) xmod = 2*(align_x*2-1) + #xmod = 0 - # draw line - ctx.line_to(x, y) - ctx.set_source_rgb(.5, .5, .5) - ctx.set_line_width(self.LEG_LINE_WIDTH) - ctx.stroke() - - # write path name and register a hotspot - ctx.move_to(x+xmod,y) + point_a = CENTERX+e*cos((start+end)*pi), CENTERY+e*sin((start+end)*pi) + point_b = CENTERX+leg_radius*cos((start+end)*pi), CENTERY+leg_radius*sin((start+end)*pi) + point_c = x,y # draw the side link label + ctx.move_to(x+xmod,y) if hasContents: ctx.set_source_rgb(0,0,1) width,height = self._draw_centered_text(ctx, fn + "/", align_x) @@ -152,9 +154,20 @@ class FringRenderer: if align_x == 0: width *= -1 - + self.__register_side_link(hasContents,p,value,end-start,x,y+(height/2),x+(width),y-(height/2)) + # draw line + + ctx.move_to(*point_a) + ctx.line_to(*point_b) + offset = 5 + if align_x: ctx.line_to(point_c[0]+width+offset,point_c[1]) + else: ctx.line_to(point_c[0]+xmod+width-offset,point_c[1]) + ctx.set_source_rgb(*self.LEG_LINE_COLOR) + ctx.set_line_width(self.LEG_LINE_WIDTH) + ctx.stroke() + # write disk usage on segments if self.RING_RADIUS >= ctx.text_extents("55%")[3]: ctx.move_to(*middle) @@ -196,12 +209,12 @@ class FringRenderer: return None # A simple bisection algorithm - - ring = int((radius - self.INNER_RADIUS)/(self.RING_RADIUS + self.RING_SPACE)) try: + ring = int((radius - self.INNER_RADIUS)/(self.RING_RADIUS + self.RING_SPACE)) data = self.lookup_data[ring] - except IndexError: - return None + except IndexError: return None + except ZeroDivisionError: return None + except OverflowError: return None minidx, maxidx = 0, len(data)-1 p = int(maxidx*v) # Initial estimation -- cgit