2004-07-14 21:18:57 -04:00
|
|
|
#!/usr/bin/env ruby
|
|
|
|
##
|
|
|
|
## buttons.rb
|
|
|
|
##
|
|
|
|
## demonstrates the simulation of a button array
|
|
|
|
##
|
|
|
|
## ( based on 'buttons.tcl' included source archive of tktable extension )
|
|
|
|
##
|
|
|
|
require 'tk'
|
|
|
|
require 'tkextlib/tktable'
|
|
|
|
|
|
|
|
# create the table
|
|
|
|
tab = TkVariable.new_hash
|
|
|
|
rows = 20
|
|
|
|
cols = 20
|
|
|
|
|
2009-03-05 22:56:38 -05:00
|
|
|
table = Tk::TkTable.new(:rows=>rows + 1, :cols=>cols + 1,
|
|
|
|
:variable=>tab, :titlerows=>1, :titlecols=>1,
|
|
|
|
:roworigin=>-1, :colorigin=>-1,
|
|
|
|
:colwidth=>4, :width=>8, :height=>8,
|
|
|
|
:cursor=>'top_left_arrow', :borderwidth=>2,
|
2004-10-11 00:51:21 -04:00
|
|
|
:flashmode=>false, :state=>:disabled)
|
2004-07-14 21:18:57 -04:00
|
|
|
|
|
|
|
sx = table.xscrollbar(TkScrollbar.new)
|
|
|
|
sy = table.yscrollbar(TkScrollbar.new)
|
|
|
|
|
|
|
|
Tk.grid(table, sy, :sticky=>:news)
|
|
|
|
Tk.grid(sx, :sticky=>:ew)
|
|
|
|
|
|
|
|
Tk.root.grid_columnconfig(0, :weight=>1)
|
|
|
|
Tk.root.grid_rowconfig(0, :weight=>1)
|
|
|
|
|
|
|
|
# set up tags for the various states of the buttons
|
|
|
|
table.tag_configure('OFF', :bg=>'red', :relief=>:raised)
|
|
|
|
table.tag_configure('ON', :bg=>'green', :relief=>:sunken)
|
|
|
|
table.tag_configure('sel', :bg=>'gray75', :relief=>:flat)
|
|
|
|
|
|
|
|
# clean up if mouse leaves the widget
|
|
|
|
table.bind('Leave', proc{|w| w.selection_clear_all}, '%W')
|
|
|
|
|
|
|
|
# highlight the cell under the mouse
|
|
|
|
table.bind('Motion', proc{|w, x, y|
|
2004-10-11 00:51:21 -04:00
|
|
|
Tk.callback_break if w.selection_include?(TkComm._at(x,y))
|
|
|
|
w.selection_clear_all
|
|
|
|
w.selection_set(TkComm._at(x,y))
|
|
|
|
Tk.callback_break
|
|
|
|
## "break" prevents the call to tkTableCheckBorder
|
|
|
|
}, '%W %x %y')
|
2004-07-14 21:18:57 -04:00
|
|
|
|
|
|
|
# mousebutton 1 toggles the value of the cell
|
|
|
|
# use of "selection includes" would work here
|
|
|
|
table.bind('1', proc{|w, x, y|
|
2004-10-11 00:51:21 -04:00
|
|
|
#rc = w.curselection[0]
|
|
|
|
rc = w.index(TkComm._at(x,y))
|
|
|
|
if tab[rc] == 'ON'
|
|
|
|
tab[rc] = 'OFF'
|
|
|
|
w.tag_cell('OFF', rc)
|
|
|
|
else
|
|
|
|
tab[rc] = 'ON'
|
|
|
|
w.tag_cell('ON', rc)
|
|
|
|
end}, '%W %x %y')
|
2004-07-14 21:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
# inititialize the array, titles, and celltags
|
|
|
|
0.step(rows){|i|
|
|
|
|
tab[i,-1] = i
|
|
|
|
0.step(cols){|j|
|
|
|
|
if i == 0
|
|
|
|
tab[-1,j] = j
|
2009-03-05 22:56:38 -05:00
|
|
|
end
|
2004-07-14 21:18:57 -04:00
|
|
|
tab[i,j] = "OFF"
|
|
|
|
table.tag_cell('OFF', "#{i},#{j}")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Tk.mainloop
|