diff options
author | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-07-12 23:08:32 +0000 |
---|---|---|
committer | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-07-12 23:08:32 +0000 |
commit | ed6ce8b43b6f25df1d4809ac799de4dd1c85c1f3 (patch) | |
tree | 09bc05d679d0f224a29fee44d10beea321bdc0b5 /ext/tk/sample/tkcombobox.rb | |
parent | e13fb8029b87943ab8af2211226b7c9347d3976d (diff) | |
download | ruby-ed6ce8b43b6f25df1d4809ac799de4dd1c85c1f3.tar.gz |
* 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
Diffstat (limited to 'ext/tk/sample/tkcombobox.rb')
-rw-r--r-- | ext/tk/sample/tkcombobox.rb | 121 |
1 files changed, 91 insertions, 30 deletions
diff --git a/ext/tk/sample/tkcombobox.rb b/ext/tk/sample/tkcombobox.rb index 941f7cc4cb..59db565f06 100644 --- a/ext/tk/sample/tkcombobox.rb +++ b/ext/tk/sample/tkcombobox.rb @@ -1,11 +1,20 @@ # -# tkcombobox.rb : TkAutoScrollbox & TkCombobox +# tkcombobox.rb : auto scrollbox & combobox # # by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) # require 'tk' -class TkAutoScrollbox < TkListbox +module Tk + module RbWidget + class AutoScrollListbox < TkListbox + end + class Combobox < TkEntry + end + end +end + +class Tk::RbWidget::AutoScrollListbox include TkComposite @@up_bmp = TkBitmapImage.new(:data=><<EOD) @@ -221,17 +230,7 @@ end ################################################ -# don't use Ttk widget -Object.instance_eval{remove_const :TkCombobox} if Object.autoload? :TkCombobox - -# if you want to use the 'default_widget_set' selector, -#class TkCombobox < TkEntry; end -#Tk.__set_toplevel_aliases__(:Tk, TkCombobox, :TkCombobox) - - -################################################ - -class TkCombobox < TkEntry +class Tk::RbWidget::Combobox < TkEntry include TkComposite @@down_btn_bmp = TkBitmapImage.new(:data=><<EOD) @@ -251,6 +250,7 @@ static unsigned char up_arrow_bits[] = { EOD def _button_proc(dir = true) + return if @ent.state == 'disabled' @btn.relief(:sunken) x = @frame.winfo_rootx y = @frame.winfo_rooty @@ -275,9 +275,10 @@ EOD @top.grab begin - @var.tkwait - if (idx = @var.to_i) >= 0 - @ent.value = @lst.get(idx) + @wait_var.tkwait + if (idx = @wait_var.to_i) >= 0 + # @ent.value = @lst.get(idx) + _set_entry_value(@lst.get(idx)) end @top.withdraw @btn.relief(:raised) @@ -297,18 +298,65 @@ EOD @btn.bind('1', proc{_button_proc(true)}) @btn.bind('3', proc{_button_proc(false)}) - @lst.bind('1', proc{|y| @var.value = @lst.nearest(y)}, '%y') - @lst.bind('Return', proc{@var.value = @lst.curselection[0]}) + @lst.bind('1', proc{|y| @wait_var.value = @lst.nearest(y)}, '%y') + @lst.bind('Return', proc{@wait_var.value = @lst.curselection[0]}) cancel = TkVirtualEvent.new('2', '3', 'Escape') - @lst.bind(cancel, proc{@var.value = -1}) + @lst.bind(cancel, proc{@wait_var.value = -1}) end private :_init_bindings + def _set_entry_value(val) + @ent.textvariable.value = val + end + private :_set_entry_value + + #---------------------------------------------------- + + def _state_control(value = None) + if value == None + # get + @ent.state + else + # set + @ent.state(value.to_s) + case value = @ent.state # regulate 'state' string + when 'normal', 'readonly' + @btn.state 'normal' + when 'disabled' + @btn.state 'disabled' + else + # unknown : do nothing + end + end + end + private :_state_control + + def __methodcall_optkeys # { key=>method, ... } + {'state' => :_state_control} + end + private :__methodcall_optkeys + + #---------------------------------------------------- + + def _textvariable_control(var = None) + if var == None + # get + ((var = @ent.textvariable) === @default_var)? nil: var + else + # set + @var = var + tk_send('configure', '-textvariable', (@var)? var: @default_var) + end + end + private :_textvariable_control + + #---------------------------------------------------- + def initialize_composite(keys={}) keys = _symbolkey2str(keys) - @btn = TkLabel.new(@frame, :relief=>:raised, :borderwidth=>3, + @btn = TkLabel.new(@frame, :relief=>:raised, :borderwidth=>2, :image=>@@down_btn_bmp).pack(:side=>:right, :ipadx=>2, :fill=>:y) @ent = TkEntry.new(@frame).pack(:side=>:left) @@ -322,16 +370,21 @@ EOD startwait = keys.delete('startwait'){300} interval = keys.delete('interval'){150} - @lst = TkAutoScrollbox.new(@top, - :startwait=>startwait, - :interval=>interval).pack(:fill=>:both, - :expand=>true) + @lst = Tk::RbWidget::AutoScrollListbox.new(@top, :scrollbar=>true, + :startwait=>startwait, + :interval=>interval) + @lst.pack(:fill=>:both, :expand=>true) @ent_list = [] - @var = TkVariable.new + @wait_var = TkVariable.new + @var = @default_var = TkVariable.new + + @ent.textvariable @default_var _init_bindings + option_methods('textvariable' => :_textvariable_control) + delegate('DEFAULT', @ent) delegate('height', @lst) delegate('relief', @frame) @@ -340,6 +393,8 @@ EOD delegate('arrowrelief', @lst) delegate('arrowborderwidth', @lst) + delegate('state', false) + if mode = keys.delete('scrollbar') scrollbar(mode) end @@ -405,10 +460,14 @@ end # test ################################################ if __FILE__ == $0 +# e0 = Tk::RbWidget::Combobox.new.pack +# e0.values(%w(aa bb cc dd ee ff gg hh ii jj kk ll mm nn oo pp qq rr ss tt uu)) + v = TkVariable.new - e = TkCombobox.new(:height=>7, :scrollbar=>true, :textvariable=>v, - :arrowrelief=>:flat, :arrowborderwidth=>0, - :startwait=>400, :interval=>200).pack + e = Tk::RbWidget::Combobox.new(:height=>7, :scrollbar=>true, + :textvariable=>v, + :arrowrelief=>:flat, :arrowborderwidth=>0, + :startwait=>400, :interval=>200).pack e.values(%w(aa bb cc dd ee ff gg hh ii jj kk ll mm nn oo pp qq rr ss tt uu)) #e.see(e.list_index('end') - 2) e.value = 'cc' @@ -421,8 +480,10 @@ if __FILE__ == $0 TkFrame.new(:relief=>:raised, :borderwidth=>2, :height=>3).pack(:fill=>:x, :expand=>true, :padx=>5, :pady=>3) - l = TkAutoScrollbox.new(nil, :relief=>:groove, :borderwidth=>4, - :width=>20).pack(:fill=>:both, :expand=>true) + l = Tk::RbWidget::AutoScrollListbox.new(nil, :relief=>:groove, + :borderwidth=>4,:height=>7, + :width=>20).pack(:fill=>:both, + :expand=>true) (0..20).each{|i| l.insert('end', "line #{i}")} TkFrame.new(:relief=>:ridge, :borderwidth=>3){ |