新井です。

Ruby/Tkのパッチ(その3)です。

Ruby/Tk でのスクロールバーとの連係をもう少し簡単にするために、
Tk::Scrollable#[xy]scrollbarメソッドを作って見ました。

# Gtk のようなスクロールバー付きフレームが使いやすいのですが、
# まぁとりあえず。

使用例:

  require "tk"

  TkListbox.new {
    ('a'..'z').each {|v|
      insert 'end', (v..'z').to_a.join
    }

    xscrollbar TkScrollbar.new
    yscrollbar TkScrollbar.new
    xscrollbar.grid 'column'=>0, 'row'=>1, 'sticky'=>'ew'
    yscrollbar.grid 'column'=>1, 'row'=>0, 'sticky'=>'ns'
    grid 'column'=>0, 'row'=>0, 'sticky'=>'nsew'
    focus
  }

  TkGrid.columnconfigure Tk.root, 0, 'weight'=>100
  TkGrid.rowconfigure    Tk.root, 0, 'weight'=>100

  Tk.mainloop

ついでに、xview、yview をTk::Scrollableのメソッドにして、
TkEntryもこれを使うようにしました(yscrollがないのはTcl/Tkの
チェックに任せた)。

  require "tk"

  entry = TkEntry.new {
    text "test"
    pack
    xscrollbar TkScrollbar.new.pack('fill'=>'both')
  }

  Tk.mainloop

tktext.rb, tkcanvas.rb のxview,yviewもいらなくなるのですが手
を付けてません。(先にこのパッチを検証してもらってからと思い
まして)

以上、いかがでしょうか?

--- ext/tk/lib/tk.rb.old Sat Jan 22 14:50:30 2000 +++ ext/tk/lib/tk.rb Mon Jan 24 05:34:37 2000 @@ -583,6 +583,32 @@ module Tk def yscrollcommand(cmd=Proc.new) configure_cmd 'yscrollcommand', cmd end + def xview(*index) + v = tk_send('xview', *index) + list(v) if index.size == 0 + end + def yview(*index) + v = tk_send('yview', *index) + list(v) if index.size == 0 + end + def xscrollbar(bar=nil) + if bar + @xscrollbar = bar + @xscrollbar.orient 'horizontal' + self.xscrollcommand {|arg| @xscrollbar.set *arg} + @xscrollbar.command {|arg| self.xview *arg} + end + @xscrollbar + end + def yscrollbar(bar=nil) + if bar + @yscrollbar = bar + @yscrollbar.orient 'vertical' + self.yscrollcommand {|arg| @yscrollbar.set *arg} + @yscrollbar.command {|arg| self.yview *arg} + end + @yscrollbar + end end module Wm @@ -2220,14 +2246,6 @@ class TkListbox<TkTextWin end def selection_set(first, last=None) tk_send 'selection', 'set', first, last - end - def xview(cmd, *more) - v = tk_send('xview', cmd, *more) - v.to_i if more.size == 0 - end - def yview(cmd, *more) - v = tk_send('yview', cmd, *more) - v.to_i if more.size == 0 end end --- ext/tk/lib/tkentry.rb.old Tue Jan 11 04:04:15 2000 +++ ext/tk/lib/tkentry.rb Mon Jan 24 04:23:28 2000 @@ -6,6 +6,8 @@ require 'tk.rb' class TkEntry<TkLabel + include Scrollable + WidgetClassName = 'Entry'.freeze WidgetClassNames[WidgetClassName] = self def self.to_eval @@ -15,9 +17,6 @@ class TkEntry<TkLabel def create_self tk_call 'entry', @path end - def xscrollcommand(cmd=Proc.new) - configure_cmd 'xscrollcommand', cmd - end def delete(s, e=None) tk_send 'delete', s, e @@ -58,9 +57,6 @@ class TkEntry<TkLabel end def selection_to(index) tk_send 'selection', 'to', index - end - def xview(*index) - tk_send 'xview', *index end def value