summaryrefslogtreecommitdiff
path: root/jni/ruby/ext/tk/sample/demos-en/cscroll.rb
blob: 40a3afc0adb2b3207676e94e5a2d374ebfa53496 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# cscroll.rb
#
# This demonstration script creates a simple canvas that can be
# scrolled in two dimensions.
#
# simple scrollable canvas widget demo (called by 'widget')
#

# toplevel widget
if defined?($cscroll_demo) && $cscroll_demo
  $cscroll_demo.destroy
  $cscroll_demo = nil
end

# demo toplevel widget
$cscroll_demo = TkToplevel.new {|w|
  title("Scrollable Canvas Demonstration")
  iconname("cscroll")
  positionWindow(w)
}

base_frame = TkFrame.new($cscroll_demo).pack(:fill=>:both, :expand=>true)

# label
TkLabel.new(base_frame, 'font'=>$font, 'wraplength'=>'4i',
            'justify'=>'left', 'text'=>"This window displays a canvas widget that can be scrolled either using the scrollbars or by dragging with button 2 in the canvas.  If you click button 1 on one of the rectangles, its indices will be printed on stdout."){
  pack('side'=>'top')
}

# frame
$cscroll_buttons = TkFrame.new(base_frame) {|frame|
  TkButton.new(frame) {
    text 'Dismiss'
    command proc{
      tmppath = $cscroll_demo
      $cscroll_demo = nil
      tmppath.destroy
    }
  }.pack('side'=>'left', 'expand'=>'yes')

  TkButton.new(frame) {
    text 'Show Code'
    command proc{showCode 'cscroll'}
  }.pack('side'=>'left', 'expand'=>'yes')
}
$cscroll_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m')

# frame
unless $tk_version =~ /^4\.[01]/
  $cscroll_grid = TkFrame.new(base_frame) {
    pack('expand'=>'yes', 'fill'=>'both', 'padx'=>1, 'pady'=>1)
  }
  TkGrid.rowconfigure($cscroll_grid, 0, 'weight'=>1, 'minsize'=>0)
  TkGrid.columnconfigure($cscroll_grid, 0, 'weight'=>1, 'minsize'=>0)
end

# canvas
$cscroll_canvas = TkCanvas.new(base_frame,
                               'relief'=>'sunken', 'borderwidth'=>2,
                               'scrollregion'=>['-11c', '-11c', '50c', '20c']
                               ) {|c|
  if $tk_version =~ /^4\.[01]/
    pack('expand'=>'yes', 'fill'=>'both')
  else
    grid('in'=>$cscroll_grid, 'padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>0,
         'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news')
  end

  TkScrollbar.new(base_frame, 'command'=>proc{|*args| c.yview(*args)}) {|vs|
    c.yscrollcommand(proc{|first,last| vs.set first,last})
    if $tk_version =~ /^4\.[01]/
      pack('side'=>'right', 'fill'=>'y')
    else
      grid('in'=>$cscroll_grid, 'padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>1,
           'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news')
    end
  }

  TkScrollbar.new(base_frame, 'orient'=>'horiz',
                  'command'=>proc{|*args| c.xview(*args)}) {|hs|
    c.xscrollcommand(proc{|first,last| hs.set first,last})
    if $tk_version =~ /^4\.[01]/
      pack('side'=>'bottom', 'fill'=>'x')
    else
      grid('in'=>$cscroll_grid, 'padx'=>1, 'pady'=>1, 'row'=>1, 'column'=>0,
           'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news')
    end
  }
}

bg = $cscroll_canvas.configinfo('bg')[4]
(0..19).each{|i|
  x = -10+3*i
  y = -10
  (0..9).each{|j|
    TkcRectangle.new($cscroll_canvas, "#{x}c", "#{y}c", "#{x+2}c", "#{y+2}c",
                     'outline'=>'black', 'fill'=>bg, 'tags'=>'rect')
    TkcText.new($cscroll_canvas, "#{x+1}c", "#{y+1}c",
                'text'=>"#{i},#{j}", 'anchor'=>'center', 'tags'=>'text')
    y += 3
  }
}

$cscroll_canvas.itembind('all', 'Any-Enter', proc{scrollEnter $cscroll_canvas})
$cscroll_canvas.itembind('all', 'Any-Leave', proc{scrollLeave $cscroll_canvas})
$cscroll_canvas.itembind('all', '1', proc{scrollButton $cscroll_canvas})
$cscroll_canvas.itembind('all', 'Any-Enter', proc{scrollEnter $cscroll_canvas})
$cscroll_canvas.bind('2', proc{|x,y| $cscroll_canvas.scan_mark(x,y)}, '%x %y')
$cscroll_canvas.bind('B2-Motion',
                     proc{|x,y| $cscroll_canvas.scan_dragto(x,y)}, '%x %y')

def scrollEnter(c)
  id = c.find_withtag('current')[0].id
  id -= 1 if c.gettags('current').include?('text')
  $oldFill = c.itemconfiginfo(id, 'fill')[4]
  if TkWinfo.depth(c) > 1
    c.itemconfigure(id, 'fill'=>'SeaGreen1')
  else
    c.itemconfigure(id, 'fill'=>'black')
    c.itemconfigure(id+1, 'fill'=>'white')
  end
end

def scrollLeave(c)
  id = c.find_withtag('current')[0].id
  id -= 1 if c.gettags('current').include?('text')
  c.itemconfigure(id, 'fill'=>$oldFill)
  c.itemconfigure(id+1, 'fill'=>'black')
end

def scrollButton(c)
  id = c.find_withtag('current')[0].id
  id += 1 unless c.gettags('current').include?('text')
  print "You buttoned at #{c.itemconfiginfo(id,'text')[4]}\n"
end