summaryrefslogtreecommitdiff
path: root/ext/tk/sample/demos-en/square
blob: 00bfde59ff65e922fcf1dab9b9b42fdb9e2b5431 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/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
    begin
      tk_call 'square', path
    rescue
      STDERR.print "\nSorry. Your Tk interpreter does not contain " +
	'a "square" demonstration widget.' + 
	"\n ( See documents included the Tcl/Tk source archive. )\n\n"
      exit
    end
  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