From: Hidetoshi NAGAI Date: 2005-08-05T15:23:59+09:00 Subject: [ruby-dev:26749] Re: TkCheckbutton#variable as getter? 永井@知能.九工大です. From: H.Yamamoto Subject: [ruby-dev:26748] Re: TkCheckbutton#variable as getter? Date: Fri, 5 Aug 2005 13:35:19 +0900 Message-ID: <20050805133518.5B06C100.ocean@m2.ccsnet.ne.jp> > このパッチだと、variable のバインドを解除しようとして c1.variable = nil > とできないので、None を使うのはどうでしょうか。 そうですね.その方が良さそうです. > また、c1.variable で返るのは > TkVariable のほうが使いやすい気がします。 それは確かにそうかもしれません. ですが,この修正では cget や configinfo などでは変数名のままです. 逆に cget や configinfo がきちんと TkVariable を返すようになれば この wrap は不要ということになります. 添付の patch ではいかがでしょうか. とりあえず急ぎで行ったので,'variable' の名前以外に 変数を属性にとるものがあったかを確認していません. 追加が必要なら,__tkvariable_optkeys と __item_tkvariable_optkeys とにオプション名を追加する (必要なクラスでの override でも OK) ことをせねばなりません. また,拡張ライブラリなどに変数のリストを属性値に持つような オプションがあったかどうかは確認できていません. もしあれば,numlist 用の定義と同様に tkvarlist 用の追加が 必要かと思います. Index: ext/tk/lib/tk.rb =================================================================== RCS file: /var/cvs/src/ruby/ext/tk/lib/tk.rb,v retrieving revision 1.102.2.63 diff -u -r1.102.2.63 tk.rb --- ext/tk/lib/tk.rb 4 Aug 2005 09:41:32 -0000 1.102.2.63 +++ ext/tk/lib/tk.rb 5 Aug 2005 06:19:20 -0000 @@ -2233,10 +2233,13 @@ end def encoding_convertfrom(str, enc=nil) - # str must be a Tcl's internal string expression in enc. + # str is an usual enc string or a Tcl's internal string expression + # in enc (which is returned from 'encoding_convertto' method). # the return value is a UTF-8 string. enc = encoding_system unless enc - TkCore::INTERP.__invoke('encoding', 'convertfrom', enc, str) + ret = TkCore::INTERP.__invoke('encoding', 'convertfrom', enc, str) + ret.instance_variable_set('@encoding', 'utf-8') + ret end alias encoding_convert_from encoding_convertfrom @@ -2245,7 +2248,9 @@ # The return value is a Tcl's internal string expression in enc. # To get an usual enc string, use Tk.fromUTF8(ret_val, enc). enc = encoding_system unless enc - TkCore::INTERP.__invoke('encoding', 'convertto', enc, str) + ret = TkCore::INTERP.__invoke('encoding', 'convertto', enc, str) + ret.instance_variable_set('@encoding', 'binary') + ret end alias encoding_convert_to encoding_convertto end @@ -2710,6 +2715,11 @@ end private :__numlistval_optkeys + def __tkvariable_optkeys + ['variable'] + end + private :__tkvariable_optkeys + def __methodcall_optkeys # { key=>method, ... } {} end @@ -2815,6 +2825,10 @@ fnt end + when /^(#{__tkvariable_optkeys.join('|')})$/ + v = tk_call_without_enc(*(__cget_cmd << "-#{slot}")) + (v.empty?)? nil: TkVarAccess.new(v) + else tk_tcl2ruby(tk_call_without_enc(*(__cget_cmd << "-#{slot}")), true) end @@ -2999,6 +3013,28 @@ when /^(#{__strval_optkeys.join('|')})$/ # conf = tk_split_simplelist(_fromUTF8(tk_call_without_enc(*(__confinfo_cmd << "-#{slot}")))) conf = tk_split_simplelist(tk_call_without_enc(*(__confinfo_cmd << "-#{slot}")), false, true) + + when /^(#{__tkvariable_optkeys.join('|')})$/ + conf = tk_split_simplelist(tk_call_without_enc(*(__confinfo_cmd << "-#{slot}")), false, true) + + if ( __configinfo_struct[:default_value] \ + && conf[__configinfo_struct[:default_value]]) + v = conf[__configinfo_struct[:default_value]] + if v.empty? + conf[__configinfo_struct[:default_value]] = nil + else + conf[__configinfo_struct[:default_value]] = TkVarAccess.new(v) + end + end + if ( conf[__configinfo_struct[:current_value]] ) + v = conf[__configinfo_struct[:current_value]] + if v.empty? + conf[__configinfo_struct[:current_value]] = nil + else + conf[__configinfo_struct[:current_value]] = TkVarAccess.new(v) + end + end + else # conf = tk_split_list(_fromUTF8(tk_call_without_enc(*(__confinfo_cmd << "-#{slot}")))) conf = tk_split_list(tk_call_without_enc(*(__confinfo_cmd << "-#{slot}")), 0, false, true) @@ -3100,6 +3136,25 @@ list(conf[__configinfo_struct[:current_value]]) end + when /^(#{__tkvariable_optkeys.join('|')})$/ + if ( __configinfo_struct[:default_value] \ + && conf[__configinfo_struct[:default_value]] ) + v = conf[__configinfo_struct[:default_value]] + if v.empty? + conf[__configinfo_struct[:default_value]] = nil + else + conf[__configinfo_struct[:default_value]] = TkVarAccess.new(v) + end + end + if ( conf[__configinfo_struct[:current_value]] ) + v = conf[__configinfo_struct[:current_value]] + if v.empty? + conf[__configinfo_struct[:current_value]] = nil + else + conf[__configinfo_struct[:current_value]] = TkVarAccess.new(v) + end + end + else if ( __configinfo_struct[:default_value] \ && conf[__configinfo_struct[:default_value]] ) @@ -3269,6 +3324,27 @@ list(conf[__configinfo_struct[:current_value]]) end + when /^(#{__tkvariable_optkeys.join('|')})$/ + conf = tk_split_simplelist(tk_call_without_enc(*(__confinfo_cmd << "-#{slot}")), false, true) + + if ( __configinfo_struct[:default_value] \ + && conf[__configinfo_struct[:default_value]] ) + v = conf[__configinfo_struct[:default_value]] + if v.empty? + conf[__configinfo_struct[:default_value]] = nil + else + conf[__configinfo_struct[:default_value]] = TkVarAccess.new(v) + end + end + if ( conf[__configinfo_struct[:current_value]] ) + v = conf[__configinfo_struct[:current_value]] + if v.empty? + conf[__configinfo_struct[:current_value]] = nil + else + conf[__configinfo_struct[:current_value]] = TkVarAccess.new(v) + end + end + when /^(#{__strval_optkeys.join('|')})$/ # conf = tk_split_simplelist(_fromUTF8(tk_call_without_enc(*(__confinfo_cmd << "-#{slot}")))) conf = tk_split_simplelist(tk_call_without_enc(*(__confinfo_cmd << "-#{slot}")), false, true) @@ -3376,6 +3452,25 @@ list(conf[__configinfo_struct[:current_value]]) end + when /^(#{__tkvariable_optkeys.join('|')})$/ + if ( __configinfo_struct[:default_value] \ + && conf[__configinfo_struct[:default_value]] ) + v = conf[__configinfo_struct[:default_value]] + if v.empty? + conf[__configinfo_struct[:default_value]] = nil + else + conf[__configinfo_struct[:default_value]] = TkVarAccess.new + end + end + if ( conf[__configinfo_struct[:current_value]] ) + v = conf[__configinfo_struct[:current_value]] + if v.empty? + conf[__configinfo_struct[:current_value]] = nil + else + conf[__configinfo_struct[:current_value]] = TkVarAccess.new + end + end + else if ( __configinfo_struct[:default_value] \ && conf[__configinfo_struct[:default_value]] ) Index: ext/tk/lib/tk/itemconfig.rb =================================================================== RCS file: /var/cvs/src/ruby/ext/tk/lib/tk/itemconfig.rb,v retrieving revision 1.1.2.6 diff -u -r1.1.2.6 itemconfig.rb --- ext/tk/lib/tk/itemconfig.rb 25 May 2005 11:09:38 -0000 1.1.2.6 +++ ext/tk/lib/tk/itemconfig.rb 5 Aug 2005 06:19:20 -0000 @@ -40,6 +40,11 @@ end private :__item_numlistval_optkeys + def __item_tkvariable_optkeys + ['variable'] + end + private :__item_tkvariable_optkeys + def __item_methodcall_optkeys(id) # { key=>method, ... } # maybe need to override # {'coords'=>'coords'} @@ -161,6 +166,10 @@ conf end + when /^(#{__item_tkvariable_optkeys(tagid(tagOrId)).join('|')})$/ + v = tk_call_without_enc(*(__item_cget_cmd(tagid(tagOrId)) << "-#{option}")) + (v.empty?)? nil: TkVarAccess.new(v) + when /^(#{__item_strval_optkeys(tagid(tagOrId)).join('|')})$/ _fromUTF8(tk_call_without_enc(*(__item_cget_cmd(tagid(tagOrId)) << "-#{option}"))) @@ -357,6 +366,27 @@ # conf = tk_split_simplelist(_fromUTF8(tk_call_without_enc(*(__item_confinfo_cmd(tagid(tagOrId)) << "-#{slot}")))) conf = tk_split_simplelist(tk_call_without_enc(*(__item_confinfo_cmd(tagid(tagOrId)) << "-#{slot}")), false, true) + when /^(#{__item_tkvariable_optkeys(tagid(tagOrId)).join('|')})$/ + conf = tk_split_simplelist(tk_call_without_enc(*(__item_confinfo_cmd(tagid(tagOrId)) << "-#{slot}")), false, true) + + if ( __item_configinfo_struct(tagid(tagOrId))[:default_value] \ + && conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] ) + v = conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] + if v.empty? + conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] = nil + else + conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] = TkVarAccess.new(v) + end + end + if ( conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] ) + v = conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] + if v.empty? + conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] = nil + else + conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] = TkVarAccess.new(v) + end + end + else # conf = tk_split_list(_fromUTF8(tk_call_without_enc(*(__item_confinfo_cmd(tagid(tagOrId)) << "-#{slot}")))) conf = tk_split_list(tk_call_without_enc(*(__item_confinfo_cmd(tagid(tagOrId)) << "-#{slot}")), 0, false, true) @@ -458,6 +488,25 @@ list(conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]]) end + when /^(#{__item_tkvariable_optkeys(tagid(tagOrId)).join('|')})$/ + if ( __item_configinfo_struct(tagid(tagOrId))[:default_value] \ + && conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] ) + v = conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] + if v.empty? + conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] = nil + else + conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] = TkVarAccess.new(v) + end + end + if ( conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] ) + v = conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] + if v.empty? + conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] = nil + else + conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] = TkVarAccess.new + end + end + else if ( __item_configinfo_struct(tagid(tagOrId))[:default_value] \ && conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] ) @@ -630,6 +679,27 @@ # conf = tk_split_simplelist(_fromUTF8(tk_call_without_enc(*(__item_confinfo_cmd(tagid(tagOrId)) << "-#{slot}")))) conf = tk_split_simplelist(tk_call_without_enc(*(__item_confinfo_cmd(tagid(tagOrId)) << "-#{slot}")), false, true) + when /^(#{__item_tkvariable_optkeys(tagid(tagOrId)).join('|')})$/ + conf = tk_split_simplelist(tk_call_without_enc(*(__item_confinfo_cmd(tagid(tagOrId)) << "-#{slot}")), false, true) + + if ( __item_configinfo_struct(tagid(tagOrId))[:default_value] \ + && conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] ) + v = conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] + if v.empty? + conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] = nil + else + conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] = TkVarAccess.new(v) + end + end + if ( conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] ) + v = conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] + if v.empty? + conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] = nil + else + conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] = TkVarAccess.new(v) + end + end + else # conf = tk_split_list(_fromUTF8(tk_call_without_enc(*(__item_confinfo_cmd(tagid(tagOrId)) << "-#{slot}")))) conf = tk_split_list(tk_call_without_enc(*(__item_confinfo_cmd(tagid(tagOrId)) << "-#{slot}")), 0, false, true) @@ -734,6 +804,25 @@ list(conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]]) end + when /^(#{__item_tkvariable_optkeys(tagid(tagOrId)).join('|')})$/ + if ( __item_configinfo_struct(tagid(tagOrId))[:default_value] \ + && conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] ) + v = conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] + if v.empty? + conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] = nil + else + conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] = TkVarAccess.new(v) + end + end + if ( conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] ) + v = conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] + if v.empty? + conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] = nil + else + conf[__item_configinfo_struct(tagid(tagOrId))[:current_value]] = TkVarAccess.new(v) + end + end + else if ( __item_configinfo_struct(tagid(tagOrId))[:default_value] \ && conf[__item_configinfo_struct(tagid(tagOrId))[:default_value]] ) -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp