gui/graph_displayer_canvas-zoom.cc
author ladanyi
Fri, 04 Nov 2005 19:07:15 +0000
changeset 1777 a70cee06ae9c
parent 1632 93ac8c521fe5
child 1819 fd82adfbe905
permissions -rwxr-xr-x
improved zooming
     1 #include "graph_displayer_canvas.h"
     2 #include "broken_edge.h"
     3 #include <cmath>
     4 
     5 void GraphDisplayerCanvas::zoomIn()
     6 {
     7   set_pixels_per_unit(
     8       (1.0 + (double) zoom_step / 100.0) * get_pixels_per_unit());
     9 }
    10 
    11 void GraphDisplayerCanvas::zoomOut()
    12 {
    13   set_pixels_per_unit(
    14       (1.0 - (double) zoom_step / 100.0) * get_pixels_per_unit());
    15 }
    16 
    17 void GraphDisplayerCanvas::zoomFit()
    18 {
    19   updateScrollRegion();
    20 
    21   // get the height and width of the canvas
    22   Gtk::Allocation a = get_allocation();
    23   int aw = a.get_width();
    24   int ah = a.get_height();
    25 
    26   // get the bounding box of the graph
    27   update_now();
    28   double x1, y1, x2, y2;
    29   root()->get_bounds(x1, y1, x2, y2);
    30 
    31   // fit the graph to the window
    32   double ppu1 = (double) aw / fabs(x2 - x1);
    33   double ppu2 = (double) ah / fabs(y2 - y1);
    34   set_pixels_per_unit((ppu1 < ppu2) ? ppu1 : ppu2);
    35 }
    36 
    37 void GraphDisplayerCanvas::zoom100()
    38 {
    39   updateScrollRegion();
    40   set_pixels_per_unit(1.0);
    41 }
    42 
    43 void GraphDisplayerCanvas::updateScrollRegion()
    44 {
    45   // get_bounds() yields something sane only when no updates are pending
    46   // and it returns a sufficient, not an exact bounding box
    47   update_now();
    48   double x1, y1, x2, y2;
    49   root()->get_bounds(x1, y1, x2, y2);
    50   set_scroll_region(x1, y1, x2, y2);
    51 }