zoom

$canvaseditor zoom
updates variable zoom in object namespace dot
$canvaseditor zoom in
increases zoom factor
$canvaseditor zoom out
decreases zoom factor

obj method canvaseditor zoom {{how !?} {warp false}} {
  if {$warp} then {
    $self pointerToXY {*}[pointerXY]
  }
  set max 64
  set changed no
  switch -exact -- $how {
    !? #
    in {
      if {[my zoom] < $max} then {
        my zoom [expr {[my zoom] * sqrt(2)}]
        set changed yes
      }
    }
    out {
      if {[my zoom] > 1} then {
        my zoom [expr {[my zoom] / sqrt(2)}]
        set changed yes
      }
    }
    original - none {
      if {[my zoom] != 1.0} then {
        my zoom 1.0
        set changed yes
      }
    }
    default {
      my zoom [fexpr $how]
      set changed yes
    }
  }
  if {$changed} then {
    set diff [abs [- [my zoom] [round [my zoom]]]]
    if {$diff > 0 && $diff < 1e-13} then {
      my zoom [double [round [my zoom]]]
    }
    obj inscope dot set zoom [my zoom]
    $self canvas configure -scrollregion "0 0\
        [* [$self setting width] [my zoom]]\
        [* [$self setting height] [my zoom]]"
    after idle "event generate [my canvas] <Configure>"
    $self statusLine "Zoom [my zoom]"
    $self elements -all draw coords
    lassign [pointerXY] x y
    lassign [calcZoomClipping [$self canvasx $x] [$self canvasy $y]\
        [winfo width [my canvas]] [winfo height [my canvas]] [my zoom]]\
      clipX clipY
    $self canvas xview moveto $clipX
    $self canvas yview moveto $clipY
  }
  my zoom
}
obj inscope canvaseditor proc calcZoomClipping {x y width height zoom} {
  set clipFrac [/ 1.0 $zoom 2]
  set xFrac [/ [double $x] [double $width]]
  set xLeft [- $xFrac $clipFrac]
  set yFrac [/ [double $y] [double $height]]
  set yTop [- $yFrac $clipFrac]
  list [max 0.0 $xLeft] [max 0.0 $yTop]
}
obj method canvaseditor scrollbars {{onoff on}} {
  if {[$self canvas xview] eq "0.0 1.0" &&
    [$self canvas yview] eq "0.0 1.0"} then {
    $self buildInfoWindow
    $self statusLine\
      "No scrolling. Completely visible."
  } elseif {$onoff} then {
    $self pointerToXY {*}[pointerXY]
    $self basicBindings off
    bind [my canvas] <<Click>> "$self scrollbars off"
    bind [my canvas] <3> "$self scrollbars off"
    #
    place [my canvas].x -rely 1.0 -relx 0 -anchor sw\
      -relwidth 1.0 -width -[winfo reqwidth [my canvas].y]
    place [my canvas].y -relx 1.0 -rely 0 -anchor ne\
      -relheight 1.0 -height -[winfo reqheight [my canvas].x]
    #
  } else {
    place forget [my canvas].x
    place forget [my canvas].y
    $self basicBindings on
  }
}

© Wolf-Dieter Busch | Home | Sitemap | Urheber | A-Z