mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
a25fbe3b3e
* parse.y: encoding aware parsing. * parse.y (pragma_encoding): encoding specification pragma. * parse.y (rb_intern3): encoding specified symbols. * string.c (rb_str_length): length based on characters. for older behavior, bytesize method added. * string.c (rb_str_index_m): index based on characters. rindex as well. * string.c (succ_char): encoding aware succeeding string. * string.c (rb_str_reverse): reverse based on characters. * string.c (rb_str_inspect): encoding aware string description. * string.c (rb_str_upcase_bang): encoding aware case conversion. downcase, capitalize, swapcase as well. * string.c (rb_str_tr_bang): tr based on characters. delete, squeeze, tr_s, count as well. * string.c (rb_str_split_m): split based on characters. * string.c (rb_str_each_line): encoding aware each_line. * string.c (rb_str_each_char): added. iteration based on characters. * string.c (rb_str_strip_bang): encoding aware whitespace stripping. lstrip, rstrip as well. * string.c (rb_str_justify): encoding aware justifying (ljust, rjust, center). * string.c (str_encoding): get encoding attribute from a string. * re.c (rb_reg_initialize): encoding aware regular expression * sprintf.c (rb_str_format): formatting (i.e. length count) based on characters. * io.c (rb_io_getc): getc to return one-character string. for older behavior, getbyte method added. * ext/stringio/stringio.c (strio_getc): ditto. * io.c (rb_io_ungetc): allow pushing arbitrary string at the current reading point. * ext/stringio/stringio.c (strio_ungetc): ditto. * ext/strscan/strscan.c: encoding support. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13261 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
117 lines
3.2 KiB
Ruby
117 lines
3.2 KiB
Ruby
# -*- coding: euc-jp -*-
|
|
#
|
|
# 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 'このデモでは、ラインアイテムが一つだけ描かれたキャンバスウィジェットが表示されています。アニメーション処理は、そのラインアイテムの座標値を変更することで実現しています。'
|
|
}
|
|
msg.pack('side'=>'top')
|
|
|
|
# create frame
|
|
TkFrame.new($aniwave_demo) {|frame|
|
|
TkButton.new(frame) {
|
|
#text '了解'
|
|
text '閉じる'
|
|
command proc{
|
|
tmppath = $aniwave_demo
|
|
$aniwave_demo = nil
|
|
tmppath.destroy
|
|
}
|
|
}.pack('side'=>'left', 'expand'=>'yes')
|
|
|
|
TkButton.new(frame) {
|
|
text 'コード参照'
|
|
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
|