All pastes #773761 Raw Edit

dynpw

public text v1 · immutable
·published 2007-11-14 19:30 UTC
rendered paste body
/*
DYNAMIC PICWIN
*/
alias math.PI { 
  return 3.1415926535897932384626433832795
}
alias -l dynpw {
  if ($isid) { 
    return $iif($2 != $null,$hget(dynpw,$+($1,.,$2)),$hget(dynpw,$+($1,.DYNPW_LAYER)))
  }
  if ($3 != $null) { 
    hadd -m dynpw $+($1,.,$2) $3-
  }
  else {
    hadd -m dynpw $1-
  }
}
alias -l dynpwDel { 
  hdel dynpw $+($1,.,$2)
}
alias  dynpwCircle {
  ;(rad,ainc,a,enda,speed,slant)
  var %rad = $2
  var %ainc = $3
  var %a = $4
  var %enda = $5
  var %speed = $6
  var %slant = $7
  if (%slant == %null) var  %slant = 0
  dynpw $1 rad %rad
  dynpw $1 ainc  %ainc
  dynpw $1 a  %a
  dynpw $1 b  $calc(%slant * $Math.PI / 180)
  dynpw $1 u  $calc(%rad * $cos($calc(%a * $Math.PI / 180)))
  dynpw $1 v  $calc(%rad * $sin($calc(%a * $Math.PI / 180)))
  dynpw $1 enda  %enda
  dynpw $1 speed  %speed
  startCircle $1
}

alias -l startCircle {
  if (!$dynpw($1,Cactive)) {
    ;   if (this.cx!=null && this.cy!=null) { this.xc=this.cx - (this.u*Math.cos(this.b) - this.v*Math.sin(this.b)) 
    ;     this.yc=this.cy + (this.u*Math.sin(this.a) + this.v*Math.cos(this.b))
    ;     this.a = this.LastAngle?this.LastAngle:this.a 
    ;   }
    ;   else {
    dynpw $1 xc $calc($dynpw($1,x) - ($dynpw($1,u) * $cos($dynpw($1,b)) - $dynpw($1,v) * $sin($dynpw($1,b))))
    dynpw $1 yc $calc($dynpw($1,y) + ($dynpw($1,u) * $sin($dynpw($1,a)) + $dynpw($1,v) * $cos($dynpw($1,b))))
    ;  }
    if ($dynpw($1,enda) != $null) {
      dynpw $1 ainc $abs($dynpw($1,ainc))
      if ($dynpw($1,enda) < $dynpw($1,a))  dynpw $1 ainc $calc($dynpw($1,ainc) * -1)
    }
    dynpw $1 Cactive $true
  }
  if ($abs($dynpw($1,ainc)) < $abs($calc($dynpw($1,enda) - $dynpw($1,a))) ) {
    dynpw $1 a $calc($dynpw($1,a) + $dynpw($1,ainc))
    dynpw $1 u  $calc($dynpw($1,rad) * $cos($calc($dynpw($1,a) * $Math.PI / 180)))
    dynpw $1 v  $calc($dynpw($1,rad) * $sin($calc($dynpw($1,a) * $Math.PI / 180)))
    var %x = $calc($dynpw($1,xc) + ($dynpw($1,u) * $cos($dynpw($1,b)) - $dynpw($1,v) * $sin($dynpw($1,b)))) 
    var %y = $calc($dynpw($1,yc) -  ($dynpw($1,u) * $sin($dynpw($1,b)) + $dynpw($1,v) * $cos($dynpw($1,b))))
    dynpwmoveTo $1 %x %y 
    ;    if (this.onCircle) this.onCircle()
    .timer -h 1 $dynpw($1,speed) startcircle $1
    ; ID=setTimeout(this.obj + ".startCircle()",this.speed)
  }
  else { 
    if ($dynpw($1,enda) != $null) { 
      dynpw $1 u  $calc($dynpw($1,rad) * $cos($calc($dynpw($1,enda) * $Math.PI / 180)))
      dynpw $1 v  $calc($dynpw($1,rad) * $sin($calc($dynpw($1,enda) * $Math.PI / 180)))
      var %x  $calc($dynpw($1,xc) + ($dynpw($1,u) * $cos($dynpw($1,b)) - $dynpw($1,v) * $sin($dynpw($1,b))))
      var %y  $calc($dynpw($1,yc) -  ($dynpw($1,u) * $sin($dynpw($1,b)) + $dynpw($1,v) * $cos($dynpw($1,b))))
      ; LastAngle = this.enda
      dynpwmoveTo $1 %x %y
    }
    dynpwdel $1 rad 
    dynpwdel $1 ainc 
    dynpwdel $1 a 
    dynpwdel $1 b 
    dynpwdel $1 u  
    dynpwdel $1 v  
    dynpwdel $1 enda  
    dynpwdel $1 speed  
    dynpwdel $1 Cactive 
    ; if (this.onCircleStop) { 
    ;   this.onCircleStop()
    ; }
  }
}
alias -l dynpwSlide {
  ;(endx,endy,inc,speed)
  var %endx = $2
  var %endy = $3
  var %inc = $4
  var %speed = $5
  if (!$dynpw($1,slideActive)) {
    var %distx = $calc($2 - $dynpw($1,x))
    var %disty = $calc($3 - $dynpw($1,y))
    var %num = $calc($sqrt($calc((%distx ^ 2) + (%disty ^ 2))) / %inc)
    if (%num == 0) { return }
    var %dx = $calc(%distx / %num)
    var %dy = $calc(%disty / %num)
    dynpw $1 slideActive  $true
    dynpwSlideStart $1 %dx %dy %endx %endy %num 1 %speed

  }
}

alias -l dynpwSlideStart {
  ; function(dx,dy,endx,endy,num,i,speed) {
  var %dx = $2
  var %dy = $3
  var %endx = $4
  var %endy = $5
  var %num = $6
  var %i = $7
  var %speed = $8
  if (!$dynpw($1,slideActive)) { return }
  if (%i < %num) { 
    inc %i 
    dynpwmoveTo $1 $calc($getLayer($1).x + %dx) $calc($getLayer($1).y + %dy)
    .timer -h 1 %speed dynpwslidestart $1 %dx %dy %endx %endy %num %i %speed
  }
  else { 
    dynpwmoveTo $1 %endx %endy
    dynpw $1 slideActive $false

    if ($dynpw($1,onSlideStop) != $null ) { 
      $dynpw($1,onSlideStop) $1

    }
  }
}
alias -l dynpwmoveTo { 
  if (!$dynpw($1)) { return }
  if ($dynpw($1,type) ) { 
    drawrect -f $gettok($1,1,46) 1 1 $dynpw($1,x) $dynpw($1,y) $dynpw($1,w) $dynpw($1,h)
    $dynpw($1,type) $2 $3 $dynpw($1,w) $dynpw($1,h)
    dynpw $1 x $2 
    dynpw $1 y $3
    redrawdynpw $gettok($1,1,46)

    return
  }
  dynpw $1 x $2 
  dynpw $1 y $3

}
alias -l dynpwsetDim { 
  if (!$dynpw($1)) { return }
  if ($dynpw($1,type)) { 
    drawrect -f 0 $gettok($1,1,46) 1 $dynpw($1,x) $dynpw($1,y) $dynpw($1,w) $dynpw($1,h)
    $dynpw($1,type) $dynpw($1,x) $dynpw($1,y) $2 $3
  }
  dynpw $1 w $2 
  dynpw $1 h $3

}
alias  redrawdynpw { 
  var %__i = 1
  while ($hfind(dynpw,$+($1,.,*,.DYNPW_LAYER),%__i,w)) { 
    var %layer = $gettok($ifmatch,1-2,46)
    $dynpw(%layer,type) $dynpw(%layer,x) $dynpw(%layer,y) $dynpw(%layer,w) $dynpw(%layer,h)
    var %__j = 1
    while ($dynpw(%layer,$+(layer.,%__j))) { 
      tokenize 32 $ifmatch
      $1-5  $calc($dynpw(%layer,x) + 2) $calc($dynpw(%layer,y) + 2) $6
      inc %__j
    }
    inc %__i
  }
}
alias getLayer { 
  if (!$dynpw($+($1,.,$2),DYNPW_LAYER) && !$dynpw($1,DYNPW_LAYER)) { echo -s  Error : getLayer :  window $1 doesn't have a layer $2 | return }
  if (!$prop) { return $dynpw($+($1,.,$2,DYNPW_LAYER)) }
  if (!$dynpw($1,DYNPW_LAYER)) {
    var %layer = $+($1,.,$2)
  }
  else { var %layer = $1  }
  var %prop = $gettok($prop,1,40)
  if (%prop == moveTo)  {
    tokenize 44 $remove($gettok($prop,2,40),$chr(41))
    dynpwmoveTo %layer $1 $2
  }
  else if (%prop == setDim) { 
    tokenize 44 $remove($gettok($prop,2,40),$chr(41))
    dynpwsetDim %layer $1 $2
  }
  else if (%prop == x) { return $dynpw(%layer,x) }
  else if (%prop == y) { return $dynpw(%layer,y) }
  else if (%prop == w) { return $dynpw(%layer,w) }
  else if (%prop == h) { return $dynpw(%layer,h) }
  else if (%prop == moveBy) {
    tokenize 44 $remove($gettok($prop,2,40),$chr(41))
    dynpwmoveTo %layer $calc($dynpw(%layer,x) + $1) $calc($dynpw(%layer,y) + $2)
  }
  else if (%prop == Slide) { 
    tokenize 44 $remove($gettok($prop,2,40),$chr(41))
    dynpwslide %layer $1-
  }
  else if (%prop == setOnClick) { 
    return hadd dynpw $+(%layer,.onClick)
  }
  else if (%prop == setOnSlideStop) { 
    return hadd dynpw $+(%layer,.onSlideStop)
  }
  elseif (%prop == onClick()) { 
    $dynpw(%layer,onClick)
  }
  else if (%prop == circle) { 
    tokenize 44 $remove($gettok($prop,2,40),$chr(41))
    dynpwcircle %layer $1-
  }
  else if (%prop == makeDragable) { 
    dynpw %layer drag $true
    dynpw %layer onClick dynpw.startDrag %layer 
  }
  else if (%prop == noDrag) {
    dynpwdel %layer drag
    dynpw %layer onClick .
  }
  else if (%prop == write) { 
    tokenize 44 $remove($gettok($prop,2,40),$chr(41))
    var %j = 1
    while ($dynpw(%layer,$+(layer.,%j))) { 
      inc %j
    }
    dynpw %layer $+(layer.,%j) drawtext $gettok(%layer,1,46) $2 $3 $4 $1
    return drawtext $gettok(%layer,1,46) $2 $3 $4 $calc($dynpw(%layer,x) + 1) $calc($dynpw(%layer,y) + 1) $1
  }
}
alias dynpw.startDrag {
  dynpw $1 dsx $calc($mouse.x - $dynpw($1,x))
  dynpw $1 dsy $calc($mouse.y - $dynpw($1,y))
  dynpw $1 dragging $true
}
alias dynpw.checkOnClick { 
  var %i = 1
  var %zIndex
  while ($hfind(dynpw,$+($active,.,*onClick),%i,w) != $null) { 
    var %layer = $gettok($ifmatch,1-2,46)
    var %ifmatch = $ifmatch

    if ($gettok($ifmatch,1,46 == $1)) { 
      var %x = $dynpw(%layer,x)
      var %y = $dynpw(%layer,y)
      var %w = $dynpw(%layer,w)
      var %h = $dynpw(%layer,h)
      if ($inrect($2,$3,%x,%y,%w,%h)) { 
        var %zIndex = $hget(dynpw,%ifmatch)

      }
    }
    inc %i
  }
  %zIndex
}
alias createElement { 
  if ($hget(dynpw,$+($1,.,$2,.DYNPW_LAYER)) || $regex($2,/[1-9 a-z A-Z]/g) != $len($2)) { 
    echo  -s * /createElement : Name Invailed or already an object
  }
  else { 
    dynpw $+($1,.,$2) DYNPW_LAYER $+($1,.,$2)
    dynpw $+($1,.,$2) type $iif($left($4,1) == -,$3-7,$3-6)
    $3-
    var %layer = $+($1,.,$2)
    if ($3 != drawrect) { echo -s * /createElement: Only drawrect is supported at this time | return }
    if ($left($4,1) == -) { tokenize 32 $8- }
    else { tokenize 32 $7- }
    dynpw %layer x $1 
    dynpw %layer y $2
    dynpw %layer w $3 
    dynpw %layer h $4
  }
}
alias dynpw.checkDrag { 
  var %i = 1
  while ($hfind(dynpw,*drag,%i,w) != $null) { 
    var %layer = $gettok($ifmatch,1-2,46)
    var %ifmatch = $ifmatch
    if ($gettok($ifmatch,1,46 == $1) && $dynpw(%layer,dragging)) { 
      var %x = $dynpw(%layer,dsx)
      var %y = $dynpw(%layer,dsy)
      dynpwmoveTo %layer $calc($mouse.x - %x) $calc($mouse.y - %y)
    }
    inc %i
  }
}

alias dynpw.checkOnMouseUp {
  var %i = 1
  while ($hfind(dynpw,*drag,%i,w) != $null) { 
    var %layer = $gettok($ifmatch,1-2,46)
    var %ifmatch = $ifmatch
    if ($gettok($ifmatch,1,46 == $1) && $dynpw(%layer,dragging)) { 
      dynpw %layer dragging $false
      break
    }
    inc %i
  }
}
alias removeElement { 
  if ($window($1) && $2) { 
    drawrect -f $1 1 1 $dynpw($+($1,.,$2),x) $dynpw($+($1,.,$2),y) $dynpw($+($1,.,$2),w) $dynpw($+($1,.,$2),h)
  }
  var %i = 1
  while ($hfind(dynpw,$+($1,.,$2,*),%i,w)) { 
    hdel dynpw $ifmatch
    inc %i
  }
  if ($hfind(dynpw,$+($1,.,$2,*),0,w) > 0) {
    .timer -h 1 0 removeelement $1 $2
  }
}
alias circleIt { 
  $getLayer($1,test).circle(100,5,0,180,20)
  $getLayer($1,test).setOnSlideStop $null
}
alias circleIt2 { 
  $getLayer($1,test2).circle(100,5,0,720,20)
  $getLayer($1,test).setOnSlideStop $null
}
menu @dynpw { 
  sclick {
    $dynpw.checkOnClick($active,$mouse.x,$mouse.y)
  }
  uclick {
    $dynpw.checkOnMouseUp($active)
  }
  mouse {
    dynpw.checkDrag $active $mouse.x $mouse.y
  }
  TEST 1 = WHITE | TEST 2 = RED {
  }
  -
  SLIDE
  -
  slide test 1 to 50 50 : { 
    $getLayer($active,test).slide(50,50,5,10)
  }
  slide test 1 to 500 0 : { 
    $getLayer($active,test).slide(500,0,5,10)
  }
  slide test 2 to 0 0 : {
    $getLayer($active,test2).slide(0,0,5,10)
  }
  slide test 2 to 500 0: { 
    $getLayer($active,test2).slide(500,0,5,10)
  }
  slide test 1 to 100 100 and slide test 2 to 400 200 : { 
    $getLayer($active,test).slide(100,100,5,10)
    $getLayer($active,test2).slide(400,200,5,10)
  }
  -
  onSlideStop CIRCLE
  -
  slide test 1 to 400 200 then circle it 180° at a raduis of 100 : {
    $getLayer($active,test).slide(400,200,5,10)
    $getLayer($active,test).setOnSlideStop circleIt
  }
  slide test 2 to 450 250 then make 2 complete circles : { 
    $getLayer($active,test2).slide(450,250,5,10)
    $getLayer($active,test2).setOnSlideStop circleIt2
  }   
  -
  DRAG METHOD
  -
  make test 1 dragable {
    $getLayer($active,test).makeDragable
  }
  make test 1 not dragable {
    $getLayer($active,test).noDrag
  }

}
alias dynpw.test { 
  window -p @dynpw
  createElement @dynpw test drawrect -f @dynpw 0 1 0 0 100 100
  $getLayer(@dynpw,test).setOnClick echo -s **** clicked test layer
  createElement @dynpw test2 drawrect -f @dynpw 4 1 100 100 20 20
  $getLayer(@dynpw,test2).setOnClick echo -s **** clicked test2 layer
}
alias dynpw.switchbar { 
  if (!$window(switchbar)) { 
    window -p @switchbar
    createElement @switchbar status drawrect -f @switchbar 0 1 0 -20 50 20
    $getLayer(@switchbar,status).write(Status,1,tomaha,15)
    $getLayer(@switchbar,status).slide(0,0,5,15)
  }
}
on *:CLOSE:@dynpw*: {
  removeelement @dynpw
}
on *:CLOSE:@switchbar: {
  removeelement @switchbar
}