/* 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 }