1# -*- coding: utf-8 -*- 2# 3# simple scrollable canvas widget demo (called by 'widget') 4# 5 6# toplevel widget が存在すれば削除する 7if defined?($cscroll_demo) && $cscroll_demo 8 $cscroll_demo.destroy 9 $cscroll_demo = nil 10end 11 12# demo 用の toplevel widget を生成 13$cscroll_demo = TkToplevel.new {|w| 14 title("Scrollable Canvas Demonstration") 15 iconname("cscroll") 16 positionWindow(w) 17} 18 19base_frame = TkFrame.new($cscroll_demo).pack(:fill=>:both, :expand=>true) 20 21# label 生成 22TkLabel.new(base_frame, 'font'=>$font, 'wraplength'=>'4i', 23 'justify'=>'left', 'text'=>"このウィンドウにはスクロールバーやマウスのボタン2 でスクロールできるキャンバス widget が表示されています。四角の上でボタン1 をクリックすると、そのインデックスが標準出力に出力されます。"){ 24 pack('side'=>'top') 25} 26 27# frame 生成 28$cscroll_buttons = TkFrame.new(base_frame) {|frame| 29 TkButton.new(frame) { 30 #text '了解' 31 text '閉じる' 32 command proc{ 33 tmppath = $cscroll_demo 34 $cscroll_demo = nil 35 tmppath.destroy 36 } 37 }.pack('side'=>'left', 'expand'=>'yes') 38 39 TkButton.new(frame) { 40 text 'コード参照' 41 command proc{showCode 'cscroll'} 42 }.pack('side'=>'left', 'expand'=>'yes') 43} 44$cscroll_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') 45 46# frame 設定 47unless $tk_version =~ /^4\.[01]/ 48 $cscroll_grid = TkFrame.new(base_frame) { 49 pack('expand'=>'yes', 'fill'=>'both', 'padx'=>1, 'pady'=>1) 50 } 51 TkGrid.rowconfigure($cscroll_grid, 0, 'weight'=>1, 'minsize'=>0) 52 TkGrid.columnconfigure($cscroll_grid, 0, 'weight'=>1, 'minsize'=>0) 53end 54 55# canvas 設定 56$cscroll_canvas = TkCanvas.new(base_frame, 57 'relief'=>'sunken', 'borderwidth'=>2, 58 'scrollregion'=>['-11c', '-11c', '50c', '20c'] 59 ) {|c| 60 if $tk_version =~ /^4\.[01]/ 61 pack('expand'=>'yes', 'fill'=>'both') 62 else 63 grid('in'=>$cscroll_grid, 'padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>0, 64 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') 65 end 66 67 TkScrollbar.new(base_frame, 'command'=>proc{|*args| c.yview(*args)}) {|vs| 68 c.yscrollcommand(proc{|first,last| vs.set first,last}) 69 if $tk_version =~ /^4\.[01]/ 70 pack('side'=>'right', 'fill'=>'y') 71 else 72 grid('in'=>$cscroll_grid, 'padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>1, 73 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') 74 end 75 } 76 77 TkScrollbar.new(base_frame, 'orient'=>'horiz', 78 'command'=>proc{|*args| c.xview(*args)}) {|hs| 79 c.xscrollcommand(proc{|first,last| hs.set first,last}) 80 if $tk_version =~ /^4\.[01]/ 81 pack('side'=>'bottom', 'fill'=>'x') 82 else 83 grid('in'=>$cscroll_grid, 'padx'=>1, 'pady'=>1, 'row'=>1, 'column'=>0, 84 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') 85 end 86 } 87} 88 89bg = $cscroll_canvas.configinfo('bg')[4] 90(0..19).each{|i| 91 x = -10+3*i 92 y = -10 93 (0..9).each{|j| 94 TkcRectangle.new($cscroll_canvas, "#{x}c", "#{y}c", "#{x+2}c", "#{y+2}c", 95 'outline'=>'black', 'fill'=>bg, 'tags'=>'rect') 96 TkcText.new($cscroll_canvas, "#{x+1}c", "#{y+1}c", 97 'text'=>"#{i},#{j}", 'anchor'=>'center', 'tags'=>'text') 98 y += 3 99 } 100} 101 102$cscroll_canvas.itembind('all', 'Any-Enter', proc{scrollEnter $cscroll_canvas}) 103$cscroll_canvas.itembind('all', 'Any-Leave', proc{scrollLeave $cscroll_canvas}) 104$cscroll_canvas.itembind('all', '1', proc{scrollButton $cscroll_canvas}) 105$cscroll_canvas.itembind('all', 'Any-Enter', proc{scrollEnter $cscroll_canvas}) 106$cscroll_canvas.bind('2', proc{|x,y| $cscroll_canvas.scan_mark(x,y)}, '%x %y') 107$cscroll_canvas.bind('B2-Motion', 108 proc{|x,y| $cscroll_canvas.scan_dragto(x,y)}, '%x %y') 109 110def scrollEnter(c) 111 id = c.find_withtag('current')[0].id 112 id -= 1 if c.gettags('current').include?('text') 113 $oldFill = c.itemconfiginfo(id, 'fill')[4] 114 if TkWinfo.depth(c) > 1 115 c.itemconfigure(id, 'fill'=>'SeaGreen1') 116 else 117 c.itemconfigure(id, 'fill'=>'black') 118 c.itemconfigure(id+1, 'fill'=>'white') 119 end 120end 121 122def scrollLeave(c) 123 id = c.find_withtag('current')[0].id 124 id -= 1 if c.gettags('current').include?('text') 125 c.itemconfigure(id, 'fill'=>$oldFill) 126 c.itemconfigure(id+1, 'fill'=>'black') 127end 128 129def scrollButton(c) 130 id = c.find_withtag('current')[0].id 131 id += 1 unless c.gettags('current').include?('text') 132 print "You buttoned at #{c.itemconfiginfo(id,'text')[4]}\n" 133end 134 135