mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/tk/tcltklib.c: enforce thread-check and exception-handling to
avoid SEGV trouble. * ext/tk/tkutil/tkutil.c; fix a bug on converting a SJIS string array to a Tcl's list string. * ext/tk/tcltklib.c: wrap Tcl's original "namespace" command to protect from namespace crash. * ext/tk/lib/multi-tk.rb: enforce exception-handling. * ext/tk/lib/multi-tk.rb: catch IRB_EXIT to work on irb. * ext/tk/lib/tk.rb: ditto. * ext/tk/tcltklib.c: add TclTkLib.mainloop_thread? * ext/tk/lib/multi-tk.rb: (bug fix) callback returns a value. * ext/tk/lib/tk/canvas.rb (delete): bug fix when multiple arguments. * ext/tk/lib/clock.rb: fix 'no method error'. * ext/tk/lib/clock.rb (self.clicks): accept a Symbol argument. * ext/tk/lib/variable.rb: be able to set default_value_type; :numeric, :bool, :string, :symbol, :list, :numlist or nil (default; same to :string). If set a type, TkVariable#value returns a value of the type. * ext/tk/lib/tkextlib/tclx/tclx.rb: add Tk::TclX.signal to warn the risk of using TclX extension's 'signal' command. * ext/tk/sample/irbtk.rb: irb with Ruby/Tk. * ext/tk/sample/demos-*/anilabel.rb: bug fix on 'show code' * ext/tk/sample/demos-*/aniwave.rb: new Ruby/Tk animation demo. * ext/tk/sample/demos-*/pendulum.rb: ditto. * ext/tk/sample/demos-*/goldberg.rb: ditto. * ext/tk/sample/demos-*/widget: add entries of animation demos. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8046 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
16771ba23c
commit
3124427ccb
24 changed files with 7685 additions and 696 deletions
115
ext/tk/sample/demos-en/aniwave.rb
Normal file
115
ext/tk/sample/demos-en/aniwave.rb
Normal file
|
@ -0,0 +1,115 @@
|
|||
#
|
||||
# animated wave demo (called by 'widget')
|
||||
#
|
||||
# based on Tcl/Tk8.5a2 widget demos
|
||||
|
||||
# destroy toplevel widget for this demo script
|
||||
if defined?($aniwave_demo) && $aniwave_demo
|
||||
$aniwave_demo.destroy
|
||||
$aniwave_demo = nil
|
||||
end
|
||||
|
||||
# create toplevel widget
|
||||
$aniwave_demo = TkToplevel.new {|w|
|
||||
title("Animated Wave Demonstration")
|
||||
iconname("aniwave")
|
||||
positionWindow(w)
|
||||
}
|
||||
|
||||
# create label
|
||||
msg = TkLabel.new($aniwave_demo) {
|
||||
font $font
|
||||
wraplength '4i'
|
||||
justify 'left'
|
||||
text 'This demonstration contains a canvas widget with a line item inside it. The animation routines work by adjusting the coordinates list of the line.'
|
||||
}
|
||||
msg.pack('side'=>'top')
|
||||
|
||||
# create frame
|
||||
TkFrame.new($aniwave_demo) {|frame|
|
||||
TkButton.new(frame) {
|
||||
text 'Dismiss'
|
||||
command proc{
|
||||
tmppath = $aniwave_demo
|
||||
$aniwave_demo = nil
|
||||
tmppath.destroy
|
||||
}
|
||||
}.pack('side'=>'left', 'expand'=>'yes')
|
||||
|
||||
TkButton.new(frame) {
|
||||
text 'See Code'
|
||||
command proc{showCode 'aniwave'}
|
||||
}.pack('side'=>'left', 'expand'=>'yes')
|
||||
|
||||
}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m')
|
||||
|
||||
# animated wave
|
||||
class AnimatedWaveDemo
|
||||
def initialize(frame, dir=:left)
|
||||
@direction = dir
|
||||
|
||||
# create canvas widget
|
||||
@c = TkCanvas.new(frame, :width=>300, :height=>200,
|
||||
:background=>'black')
|
||||
@c.pack(:padx=>10, :pady=>10, :expand=>true)
|
||||
|
||||
# Creates a coordinates list of a wave.
|
||||
@waveCoords = []
|
||||
@backupCoords = []
|
||||
n = 0
|
||||
(-10..300).step(5){|n| @waveCoords << [n, 100]; @backupCoords << [n, 100] }
|
||||
@waveCoords << [n, 0]; @backupCoords << [n, 0]
|
||||
@waveCoords << [n+5, 200]; @backupCoords << [n+5, 200]
|
||||
@coordsLen = @waveCoords.length
|
||||
|
||||
# Create a smoothed line and arrange for its coordinates to be the
|
||||
# contents of the variable waveCoords.
|
||||
@line = TkcLine.new(@c, @waveCoords,
|
||||
:width=>1, :fill=>'green', :smooth=>true)
|
||||
|
||||
# Main animation "loop".
|
||||
# Theoretically 100 frames-per-second (==10ms between frames)
|
||||
@timer = TkTimer.new(10){ basicMotion; reverser }
|
||||
|
||||
# Arrange for the animation loop to stop when the canvas is deleted
|
||||
@c.bindtags_unshift(TkBindTag.new('Destroy'){ @timer.stop })
|
||||
end
|
||||
|
||||
# Basic motion handler. Given what direction the wave is travelling
|
||||
# in, it advances the y coordinates in the coordinate-list one step in
|
||||
# that direction.
|
||||
def basicMotion
|
||||
@backupCoords, @waveCoords = @waveCoords, @backupCoords
|
||||
(0...@coordsLen).each{|idx|
|
||||
if @direction == :left
|
||||
@waveCoords[idx][1] = @backupCoords[(idx+1 == @coordsLen)? 0: idx+1][1]
|
||||
else
|
||||
@waveCoords[idx][1] = @backupCoords[(idx == 0)? -1: idx-1][1]
|
||||
end
|
||||
}
|
||||
@line.coords(@waveCoords)
|
||||
end
|
||||
|
||||
# Oscillation handler. This detects whether to reverse the direction
|
||||
# of the wave by checking to see if the peak of the wave has moved off
|
||||
# the screen (whose size we know already.)
|
||||
def reverser
|
||||
if @waveCoords[0][1] < 10
|
||||
@direction = :right
|
||||
elsif @waveCoords[-1][1] < 10
|
||||
@direction = :left
|
||||
end
|
||||
end
|
||||
|
||||
# animation control
|
||||
def move
|
||||
@timer.start
|
||||
end
|
||||
|
||||
def stop
|
||||
@timer.stop
|
||||
end
|
||||
end
|
||||
|
||||
# Start the animation processing
|
||||
AnimatedWaveDemo.new($aniwave_demo, :left).move
|
Loading…
Add table
Add a link
Reference in a new issue