pyviz: autoscale the view to show all nodes on startup
authorGustavo J. A. M. Carneiro <gjc@inescporto.pt>
Thu Jan 21 14:11:14 2010 +0000 (2010-01-21)
changeset 3921fc0125062de7
parent 3920 c4628d5094e0
child 3922 d26a12d3ebb8
pyviz: autoscale the view to show all nodes on startup
src/contrib/visualizer/core.py
     1.1 --- a/src/contrib/visualizer/core.py	Tue Mar 31 16:06:08 2009 +0100
     1.2 +++ b/src/contrib/visualizer/core.py	Thu Jan 21 14:11:14 2010 +0000
     1.3 @@ -15,9 +15,9 @@
     1.4  
     1.5  import platform
     1.6  if platform.system() == "Windows":
     1.7 -        SHELL_FONT = "Lucida Console 9"
     1.8 +    SHELL_FONT = "Lucida Console 9"
     1.9  else:
    1.10 -        SHELL_FONT = "Luxi Mono 10"
    1.11 +    SHELL_FONT = "Luxi Mono 10"
    1.12  
    1.13  
    1.14  import ns3
    1.15 @@ -1098,10 +1098,39 @@
    1.16          import types
    1.17          __IPYTHON__.runcode = types.MethodType(runcode, __IPYTHON__)                
    1.18  
    1.19 +    def autoscale_view(self):
    1.20 +        self._update_node_positions()
    1.21 +        positions = [node.get_position() for node in self.nodes.itervalues()]
    1.22 +        min_x, min_y = min(x for (x,y) in positions), min(y for (x,y) in positions)
    1.23 +        max_x, max_y = max(x for (x,y) in positions), max(y for (x,y) in positions)
    1.24 +        min_x_px, min_y_px = self.canvas.convert_to_pixels(min_x, min_y)
    1.25 +        max_x_px, max_y_px = self.canvas.convert_to_pixels(max_x, max_y)
    1.26 +        dx = max_x - min_x
    1.27 +        dy = max_y - min_y
    1.28 +        dx_px = max_x_px - min_x_px
    1.29 +        dy_px = max_y_px - min_y_px
    1.30 +        hadj = self._scrolled_window.get_hadjustment()
    1.31 +        vadj = self._scrolled_window.get_vadjustment()
    1.32 +        new_dx, new_dy = 1.5*dx_px, 1.5*dy_px
    1.33 +
    1.34 +        self.zoom.value = min(hadj.page_size/new_dx, vadj.page_size/new_dy)
    1.35 +
    1.36 +        x1, y1 = self.canvas.convert_from_pixels(hadj.value, vadj.value)
    1.37 +        x2, y2 = self.canvas.convert_from_pixels(hadj.value+hadj.page_size, vadj.value+vadj.page_size)
    1.38 +        width = x2 - x1
    1.39 +        height = y2 - y1
    1.40 +        center_x = (min_x + max_x) / 2
    1.41 +        center_y = (min_y + max_y) / 2
    1.42 +        
    1.43 +        self.canvas.scroll_to(center_x - width/2, center_y - height/2)
    1.44 +
    1.45 +        return False
    1.46 +
    1.47      def start(self):
    1.48          self.scan_topology()
    1.49          self.window.connect("delete-event", self._quit)
    1.50          #self._start_update_timer()
    1.51 +        gobject.timeout_add(200, self.autoscale_view)
    1.52          self.simulation.start()
    1.53  
    1.54          try: