ruby/ext/tk/sample/cd_timer.rb
nagai 41b74c6e20 * ext/tk/extconf.rb: New strategy for searching Tcl/Tk libraries.
* ext/tk/*: Support new features of Tcl/Tk8.6b1 and minor bug fixes.
     ( [KNOWN BUG] Ruby/Tk on Ruby 1.9 will not work on Cygwin. )
* ext/tk/*: Unify sources between Ruby 1.8 & 1.9.
            Improve default_widget_set handling.
* ext/tk/*: Multi-TkInterpreter (multi-tk.rb) works on Ruby 1.8 & 1.9.
     ( [KNOWN BUG] On Ruby 1.8, join to a long term Thread on Tk
       callbacks may freeze. On Ruby 1.9, cannot create a second 
       master interpreter (creating slaves are OK); supported master
       interpreter is the default master interpreter only. )
* ext/tk/lib/tkextlib/*: Update supported versions of Tk extensions.
         Tcllib 1.8/Tklib 0.4.1  ==>  Tcllib 1.11.1/Tklib 0.5
         BWidgets 1.7            ==>  BWidgets 1.8
         TkTable 2.9             ==>  TkTable 2.10
         TkTreeCtrl 2005-12-02   ==>  TkTreeCtrl 2.2.9
         Tile 0.8.0/8.5.1        ==>  Tile 0.8.3/8.6b1
         IncrTcl 2005-02-14      ==>  IncrTcl 2008-12-15
         TclX 2005-02-07         ==>  TclX 2008-12-15
         Trofs 0.4.3             ==>  Trofs 0.4.4


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@24064 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-07-12 23:09:52 +00:00

81 lines
2.3 KiB
Ruby

#!/usr/bin/env ruby
#
# countdown timer
# usage: cd_timer min [, min ... ]
# ( e.g. cd_timer 0.5 1 3 5 10 )
#
require 'tk'
if ARGV.empty?
$stderr.puts 'Error:: No time arguments for counting down'
exit(1)
end
width = 10
TkButton.new(:text=>'exit',
:command=>proc{exit}).pack(:side=>:bottom, :fill=>:x)
b = TkButton.new(:text=>'start').pack(:side=>:top, :fill=>:x)
f = TkFrame.new(:relief=>:ridge, :borderwidth=>2).pack(:fill=>:x)
TkLabel.new(f, :relief=>:flat, :pady=>3,
:background=>'black', :foreground=>'white',
:text=>' elapsed: ').pack(:fill=>:x, :side=>:left, :expand=>true)
now = TkLabel.new(f, :width=>width, :relief=>:flat, :pady=>3, :anchor=>:w,
:background=>'black', :foreground=>'white',
:text=>'%4d:%02d.00' % [0, 0]).pack(:side=>:right)
timers = [ TkRTTimer.new(10){|tm|
t = (tm.return_value || 0) + 1
s, u = t.divmod(100)
m, s = s.divmod(60)
now.text('%4d:%02d.%02d' % [m, s, u])
t
}.set_start_proc(0, proc{
now.text('%4d:%02d.00' % [0,0])
now.foreground('white')
0
})
]
ARGV.collect{|arg| (Float(arg) * 60).to_i}.sort.each_with_index{|time, idx|
f = TkFrame.new(:relief=>:ridge, :borderwidth=>2).pack(:fill=>:x)
TkLabel.new(f, :relief=>:flat, :pady=>3,
:text=>' %4d:%02d --> ' % (time.divmod(60))).pack(:side=>:left)
l = TkLabel.new(f, :width=>width, :relief=>:flat, :pady=>3, :anchor=>:w,
:text=>'%4d:%02d' % (time.divmod(60))).pack(:side=>:right)
timers << TkRTTimer.new(1000){|tm|
t = (tm.return_value || time) - 1
if t < 0
l.text('%4d:%02d' % ((-t).divmod(60)))
else
l.text('%4d:%02d' % (t.divmod(60)))
end
if t.zero?
l.foreground('red')
idx.times{Tk.bell}
end
t
}.set_start_proc(0, proc{
l.text('%4d:%02d' % (time.divmod(60)))
l.foreground('black')
time
})
}
mode = :start
b.command(proc{
if mode == :start
timers.each{|timer| timer.restart}
b.text('reset')
mode = :reset
else
timers.each{|timer| timer.stop.reset}
b.text('start')
mode = :start
end
})
Tk.mainloop