ruby--ruby/ext/tk/sample/demos-en/square

75 lines
1.4 KiB
Ruby

#!/usr/bin/env ruby
# square --
# This script generates a demo application containing only
# a "square" widget. It's only usable if Tk has been compiled
# with tkSquare.c and with the -DSQUARE_DEMO compiler switch.
# This demo arranges the following bindings for the widget:
#
# Button-1 press/drag: moves square to mouse
# "a": toggle size animation on/off
#
require 'tk'
require 'tkafter'
class TkSquare<TkWindow
def create_self
tk_call 'square', path
end
def size(amount=nil)
if amount
tk_send 'size', amount
else
number(tk_send 'size')
end
end
def position(x,y)
tk_send 'position', x, y
end
end
$s = TkSquare.new{
pack('expand'=>'yes', 'fill'=>'both')
bind('1', proc{|x,y| center(x,y)}, '%s %y')
bind('B1-Motion', proc{|x,y| center(x,y)}, '%s %y')
bind('a', proc{animate})
focus
}
TkRoot.new.minsize(1,1)
# The procedure below centers the square on a given position.
def center(x,y)
a = $s.size
$s.position(x-(a/2), y-(a/2))
end
# The procedures below provide a simple form of animation where
# the box changes size in a pulsing pattern: larger, smaller, larger,
# and so on.
$inc = 0
def timer_proc
a = $s.size
return if $inc == 0
$inc = -3 if a >= 40
$inc = 3 if a <= 10
$s.size(a+$inc)
end
$timer = TkAfter.new(30, -1, proc{timer_proc})
def animate
if $inc == 0
$inc = 3
$timer.start
else
$inc = 0
$timer.stop
end
end
Tk.mainloop