1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/ext/tk/sample/tkalignbox.rb
nagai ed6ce8b43b * 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/trunk@24063 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-07-12 23:08:32 +00:00

235 lines
6.4 KiB
Ruby

#
# tkalignbox.rb : align widgets with same width/height
#
# by Hidetoshi NAGAI
#
# The box size depends on 'reqheight' and 'reqwidth' of contained widgets.
# If you want to give the box size when those requested sizes are 0,
# please set box.propagate = false (See the test routine at the tail of
# this file).
require 'tk'
module Tk
module RbWidget
class AlignBox < TkFrame
end
end
end
class Tk::RbWidget::AlignBox < TkFrame
def initialize(*args)
if self.class == Tk::RbWidget::AlignBox
fail RuntimeError, "Tk::AlignBox is an abstract class"
end
@padx = 0
@pady = 0
if args[-1].kind_of? Hash
keys = _symbolkey2str(args.pop)
@padx = keys.delete('padx') || 0
@pady = keys.delete('pady') || 0
args.push(keys)
end
super(*args)
@max_width = 0
@max_height = 0
@propagate = true
@widgets = []
end
def _set_framesize
fail RuntimeError, "Tk::AlignBox is an abstract class"
end
private :_set_framesize
def _place_config(widget, idx, cnt)
fail RuntimeError, "Tk::AlignBox is an abstract class"
end
private :_place_config
def align
widgets = []
@widgets.each{|w| widgets << w if w.winfo_exist?}
@widgets = widgets
cnt = @widgets.size.to_f
@widgets.each_with_index{|w, idx| _place_config(w, idx, cnt)}
@widgets = widgets
_set_framesize if @propagate
self
end
def add(*widgets)
widgets.each{|w|
unless w.kind_of? TkWindow
fail RuntimeError, "#{w.inspect} is not a widget instance."
end
@widgets.delete(w)
@widgets << w
sz = w.winfo_reqwidth
@max_width = sz if @max_width < sz
sz = w.winfo_reqheight
@max_height = sz if @max_height < sz
}
align
end
def <<(widget)
add(widget)
end
def insert(idx, widget)
unless widget.kind_of? TkWindow
fail RuntimeError, "#{widget.inspect} is not a widget instance."
end
@widgets.delete(widget)
@widgets[idx,0] = widget
sz = widget.winfo_reqwidth
@max_width = sz if @max_width < sz
sz = widget.winfo_reqheight
@max_height = sz if @max_height < sz
align
end
def delete(idx)
ret = @widgets.delete_at(idx)
@req_size = 0
@widget.each{|w|
sz = w.winfo_reqwidth
@max_width = sz if @max_width < sz
sz = w.winfo_reqheight
@max_height = sz if @max_height < sz
}
align
ret
end
def padx(size = nil)
if size
@padx = size
align
else
@padx
end
end
def pady(size = nil)
if size
@pady = size
align
else
@pady
end
end
attr_accessor :propagate
end
class Tk::RbWidget::HBox < Tk::RbWidget::AlignBox
def _set_framesize
bd = self.borderwidth
self.width((@max_width + 2*@padx) * @widgets.size + 2*bd)
self.height(@max_height + 2*@pady + 2*bd)
end
private :_set_framesize
def _place_config(widget, idx, cnt)
widget.place_in(self,
'relx'=>idx/cnt, 'x'=>@padx,
'rely'=>0, 'y'=>@pady,
'relwidth'=>1.0/cnt, 'width'=>-2*@padx,
'relheight'=>1.0, 'height'=>-2*@pady)
end
private :_place_config
end
Tk::RbWidget::HLBox = Tk::RbWidget::HBox
class Tk::RbWidget::HRBox < Tk::RbWidget::HBox
def _place_config(widget, idx, cnt)
widget.place_in(self,
'relx'=>(cnt - idx - 1)/cnt, 'x'=>@padx,
'rely'=>0, 'y'=>@pady,
'relwidth'=>1.0/cnt, 'width'=>-2*@padx,
'relheight'=>1.0, 'height'=>-2*@pady)
end
private :_place_config
end
class Tk::RbWidget::VBox < Tk::RbWidget::AlignBox
def _set_framesize
bd = self.borderwidth
self.width(@max_width + 2*@padx + 2*bd)
self.height((@max_height + 2*@pady) * @widgets.size + 2*bd)
end
private :_set_framesize
def _place_config(widget, idx, cnt)
widget.place_in(self,
'relx'=>0, 'x'=>@padx,
'rely'=>idx/cnt, 'y'=>@pady,
'relwidth'=>1.0, 'width'=>-2*@padx,
'relheight'=>1.0/cnt, 'height'=>-2*@pady)
end
private :_place_config
end
Tk::RbWidget::VTBox = Tk::RbWidget::VBox
class Tk::RbWidget::VBBox < Tk::RbWidget::VBox
def _place_config(widget, idx, cnt)
widget.place_in(self,
'relx'=>0, 'x'=>@padx,
'rely'=>(cnt - idx - 1)/cnt, 'y'=>@pady,
'relwidth'=>1.0, 'width'=>-2*@padx,
'relheight'=>1.0/cnt, 'height'=>-2*@pady)
end
private :_place_config
end
################################################
# test
################################################
if __FILE__ == $0
f = Tk::RbWidget::HBox.new(:borderwidth=>3, :relief=>'ridge').pack
f.add(TkButton.new(f, :text=>'a'),
TkButton.new(f, :text=>'aa', :font=>'Helvetica 16'),
TkButton.new(f, :text=>'aaa'),
TkButton.new(f, :text=>'aaaa'))
f = Tk::RbWidget::HBox.new(:borderwidth=>3, :relief=>'ridge',
:padx=>7, :pady=>3, :background=>'yellow').pack
f.add(TkButton.new(f, :text=>'a'),
TkButton.new(f, :text=>'aa', :font=>'Helvetica 16'),
TkButton.new(f, :text=>'aaa'),
TkButton.new(f, :text=>'aaaa'))
f = Tk::RbWidget::VBox.new(:borderwidth=>5,
:relief=>'groove').pack(:fill=>:y, :expand=>true)
f.add(TkButton.new(f, :text=>'a'),
TkButton.new(f, :text=>'aa', :font=>'Helvetica 30'),
TkButton.new(f, :text=>'aaa'),
TkButton.new(f, :text=>'aaaa'))
f = Tk::RbWidget::HRBox.new(:borderwidth=>3,
:relief=>'raised').pack(:fill=>:x)
f.add(TkButton.new(f, :text=>'a'),
TkButton.new(f, :text=>'aa'),
TkButton.new(f, :text=>'aaa'))
f = Tk::RbWidget::VBBox.new(:borderwidth=>3,
:relief=>'ridge').pack(:fill=>:x)
f.propagate = false
f.height 100
f.add(TkFrame.new(f){|ff|
TkButton.new(ff, :text=>'a').pack(:pady=>4, :padx=>6,
:fill=>:both, :expand=>true)
},
TkFrame.new(f){|ff|
TkButton.new(ff, :text=>'aa').pack(:pady=>4, :padx=>6,
:fill=>:both, :expand=>true)
},
TkFrame.new(f){|ff|
TkButton.new(ff, :text=>'aaaa').pack(:pady=>4, :padx=>6,
:fill=>:both, :expand=>true)
})
Tk.mainloop
end