scaleMode

$canvaseditor scaleMode mode
manages event bindings of canvas to scale selected objecs interactively.

obj method canvaseditor scaleMode {{mode both}} {
  set canvas [my canvas]
  $self selected dots storeXY
  $self selected calcCenter
  $self selected blink off
  $self snapMode on
  set nearDot [$self nearestDot -selected -end]
  #
  $self memory currentDot $nearDot
  $self memory transformation "scale $mode"
  #
  switch -exact -- $mode {
    horizontal {
      if {
        [min {*}[$self dots -selected -gravity cget -x]] ==
        [max {*}[$self dots -selected -gravity cget -x]]
      } then {
        return -code error "Sorry, zero width!"
      }
      set leftDot [$self leftmostDot -gravity]
      set rightDot [$self rightmostDot -gravity]
      set centerX [expr {([$leftDot cget -x] + [$rightDot cget -x]) / 2}]
      #
      if {[$nearDot cget -x] < $centerX} then {
        set farDot $rightDot
      } else {
        set farDot $leftDot
      }
    }
    vertical {
      if {
        [min {*}[$self dots -selected -gravity cget -y]] ==
        [max {*}[$self dots -selected -gravity cget -y]]
      } then {
        return -code error "Sorry, zero height!"
      }
      set topDot [$self uppermostDot -gravity]
      set botDot [$self lowermostDot -gravity]
      set midY [expr {([$topDot cget -y] + [$botDot cget -y]) / 2}]
      #
      if {[$nearDot cget -y] > $midY} then {
        set farDot $topDot
      } else {
        set farDot $botDot
      }
    }
    default {
      set farDot [$self farmostDot -selected -gravity]
    }
  }
  if {[$farDot cget -x] == [$nearDot cget -x]} then {
    set mode vertical
  } elseif {[$farDot cget -y] == [$nearDot cget -y]} then {
    set mode horizontal
  }
  $self pointerToDot $nearDot
  $self memory currentDot $nearDot
  $farDot show
  #
  $self memory before [$self undoRedoCode]
  #
  set farXY [$farDot storeXY info]
  set nearXY [$nearDot storeXY info]
  #
  after idle [list bind $canvas <Motion>\
      [subst -nocommand {$self scaleSelection\
          [$self canvasx %x] [$self canvasy %y]\
          $farXY $nearXY $mode}]]
  $self basicBindings off
  $self statusLine Scale objects $mode
  bind $canvas <<Click>> "
    $self finishTransform
    $farDot show no
    "
  $canvas configure -cursor crosshair
}

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