2011-09-14 17:25:37 +00:00
# -*- coding: utf-8 -*-
2015-12-16 05:31:54 +00:00
# frozen_string_literal: false
2005-03-02 07:06:52 +00:00
#
# Ruby/Tk Goldverg demo (called by 'widget')
#
# Based on Tcl/Tk8.5a2 widget demos.
# The following is the original comment of TkGoldberg.tcl.
#
#>>##+#################################################################
#>>#
#>># TkGoldberg.tcl
#>># by Keith Vetter, March 13, 2003
#>>#
#>># "Man will always find a difficult means to perform a simple task"
#>># Rube Goldberg
#>>#
#>># Reproduced here with permission.
#>>#
#>>##+#################################################################
#>>#
#>># Keith Vetter 2003-03-21: this started out as a simple little program
#>># but was so much fun that it grew and grew. So I apologize about the
#>># size but I just couldn't resist sharing it.
#>>#
#>># This is a whizzlet that does a Rube Goldberg type animation, the
#>># design of which comes from an New Years e-card from IncrediMail.
#>># That version had nice sound effects which I eschewed. On the other
#>># hand, that version was in black and white (actually dark blue and
#>># light blue) and this one is fully colorized.
#>>#
#>># One thing I learned from this project is that drawing filled complex
#>># objects on a canvas is really hard. More often than not I had to
#>># draw each item twice--once with the desired fill color but no
#>># outline, and once with no fill but with the outline. Another trick
#>># is erasing by drawing with the background color. Having a flood fill
#>># command would have been extremely helpful.
#>>#
#>># Two wiki pages were extremely helpful: Drawing rounded rectangles
#>># which I generalized into Drawing rounded polygons, and regular
#>># polygons which allowed me to convert ovals and arcs into polygons
#>># which could then be rotated (see Canvas Rotation). I also wrote
#>># Named Colors to aid in the color selection.
#>>#
#>># I could comment on the code, but it's just 26 state machines with
#>># lots of canvas create and move calls.
if defined? ( $goldberg_demo ) && $goldberg_demo
2009-03-06 03:56:38 +00:00
$goldberg_demo . destroy
2005-03-02 07:06:52 +00:00
$goldberg_demo = nil
end
# demo toplevel widget
$goldberg_demo = TkToplevel . new { | w |
title ( " Tk Goldberg (demonstration) " )
iconname ( " goldberg " )
# positionWindow(w)
}
* ext/tk/tcltklib.c: SEGV when tcltk-stubs is enabled.
* ext/tk/tcltklib.c: avoid error on a shared object.
* ext/tk/extconf.rb: support --with-tcltkversion
* ext/tk/README.tcltklib: add document about --with-tcltkversion
* ext/tk/lib/tk.rb, ext/tk/lib/multi-tk.rb, ext/tk/lib/remote-tk.rb:
not work on $SAFE==4
* ext/tk/lib/multi-tk.rb: Object#methods returns Symbols on Ruby1.9.
* ext/tk/lib/tk/timer.rb: add TkTimer#at_end(proc) to register the
procedure which called at end of the timer.
* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemfont.rb, ext/tk/lib/font.rb:
support __IGNORE_UNKNOWN_CONFIGURE_OPTION__ about font options.
* ext/tk/lib/*: treat __IGNORE_UNKNOWN_CONFIGURE_OPTION__
* ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb,
ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb,
ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb: bug fix.
* ext/tk/lib/tk/text.rb: typo. call a wrong method.
* ext/tk/lib/tk/itemconfig.rb: ditto.
* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemconfig.rb,
ext/tk/lib/tk/canvas.rb: support alias names of option keys.
* ext/tk/lib/tk/grid.rb: lack of module-method definitions.
* ext/tk/lib/tk/pack.rb, ext/tk/lib/tk/grid.rb: increase supported
parameter patterns of configure method.
* ext/tk/lib/tk.rb: add TkWindow#grid_anchor, grid_column, grid_row.
* ext/tk/lib/tk/wm.rb: methods of Tk::Wm_for_General module cannot
pass the given block to methods of Tk::Wm module.
* ext/tk/lib/tk/wm.rb: Wm#overrideredirect overwrites arguemnt to
an invalid value.
* ext/tk/lib/tk.rb: fix memory (object) leak bug.
* ext/tk/tcltklib.c, ext/tk/tkutil/tkutil.c: fix memory leak.
* ext/tk/sample/demos-jp/aniwave.rb, ext/tk/sample/demos-en/aniwave.rb:
bug fix.
* ext/tk/lib/tkextlib/blt/component.rb,
ext/tk/lib/tkextlib/tile/tentry.rb,
ext/tk/lib/tkextlib/tile/treeview.rb: ditto.
* ext/tk/lib/tkextlib/tile/tpaned.rb: improve TPaned#add.
* ext/tk/sample/demos-jp/widget, ext/tk/sample/demos-en/widget,
ext/tk/sample/demos-jp/style.rb, ext/tk/sample/demos-en/style.rb,
ext/tk/sample/demos-jp/bind.rb, ext/tk/sample/demos-en/bind.rb:
bug fix.
* ext/tk/sample/ttk_wrapper.rb: ditto.
* ext/tk/sample/ttk_wrapper.rb: support "if __FILE__ == $0" idiom.
* ext/tk/sample/tktextio.rb: add binding for 'Ctrl-u' at console mode.
* ext/tk/lib/tkextlib/tile.rb, ext/tk/lib/tkextlib/tile/style.rb,
ext/tk/sample/ttk_wrapper.rb: improve treating and control themes.
add Tk::Tile.themes and Tk::Tile.set_theme(theme).
* ext/tk/lib/tkextlib/tile.rb: lack of autoload definitions.
* ext/tk/lib/tkextlib/tile/tnotebook.rb: cannot use kanji (not UTF-8)
characters for headings.
* ext/tk/lib/tkextlib/tkDND/shape.rb: wrong package name.
* ext/tk/tkutil/tkutil.c: improve handling callback-subst-keys.
Now, support longnam-keys (e.g. '%CTT' on tkdnd-2.0; however, still
not support tkdnd-2.0 on tkextlib), and symbols of parameters (e.g.
:widget=>'%W', :keycode=>'%k', '%x'=>:x, '%X'=>:root_x, and so on;
those are attributes of event object). It means that Ruby/Tk accepts
not only "widget.bind(ev, '%W', '%k', ...){|w, k, ...| ... }", but
also "widget.bind(ev, :widget, :keycode, ...){|w, k, ...| ... }".
It is potentially incompatible, when user passes symbols to the
arguments of the callback block (the block receives the symbols as
strings). I think that is very rare case (probably, used by Ruby/Tk
experts only). When causes such trouble, please give strings instead
of such symbol parameters (e.g. call Symbol#to_s method).
* ext/tk/lib/tk/event.rb, ext/tk/lib/tk/validation.rb,
ext/tk/lib/tkextlib/blt/treeview.rb,
ext/tk/lib/tkextlib/winico/winico.rb: ditto.
* ext/tk/tkutil/tkutil.c: strings are available on subst_tables on
TkUtil::CallbackSubst class (it is useful on Ruby 1.9).
* ext/tk/lib/tk/spinbox.rb, ext/tk/lib/tkextlib/iwidgets/hierarchy.rb,
ext/tk/lib/tkextlib/iwidgets/spinner.rb,
ext/tk/lib/tkextlib/iwidgets/entryfield.rb,
ext/tk/lib/tkextlib/iwidgets/calendar.rb,
ext/tk/lib/tkextlib/blt/dragdrop.rb,
ext/tk/lib/tkextlib/tkDND/tkdnd.rb,
ext/tk/lib/tkextlib/treectrl/tktreectrl.rb,
ext/tk/lib/tkextlib/tktable/tktable.rb: disable code piece became
unnecessary by reason of the changes of ext/tk/tkutil/tkutil.c.
* ext/tk/lib/tk.rb, ext/tk/lib/multi-tk.rb: change strategy to define
the constant WITH_ENCODING.
* ext/tk/lib/tk.rb: fix bug on Tk::Encoding.tk_encoding_names.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17083 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-10 20:59:10 +00:00
base_frame = TkFrame . new ( $goldberg_demo ) . pack ( :fill = > :both , :expand = > true )
2005-04-07 16:53:56 +00:00
= begin
2005-03-02 07:06:52 +00:00
# label
msg = TkLabel . new ( $goldberg_demo ) {
font 'Arial 10'
wraplength '4i'
justify 'left'
2011-09-14 17:25:37 +00:00
text " これは、あなたが自分のアニメーションをいかに入り組んだものにできるかを示すというだけのためのデモです。ボールをクリックすれば物が動き始めます! \n \n \" Man will always find a difficult means to perform a simple task \" \n - Rube Goldberg "
2005-03-02 07:06:52 +00:00
}
msg . pack ( 'side' = > 'top' )
2005-04-07 16:53:56 +00:00
= end
2005-03-02 07:06:52 +00:00
2005-04-07 16:53:56 +00:00
= begin
2005-03-02 07:06:52 +00:00
# frame
TkFrame . new ( $goldberg_demo ) { | frame |
TkButton . new ( frame ) {
2011-09-14 17:25:37 +00:00
text '閉じる'
2005-03-02 07:06:52 +00:00
command proc {
tmppath = $goldberg_demo
$goldberg_demo = nil
tmppath . destroy
}
} . pack ( 'side' = > 'left' , 'expand' = > 'yes' )
TkButton . new ( frame ) {
2011-09-14 17:25:37 +00:00
text 'コード参照'
2005-03-02 07:06:52 +00:00
command proc { showCode 'goldberg' }
} . pack ( 'side' = > 'left' , 'expand' = > 'yes' )
} . pack ( 'side' = > 'bottom' , 'fill' = > 'x' , 'pady' = > '2m' )
2005-04-07 16:53:56 +00:00
= end
2005-03-02 07:06:52 +00:00
#########################################
class TkGoldberg_Demo
def initialize ( parent )
@parent = parent
@S = { }
@S [ 'title' ] = 'Tk Goldberg'
@S [ 'speed' ] = TkVariable . new ( 5 )
@S [ 'cnt' ] = TkVariable . new ( 0 )
# @S['message'] = TkVariable.new("\\nWelcome\\nto\\nRuby/Tk")
2011-09-14 17:25:37 +00:00
@S [ 'message' ] = TkVariable . new ( " \\ n ようこそ! \\ nRuby/Tk \\ nの \\ n世界へ " )
2005-03-02 07:06:52 +00:00
@S [ 'pause' ] = TkVariable . new
@S [ 'details' ] = TkVariable . new ( true )
2009-03-06 03:56:38 +00:00
@S [ 'mode' ] = TkVariable . new ( :MSTART , :symbol )
2005-03-02 07:06:52 +00:00
# :MSTART, :MGO, :MPAUSE, :MSSTEP, :MBSTEP, :MDONE, :MDEBUG
# 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
@speed = [ 1 , 10 , 20 , 50 , 80 , 100 , 150 , 200 , 300 , 400 , 500 ]
# colors
@C = { }
@C [ 'fg' ] = 'black'
# @C['bg'] = 'gray75'
@C [ 'bg' ] = 'cornflowerblue'
@C [ '0' ] = 'white' ; @C [ '1a' ] = 'darkgreen' ; @C [ '1b' ] = 'yellow'
@C [ '2' ] = 'red' ; @C [ '3a' ] = 'green' ; @C [ '3b' ] = 'darkblue'
@C [ '4' ] = @C [ 'fg' ] ; @C [ '5a' ] = 'brown' ; @C [ '5b' ] = 'white'
@C [ '6' ] = 'magenta' ; @C [ '7' ] = 'green' ; @C [ '8' ] = @C [ 'fg' ]
@C [ '9' ] = 'blue4' ; @C [ '10a' ] = 'white' ; @C [ '10b' ] = 'cyan'
@C [ '11a' ] = 'yellow' ; @C [ '11b' ] = 'mediumblue' ; @C [ '12' ] = 'tan2'
@C [ '13a' ] = 'yellow' ; @C [ '13b' ] = 'red' ; @C [ '14' ] = 'white'
@C [ '15a' ] = 'green' ; @C [ '15b' ] = 'yellow' ; @C [ '16' ] = 'gray65'
@C [ '17' ] = '#A65353' ; @C [ '18' ] = @C [ 'fg' ] ; @C [ '19' ] = 'gray50'
@C [ '20' ] = 'cyan' ; @C [ '21' ] = 'gray65' ; @C [ '22' ] = @C [ '20' ]
@C [ '23a' ] = 'blue' ; @C [ '23b' ] = 'red' ; @C [ '23c' ] = 'yellow'
@C [ '24a' ] = 'red' ; @C [ '24b' ] = 'white' ;
@STEP = TkVariable . new_hash
@STEP . default_value_type = :numeric
@XY = { }
@XY6 = {
2009-03-06 03:56:38 +00:00
'-1' = > [ 366 , 207 ] , '-2' = > [ 349 , 204 ] , '-3' = > [ 359 , 193 ] , '-4' = > [ 375 , 192 ] ,
2005-03-02 07:06:52 +00:00
'-5' = > [ 340 , 190 ] , '-6' = > [ 349 , 177 ] , '-7' = > [ 366 , 177 ] , '-8' = > [ 380 , 176 ] ,
2009-03-06 03:56:38 +00:00
'-9' = > [ 332 , 172 ] , '-10' = > [ 342 , 161 ] , '-11' = > [ 357 , 164 ] ,
'-12' = > [ 372 , 163 ] , '-13' = > [ 381 , 149 ] , '-14' = > [ 364 , 151 ] ,
'-15' = > [ 349 , 146 ] , '-16' = > [ 333 , 148 ] , '0' = > [ 357 , 219 ] ,
'1' = > [ 359 , 261 ] , '2' = > [ 359 , 291 ] , '3' = > [ 359 , 318 ] , '4' = > [ 361 , 324 ] ,
'5' = > [ 365 , 329 ] , '6' = > [ 367 , 334 ] , '7' = > [ 367 , 340 ] , '8' = > [ 366 , 346 ] ,
'9' = > [ 364 , 350 ] , '10' = > [ 361 , 355 ] , '11' = > [ 359 , 370 ] , '12' = > [ 359 , 391 ] ,
'13,0' = > [ 360 , 456 ] , '13,1' = > [ 376 , 456 ] , '13,2' = > [ 346 , 456 ] ,
'13,3' = > [ 330 , 456 ] , '13,4' = > [ 353 , 444 ] , '13,5' = > [ 368 , 443 ] ,
'13,6' = > [ 339 , 442 ] , '13,7' = > [ 359 , 431 ] , '13,8' = > [ 380 , 437 ] ,
'13,9' = > [ 345 , 428 ] , '13,10' = > [ 328 , 434 ] , '13,11' = > [ 373 , 424 ] ,
'13,12' = > [ 331 , 420 ] , '13,13' = > [ 360 , 417 ] , '13,14' = > [ 345 , 412 ] ,
2005-03-02 07:06:52 +00:00
'13,15' = > [ 376 , 410 ] , '13,16' = > [ 360 , 403 ]
}
@timer = TkTimer . new ( @speed [ @S [ 'speed' ] . numeric ] ) { | timer |
timer . set_interval ( go )
}
do_display
reset
# Start everything going
@timer . start
end
def do_display ( )
@ctrl = TkFrame . new ( @parent , :relief = > :ridge , :bd = > 2 , :padx = > 5 , :pady = > 5 )
2009-03-06 03:56:38 +00:00
@screen = TkFrame . new ( @parent , :bd = > 2 ,
:relief = > :raised ) . pack ( :side = > :left , :fill = > :both ,
2005-03-02 07:06:52 +00:00
:expand = > true )
2009-03-06 03:56:38 +00:00
@canvas = TkCanvas . new ( @parent , :width = > 850 , :height = > 700 ,
2005-03-02 07:06:52 +00:00
:bg = > @C [ 'bg' ] , :highlightthickness = > 0 ) {
scrollregion ( [ 0 , 0 , 1000 , 1000 ] ) # Kludge to move everything up
yview_moveto ( 0 . 05 )
} . pack ( :in = > @screen , :side = > :top , :fill = > :both , :expand = > true )
@canvas . bind ( '3' ) { @pause . invoke }
@canvas . bind ( 'Destroy' ) { @timer . stop }
do_ctrl_frame
do_detail_frame
* ext/tk/tcltklib.c: SEGV when tcltk-stubs is enabled.
* ext/tk/tcltklib.c: avoid error on a shared object.
* ext/tk/extconf.rb: support --with-tcltkversion
* ext/tk/README.tcltklib: add document about --with-tcltkversion
* ext/tk/lib/tk.rb, ext/tk/lib/multi-tk.rb, ext/tk/lib/remote-tk.rb:
not work on $SAFE==4
* ext/tk/lib/multi-tk.rb: Object#methods returns Symbols on Ruby1.9.
* ext/tk/lib/tk/timer.rb: add TkTimer#at_end(proc) to register the
procedure which called at end of the timer.
* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemfont.rb, ext/tk/lib/font.rb:
support __IGNORE_UNKNOWN_CONFIGURE_OPTION__ about font options.
* ext/tk/lib/*: treat __IGNORE_UNKNOWN_CONFIGURE_OPTION__
* ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb,
ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb,
ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb: bug fix.
* ext/tk/lib/tk/text.rb: typo. call a wrong method.
* ext/tk/lib/tk/itemconfig.rb: ditto.
* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemconfig.rb,
ext/tk/lib/tk/canvas.rb: support alias names of option keys.
* ext/tk/lib/tk/grid.rb: lack of module-method definitions.
* ext/tk/lib/tk/pack.rb, ext/tk/lib/tk/grid.rb: increase supported
parameter patterns of configure method.
* ext/tk/lib/tk.rb: add TkWindow#grid_anchor, grid_column, grid_row.
* ext/tk/lib/tk/wm.rb: methods of Tk::Wm_for_General module cannot
pass the given block to methods of Tk::Wm module.
* ext/tk/lib/tk/wm.rb: Wm#overrideredirect overwrites arguemnt to
an invalid value.
* ext/tk/lib/tk.rb: fix memory (object) leak bug.
* ext/tk/tcltklib.c, ext/tk/tkutil/tkutil.c: fix memory leak.
* ext/tk/sample/demos-jp/aniwave.rb, ext/tk/sample/demos-en/aniwave.rb:
bug fix.
* ext/tk/lib/tkextlib/blt/component.rb,
ext/tk/lib/tkextlib/tile/tentry.rb,
ext/tk/lib/tkextlib/tile/treeview.rb: ditto.
* ext/tk/lib/tkextlib/tile/tpaned.rb: improve TPaned#add.
* ext/tk/sample/demos-jp/widget, ext/tk/sample/demos-en/widget,
ext/tk/sample/demos-jp/style.rb, ext/tk/sample/demos-en/style.rb,
ext/tk/sample/demos-jp/bind.rb, ext/tk/sample/demos-en/bind.rb:
bug fix.
* ext/tk/sample/ttk_wrapper.rb: ditto.
* ext/tk/sample/ttk_wrapper.rb: support "if __FILE__ == $0" idiom.
* ext/tk/sample/tktextio.rb: add binding for 'Ctrl-u' at console mode.
* ext/tk/lib/tkextlib/tile.rb, ext/tk/lib/tkextlib/tile/style.rb,
ext/tk/sample/ttk_wrapper.rb: improve treating and control themes.
add Tk::Tile.themes and Tk::Tile.set_theme(theme).
* ext/tk/lib/tkextlib/tile.rb: lack of autoload definitions.
* ext/tk/lib/tkextlib/tile/tnotebook.rb: cannot use kanji (not UTF-8)
characters for headings.
* ext/tk/lib/tkextlib/tkDND/shape.rb: wrong package name.
* ext/tk/tkutil/tkutil.c: improve handling callback-subst-keys.
Now, support longnam-keys (e.g. '%CTT' on tkdnd-2.0; however, still
not support tkdnd-2.0 on tkextlib), and symbols of parameters (e.g.
:widget=>'%W', :keycode=>'%k', '%x'=>:x, '%X'=>:root_x, and so on;
those are attributes of event object). It means that Ruby/Tk accepts
not only "widget.bind(ev, '%W', '%k', ...){|w, k, ...| ... }", but
also "widget.bind(ev, :widget, :keycode, ...){|w, k, ...| ... }".
It is potentially incompatible, when user passes symbols to the
arguments of the callback block (the block receives the symbols as
strings). I think that is very rare case (probably, used by Ruby/Tk
experts only). When causes such trouble, please give strings instead
of such symbol parameters (e.g. call Symbol#to_s method).
* ext/tk/lib/tk/event.rb, ext/tk/lib/tk/validation.rb,
ext/tk/lib/tkextlib/blt/treeview.rb,
ext/tk/lib/tkextlib/winico/winico.rb: ditto.
* ext/tk/tkutil/tkutil.c: strings are available on subst_tables on
TkUtil::CallbackSubst class (it is useful on Ruby 1.9).
* ext/tk/lib/tk/spinbox.rb, ext/tk/lib/tkextlib/iwidgets/hierarchy.rb,
ext/tk/lib/tkextlib/iwidgets/spinner.rb,
ext/tk/lib/tkextlib/iwidgets/entryfield.rb,
ext/tk/lib/tkextlib/iwidgets/calendar.rb,
ext/tk/lib/tkextlib/blt/dragdrop.rb,
ext/tk/lib/tkextlib/tkDND/tkdnd.rb,
ext/tk/lib/tkextlib/treectrl/tktreectrl.rb,
ext/tk/lib/tkextlib/tktable/tktable.rb: disable code piece became
unnecessary by reason of the changes of ext/tk/tkutil/tkutil.c.
* ext/tk/lib/tk.rb, ext/tk/lib/multi-tk.rb: change strategy to define
the constant WITH_ENCODING.
* ext/tk/lib/tk.rb: fix bug on Tk::Encoding.tk_encoding_names.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17083 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-10 20:59:10 +00:00
# msg = TkLabel.new(@parent, :bg=>@C['bg'], :fg=>'white') {
msg = Tk :: Label . new ( @parent , :bg = > @C [ 'bg' ] , :fg = > 'white' ) {
2005-04-07 16:53:56 +00:00
font 'Arial 10'
wraplength 600
justify 'left'
2011-09-14 17:25:37 +00:00
text " これは、あなたが自分のアニメーションをいかに入り組んだものにできるかを示すというだけのためのデモです。ボールをクリックすれば物が動き始めます! \n \" Man will always find a difficult means to perform a simple task \" - Rube Goldberg "
2005-04-07 16:53:56 +00:00
}
msg . place ( :in = > @canvas , :relx = > 0 , :rely = > 0 , :anchor = > :nw )
frame = TkFrame . new ( @parent , :bg = > @C [ 'bg' ] )
* ext/tk/tcltklib.c: SEGV when tcltk-stubs is enabled.
* ext/tk/tcltklib.c: avoid error on a shared object.
* ext/tk/extconf.rb: support --with-tcltkversion
* ext/tk/README.tcltklib: add document about --with-tcltkversion
* ext/tk/lib/tk.rb, ext/tk/lib/multi-tk.rb, ext/tk/lib/remote-tk.rb:
not work on $SAFE==4
* ext/tk/lib/multi-tk.rb: Object#methods returns Symbols on Ruby1.9.
* ext/tk/lib/tk/timer.rb: add TkTimer#at_end(proc) to register the
procedure which called at end of the timer.
* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemfont.rb, ext/tk/lib/font.rb:
support __IGNORE_UNKNOWN_CONFIGURE_OPTION__ about font options.
* ext/tk/lib/*: treat __IGNORE_UNKNOWN_CONFIGURE_OPTION__
* ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb,
ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb,
ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb: bug fix.
* ext/tk/lib/tk/text.rb: typo. call a wrong method.
* ext/tk/lib/tk/itemconfig.rb: ditto.
* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemconfig.rb,
ext/tk/lib/tk/canvas.rb: support alias names of option keys.
* ext/tk/lib/tk/grid.rb: lack of module-method definitions.
* ext/tk/lib/tk/pack.rb, ext/tk/lib/tk/grid.rb: increase supported
parameter patterns of configure method.
* ext/tk/lib/tk.rb: add TkWindow#grid_anchor, grid_column, grid_row.
* ext/tk/lib/tk/wm.rb: methods of Tk::Wm_for_General module cannot
pass the given block to methods of Tk::Wm module.
* ext/tk/lib/tk/wm.rb: Wm#overrideredirect overwrites arguemnt to
an invalid value.
* ext/tk/lib/tk.rb: fix memory (object) leak bug.
* ext/tk/tcltklib.c, ext/tk/tkutil/tkutil.c: fix memory leak.
* ext/tk/sample/demos-jp/aniwave.rb, ext/tk/sample/demos-en/aniwave.rb:
bug fix.
* ext/tk/lib/tkextlib/blt/component.rb,
ext/tk/lib/tkextlib/tile/tentry.rb,
ext/tk/lib/tkextlib/tile/treeview.rb: ditto.
* ext/tk/lib/tkextlib/tile/tpaned.rb: improve TPaned#add.
* ext/tk/sample/demos-jp/widget, ext/tk/sample/demos-en/widget,
ext/tk/sample/demos-jp/style.rb, ext/tk/sample/demos-en/style.rb,
ext/tk/sample/demos-jp/bind.rb, ext/tk/sample/demos-en/bind.rb:
bug fix.
* ext/tk/sample/ttk_wrapper.rb: ditto.
* ext/tk/sample/ttk_wrapper.rb: support "if __FILE__ == $0" idiom.
* ext/tk/sample/tktextio.rb: add binding for 'Ctrl-u' at console mode.
* ext/tk/lib/tkextlib/tile.rb, ext/tk/lib/tkextlib/tile/style.rb,
ext/tk/sample/ttk_wrapper.rb: improve treating and control themes.
add Tk::Tile.themes and Tk::Tile.set_theme(theme).
* ext/tk/lib/tkextlib/tile.rb: lack of autoload definitions.
* ext/tk/lib/tkextlib/tile/tnotebook.rb: cannot use kanji (not UTF-8)
characters for headings.
* ext/tk/lib/tkextlib/tkDND/shape.rb: wrong package name.
* ext/tk/tkutil/tkutil.c: improve handling callback-subst-keys.
Now, support longnam-keys (e.g. '%CTT' on tkdnd-2.0; however, still
not support tkdnd-2.0 on tkextlib), and symbols of parameters (e.g.
:widget=>'%W', :keycode=>'%k', '%x'=>:x, '%X'=>:root_x, and so on;
those are attributes of event object). It means that Ruby/Tk accepts
not only "widget.bind(ev, '%W', '%k', ...){|w, k, ...| ... }", but
also "widget.bind(ev, :widget, :keycode, ...){|w, k, ...| ... }".
It is potentially incompatible, when user passes symbols to the
arguments of the callback block (the block receives the symbols as
strings). I think that is very rare case (probably, used by Ruby/Tk
experts only). When causes such trouble, please give strings instead
of such symbol parameters (e.g. call Symbol#to_s method).
* ext/tk/lib/tk/event.rb, ext/tk/lib/tk/validation.rb,
ext/tk/lib/tkextlib/blt/treeview.rb,
ext/tk/lib/tkextlib/winico/winico.rb: ditto.
* ext/tk/tkutil/tkutil.c: strings are available on subst_tables on
TkUtil::CallbackSubst class (it is useful on Ruby 1.9).
* ext/tk/lib/tk/spinbox.rb, ext/tk/lib/tkextlib/iwidgets/hierarchy.rb,
ext/tk/lib/tkextlib/iwidgets/spinner.rb,
ext/tk/lib/tkextlib/iwidgets/entryfield.rb,
ext/tk/lib/tkextlib/iwidgets/calendar.rb,
ext/tk/lib/tkextlib/blt/dragdrop.rb,
ext/tk/lib/tkextlib/tkDND/tkdnd.rb,
ext/tk/lib/tkextlib/treectrl/tktreectrl.rb,
ext/tk/lib/tkextlib/tktable/tktable.rb: disable code piece became
unnecessary by reason of the changes of ext/tk/tkutil/tkutil.c.
* ext/tk/lib/tk.rb, ext/tk/lib/multi-tk.rb: change strategy to define
the constant WITH_ENCODING.
* ext/tk/lib/tk.rb: fix bug on Tk::Encoding.tk_encoding_names.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17083 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-10 20:59:10 +00:00
# TkButton.new(frame, :bg=>@C['bg'], :activebackground=>@C['bg']) {
Tk :: Button . new ( frame , :bg = > @C [ 'bg' ] , :activebackground = > @C [ 'bg' ] ) {
2011-09-14 17:25:37 +00:00
text '閉じる'
2005-04-07 16:53:56 +00:00
command proc {
tmppath = $goldberg_demo
$goldberg_demo = nil
tmppath . destroy
}
} . pack ( 'side' = > 'left' )
* ext/tk/tcltklib.c: SEGV when tcltk-stubs is enabled.
* ext/tk/tcltklib.c: avoid error on a shared object.
* ext/tk/extconf.rb: support --with-tcltkversion
* ext/tk/README.tcltklib: add document about --with-tcltkversion
* ext/tk/lib/tk.rb, ext/tk/lib/multi-tk.rb, ext/tk/lib/remote-tk.rb:
not work on $SAFE==4
* ext/tk/lib/multi-tk.rb: Object#methods returns Symbols on Ruby1.9.
* ext/tk/lib/tk/timer.rb: add TkTimer#at_end(proc) to register the
procedure which called at end of the timer.
* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemfont.rb, ext/tk/lib/font.rb:
support __IGNORE_UNKNOWN_CONFIGURE_OPTION__ about font options.
* ext/tk/lib/*: treat __IGNORE_UNKNOWN_CONFIGURE_OPTION__
* ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb,
ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb,
ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb: bug fix.
* ext/tk/lib/tk/text.rb: typo. call a wrong method.
* ext/tk/lib/tk/itemconfig.rb: ditto.
* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemconfig.rb,
ext/tk/lib/tk/canvas.rb: support alias names of option keys.
* ext/tk/lib/tk/grid.rb: lack of module-method definitions.
* ext/tk/lib/tk/pack.rb, ext/tk/lib/tk/grid.rb: increase supported
parameter patterns of configure method.
* ext/tk/lib/tk.rb: add TkWindow#grid_anchor, grid_column, grid_row.
* ext/tk/lib/tk/wm.rb: methods of Tk::Wm_for_General module cannot
pass the given block to methods of Tk::Wm module.
* ext/tk/lib/tk/wm.rb: Wm#overrideredirect overwrites arguemnt to
an invalid value.
* ext/tk/lib/tk.rb: fix memory (object) leak bug.
* ext/tk/tcltklib.c, ext/tk/tkutil/tkutil.c: fix memory leak.
* ext/tk/sample/demos-jp/aniwave.rb, ext/tk/sample/demos-en/aniwave.rb:
bug fix.
* ext/tk/lib/tkextlib/blt/component.rb,
ext/tk/lib/tkextlib/tile/tentry.rb,
ext/tk/lib/tkextlib/tile/treeview.rb: ditto.
* ext/tk/lib/tkextlib/tile/tpaned.rb: improve TPaned#add.
* ext/tk/sample/demos-jp/widget, ext/tk/sample/demos-en/widget,
ext/tk/sample/demos-jp/style.rb, ext/tk/sample/demos-en/style.rb,
ext/tk/sample/demos-jp/bind.rb, ext/tk/sample/demos-en/bind.rb:
bug fix.
* ext/tk/sample/ttk_wrapper.rb: ditto.
* ext/tk/sample/ttk_wrapper.rb: support "if __FILE__ == $0" idiom.
* ext/tk/sample/tktextio.rb: add binding for 'Ctrl-u' at console mode.
* ext/tk/lib/tkextlib/tile.rb, ext/tk/lib/tkextlib/tile/style.rb,
ext/tk/sample/ttk_wrapper.rb: improve treating and control themes.
add Tk::Tile.themes and Tk::Tile.set_theme(theme).
* ext/tk/lib/tkextlib/tile.rb: lack of autoload definitions.
* ext/tk/lib/tkextlib/tile/tnotebook.rb: cannot use kanji (not UTF-8)
characters for headings.
* ext/tk/lib/tkextlib/tkDND/shape.rb: wrong package name.
* ext/tk/tkutil/tkutil.c: improve handling callback-subst-keys.
Now, support longnam-keys (e.g. '%CTT' on tkdnd-2.0; however, still
not support tkdnd-2.0 on tkextlib), and symbols of parameters (e.g.
:widget=>'%W', :keycode=>'%k', '%x'=>:x, '%X'=>:root_x, and so on;
those are attributes of event object). It means that Ruby/Tk accepts
not only "widget.bind(ev, '%W', '%k', ...){|w, k, ...| ... }", but
also "widget.bind(ev, :widget, :keycode, ...){|w, k, ...| ... }".
It is potentially incompatible, when user passes symbols to the
arguments of the callback block (the block receives the symbols as
strings). I think that is very rare case (probably, used by Ruby/Tk
experts only). When causes such trouble, please give strings instead
of such symbol parameters (e.g. call Symbol#to_s method).
* ext/tk/lib/tk/event.rb, ext/tk/lib/tk/validation.rb,
ext/tk/lib/tkextlib/blt/treeview.rb,
ext/tk/lib/tkextlib/winico/winico.rb: ditto.
* ext/tk/tkutil/tkutil.c: strings are available on subst_tables on
TkUtil::CallbackSubst class (it is useful on Ruby 1.9).
* ext/tk/lib/tk/spinbox.rb, ext/tk/lib/tkextlib/iwidgets/hierarchy.rb,
ext/tk/lib/tkextlib/iwidgets/spinner.rb,
ext/tk/lib/tkextlib/iwidgets/entryfield.rb,
ext/tk/lib/tkextlib/iwidgets/calendar.rb,
ext/tk/lib/tkextlib/blt/dragdrop.rb,
ext/tk/lib/tkextlib/tkDND/tkdnd.rb,
ext/tk/lib/tkextlib/treectrl/tktreectrl.rb,
ext/tk/lib/tkextlib/tktable/tktable.rb: disable code piece became
unnecessary by reason of the changes of ext/tk/tkutil/tkutil.c.
* ext/tk/lib/tk.rb, ext/tk/lib/multi-tk.rb: change strategy to define
the constant WITH_ENCODING.
* ext/tk/lib/tk.rb: fix bug on Tk::Encoding.tk_encoding_names.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17083 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-10 20:59:10 +00:00
# TkButton.new(frame, :bg=>@C['bg'], :activebackground=>@C['bg']) {
Tk :: Button . new ( frame , :bg = > @C [ 'bg' ] , :activebackground = > @C [ 'bg' ] ) {
2011-09-14 17:25:37 +00:00
text 'コード参照'
2005-04-07 16:53:56 +00:00
command proc { showCode 'goldberg' }
} . pack ( 'side' = > 'left' , 'padx' = > 5 )
2009-03-06 03:56:38 +00:00
# @show = TkButton.new(frame, :text=>'>>', :command=>proc{show_ctrl},
@show = Tk :: Button . new ( frame , :text = > '>>' , :command = > proc { show_ctrl } ,
2005-03-02 07:06:52 +00:00
:bg = > @C [ 'bg' ] , :activebackground = > @C [ 'bg' ] )
2005-04-07 16:53:56 +00:00
@show . pack ( 'side' = > 'left' )
frame . place ( :in = > @canvas , :relx = > 1 , :rely = > 0 , :anchor = > :ne )
2005-03-02 07:06:52 +00:00
Tk . update
end
def do_ctrl_frame
2009-03-06 03:56:38 +00:00
@start = Tk :: Button . new ( @parent , :text = > 'Start' , :bd = > 6 ,
2005-03-02 07:06:52 +00:00
:command = > proc { do_button ( 0 ) } )
* ext/tk/tcltklib.c: SEGV when tcltk-stubs is enabled.
* ext/tk/tcltklib.c: avoid error on a shared object.
* ext/tk/extconf.rb: support --with-tcltkversion
* ext/tk/README.tcltklib: add document about --with-tcltkversion
* ext/tk/lib/tk.rb, ext/tk/lib/multi-tk.rb, ext/tk/lib/remote-tk.rb:
not work on $SAFE==4
* ext/tk/lib/multi-tk.rb: Object#methods returns Symbols on Ruby1.9.
* ext/tk/lib/tk/timer.rb: add TkTimer#at_end(proc) to register the
procedure which called at end of the timer.
* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemfont.rb, ext/tk/lib/font.rb:
support __IGNORE_UNKNOWN_CONFIGURE_OPTION__ about font options.
* ext/tk/lib/*: treat __IGNORE_UNKNOWN_CONFIGURE_OPTION__
* ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb,
ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb,
ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb: bug fix.
* ext/tk/lib/tk/text.rb: typo. call a wrong method.
* ext/tk/lib/tk/itemconfig.rb: ditto.
* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemconfig.rb,
ext/tk/lib/tk/canvas.rb: support alias names of option keys.
* ext/tk/lib/tk/grid.rb: lack of module-method definitions.
* ext/tk/lib/tk/pack.rb, ext/tk/lib/tk/grid.rb: increase supported
parameter patterns of configure method.
* ext/tk/lib/tk.rb: add TkWindow#grid_anchor, grid_column, grid_row.
* ext/tk/lib/tk/wm.rb: methods of Tk::Wm_for_General module cannot
pass the given block to methods of Tk::Wm module.
* ext/tk/lib/tk/wm.rb: Wm#overrideredirect overwrites arguemnt to
an invalid value.
* ext/tk/lib/tk.rb: fix memory (object) leak bug.
* ext/tk/tcltklib.c, ext/tk/tkutil/tkutil.c: fix memory leak.
* ext/tk/sample/demos-jp/aniwave.rb, ext/tk/sample/demos-en/aniwave.rb:
bug fix.
* ext/tk/lib/tkextlib/blt/component.rb,
ext/tk/lib/tkextlib/tile/tentry.rb,
ext/tk/lib/tkextlib/tile/treeview.rb: ditto.
* ext/tk/lib/tkextlib/tile/tpaned.rb: improve TPaned#add.
* ext/tk/sample/demos-jp/widget, ext/tk/sample/demos-en/widget,
ext/tk/sample/demos-jp/style.rb, ext/tk/sample/demos-en/style.rb,
ext/tk/sample/demos-jp/bind.rb, ext/tk/sample/demos-en/bind.rb:
bug fix.
* ext/tk/sample/ttk_wrapper.rb: ditto.
* ext/tk/sample/ttk_wrapper.rb: support "if __FILE__ == $0" idiom.
* ext/tk/sample/tktextio.rb: add binding for 'Ctrl-u' at console mode.
* ext/tk/lib/tkextlib/tile.rb, ext/tk/lib/tkextlib/tile/style.rb,
ext/tk/sample/ttk_wrapper.rb: improve treating and control themes.
add Tk::Tile.themes and Tk::Tile.set_theme(theme).
* ext/tk/lib/tkextlib/tile.rb: lack of autoload definitions.
* ext/tk/lib/tkextlib/tile/tnotebook.rb: cannot use kanji (not UTF-8)
characters for headings.
* ext/tk/lib/tkextlib/tkDND/shape.rb: wrong package name.
* ext/tk/tkutil/tkutil.c: improve handling callback-subst-keys.
Now, support longnam-keys (e.g. '%CTT' on tkdnd-2.0; however, still
not support tkdnd-2.0 on tkextlib), and symbols of parameters (e.g.
:widget=>'%W', :keycode=>'%k', '%x'=>:x, '%X'=>:root_x, and so on;
those are attributes of event object). It means that Ruby/Tk accepts
not only "widget.bind(ev, '%W', '%k', ...){|w, k, ...| ... }", but
also "widget.bind(ev, :widget, :keycode, ...){|w, k, ...| ... }".
It is potentially incompatible, when user passes symbols to the
arguments of the callback block (the block receives the symbols as
strings). I think that is very rare case (probably, used by Ruby/Tk
experts only). When causes such trouble, please give strings instead
of such symbol parameters (e.g. call Symbol#to_s method).
* ext/tk/lib/tk/event.rb, ext/tk/lib/tk/validation.rb,
ext/tk/lib/tkextlib/blt/treeview.rb,
ext/tk/lib/tkextlib/winico/winico.rb: ditto.
* ext/tk/tkutil/tkutil.c: strings are available on subst_tables on
TkUtil::CallbackSubst class (it is useful on Ruby 1.9).
* ext/tk/lib/tk/spinbox.rb, ext/tk/lib/tkextlib/iwidgets/hierarchy.rb,
ext/tk/lib/tkextlib/iwidgets/spinner.rb,
ext/tk/lib/tkextlib/iwidgets/entryfield.rb,
ext/tk/lib/tkextlib/iwidgets/calendar.rb,
ext/tk/lib/tkextlib/blt/dragdrop.rb,
ext/tk/lib/tkextlib/tkDND/tkdnd.rb,
ext/tk/lib/tkextlib/treectrl/tktreectrl.rb,
ext/tk/lib/tkextlib/tktable/tktable.rb: disable code piece became
unnecessary by reason of the changes of ext/tk/tkutil/tkutil.c.
* ext/tk/lib/tk.rb, ext/tk/lib/multi-tk.rb: change strategy to define
the constant WITH_ENCODING.
* ext/tk/lib/tk.rb: fix bug on Tk::Encoding.tk_encoding_names.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17083 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-10 20:59:10 +00:00
if font = @start [ 'font' ]
@start . font ( font . weight ( 'bold' ) )
end
2005-03-02 07:06:52 +00:00
2009-03-06 03:56:38 +00:00
@pause = TkCheckbutton . new ( @parent , :text = > 'Pause' , :font = > font ,
:command = > proc { do_button ( 1 ) } , :relief = > :raised ,
2005-03-02 07:06:52 +00:00
:variable = > @S [ 'pause' ] )
2009-03-06 03:56:38 +00:00
@step = TkButton . new ( @parent , :text = > 'Single Step' , :font = > font ,
2005-03-02 07:06:52 +00:00
:command = > proc { do_button ( 2 ) } )
2009-03-06 03:56:38 +00:00
@bstep = TkButton . new ( @parent , :text = > 'Big Step' , :font = > font ,
2005-03-02 07:06:52 +00:00
:command = > proc { do_button ( 4 ) } )
2009-03-06 03:56:38 +00:00
@reset = TkButton . new ( @parent , :text = > 'Reset' , :font = > font ,
2005-03-02 07:06:52 +00:00
:command = > proc { do_button ( 3 ) } )
@details = TkFrame . new ( @parent , :bd = > 2 , :relief = > :ridge )
2009-03-06 03:56:38 +00:00
@detail = TkCheckbutton . new ( @parent , :text = > 'Details' , :font = > font ,
2005-03-02 07:06:52 +00:00
:relief = > :raised , :variable = > @S [ 'details' ] )
2009-03-06 03:56:38 +00:00
@msg_entry = TkEntry . new ( @parent , :textvariable = > @S [ 'message' ] ,
2005-03-02 07:06:52 +00:00
:justify = > :center )
2009-03-06 03:56:38 +00:00
@speed_scale = TkScale . new ( @parent , :orient = > :horizontal ,
:from = > 1 , :to = > 10 , :font = > font ,
:variable = > @S [ 'speed' ] , :bd = > 2 ,
2005-03-02 07:06:52 +00:00
:relief = > :ridge , :showvalue = > false )
2009-03-06 03:56:38 +00:00
@about = TkButton . new ( @parent , :text = > 'About' ,
2005-03-02 07:06:52 +00:00
:command = > proc { about } , :font = > font )
Tk . grid ( @start , :in = > @ctrl , :row = > 0 , :sticky = > :ew )
@ctrl . grid_rowconfigure ( 1 , :minsize = > 10 )
Tk . grid ( @pause , :in = > @ctrl , :row = > 2 , :sticky = > :ew )
Tk . grid ( @step , :in = > @ctrl , :sticky = > :ew )
Tk . grid ( @bstep , :in = > @ctrl , :sticky = > :ew )
Tk . grid ( @reset , :in = > @ctrl , :sticky = > :ew )
@ctrl . grid_rowconfigure ( 10 , :minsize = > 20 )
Tk . grid ( @details , :in = > @ctrl , :row = > 11 , :sticky = > :ew )
Tk . grid ( @detail , :in = > @details , :row = > 0 , :sticky = > :ew )
@ctrl . grid_rowconfigure ( 50 , :weight = > 1 )
@S [ 'mode' ] . trace ( 'w' , proc { | * args | active_GUI ( * args ) } )
@S [ 'details' ] . trace ( 'w' , proc { | * args | active_GUI ( * args ) } )
@S [ 'speed' ] . trace ( 'w' , proc { | * args | active_GUI ( * args ) } )
Tk . grid ( @msg_entry , :in = > @ctrl , :row = > 98 , :sticky = > :ew , :pady = > 5 )
Tk . grid ( @speed_scale , :in = > @ctrl , :row = > 99 , :sticky = > :ew )
Tk . grid ( @about , :in = > @ctrl , :row = > 100 , :sticky = > :ew )
@reset . bind ( '3' ) { @S [ 'mode' ] . value = - 1 } # Debugging
end
def do_detail_frame
@f_details = TkFrame . new ( @details )
2009-03-06 03:56:38 +00:00
@label = TkLabel . new ( @f_details , :textvariable = > @S [ 'cnt' ] ,
2005-03-02 07:06:52 +00:00
:bd = > 1 , :relief = > :solid , :bg = > 'white' )
Tk . grid ( @label , '-' , '-' , '-' , :sticky = > :ew , :row = > 0 )
idx = 1
loop {
break unless respond_to? ( " move #{ idx } " )
2009-03-06 03:56:38 +00:00
l = TkLabel . new ( @f_details , :text = > idx , :anchor = > :e ,
2005-03-02 07:06:52 +00:00
:width = > 2 , :bd = > 1 , :relief = > :solid , :bg = > 'white' )
@STEP [ idx ] = 0
2009-03-06 03:56:38 +00:00
ll = TkLabel . new ( @f_details , :textvariable = > @STEP . ref ( idx ) ,
2005-03-02 07:06:52 +00:00
:width = > 5 , :bd = > 1 , :relief = > :solid , :bg = > 'white' )
row = ( idx + 1 ) / 2
col = ( ( idx + 1 ) & 1 ) * 2
Tk . grid ( l , :sticky = > :ew , :row = > row , :column = > col )
Tk . grid ( ll , :sticky = > :ew , :row = > row , :column = > ( col + 1 ) )
idx += 1
}
@f_details . grid_columnconfigure ( 1 , :weight = > 1 )
end
def show_ctrl
if @ctrl . winfo_mapped?
@ctrl . pack_forget
@show . text ( '>>' )
else
@ctrl . pack ( :side = > :right , :fill = > :both , :ipady = > 5 )
@show . text ( '<<' )
end
end
def draw_all
reset_step
@canvas . delete ( :all )
idx = 0
loop {
m = " draw #{ idx } "
break unless respond_to? ( m )
send ( m )
idx += 1
}
end
def active_GUI ( var1 , var2 , op )
st = { false = > :disabled , true = > :normal }
m = @S [ 'mode' ] . to_sym
@S [ 'pause' ] . value = ( m == :MPAUSE )
@start . state ( st [ m != :MGO ] )
@pause . state ( st [ m != :MSTART && m != :MDONE ] )
@step . state ( st [ m != :MGO && m != :MDONE ] )
@bstep . state ( st [ m != :MGO && m != :MDONE ] )
@reset . state ( st [ m != :MSTART ] )
if @S [ 'details' ] . bool
Tk . grid ( @f_details , :in = > @details , :row = > 2 , :sticky = > :ew )
else
Tk . grid_forget ( @f_details )
end
@speed_scale . label ( " Speed: #{ @S [ 'speed' ] . value } " )
end
def start
@S [ 'mode' ] . value = :MGO
end
def do_button ( what )
case what
when 0 # Start
reset if @S [ 'mode' ] . to_sym == :MDONE
@S [ 'mode' ] . value = :MGO
when 1 # Pause
@S [ 'mode' ] . value = ( ( @S [ 'pause' ] . bool ) ? :MPAUSE : :MGO )
when 2 # Step
@S [ 'mode' ] . value = :MSSTEP
when 3 # Reset
reset
when 4 # Big step
@S [ 'mode' ] . value = :MBSTEP
end
end
def go ( who = nil )
2015-12-27 09:58:48 +00:00
now = Tk :: Clock . clicks ( :milliseconds )
2005-03-02 07:06:52 +00:00
if who # Start here for debugging
@S [ 'active' ] = [ who ]
@S [ 'mode' ] . value = :MGO
end
return if @S [ 'mode' ] . to_sym == :MDEBUG # Debugging
# If not paused, do the next move
n = next_step if @S [ 'mode' ] . to_sym != :MPAUSE
@S [ 'mode' ] . value = :MPAUSE if @S [ 'mode' ] . to_sym == :MSSTEP # Single step
@S [ 'mode' ] . value = :MSSTEP if @S [ 'mode' ] . to_sym == :MBSTEP && n # big step
2015-12-27 09:58:48 +00:00
elapsed = Tk :: Clock . clicks ( :milliseconds ) - now
2005-03-02 07:06:52 +00:00
delay = @speed [ @S [ 'speed' ] . to_i ] - elapsed
delay = 1 if delay < = 0
return delay
end
def next_step
retval = false # Return value
if @S [ 'mode' ] . to_sym != :MSTART && @S [ 'mode' ] . to_sym != :MDONE
@S [ 'cnt' ] . numeric += 1
end
alive = [ ]
@S [ 'active' ] . each { | who |
who = who . to_i
n = send ( " move #{ who } " )
if ( n & 1 ) . nonzero? # This guy still alive
2009-03-06 03:56:38 +00:00
alive << who
2005-03-02 07:06:52 +00:00
end
if ( n & 2 ) . nonzero? # Next guy is active
alive << ( who + 1 )
retval = true
end
if ( n & 4 ) . nonzero? # End of puzzle flag
@S [ 'mode' ] . value = :MDONE # Done mode
@S [ 'active' ] = [ ] # No more animation
return true
end
}
@S [ 'active' ] = alive
return retval
end
def about
msg = " Ruby/Tk Version :: \n by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) \n \n "
msg += " Original Version :: \n "
msg += " #{ @S [ 'title' ] } \n by Keith Vetter, March 2003 \n (Reproduced by kind permission of the author) \n \n "
msg += " Man will always find a difficult means to perform a simple task "
msg += " \n Rube Goldberg "
Tk . messageBox ( :message = > msg , :title = > 'About' )
end
################################################################
#
# All the drawing and moving routines
#
# START HERE! banner
def draw0
color = @C [ '0' ]
2009-03-06 03:56:38 +00:00
TkcText . new ( @canvas ,
# [579, 119], :text=>'START HERE!',
2011-09-14 17:25:37 +00:00
[ 558 , 119 ] , :text = > 'ここからスタート!' ,
2009-03-06 03:56:38 +00:00
:fill = > color , :anchor = > :w ,
2005-03-02 07:06:52 +00:00
:tag = > 'I0' , :font = > [ 'Times Roman' , 12 , :italic , :bold ] )
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 719 , 119 , 763 , 119 ] , :tag = > 'I0' , :fill = > color ,
2005-03-02 07:06:52 +00:00
:width = > 5 , :arrow = > :last , :arrowshape = > [ 18 , 18 , 5 ] )
@canvas . itembind ( 'I0' , '1' ) { start }
end
def move0 ( step = nil )
step = get_step ( 0 , step )
if @S [ 'mode' ] . to_sym != :MSTART # Start the ball rolling
move_abs ( 'I0' , [ - 100 , - 100 ] ) # Hide the banner
return 2
end
pos = [
2009-03-06 03:56:38 +00:00
[ 673 , 119 ] , [ 678 , 119 ] , [ 683 , 119 ] , [ 688 , 119 ] ,
2005-03-02 07:06:52 +00:00
[ 693 , 119 ] , [ 688 , 119 ] , [ 683 , 119 ] , [ 678 , 119 ]
]
step = step % pos . length
move_abs ( 'I0' , pos [ step ] )
return 1
end
# Dropping ball
def draw1
color = @C [ '1a' ]
color2 = @C [ '1b' ]
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas ,
[ 844 , 133 , 800 , 133 , 800 , 346 , 820 , 346 ,
820 , 168 , 844 , 168 , 844 , 133 ] ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :fill = > color , :outline = > '' )
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas ,
[ 771 , 133 , 685 , 133 , 685 , 168 , 751 , 168 ,
751 , 346 , 771 , 346 , 771 , 133 ] ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :fill = > color , :outline = > '' )
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , box ( 812 , 122 , 9 ) ,
2005-03-02 07:06:52 +00:00
:tag = > 'I1' , :fill = > color2 , :outline = > '' )
@canvas . itembind ( 'I1' , '1' ) { start }
end
def move1 ( step = nil )
step = get_step ( 1 , step )
pos = [
2009-03-06 03:56:38 +00:00
[ 807 , 122 ] , [ 802 , 122 ] , [ 797 , 123 ] , [ 793 , 124 ] , [ 789 , 129 ] , [ 785 , 153 ] ,
[ 785 , 203 ] , [ 785 , 278 , :x ] , [ 785 , 367 ] , [ 810 , 392 ] , [ 816 , 438 ] ,
[ 821 , 503 ] , [ 824 , 585 , :y ] , [ 838 , 587 ] , [ 848 , 593 ] , [ 857 , 601 ] ,
2005-03-02 07:06:52 +00:00
[ - 100 , - 100 ]
]
return 0 if step > = pos . length
where = pos [ step ]
move_abs ( 'I1' , where )
move15a if where [ 2 ] == :y
return 3 if where [ 2 ] == :x
return 1
end
# Lighting the match
def draw2
color = @C [ '2' ]
# Fulcrum
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , [ 750 , 369 , 740 , 392 , 760 , 392 ] ,
2005-03-02 07:06:52 +00:00
:fill = > @C [ 'fg' ] , :outline = > @C [ 'fg' ] )
# Strike box
2009-03-06 03:56:38 +00:00
TkcRectangle . new ( @canvas , [ 628 , 335 , 660 , 383 ] ,
2005-03-02 07:06:52 +00:00
:fill = > '' , :outline = > @C [ 'fg' ] )
( 0 .. 2 ) . each { | y |
yy = 335 + y * 16
2009-03-06 03:56:38 +00:00
TkcBitmap . new ( @canvas , [ 628 , yy ] , :bitmap = > 'gray25' ,
2005-03-02 07:06:52 +00:00
:anchor = > :nw , :foreground = > @C [ 'fg' ] )
2009-03-06 03:56:38 +00:00
TkcBitmap . new ( @canvas , [ 644 , yy ] , :bitmap = > 'gray25' ,
2005-03-02 07:06:52 +00:00
:anchor = > :nw , :foreground = > @C [ 'fg' ] )
}
# Lever
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 702 , 366 , 798 , 366 ] ,
2005-03-02 07:06:52 +00:00
:fill = > @C [ 'fg' ] , :width = > 6 , :tag = > 'I2_0' )
# R strap
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 712 , 363 , 712 , 355 ] ,
2005-03-02 07:06:52 +00:00
:fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I2_1' )
# L strap
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 705 , 363 , 705 , 355 ] ,
2005-03-02 07:06:52 +00:00
:fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I2_2' )
# Match stick
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 679 , 356 , 679 , 360 , 717 , 360 , 717 , 356 , 679 , 356 ] ,
2005-03-02 07:06:52 +00:00
:fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I2_3' )
# Match head
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas ,
[ 671 , 352 , 677 . 4 , 353 . 9 , 680 , 358 . 5 , 677 . 4 , 363 . 1 ,
671 , 365 , 664 . 6 , 363 . 1 , 662 , 358 . 5 , 664 . 6 , 353 . 9 ] ,
2005-03-02 07:06:52 +00:00
:fill = > color , :outline = > color , :tag = > 'I2_4' )
end
def move2 ( step = nil )
step = get_step ( 2 , step )
stages = [ 0 , 0 , 1 , 2 , 0 , 2 , 1 , 0 , 1 , 2 , 0 , 2 , 1 ]
xy = [ ]
xy [ 0 ] = [
2009-03-06 03:56:38 +00:00
686 , 333 , 692 , 323 , 682 , 316 , 674 , 309 , 671 , 295 , 668 , 307 ,
2005-03-02 07:06:52 +00:00
662 , 318 , 662 , 328 , 671 , 336
]
xy [ 1 ] = [
2009-03-06 03:56:38 +00:00
687 , 331 , 698 , 322 , 703 , 295 , 680 , 320 , 668 , 297 , 663 , 311 ,
2005-03-02 07:06:52 +00:00
661 , 327 , 671 , 335
]
xy [ 2 ] = [
2009-03-06 03:56:38 +00:00
686 , 331 , 704 , 322 , 688 , 300 , 678 , 283 , 678 , 283 , 674 , 298 ,
2005-03-02 07:06:52 +00:00
666 , 309 , 660 , 324 , 672 , 336
]
if step > = stages . length
@canvas . delete ( 'I2' )
return 0
end
if step == 0 # Rotate the match
beta = 20
2009-03-06 03:56:38 +00:00
2005-03-02 07:06:52 +00:00
ox , oy = anchor ( 'I2_0' , :s ) # Where to pivot
i = 0
until @canvas . find_withtag ( " I2_ #{ i } " ) . empty?
rotate_item ( " I2_ #{ i } " , ox , oy , beta )
i += 1
end
# For the flame
TkcPolygon . new ( @canvas , [ ] , :tag = > 'I2' , :smooth = > true , :fill = > @C [ '2' ] )
return 1
end
@canvas . coords ( 'I2' , xy [ stages [ step ] ] )
return ( ( step == 7 ) ? 3 : 1 )
end
# Weight and pulleys
def draw3
color = @C [ '3a' ]
color2 = @C [ '3b' ]
xy = [ [ 602 , 296 ] , [ 577 , 174 ] , [ 518 , 174 ] ]
xy . each { | x , y | # 3 Pulleys
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , box ( x , y , 13 ) ,
2005-03-02 07:06:52 +00:00
:fill = > color , :outline = > @C [ 'fg' ] , :width = > 3 )
TkcOval . new ( @canvas , box ( x , y , 2 ) , :fill = > @C [ 'fg' ] , :outline = > @C [ 'fg' ] )
}
# Wall to flame
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 750 , 309 , 670 , 309 ] , :tag = > 'I3_s' ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :fill = > @C [ 'fg' ] , :smooth = > true )
# Flame to pulley 1
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 670 , 309 , 650 , 309 ] , :tag = > 'I3_0' ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :fill = > @C [ 'fg' ] , :smooth = > true )
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 650 , 309 , 600 , 309 ] , :tag = > 'I3_1' ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :fill = > @C [ 'fg' ] , :smooth = > true )
# Pulley 1 half way to 2
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 589 , 296 , 589 , 235 ] , :tag = > 'I3_2' ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :fill = > @C [ 'fg' ] )
# Pulley 1 other half to 2
TkcLine . new ( @canvas , [ 589 , 235 , 589 , 174 ] , :width = > 3 , :fill = > @C [ 'fg' ] )
# Across the top
TkcLine . new ( @canvas , [ 577 , 161 , 518 , 161 ] , :width = > 3 , :fill = > @C [ 'fg' ] )
# Down to weight
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 505 , 174 , 505 , 205 ] , :tag = > 'I3_w' ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :fill = > @C [ 'fg' ] )
# Draw the weight as 2 circles, two rectangles and 1 rounded rectangle
x1 , y1 , x2 , y2 = [ 515 , 207 , 495 , 207 ]
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , box ( x1 , y1 , 6 ) ,
2005-03-02 07:06:52 +00:00
:tag = > 'I3_' , :fill = > color2 , :outline = > color2 )
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , box ( x2 , y2 , 6 ) ,
2005-03-02 07:06:52 +00:00
:tag = > 'I3_' , :fill = > color2 , :outline = > color2 )
2009-03-06 03:56:38 +00:00
TkcRectangle . new ( @canvas , x1 , y1 - 6 , x2 , y2 + 6 ,
2005-03-02 07:06:52 +00:00
:tag = > 'I3_' , :fill = > color2 , :outline = > color2 )
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , round_rect ( [ 492 , 220 , 518 , 263 ] , 15 ) ,
2005-03-02 07:06:52 +00:00
:smooth = > true , :tag = > 'I3_' , :fill = > color2 , :outline = > color2 )
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 500 , 217 , 511 , 217 ] ,
2005-03-02 07:06:52 +00:00
:tag = > 'I3_' , :fill = > color2 , :width = > 10 )
# Bottom weight target
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 502 , 393 , 522 , 393 , 522 , 465 ] ,
2005-03-02 07:06:52 +00:00
:tag = > 'I3__' , :fill = > @C [ 'fg' ] , :joinstyle = > :miter , :width = > 10 )
end
def move3 ( step = nil )
step = get_step ( 3 , step )
pos = [ [ 505 , 247 ] , [ 505 , 297 ] , [ 505 , 386 . 5 ] , [ 505 , 386 . 5 ] ]
rope = [ ]
rope [ 0 ] = [ 750 , 309 , 729 , 301 , 711 , 324 , 690 , 300 ]
rope [ 1 ] = [ 750 , 309 , 737 , 292 , 736 , 335 , 717 , 315 , 712 , 320 ]
rope [ 2 ] = [ 750 , 309 , 737 , 309 , 740 , 343 , 736 , 351 , 725 , 340 ]
rope [ 3 ] = [ 750 , 309 , 738 , 321 , 746 , 345 , 742 , 356 ]
return 0 if step > = pos . length
@canvas . delete ( " I3_ #{ step } " ) # Delete part of the rope
move_abs ( 'I3_' , pos [ step ] ) # Move weight down
@canvas . coords ( 'I3_s' , rope [ step ] ) # Flapping rope end
@canvas . coords ( 'I3_w' , [ 505 , 174 ] . concat ( pos [ step ] ) )
if step == 2
@canvas . move ( 'I3__' , 0 , 30 )
return 2
end
return 1
end
# Cage and door
def draw4
color = @C [ '4' ]
x0 , y0 , x1 , y1 = [ 527 , 356 , 611 , 464 ]
# Horizontal bars
y0 . step ( y1 , 12 ) { | y |
TkcLine . new ( @canvas , [ x0 , y , x1 , y ] , :fill = > color , :width = > 1 )
}
# Vertical bars
x0 . step ( x1 , 12 ) { | x |
TkcLine . new ( @canvas , [ x , y0 , x , y1 ] , :fill = > color , :width = > 1 )
}
# Swing gate
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , [ 518 , 464 , 518 , 428 ] ,
2005-03-02 07:06:52 +00:00
:tag = > 'I4' , :fill = > color , :width = > 1 )
end
def move4 ( step = nil )
step = get_step ( 4 , step )
angles = [ - 10 , - 20 , - 30 , - 30 ]
return 0 if step > = angles . length
rotate_item ( 'I4' , 518 , 464 , angles [ step ] )
@canvas . raise ( 'I4' )
return ( ( step == 3 ) ? 3 : 1 )
end
# Mouse
def draw5
color = @C [ '5a' ]
color2 = @C [ '5b' ]
xy = [ 377 , 248 , 410 , 248 , 410 , 465 , 518 , 465 ] # Mouse course
xy . concat [ 518 , 428 , 451 , 428 , 451 , 212 , 377 , 212 ]
TkcPolygon . new ( @canvas , xy , :fill = > color2 , :outline = > @C [ 'fg' ] , :width = > 3 )
xy = [
2009-03-06 03:56:38 +00:00
534 . 5 , 445 . 5 , 541 , 440 , 552 , 436 , 560 , 436 , 569 , 440 , 574 , 446 ,
2005-03-02 07:06:52 +00:00
575 , 452 , 574 , 454 , 566 , 456 , 554 , 456 , 545 , 456 , 537 , 454 , 530 , 452
]
TkcPolygon . new ( @canvas , xy , :tag = > [ 'I5' , 'I5_0' ] , :fill = > color )
TkcLine . new ( @canvas , [ 573 , 452 , 592 , 458 , 601 , 460 , 613 , 456 ] , # Tail
:tag = > [ 'I5' , 'I5_1' ] , :fill = > color , :smooth = > true , :width = > 3 )
xy = box ( 540 , 446 , 2 ) # Eye
xy = [ 540 , 444 , 541 , 445 , 541 , 447 , 540 , 448 , 538 , 447 , 538 , 445 ]
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , xy , :tag = > [ 'I5' , 'I5_2' ] , :fill = > @C [ 'bg' ] ,
2005-03-02 07:06:52 +00:00
:outline = > '' , :smooth = > true )
xy = [ 538 , 454 , 535 , 461 ] # Front leg
TkcLine . new ( @canvas , xy , :tag = > [ 'I5' , 'I5_3' ] , :fill = > color , :width = > 2 )
xy = [ 566 , 455 , 569 , 462 ] # Back leg
TkcLine . new ( @canvas , xy , :tag = > [ 'I5' , 'I5_4' ] , :fill = > color , :width = > 2 )
xy = [ 544 , 455 , 545 , 460 ] # 2nd front leg
TkcLine . new ( @canvas , xy , :tag = > [ 'I5' , 'I5_5' ] , :fill = > color , :width = > 2 )
xy = [ 560 , 455 , 558 , 460 ] # 2nd back leg
TkcLine . new ( @canvas , xy , :tag = > [ 'I5' , 'I5_6' ] , :fill = > color , :width = > 2 )
end
def move5 ( step = nil )
step = get_step ( 5 , step )
pos = [
2009-03-06 03:56:38 +00:00
[ 553 , 452 ] , [ 533 , 452 ] , [ 513 , 452 ] , [ 493 , 452 ] , [ 473 , 452 ] ,
[ 463 , 442 , 30 ] , [ 445 . 5 , 441 . 5 , 30 ] , [ 425 . 5 , 434 . 5 , 30 ] , [ 422 , 414 ] ,
[ 422 , 394 ] , [ 422 , 374 ] , [ 422 , 354 ] , [ 422 , 334 ] , [ 422 , 314 ] , [ 422 , 294 ] ,
2005-03-02 07:06:52 +00:00
[ 422 , 274 , - 30 ] , [ 422 , 260 . 5 , - 30 , :x ] , [ 422 . 5 , 248 . 5 , - 28 ] , [ 425 , 237 ]
]
return 0 if step > = pos . length
x , y , beta , nxt = pos [ step ]
move_abs ( 'I5' , [ x , y ] )
if beta
ox , oy = centroid ( 'I5_0' )
( 0 .. 6 ) . each { | id | rotate_item ( " I5_ #{ id } " , ox , oy , beta ) }
end
return 3 if nxt == :x
return 1
end
# Dropping gumballs
def draw6
color = @C [ '6' ]
xy = [ 324 , 130 , 391 , 204 ] # Ball holder
xy = round_rect ( xy , 10 )
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , xy , :smooth = > true ,
2005-03-02 07:06:52 +00:00
:outline = > @C [ 'fg' ] , :width = > 3 , :fill = > color )
xy = [ 339 , 204 , 376 , 253 ] # Below the ball holder
2009-03-06 03:56:38 +00:00
TkcRectangle . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 3 ,
2005-03-02 07:06:52 +00:00
:fill = > color , :tag = > 'I6c' )
xy = box ( 346 , 339 , 28 )
TkcOval . new ( @canvas , xy , :fill = > color , :outline = > '' ) # Roter
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 2 , :style = > :arc ,
2005-03-02 07:06:52 +00:00
:start = > 80 , :extent = > 205 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 2 , :style = > :arc ,
2005-03-02 07:06:52 +00:00
:start = > - 41 , :extent = > 85 )
xy = box ( 346 , 339 , 15 ) # Center of rotor
TkcOval . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :fill = > @C [ 'fg' ] , :tag = > 'I6m' )
xy = [ 352 , 312 , 352 , 254 , 368 , 254 , 368 , 322 ] # Top drop to rotor
TkcPolygon . new ( @canvas , xy , :fill = > color , :outline = > '' )
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 2 )
xy = [ 353 , 240 , 367 , 300 ] # Poke bottom hole
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > '' )
xy = [ 341 , 190 , 375 , 210 ] # Poke another hole
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > '' )
xy = [
2009-03-06 03:56:38 +00:00
368 , 356 , 368 , 403 , 389 , 403 , 389 , 464 , 320 , 464 , 320 , 403 ,
2005-03-02 07:06:52 +00:00
352 , 403 , 352 , 366
]
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , xy , :fill = > color , :outline = > '' ,
2005-03-02 07:06:52 +00:00
:width = > 2 ) # Below rotor
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 2 )
xy = box ( 275 , 342 , 7 ) # On/off rotor
TkcOval . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :fill = > @C [ 'fg' ] )
xy = [ 276 , 334 , 342 , 325 ] # Fan belt top
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 )
xy = [ 276 , 349 , 342 , 353 ] # Fan belt bottom
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 )
xy = [ 337 , 212 , 337 , 247 ] # What the mouse pushes
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I6_' )
xy = [ 392 , 212 , 392 , 247 ]
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I6_' )
xy = [ 337 , 230 , 392 , 230 ]
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 7 , :tag = > 'I6_' )
who = - 1 # All the balls
colors = %w( red cyan orange green blue darkblue )
colors *= 3
( 0 .. 16 ) . each { | i |
loc = - i
color = colors [ i ]
x , y = @XY6 [ " #{ loc } " ]
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , box ( x , y , 5 ) ,
2005-03-02 07:06:52 +00:00
:fill = > color , :outline = > color , :tag = > " I6_b #{ i } " )
}
draw6a ( 12 ) # The wheel
end
def draw6a ( beta )
@canvas . delete ( 'I6_0' )
ox , oy = [ 346 , 339 ]
( 0 .. 3 ) . each { | i |
b = beta + i * 45
x , y = rotate_c ( 28 , 0 , 0 , 0 , b )
xy = [ ox + x , oy + y , ox - x , oy - y ]
TkcLine . new ( @canvas , xy , :tag = > 'I6_0' , :fill = > @C [ 'fg' ] , :width = > 2 )
}
end
def move6 ( step = nil )
step = get_step ( 6 , step )
return 0 if step > 62
if step < 2 # Open gate for balls to drop
@canvas . move ( 'I6_' , - 7 , 0 )
if step == 1 # Poke a hole
xy = [ 348 , 226 , 365 , 240 ]
2009-03-06 03:56:38 +00:00
TkcRectangle . new ( @canvas , xy , :fill = > @canvas . itemcget ( 'I6c' , :fill ) ,
2005-03-02 07:06:52 +00:00
:outline = > '' )
end
return 1
end
s = step - 1 # Do the gumball drop dance
( 0 .. ( ( ( s - 1 ) / 3 ) . to_i ) ) . each { | i |
tag = " I6_b #{ i } "
break if @canvas . find_withtag ( tag ) . empty?
loc = s - 3 * i
if @XY6 [ " #{ loc } , #{ i } " ]
move_abs ( tag , @XY6 [ " #{ loc } , #{ i } " ] )
elsif @XY6 [ " #{ loc } " ]
move_abs ( tag , @XY6 [ " #{ loc } " ] )
end
}
if s % 3 == 1
first = ( s + 2 ) / 3
i = first
loop {
tag = " I6_b #{ i } "
break if @canvas . find_withtag ( tag ) . empty?
loc = first - i
move_abs ( tag , @XY6 [ " #{ loc } " ] )
i += 1
}
end
if s > = 3 # Rotate the motor
idx = s % 3
draw6a ( 12 + s * 15 )
end
return ( ( s == 3 ) ? 3 : 1 )
end
# On/off switch
def draw7
color = @C [ '7' ]
xy = [ 198 , 306 , 277 , 374 ] # Box
2009-03-06 03:56:38 +00:00
TkcRectangle . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 2 ,
2005-03-02 07:06:52 +00:00
:fill = > color , :tag = > 'I7z' )
@canvas . lower ( 'I7z' )
xy = [ 275 , 343 , 230 , 349 ]
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :tag = > 'I7' , :fill = > @C [ 'fg' ] , :arrow = > :last ,
2005-03-02 07:06:52 +00:00
:arrowshape = > [ 23 , 23 , 8 ] , :width = > 6 )
xy = [ 225 , 324 ] # On button
x , y = xy
TkcOval . new ( @canvas , box ( x , y , 3 ) , :fill = > @C [ 'fg' ] , :outline = > @C [ 'fg' ] )
xy = [ 218 , 323 ] # On text
font = [ 'Times Roman' , 8 ]
2009-03-06 03:56:38 +00:00
TkcText . new ( @canvas , xy , :text = > 'on' , :anchor = > :e ,
2005-03-02 07:06:52 +00:00
:fill = > @C [ 'fg' ] , :font = > font )
xy = [ 225 , 350 ] # Off button
x , y = xy
TkcOval . new ( @canvas , box ( x , y , 3 ) , :fill = > @C [ 'fg' ] , :outline = > @C [ 'fg' ] )
xy = [ 218 , 349 ] # Off text
2009-03-06 03:56:38 +00:00
TkcText . new ( @canvas , xy , :text = > 'off' , :anchor = > :e ,
2005-03-02 07:06:52 +00:00
:fill = > @C [ 'fg' ] , :font = > font )
end
def move7 ( step = nil )
step = get_step ( 7 , step )
numsteps = 30
return 0 if step > numsteps
beta = 30 . 0 / numsteps
rotate_item ( 'I7' , 275 , 343 , beta )
return ( ( step == numsteps ) ? 3 : 1 )
end
# Electricity to the fan
def draw8
sine ( [ 271 , 248 , 271 , 306 ] , 5 , 8 , :tag = > 'I8_s' , :fill = > @C [ '8' ] , :width = > 3 )
end
def move8 ( step = nil )
step = get_step ( 8 , step )
return 0 if step > 3
if step == 0
sparkle ( anchor ( 'I8_s' , :s ) , 'I8' )
return 1
elsif step == 1
move_abs ( 'I8' , anchor ( 'I8_s' , :c ) )
elsif step == 2
move_abs ( 'I8' , anchor ( 'I8_s' , :n ) )
else
@canvas . delete ( 'I8' )
end
return ( ( step == 2 ) ? 3 : 1 )
end
# Fan
def draw9
color = @C [ '9' ]
xy = [ 266 , 194 , 310 , 220 ]
TkcOval . new ( @canvas , xy , :outline = > color , :fill = > color )
xy = [ 280 , 209 , 296 , 248 ]
TkcOval . new ( @canvas , xy , :outline = > color , :fill = > color )
xy = [
2009-03-06 03:56:38 +00:00
288 , 249 , 252 , 249 , 260 , 240 , 280 , 234 ,
2005-03-02 07:06:52 +00:00
296 , 234 , 316 , 240 , 324 , 249 , 288 , 249
]
TkcPolygon . new ( @canvas , xy , :fill = > color , :smooth = > true )
xy = [ 248 , 205 , 265 , 214 , 264 , 205 , 265 , 196 ] # Spinner
TkcPolygon . new ( @canvas , xy , :fill = > color )
xy = [ 255 , 206 , 265 , 234 ] # Fan blades
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :fill = > '' , :outline = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I9_0' )
xy = [ 255 , 176 , 265 , 204 ]
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :fill = > '' , :outline = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I9_0' )
xy = [ 255 , 206 , 265 , 220 ]
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :fill = > '' , :outline = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:width = > 1 , :tag = > 'I9_1' )
xy = [ 255 , 190 , 265 , 204 ]
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :fill = > '' , :outline = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:width = > 1 , :tag = > 'I9_1' )
end
def move9 ( step = nil )
step = get_step ( 9 , step )
if ( step & 1 ) . nonzero?
@canvas . itemconfigure ( 'I9_0' , :width = > 4 )
@canvas . itemconfigure ( 'I9_1' , :width = > 1 )
@canvas . lower ( 'I9_1' , 'I9_0' )
else
@canvas . itemconfigure ( 'I9_0' , :width = > 1 )
@canvas . itemconfigure ( 'I9_1' , :width = > 4 )
@canvas . lower ( 'I9_0' , 'I9_1' )
end
return 3 if step == 0
return 1
end
# Boat
def draw10
color = @C [ '10a' ]
color2 = @C [ '10b' ]
xy = [ 191 , 230 , 233 , 230 , 233 , 178 , 191 , 178 ] # Sail
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , xy , :fill = > color , :width = > 3 , :outline = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:tag = > 'I10' )
xy = box ( 209 , 204 , 31 ) # Front
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > '' , :fill = > color , :style = > :pie ,
2005-03-02 07:06:52 +00:00
:start = > 120 , :extent = > 120 , :tag = > 'I10' )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 3 , :style = > :arc ,
2005-03-02 07:06:52 +00:00
:start = > 120 , :extent = > 120 , :tag = > 'I10' )
xy = box ( 249 , 204 , 31 ) # Back
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > '' , :fill = > @C [ 'bg' ] , :width = > 3 ,
2005-03-02 07:06:52 +00:00
:style = > :pie , :start = > 120 , :extent = > 120 , :tag = > 'I10' )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 3 , :style = > :arc ,
2005-03-02 07:06:52 +00:00
:start = > 120 , :extent = > 120 , :tag = > 'I10' )
xy = [ 200 , 171 , 200 , 249 ] # Mast
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I10' )
xy = [ 159 , 234 , 182 , 234 ] # Bow sprit
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I10' )
xy = [ 180 , 234 , 180 , 251 , 220 , 251 ] # Hull
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 6 , :tag = > 'I10' )
xy = [ 92 , 255 , 221 , 255 ] # Waves
sine ( xy , 2 , 25 , :fill = > color2 , :width = > 1 , :tag = > 'I10w' )
xy = @canvas . coords ( 'I10w' ) [ 4 .. - 5 ] # Water
xy . concat ( [ 222 , 266 , 222 , 277 , 99 , 277 ] )
TkcPolygon . new ( @canvas , xy , :fill = > color2 , :outline = > color2 )
xy = [ 222 , 266 , 222 , 277 , 97 , 277 , 97 , 266 ] # Water bottom
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 )
xy = box ( 239 , 262 , 17 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 3 , :style = > :arc ,
2005-03-02 07:06:52 +00:00
:start = > 95 , :extent = > 103 )
xy = box ( 76 , 266 , 21 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 3 , :style = > :arc ,
2005-03-02 07:06:52 +00:00
:extent = > 190 )
end
def move10 ( step = nil )
step = get_step ( 10 , step )
pos = [
2009-03-06 03:56:38 +00:00
[ 195 , 212 ] , [ 193 , 212 ] , [ 190 , 212 ] , [ 186 , 212 ] , [ 181 , 212 ] , [ 176 , 212 ] ,
[ 171 , 212 ] , [ 166 , 212 ] , [ 161 , 212 ] , [ 156 , 212 ] , [ 151 , 212 ] , [ 147 , 212 ] ,
[ 142 , 212 ] , [ 137 , 212 ] , [ 132 , 212 , :x ] , [ 127 , 212 ] , [ 121 , 212 ] ,
2005-03-02 07:06:52 +00:00
[ 116 , 212 ] , [ 111 , 212 ]
]
return 0 if step > = pos . length
where = pos [ step ]
move_abs ( 'I10' , where )
return 3 if where [ 2 ] == :x
return 1
end
# 2nd ball drop
def draw11
color = @C [ '11a' ]
color2 = @C [ '11b' ]
xy = [ 23 , 264 , 55 , 591 ] # Color the down tube
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > '' )
xy = box ( 71 , 460 , 48 ) # Color the outer loop
TkcOval . new ( @canvas , xy , :fill = > color , :outline = > '' )
xy = [ 55 , 264 , 55 , 458 ] # Top right side
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 )
xy = [ 55 , 504 , 55 , 591 ] # Bottom right side
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 )
xy = box ( 71 , 460 , 48 ) # Outer loop
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 3 , :style = > :arc ,
2005-03-02 07:06:52 +00:00
:start = > 110 , :extent = > - 290 , :tag = > 'I11i' )
xy = box ( 71 , 460 , 16 ) # Inner loop
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :fill = > '' ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I11i' )
TkcOval . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :fill = > @C [ 'bg' ] , :width = > 3 )
xy = [ 23 , 264 , 23 , 591 ] # Left side
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 )
xy = box ( 1 , 266 , 23 ) # Top left curve
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 3 ,
2005-03-02 07:06:52 +00:00
:style = > :arc , :extent = > 90 )
xy = box ( 75 , 235 , 9 ) # The ball
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :fill = > color2 , :outline = > '' ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I11' )
end
def move11 ( step = nil )
step = get_step ( 11 , step )
pos = [
2009-03-06 03:56:38 +00:00
[ 75 , 235 ] , [ 70 , 235 ] , [ 65 , 237 ] , [ 56 , 240 ] , [ 46 , 247 ] , [ 38 , 266 ] ,
[ 38 , 296 ] , [ 38 , 333 ] , [ 38 , 399 ] , [ 38 , 475 ] , [ 74 , 496 ] , [ 105 , 472 ] ,
2005-03-02 07:06:52 +00:00
[ 100 , 437 ] , [ 65 , 423 ] , [ - 100 , - 100 ] , [ 38 , 505 ] , [ 38 , 527 , :x ] , [ 38 , 591 ]
]
return 0 if step > = pos . length
where = pos [ step ]
move_abs ( 'I11' , where )
return 3 if where [ 2 ] == :x
return 1
end
# Hand
def draw12
xy = [
2009-03-06 03:56:38 +00:00
20 , 637 , 20 , 617 , 20 , 610 , 20 , 590 , 40 , 590 , 40 , 590 ,
2005-03-02 07:06:52 +00:00
60 , 590 , 60 , 610 , 60 , 610
]
xy . concat ( [ 60 , 610 , 65 , 620 , 60 , 631 ] ) # Thumb
2009-03-06 03:56:38 +00:00
xy . concat ( [ 60 , 631 , 60 , 637 , 60 , 662 , 60 , 669 , 52 , 669 ,
2005-03-02 07:06:52 +00:00
56 , 669 , 50 , 669 , 50 , 662 , 50 , 637 ] )
y0 = 637 # Bumps for fingers
y1 = 645
50 . step ( 21 , - 10 ) { | x |
x1 = x - 5
x2 = x - 10
xy << x << y0 << x1 << y1 << x2 << y0
}
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , xy , :fill = > @C [ '12' ] , :outline = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:smooth = > true , :tag = > 'I12' , :width = > 3 )
end
def move12 ( step = nil )
step = get_step ( 12 , step )
pos = [ [ 42 . 5 , 641 , :x ] ]
return 0 if step > = pos . length
where = pos [ step ]
move_abs ( 'I12' , where )
return 3 if where [ 2 ] == :x
return 1
end
# Fax
def draw13
color = @C [ '13a' ]
xy = [ 86 , 663 , 149 , 663 , 149 , 704 , 50 , 704 , 50 , 681 , 64 , 681 , 86 , 671 ]
xy2 = [
784 , 663 , 721 , 663 , 721 , 704 , 820 , 704 , 820 , 681 , 806 , 681 , 784 , 671
]
radii = [ 2 , 9 , 9 , 8 , 5 , 5 , 2 ]
2009-03-06 03:56:38 +00:00
round_poly ( @canvas , xy , radii , :width = > 3 ,
2005-03-02 07:06:52 +00:00
:outline = > @C [ 'fg' ] , :fill = > color )
2009-03-06 03:56:38 +00:00
round_poly ( @canvas , xy2 , radii , :width = > 3 ,
2005-03-02 07:06:52 +00:00
:outline = > @C [ 'fg' ] , :fill = > color )
xy = [ 56 , 677 ]
x , y = xy
2009-03-06 03:56:38 +00:00
TkcRectangle . new ( @canvas , box ( x , y , 4 ) , :fill = > '' , :outline = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I13' )
xy = [ 809 , 677 ]
x , y = xy
2009-03-06 03:56:38 +00:00
TkcRectangle . new ( @canvas , box ( x , y , 4 ) , :fill = > '' , :outline = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I13R' )
xy = [ 112 , 687 ] # Label
2009-03-06 03:56:38 +00:00
TkcText . new ( @canvas , xy , :text = > 'FAX' , :fill = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:font = > [ 'Times Roman' , 12 , :bold ] )
xy = [ 762 , 687 ]
2009-03-06 03:56:38 +00:00
TkcText . new ( @canvas , xy , :text = > 'FAX' , :fill = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:font = > [ 'Times Roman' , 12 , :bold ] )
xy = [ 138 , 663 , 148 , 636 , 178 , 636 ] # Paper guide
TkcLine . new ( @canvas , xy , :smooth = > true , :fill = > @C [ 'fg' ] , :width = > 3 )
xy = [ 732 , 663 , 722 , 636 , 692 , 636 ]
TkcLine . new ( @canvas , xy , :smooth = > true , :fill = > @C [ 'fg' ] , :width = > 3 )
2009-03-06 03:56:38 +00:00
sine ( [ 149 , 688 , 720 , 688 ] , 5 , 15 ,
2005-03-02 07:06:52 +00:00
:tag = > 'I13_s' , :fill = > @C [ 'fg' ] , :width = > 3 )
end
def move13 ( step = nil )
step = get_step ( 13 , step )
numsteps = 7
if step == numsteps + 2
move_abs ( 'I13_star' , [ - 100 , - 100 ] )
@canvas . itemconfigure ( 'I13R' , :fill = > @C [ '13b' ] , :width = > 2 )
return 2
end
if step == 0 # Button down
@canvas . delete ( 'I13' )
sparkle ( [ - 100 , - 100 ] , 'I13_star' ) # Create off screen
return 1
end
x0 , y0 = anchor ( 'I13_s' , :w )
x1 , y1 = anchor ( 'I13_s' , :e )
x = x0 + ( x1 - x0 ) * ( step - 1 ) / numsteps . to_f
move_abs ( 'I13_star' , [ x , y0 ] )
return 1
end
# Paper in fax
def draw14
color = @C [ '14' ]
xy = [ 102 , 661 , 113 , 632 , 130 , 618 ] # Left paper edge
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :smooth = > true , :fill = > color ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I14L_0' )
xy = [ 148 , 629 , 125 , 640 , 124 , 662 ] # Right paper edge
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :smooth = > true , :fill = > color ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I14L_1' )
draw14a ( 'L' )
xy = [
768 . 0 , 662 . 5 , 767 . 991316225 , 662 . 433786215 , 767 . 926187912 , 662 . 396880171
]
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :smooth = > true , :fill = > color ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I14R_0' )
@canvas . lower ( 'I14R_0' )
# NB. these numbers are VERY sensitive, you must start with final size
# and shrink down to get the values
xy = [
745 . 947897349 , 662 . 428358855 , 745 . 997829056 , 662 . 452239237 , 746 . 0 , 662 . 5
]
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :smooth = > true , :fill = > color ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I14R_1' )
@canvas . lower ( 'I14R_1' )
end
def draw14a ( side )
color = @C [ '14' ]
xy = @canvas . coords ( " I14 #{ side } _0 " )
xy2 = @canvas . coords ( " I14 #{ side } _1 " )
x0 , y0 , x1 , y1 , x2 , y2 = xy
x3 , y3 , x4 , y4 , x5 , y5 = xy2
zz = [
2009-03-06 03:56:38 +00:00
x0 , y0 , x0 , y0 , xy , x2 , y2 , x2 , y2 ,
2005-03-02 07:06:52 +00:00
x3 , y3 , x3 , y3 , xy2 , x5 , y5 , x5 , y5
] . flatten
@canvas . delete ( " I14 #{ side } " )
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , zz , :tag = > " I14 #{ side } " , :smooth = > true ,
2005-03-02 07:06:52 +00:00
:fill = > color , :outline = > color , :width = > 3 )
@canvas . lower ( " I14 #{ side } " )
end
def move14 ( step = nil )
step = get_step ( 14 , step )
# Paper going down
sc = 0 . 9 - 0 . 05 * step
if sc < 0 . 3
@canvas . delete ( 'I14L' )
return 0
end
ox , oy = @canvas . coords ( 'I14L_0' )
@canvas . scale ( 'I14L_0' , ox , oy , sc , sc )
ox , oy = @canvas . coords ( 'I14L_1' ) [ - 2 .. - 1 ]
@canvas . scale ( 'I14L_1' , ox , oy , sc , sc )
draw14a ( 'L' )
# Paper going up
sc = 0 . 35 + 0 . 05 * step
sc = 1 / sc
ox , oy = @canvas . coords ( 'I14R_0' )
@canvas . scale ( 'I14R_0' , ox , oy , sc , sc )
ox , oy = @canvas . coords ( 'I14R_1' ) [ - 2 .. - 1 ]
@canvas . scale ( 'I14R_1' , ox , oy , sc , sc )
draw14a ( 'R' )
return ( ( step == 10 ) ? 3 : 1 )
end
# Light beam
def draw15
color = @C [ '15a' ]
xy = [ 824 , 599 , 824 , 585 , 820 , 585 , 829 , 585 ]
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I15a' )
xy = [ 789 , 599 , 836 , 643 ]
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 3 )
xy = [ 778 , 610 , 788 , 632 ]
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 3 )
xy = [ 766 , 617 , 776 , 625 ]
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 3 )
xy = [ 633 , 600 , 681 , 640 ]
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 3 )
xy = [ 635 , 567 , 657 , 599 ]
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 2 )
xy = [ 765 , 557 , 784 , 583 ]
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 2 )
2009-03-06 03:56:38 +00:00
sine ( [ 658 , 580 , 765 , 580 ] , 3 , 15 ,
2005-03-02 07:06:52 +00:00
:tag = > 'I15_s' , :fill = > @C [ 'fg' ] , :width = > 3 )
end
def move15a
color = @C [ '15b' ]
@canvas . scale ( 'I15a' , 824 , 599 , 1 , 0 . 3 ) # Button down
xy = [ 765 , 621 , 681 , 621 ]
TkcLine . new ( @canvas , xy , :dash = > '-' , :width = > 3 , :fill = > color , :tag = > 'I15' )
end
def move15 ( step = nil )
step = get_step ( 15 , step )
numsteps = 6
if step == numsteps + 2
move_abs ( 'I15_star' , [ - 100 , - 100 ] )
return 2
end
if step == 0 # Break the light beam
sparkle ( [ - 100 , - 100 ] , 'I15_star' )
xy = [ 765 , 621 , 745 , 621 ]
@canvas . coords ( 'I15' , xy )
return 1
end
x0 , y0 = anchor ( 'I15_s' , :w )
x1 , y1 = anchor ( 'I15_s' , :e )
x = x0 + ( x1 - x0 ) * ( step - 1 ) / numsteps . to_f
move_abs ( 'I15_star' , [ x , y0 ] )
return 1
end
# Bell
def draw16
color = @C [ '16' ]
xy = [ 722 , 485 , 791 , 556 ]
TkcRectangle . new ( @canvas , xy , :fill = > '' , :outline = > @C [ 'fg' ] , :width = > 3 )
xy = box ( 752 , 515 , 25 ) # Bell
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :fill = > color , :outline = > 'black' ,
2005-03-02 07:06:52 +00:00
:tag = > 'I16b' , :width = > 2 )
xy = box ( 752 , 515 , 5 ) # Bell button
TkcOval . new ( @canvas , xy , :fill = > 'black' , :outline = > 'black' , :tag = > 'I16b' )
xy = [ 784 , 523 , 764 , 549 ] # Clapper
TkcLine . new ( @canvas , xy , :width = > 3 , :tag = > 'I16c' , :fill = > @C [ 'fg' ] )
xy = box ( 784 , 523 , 4 )
TkcOval . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :outline = > @C [ 'fg' ] , :tag = > 'I16d' )
end
def move16 ( step = nil )
step = get_step ( 16 , step )
# Note: we never stop
ox , oy = [ 760 , 553 ]
if ( step & 1 ) . nonzero?
beta = 12
@canvas . move ( 'I16b' , 3 , 0 )
else
beta = - 12
@canvas . move ( 'I16b' , - 3 , 0 )
end
rotate_item ( 'I16c' , ox , oy , beta )
rotate_item ( 'I16d' , ox , oy , beta )
return ( ( step == 1 ) ? 3 : 1 )
end
# Cat
def draw17
color = @C [ '17' ]
xy = [ 584 , 556 , 722 , 556 ]
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 )
xy = [ 584 , 485 , 722 , 485 ]
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 )
xy = [ 664 , 523 , 717 , 549 ] # Body
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :fill = > color , :width = > 3 ,
2005-03-02 07:06:52 +00:00
:style = > :chord , :start = > 128 , :extent = > 260 , :tag = > 'I17' )
xy = [ 709 , 554 , 690 , 543 ] # Paw
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :fill = > color ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I17' )
xy = [ 657 , 544 , 676 , 555 ]
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :fill = > color ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I17' )
xy = box ( 660 , 535 , 15 ) # Lower face
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 3 , :style = > :arc ,
2005-03-02 07:06:52 +00:00
:start = > 150 , :extent = > 240 , :tag = > 'I17_' )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > '' , :fill = > color , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :chord , :start = > 150 , :extent = > 240 , :tag = > 'I17_' )
xy = [ 674 , 529 , 670 , 513 , 662 , 521 , 658 , 521 , 650 , 513 , 647 , 529 ] # Ears
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I17_' )
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , xy , :fill = > color , :outline = > '' , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:tag = > [ 'I17_' , 'I17_c' ] )
xy = [ 652 , 542 , 628 , 539 ] # Whiskers
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I17_' )
xy = [ 652 , 543 , 632 , 545 ]
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I17_' )
xy = [ 652 , 546 , 632 , 552 ]
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I17_' )
xy = [ 668 , 543 , 687 , 538 ]
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 ,
2005-03-02 07:06:52 +00:00
:tag = > [ 'I17_' , 'I17_w' ] )
xy = [ 668 , 544 , 688 , 546 ]
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 ,
2005-03-02 07:06:52 +00:00
:tag = > [ 'I17_' , 'I17_w' ] )
xy = [ 668 , 547 , 688 , 553 ]
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 ,
2005-03-02 07:06:52 +00:00
:tag = > [ 'I17_' , 'I17_w' ] )
xy = [ 649 , 530 , 654 , 538 , 659 , 530 ] # Left eye
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 2 ,
2005-03-02 07:06:52 +00:00
:smooth = > true , :tag = > 'I17' )
xy = [ 671 , 530 , 666 , 538 , 661 , 530 ] # Right eye
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 2 ,
2005-03-02 07:06:52 +00:00
:smooth = > true , :tag = > 'I17' )
xy = [ 655 , 543 , 660 , 551 , 665 , 543 ] # Mouth
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 2 ,
2005-03-02 07:06:52 +00:00
:smooth = > true , :tag = > 'I17' )
end
def move17 ( step = nil )
step = get_step ( 17 , step )
if step == 0
@canvas . delete ( 'I17' ) # Delete most of the cat
xy = [ 655 , 543 , 660 , 535 , 665 , 543 ] # Mouth
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 ,
:smooth = > true , :tag = > 'I17_' )
xy = box ( 654 , 530 , 4 ) # Left eye
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 3 , :fill = > '' ,
2005-03-02 07:06:52 +00:00
:tag = > 'I17_' )
xy = box ( 666 , 530 , 4 ) # Right eye
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 3 , :fill = > '' ,
2005-03-02 07:06:52 +00:00
:tag = > 'I17_' )
@canvas . move ( 'I17_' , 0 , - 20 ) # Move face up
xy = [ 652 , 528 , 652 , 554 ] # Front leg
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I17_' )
xy = [ 670 , 528 , 670 , 554 ] # 2nd front leg
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I17_' )
xy = [ # Body
2009-03-06 03:56:38 +00:00
675 , 506 , 694 , 489 , 715 , 513 , 715 , 513 , 715 , 513 , 716 , 525 ,
716 , 525 , 716 , 525 , 706 , 530 , 695 , 530 , 679 , 535 , 668 , 527 ,
2005-03-02 07:06:52 +00:00
668 , 527 , 668 , 527 , 675 , 522 , 676 , 517 , 677 , 512
]
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , xy , :fill = > @canvas . itemcget ( 'I17_c' , :fill ) ,
:outline = > @C [ 'fg' ] , :width = > 3 , :smooth = > true ,
2005-03-02 07:06:52 +00:00
:tag = > 'I17_' )
xy = [ 716 , 514 , 716 , 554 ] # Back leg
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I17_' )
xy = [ 694 , 532 , 694 , 554 ] # 2nd back leg
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I17_' )
xy = [ 715 , 514 , 718 , 506 , 719 , 495 , 716 , 488 ] # Tail
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 ,
2005-03-02 07:06:52 +00:00
:smooth = > true , :tag = > 'I17_' )
@canvas . raise ( 'I17w' ) # Make whiskers visible
@canvas . move ( 'I17_' , - 5 , 0 ) # Move away from the wall a bit
return 2
end
return 0
end
# Sling shot
def draw18
color = @C [ '18' ]
xy = [ 721 , 506 , 627 , 506 ] # Sling hold
TkcLine . new ( @canvas , xy , :width = > 4 , :fill = > @C [ 'fg' ] , :tag = > 'I18' )
xy = [ 607 , 500 , 628 , 513 ] # Sling rock
TkcOval . new ( @canvas , xy , :fill = > color , :outline = > '' , :tag = > 'I18a' )
xy = [ 526 , 513 , 606 , 507 , 494 , 502 ] # Sling band
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 4 , :tag = > 'I18b' )
xy = [ 485 , 490 , 510 , 540 , 510 , 575 , 510 , 540 , 535 , 491 ] # Sling
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 6 )
end
def move18 ( step = nil )
step = get_step ( 18 , step )
pos = [
2009-03-06 03:56:38 +00:00
[ 587 , 506 ] , [ 537 , 506 ] , [ 466 , 506 ] , [ 376 , 506 ] , [ 266 , 506 , :x ] ,
2005-03-02 07:06:52 +00:00
[ 136 , 506 ] , [ 16 , 506 ] , [ - 100 , - 100 ]
]
b = [ ]
b [ 0 ] = [ 490 , 502 , 719 , 507 , 524 , 512 ] # Band collapsing
b [ 1 ] = [
2009-03-06 03:56:38 +00:00
491 , 503 , 524 , 557 , 563 , 505 , 559 , 496 , 546 , 506 , 551 , 525 ,
2005-03-02 07:06:52 +00:00
553 , 536 , 538 , 534 , 532 , 519 , 529 , 499
]
b [ 2 ] = [
491 , 503 , 508 , 563 , 542 , 533 , 551 , 526 , 561 , 539 , 549 , 550 , 530 , 500
]
b [ 3 ] = [
491 , 503 , 508 , 563 , 530 , 554 , 541 , 562 , 525 , 568 , 519 , 544 , 530 , 501
]
return 0 if step > = pos . length
if step == 0
@canvas . delete ( 'I18' )
@canvas . itemconfigure ( 'I18b' , :smooth = > true )
end
if b [ step ]
@canvas . coords ( 'I18b' , b [ step ] )
end
where = pos [ step ]
move_abs ( 'I18a' , where )
return 3 if where [ 2 ] == :x
return 1
end
# Water pipe
def draw19
color = @C [ '19' ]
xx = [ [ 249 , 181 ] , [ 155 , 118 ] , [ 86 , 55 ] , [ 22 , 0 ] ]
xx . each { | x1 , x2 |
2009-03-06 03:56:38 +00:00
TkcRectangle . new ( @canvas , x1 , 453 , x2 , 467 ,
2005-03-02 07:06:52 +00:00
:fill = > color , :outline = > '' , :tag = > 'I19' )
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , x1 , 453 , x2 , 453 ,
2005-03-02 07:06:52 +00:00
:fill = > @C [ 'fg' ] , :width = > 1 ) # Pipe top
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , x1 , 467 , x2 , 467 ,
2005-03-02 07:06:52 +00:00
:fill = > @C [ 'fg' ] , :width = > 1 ) # Pipe bottom
}
@canvas . raise ( 'I11i' )
xy = box ( 168 , 460 , 16 ) # Bulge by the joint
TkcOval . new ( @canvas , xy , :fill = > color , :outline = > '' )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 1 , :style = > :arc ,
2005-03-02 07:06:52 +00:00
:start = > 21 , :extent = > 136 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 1 , :style = > :arc ,
2005-03-02 07:06:52 +00:00
:start = > - 21 , :extent = > - 130 )
xy = [ 249 , 447 , 255 , 473 ] # First joint 26x6
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 1 )
xy = box ( 257 , 433 , 34 ) # Bend up
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > '' , :fill = > color , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :pie , :start = > 0 , :extent = > - 91 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :arc , :start = > 0 , :extent = > - 90 )
xy = box ( 257 , 433 , 20 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > '' , :fill = > @C [ 'bg' ] , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :pie , :start = > 0 , :extent = > - 92 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :arc , :start = > 0 , :extent = > - 90 )
xy = box ( 257 , 421 , 34 ) # Bend left
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > '' , :fill = > color , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :pie , :start = > 0 , :extent = > 91 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :arc , :start = > 0 , :extent = > 90 )
xy = box ( 257 , 421 , 20 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > '' , :fill = > @C [ 'bg' ] , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :pie , :start = > 0 , :extent = > 90 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :arc , :start = > 0 , :extent = > 90 )
xy = box ( 243 , 421 , 34 ) # Bend down
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > '' , :fill = > color , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :pie , :start = > 90 , :extent = > 90 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :arc , :start = > 90 , :extent = > 90 )
xy = box ( 243 , 421 , 20 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > '' , :fill = > @C [ 'bg' ] , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :pie , :start = > 90 , :extent = > 90 )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 1 ,
2005-03-02 07:06:52 +00:00
:style = > :arc , :start = > 90 , :extent = > 90 )
xy = [ 270 , 427 , 296 , 433 ] # 2nd joint bottom
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 1 )
xy = [ 270 , 421 , 296 , 427 ] # 2nd joint top
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 1 )
xy = [ 249 , 382 , 255 , 408 ] # Third joint right
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 1 )
xy = [ 243 , 382 , 249 , 408 ] # Third joint left
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 1 )
xy = [ 203 , 420 , 229 , 426 ] # Last joint
TkcRectangle . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 1 )
xy = box ( 168 , 460 , 6 ) # Handle joint
TkcOval . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :outline = > '' , :tag = > 'I19a' )
xy = [ 168 , 460 , 168 , 512 ] # Handle bar
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 5 , :tag = > 'I19b' )
end
def move19 ( step = nil )
step = get_step ( 19 , step )
angles = [ 30 , 30 , 30 ]
return 2 if step == angles . length
ox , oy = centroid ( 'I19a' )
rotate_item ( 'I19b' , ox , oy , angles [ step ] )
return 1
end
# Water pouring
def draw20
# do nothing
end
def move20 ( step = nil )
step = get_step ( 20 , step )
pos = [ 451 , 462 , 473 , 484 , 496 , 504 , 513 , 523 , 532 ]
freq = [ 20 , 40 , 40 , 40 , 40 , 40 , 40 , 40 , 40 ]
pos = [
2009-03-06 03:56:38 +00:00
[ 451 , 20 ] , [ 462 , 40 ] , [ 473 , 40 ] , [ 484 , 40 ] , [ 496 , 40 ] ,
2005-03-02 07:06:52 +00:00
[ 504 , 40 ] , [ 513 , 40 ] , [ 523 , 40 ] , [ 532 , 40 , :x ]
]
return 0 if step > = pos . length
@canvas . delete ( 'I20' )
where = pos [ step ]
y , f = where
h20 ( y , f )
return 3 if where [ 2 ] == :x
return 1
end
def h20 ( y , f )
color = @C [ '20' ]
@canvas . delete ( 'I20' )
2009-03-06 03:56:38 +00:00
sine ( [ 208 , 428 , 208 , y ] , 4 , f , :tag = > [ 'I20' , 'I20s' ] ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :fill = > color , :smooth = > true )
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , @canvas . coords ( 'I20s' ) , :width = > 3 ,
2005-03-02 07:06:52 +00:00
:fill = > color , :smooth = > 1 , :tag = > [ 'I20' , 'I20a' ] )
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , @canvas . coords ( 'I20s' ) , :width = > 3 ,
2005-03-02 07:06:52 +00:00
:fill = > color , :smooth = > 1 , :tag = > [ 'I20' , 'I20b' ] )
@canvas . move ( 'I20a' , 8 , 0 )
@canvas . move ( 'I20b' , 16 , 0 )
end
# Bucket
def draw21
color = @C [ '21' ]
xy = [ 217 , 451 , 244 , 490 ] # Right handle
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 2 , :tag = > 'I21_a' )
xy = [ 201 , 467 , 182 , 490 ] # Left handle
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 2 , :tag = > 'I21_a' )
xy = [ 245 , 490 , 237 , 535 ] # Right side
xy2 = [ 189 , 535 , 181 , 490 ] # Left side
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , xy + xy2 , :fill = > color , :outline = > '' ,
2005-03-02 07:06:52 +00:00
:tag = > [ 'I21' , 'I21f' ] )
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 2 , :tag = > 'I21' )
TkcLine . new ( @canvas , xy2 , :fill = > @C [ 'fg' ] , :width = > 2 , :tag = > 'I21' )
xy = [ 182 , 486 , 244 , 498 ] # Top
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :fill = > color , :outline = > '' , :width = > 2 ,
2005-03-02 07:06:52 +00:00
:tag = > [ 'I21' , 'I21f' ] )
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :fill = > '' , :outline = > @C [ 'fg' ] , :width = > 2 ,
2005-03-02 07:06:52 +00:00
:tag = > [ 'I21' , 'I21t' ] )
xy = [ 189 , 532 , 237 , 540 ] # Bottom
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] , :width = > 2 ,
2005-03-02 07:06:52 +00:00
:tag = > [ 'I21' , 'I21b' ] )
end
def move21 ( step = nil )
step = get_step ( 21 , step )
numsteps = 30
return 0 if step > = numsteps
x1 , y1 , x2 , y2 = @canvas . coords ( 'I21b' )
# lx1, ly1, lx2, ly2 = @canvas.coords('I21t')
lx1 , ly1 , lx2 , ly2 = [ 183 , 492 , 243 , 504 ]
f = step / numsteps . to_f
y2 = y2 - 3
xx1 = x1 + ( lx1 - x1 ) * f
yy1 = y1 + ( ly1 - y1 ) * f
xx2 = x2 + ( lx2 - x2 ) * f
yy2 = y2 + ( ly2 - y2 ) * f
@canvas . itemconfigure ( 'I21b' , :fill = > @C [ '20' ] )
@canvas . delete ( 'I21w' )
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , x2 , y2 , x1 , y1 , xx1 , yy1 , xx2 , yy1 ,
2005-03-02 07:06:52 +00:00
:tag = > [ 'I21' , 'I21w' ] , :outline = > '' , :fill = > @C [ '20' ] )
@canvas . lower ( 'I21w' , 'I21' )
@canvas . raise ( 'I21b' )
@canvas . lower ( 'I21f' )
return ( ( step == numsteps - 1 ) ? 3 : 1 )
end
# Bucket drop
def draw22
# do nothing
end
def move22 ( step = nil )
step = get_step ( 22 , step )
pos = [ [ 213 , 513 ] , [ 213 , 523 ] , [ 213 , 543 , :x ] , [ 213 , 583 ] , [ 213 , 593 ] ]
@canvas . itemconfigure ( 'I21f' , :fill = > @C [ '22' ] ) if step == 0
return 0 if step > = pos . length
where = pos [ step ]
move_abs ( 'I21' , where )
h20 ( where [ 1 ] , 40 )
@canvas . delete ( 'I21_a' ) # Delete handles
return 3 if where [ 2 ] == :x
return 1
end
# Blow dart
def draw23
color = @C [ '23a' ]
color2 = @C [ '23b' ]
color3 = @C [ '23c' ]
xy = [ 185 , 623 , 253 , 650 ] # Block
2009-03-06 03:56:38 +00:00
TkcRectangle . new ( @canvas , xy , :fill = > 'black' , :outline = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:width = > 2 , :tag = > 'I23a' )
xy = [ 187 , 592 , 241 , 623 ] # Balloon
TkcOval . new ( @canvas , xy , :outline = > '' , :fill = > color , :tag = > 'I23b' )
2009-03-06 03:56:38 +00:00
TkcArc . new ( @canvas , xy , :outline = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I23b' ,
2005-03-02 07:06:52 +00:00
:style = > :arc , :start = > 12 , :extent = > 336 )
xy = [ 239 , 604 , 258 , 589 , 258 , 625 , 239 , 610 ] # Balloon nozzle
TkcPolygon . new ( @canvas , xy , :outline = > '' , :fill = > color , :tag = > 'I23b' )
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I23b' )
xy = [ 285 , 611 , 250 , 603 ] # Dart body
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :fill = > color2 , :outline = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I23d' )
xy = [ 249 , 596 , 249 , 618 , 264 , 607 , 249 , 596 ] # Dart tail
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , xy , :fill = > color3 , :outline = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I23d' )
xy = [ 249 , 607 , 268 , 607 ] # Dart detail
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I23d' )
xy = [ 285 , 607 , 305 , 607 ] # Dart needle
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I23d' )
end
def move23 ( step = nil )
step = get_step ( 23 , step )
pos = [
2009-03-06 03:56:38 +00:00
[ 277 , 607 ] , [ 287 , 607 ] , [ 307 , 607 , :x ] , [ 347 , 607 ] , [ 407 , 607 ] ,
2005-03-02 07:06:52 +00:00
[ 487 , 607 ] , [ 587 , 607 ] , [ 687 , 607 ] , [ 787 , 607 ] , [ - 100 , - 100 ]
]
return 0 if step > = pos . length
if step < = 1
ox , oy = anchor ( 'I23a' , :n )
@canvas . scale ( 'I23b' , ox , oy , 0 . 9 , 0 . 5 )
end
where = pos [ step ]
move_abs ( 'I23d' , where )
return 3 if where [ 2 ] == :x
return 1
end
# Balloon
def draw24
color = @C [ '24a' ]
xy = [ 366 , 518 , 462 , 665 ] # Balloon
2009-03-06 03:56:38 +00:00
TkcOval . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] ,
2005-03-02 07:06:52 +00:00
:width = > 3 , :tag = > 'I24' )
xy = [ 414 , 666 , 414 , 729 ] # String
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :width = > 3 , :tag = > 'I24' )
xy = [ 410 , 666 , 404 , 673 , 422 , 673 , 418 , 666 ] # Nozzle
TkcPolygon . new ( @canvas , xy , :fill = > color , :outline = > @C [ 'fg' ] ,
:width = > 3 , :tag = > 'I24' )
xy = [ 387 , 567 , 390 , 549 , 404 , 542 ] # Reflections
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :smooth = > true ,
2005-03-02 07:06:52 +00:00
:width = > 2 , :tag = > 'I24' )
xy = [ 395 , 568 , 399 , 554 , 413 , 547 ]
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :smooth = > true ,
2005-03-02 07:06:52 +00:00
:width = > 2 , :tag = > 'I24' )
xy = [ 403 , 570 , 396 , 555 , 381 , 553 ]
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :smooth = > true ,
2005-03-02 07:06:52 +00:00
:width = > 2 , :tag = > 'I24' )
xy = [ 408 , 564 , 402 , 547 , 386 , 545 ]
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , xy , :fill = > @C [ 'fg' ] , :smooth = > true ,
2005-03-02 07:06:52 +00:00
:width = > 2 , :tag = > 'I24' )
end
def move24 ( step = nil )
step = get_step ( 24 , step )
return 0 if step > 4
return 2 if step == 4
if step == 0
@canvas . delete ( 'I24' ) # Exploding balloon
xy = [
2009-03-06 03:56:38 +00:00
347 , 465 , 361 , 557 , 271 , 503 , 272 , 503 , 342 , 574 , 259 , 594 ,
259 , 593 , 362 , 626 , 320 , 737 , 320 , 740 , 398 , 691 , 436 , 738 ,
436 , 739 , 476 , 679 , 528 , 701 , 527 , 702 , 494 , 627 , 548 , 613 ,
548 , 613 , 480 , 574 , 577 , 473 , 577 , 473 , 474 , 538 , 445 , 508 ,
2005-03-02 07:06:52 +00:00
431 , 441 , 431 , 440 , 400 , 502 , 347 , 465 , 347 , 465
]
2009-03-06 03:56:38 +00:00
TkcPolygon . new ( @canvas , xy , :tag = > 'I24' , :fill = > @C [ '24b' ] ,
2005-03-02 07:06:52 +00:00
:outline = > @C [ '24a' ] , :width = > 10 , :smooth = > true )
msg = Tk . subst ( @S [ 'message' ] . value )
2009-03-06 03:56:38 +00:00
TkcText . new ( @canvas , centroid ( 'I24' ) , :text = > msg , :tag = > [ 'I24' , 'I24t' ] ,
2005-03-02 07:06:52 +00:00
:justify = > :center , :font = > [ 'Times Roman' , 18 , :bold ] )
return 1
end
@canvas . itemconfigure ( 'I24t' , :font = > [ 'Times Roman' , 18 + 6 * step , :bold ] )
@canvas . move ( 'I24' , 0 , - 60 )
ox , oy = centroid ( 'I24' )
@canvas . scale ( 'I24' , ox , oy , 1 . 25 , 1 . 25 )
return 1
end
# Displaying the message
def move25 ( step = nil )
step = get_step ( 25 , step )
if step == 0
2015-12-27 09:58:48 +00:00
@XY [ '25' ] = Tk :: Clock . clicks ( :milliseconds )
2005-03-02 07:06:52 +00:00
return 1
end
2015-12-27 09:58:48 +00:00
elapsed = Tk :: Clock . clicks ( :milliseconds ) - @XY [ '25' ]
2005-03-02 07:06:52 +00:00
return 1 if elapsed < 5000
return 2
end
# Collapsing balloon
def move26 ( step = nil )
step = get_step ( 26 , step )
if step > = 3
@canvas . delete ( 'I24' , 'I26' )
2009-03-06 03:56:38 +00:00
TkcText . new ( @canvas , 430 , 735 , :anchor = > :s , :tag = > 'I26' ,
#:text=>'click to continue',
2011-09-14 17:25:37 +00:00
:text = > 'クリックでリセットします' ,
2005-04-09 04:38:00 +00:00
:font = > [ 'Times Roman' , 20 , :bold ] )
2005-03-02 07:06:52 +00:00
@canvas . bind ( '1' , proc { reset } )
return 4
end
ox , oy = centroid ( 'I24' )
@canvas . scale ( 'I24' , ox , oy , 0 . 8 , 0 . 8 )
@canvas . move ( 'I24' , 0 , 60 )
@canvas . itemconfigure ( 'I24t' , :font = > [ 'Times Roman' , 30 - 6 * step , :bold ] )
return 1
end
################################################################
#
# Helper functions
#
def box ( x , y , r )
[ x - r , y - r , x + r , y + r ]
end
def move_abs ( item , xy )
x , y = xy
ox , oy = centroid ( item )
dx = x - ox
dy = y - oy
@canvas . move ( item , dx , dy )
end
def rotate_item ( item , ox , oy , beta )
xy = @canvas . coords ( item )
xy2 = [ ]
0 . step ( xy . length - 1 , 2 ) { | idx |
x , y = xy [ idx , 2 ]
xy2 . concat ( rotate_c ( x , y , ox , oy , beta ) )
}
@canvas . coords ( item , xy2 )
end
def rotate_c ( x , y , ox , oy , beta )
# rotates vector (ox,oy)->(x,y) by beta degrees clockwise
x -= ox # Shift to origin
y -= oy
beta = beta * Math . atan ( 1 ) * 4 / 180 . 0 # Radians
xx = x * Math . cos ( beta ) - y * Math . sin ( beta ) # Rotate
yy = x * Math . sin ( beta ) + y * Math . cos ( beta )
xx += ox # Shift back
yy += oy
[ xx , yy ]
end
def reset
draw_all
@canvas . bind_remove ( '1' )
@S [ 'mode' ] . value = :MSTART
@S [ 'active' ] = [ 0 ]
end
# Each Move## keeps its state info in STEP, this retrieves and increments it
def get_step ( who , step )
if step
@STEP [ who ] = step
else
if ! @STEP . exist? ( who ) || @STEP [ who ] == " "
@STEP [ who ] = 0
else
@STEP [ who ] += 1
end
end
@STEP [ who ]
end
def reset_step
@S [ 'cnt' ] . value = 0
@STEP . keys . each { | k | @STEP [ k ] = '' }
end
def sine ( xy0 , amp , freq , opts = { } )
x0 , y0 , x1 , y1 = xy0
step = 2
xy = [ ]
if y0 == y1 # Horizontal
x0 . step ( x1 , step ) { | x |
beta = ( x - x0 ) * 2 * Math :: PI / freq
y = y0 + amp * Math . sin ( beta )
xy << x << y
}
else
y0 . step ( y1 , step ) { | y |
beta = ( y - y0 ) * 2 * Math :: PI / freq
x = x0 + amp * Math . sin ( beta )
xy << x << y
}
end
TkcLine . new ( @canvas , xy , opts )
end
def round_rect ( xy , radius , opts = { } )
x0 , y0 , x3 , y3 = xy
r = @canvas . winfo_pixels ( radius )
d = 2 * r
# Make sure that the radius of the curve is less than 3/8 size of the box!
maxr = 0 . 75
if d > maxr * ( x3 - x0 )
d = maxr * ( x3 - x0 )
end
if d > maxr * ( y3 - y0 )
d = maxr * ( y3 - y0 )
end
x1 = x0 + d
x2 = x3 - d
y1 = y0 + d
y2 = y3 - d
xy = [ x0 , y0 , x1 , y0 , x2 , y0 , x3 , y0 , x3 , y1 , x3 , y2 ]
xy . concat ( [ x3 , y3 , x2 , y3 , x1 , y3 , x0 , y3 , x0 , y2 , x0 , y1 ] )
return xy
end
def round_poly ( canv , xy , radii , opts )
lenXY = xy . length
lenR = radii . length
if lenXY != 2 * lenR
raise " wrong number of vertices and radii "
end
knots = [ ]
x0 = xy [ - 2 ] ; y0 = xy [ - 1 ]
x1 = xy [ 0 ] ; y1 = xy [ 1 ]
xy << xy [ 0 ] << xy [ 1 ]
0 . step ( lenXY - 1 , 2 ) { | i |
radius = radii [ i / 2 ]
r = canv . winfo_pixels ( radius )
x2 = xy [ i + 2 ] ; y2 = xy [ i + 3 ]
z = _round_poly2 ( x0 , y0 , x1 , y1 , x2 , y2 , r )
knots . concat ( z )
x0 = x1 ; y0 = y1
x1 = x2 ; y1 = y2
}
TkcPolygon . new ( canv , knots , { :smooth = > true } . update ( opts ) )
end
def _round_poly2 ( x0 , y0 , x1 , y1 , x2 , y2 , radius )
d = 2 * radius
maxr = 0 . 75
v1x = x0 - x1
v1y = y0 - y1
v2x = x2 - x1
v2y = y2 - y1
vlen1 = Math . sqrt ( v1x * v1x + v1y * v1y )
vlen2 = Math . sqrt ( v2x * v2x + v2y * v2y )
if d > maxr * vlen1
d = maxr * vlen1
end
if d > maxr * vlen2
d = maxr * vlen2
end
xy = [ ]
xy << ( x1 + d * v1x / vlen1 ) << ( y1 + d * v1y / vlen1 )
xy << x1 << y1
xy << ( x1 + d * v2x / vlen2 ) << ( y1 + d * v2y / vlen2 )
return xy
end
def sparkle ( oxy , tag )
xy = [
2009-03-06 03:56:38 +00:00
[ 299 , 283 ] , [ 298 , 302 ] , [ 295 , 314 ] , [ 271 , 331 ] ,
2005-03-02 07:06:52 +00:00
[ 239 , 310 ] , [ 242 , 292 ] , [ 256 , 274 ] , [ 281 , 273 ]
]
xy . each { | x , y |
2009-03-06 03:56:38 +00:00
TkcLine . new ( @canvas , 271 , 304 , x , y ,
2005-03-02 07:06:52 +00:00
:fill = > 'white' , :width = > 3 , :tag = > tag )
}
move_abs ( tag , oxy )
end
def centroid ( item )
anchor ( item , :c )
end
def anchor ( item , where )
x1 , y1 , x2 , y2 = @canvas . bbox ( item )
case ( where )
when :n
y = y1
when :s
y = y2
else
y = ( y1 + y2 ) / 2 . 0
end
case ( where )
when :w
x = x1
when :e
x = x2
else
x = ( x1 + x2 ) / 2 . 0
end
return [ x , y ]
end
end
* ext/tk/tcltklib.c: SEGV when tcltk-stubs is enabled.
* ext/tk/tcltklib.c: avoid error on a shared object.
* ext/tk/extconf.rb: support --with-tcltkversion
* ext/tk/README.tcltklib: add document about --with-tcltkversion
* ext/tk/lib/tk.rb, ext/tk/lib/multi-tk.rb, ext/tk/lib/remote-tk.rb:
not work on $SAFE==4
* ext/tk/lib/multi-tk.rb: Object#methods returns Symbols on Ruby1.9.
* ext/tk/lib/tk/timer.rb: add TkTimer#at_end(proc) to register the
procedure which called at end of the timer.
* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemfont.rb, ext/tk/lib/font.rb:
support __IGNORE_UNKNOWN_CONFIGURE_OPTION__ about font options.
* ext/tk/lib/*: treat __IGNORE_UNKNOWN_CONFIGURE_OPTION__
* ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb,
ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb,
ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb: bug fix.
* ext/tk/lib/tk/text.rb: typo. call a wrong method.
* ext/tk/lib/tk/itemconfig.rb: ditto.
* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemconfig.rb,
ext/tk/lib/tk/canvas.rb: support alias names of option keys.
* ext/tk/lib/tk/grid.rb: lack of module-method definitions.
* ext/tk/lib/tk/pack.rb, ext/tk/lib/tk/grid.rb: increase supported
parameter patterns of configure method.
* ext/tk/lib/tk.rb: add TkWindow#grid_anchor, grid_column, grid_row.
* ext/tk/lib/tk/wm.rb: methods of Tk::Wm_for_General module cannot
pass the given block to methods of Tk::Wm module.
* ext/tk/lib/tk/wm.rb: Wm#overrideredirect overwrites arguemnt to
an invalid value.
* ext/tk/lib/tk.rb: fix memory (object) leak bug.
* ext/tk/tcltklib.c, ext/tk/tkutil/tkutil.c: fix memory leak.
* ext/tk/sample/demos-jp/aniwave.rb, ext/tk/sample/demos-en/aniwave.rb:
bug fix.
* ext/tk/lib/tkextlib/blt/component.rb,
ext/tk/lib/tkextlib/tile/tentry.rb,
ext/tk/lib/tkextlib/tile/treeview.rb: ditto.
* ext/tk/lib/tkextlib/tile/tpaned.rb: improve TPaned#add.
* ext/tk/sample/demos-jp/widget, ext/tk/sample/demos-en/widget,
ext/tk/sample/demos-jp/style.rb, ext/tk/sample/demos-en/style.rb,
ext/tk/sample/demos-jp/bind.rb, ext/tk/sample/demos-en/bind.rb:
bug fix.
* ext/tk/sample/ttk_wrapper.rb: ditto.
* ext/tk/sample/ttk_wrapper.rb: support "if __FILE__ == $0" idiom.
* ext/tk/sample/tktextio.rb: add binding for 'Ctrl-u' at console mode.
* ext/tk/lib/tkextlib/tile.rb, ext/tk/lib/tkextlib/tile/style.rb,
ext/tk/sample/ttk_wrapper.rb: improve treating and control themes.
add Tk::Tile.themes and Tk::Tile.set_theme(theme).
* ext/tk/lib/tkextlib/tile.rb: lack of autoload definitions.
* ext/tk/lib/tkextlib/tile/tnotebook.rb: cannot use kanji (not UTF-8)
characters for headings.
* ext/tk/lib/tkextlib/tkDND/shape.rb: wrong package name.
* ext/tk/tkutil/tkutil.c: improve handling callback-subst-keys.
Now, support longnam-keys (e.g. '%CTT' on tkdnd-2.0; however, still
not support tkdnd-2.0 on tkextlib), and symbols of parameters (e.g.
:widget=>'%W', :keycode=>'%k', '%x'=>:x, '%X'=>:root_x, and so on;
those are attributes of event object). It means that Ruby/Tk accepts
not only "widget.bind(ev, '%W', '%k', ...){|w, k, ...| ... }", but
also "widget.bind(ev, :widget, :keycode, ...){|w, k, ...| ... }".
It is potentially incompatible, when user passes symbols to the
arguments of the callback block (the block receives the symbols as
strings). I think that is very rare case (probably, used by Ruby/Tk
experts only). When causes such trouble, please give strings instead
of such symbol parameters (e.g. call Symbol#to_s method).
* ext/tk/lib/tk/event.rb, ext/tk/lib/tk/validation.rb,
ext/tk/lib/tkextlib/blt/treeview.rb,
ext/tk/lib/tkextlib/winico/winico.rb: ditto.
* ext/tk/tkutil/tkutil.c: strings are available on subst_tables on
TkUtil::CallbackSubst class (it is useful on Ruby 1.9).
* ext/tk/lib/tk/spinbox.rb, ext/tk/lib/tkextlib/iwidgets/hierarchy.rb,
ext/tk/lib/tkextlib/iwidgets/spinner.rb,
ext/tk/lib/tkextlib/iwidgets/entryfield.rb,
ext/tk/lib/tkextlib/iwidgets/calendar.rb,
ext/tk/lib/tkextlib/blt/dragdrop.rb,
ext/tk/lib/tkextlib/tkDND/tkdnd.rb,
ext/tk/lib/tkextlib/treectrl/tktreectrl.rb,
ext/tk/lib/tkextlib/tktable/tktable.rb: disable code piece became
unnecessary by reason of the changes of ext/tk/tkutil/tkutil.c.
* ext/tk/lib/tk.rb, ext/tk/lib/multi-tk.rb: change strategy to define
the constant WITH_ENCODING.
* ext/tk/lib/tk.rb: fix bug on Tk::Encoding.tk_encoding_names.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17083 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-10 20:59:10 +00:00
TkGoldberg_Demo . new ( base_frame )