|
|
1.1 root 1: # mkScroll w
2: #
3: # Create a top-level window containing a simple canvas that can
4: # be scrolled in two dimensions.
5: #
6: # Arguments:
7: # w - Name to use for new top-level window.
8:
9: proc mkScroll {{w .cscroll}} {
10: catch {destroy $w}
11: toplevel $w
12: dpos $w
13: wm title $w "Scrollable Canvas Demonstration"
14: wm iconname $w "Canvas"
15: wm minsize $w 100 100
16: set c $w.frame2.c
17:
18: frame $w.frame1 -relief raised -bd 2
19: frame $w.frame2 -relief raised -bd 2
20: button $w.ok -text "OK" -command "destroy $w"
21: pack append $w $w.frame1 {top fill} $w.ok {bottom pady 10 frame center} \
22: $w.frame2 {top expand fill}
23: message $w.frame1.m -font -Adobe-Times-Medium-R-Normal-*-180-* -aspect 300 \
24: -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."
25: pack append $w.frame1 $w.frame1.m {frame center}
26:
27: canvas $c -scrollregion {-10c -10c 50c 20c}
28: scrollbar $w.frame2.vscroll -relief sunken -command "$c yview"
29: scrollbar $w.frame2.hscroll -orient horiz -relief sunken -command "$c xview"
30: pack append $w.frame2 $w.frame2.hscroll {bottom fillx} \
31: $w.frame2.vscroll {right filly} $c {expand fill}
32: $c config -xscroll "$w.frame2.hscroll set" -yscroll "$w.frame2.vscroll set"
33:
34: set bg [lindex [$c config -bg] 4]
35: for {set i 0} {$i < 20} {incr i} {
36: set x [expr {-10 + 3*$i}]
37: for {set j 0; set y -10} {$j < 10} {incr j; incr y 3} {
38: $c create rect ${x}c ${y}c [expr $x+2]c [expr $y+2]c \
39: -outline black -fill $bg -tags rect
40: $c create text [expr $x+1]c [expr $y+1]c -text "$i,$j" \
41: -anchor center -tags text
42: }
43: }
44:
45: $c bind all <Any-Enter> "scrollEnter $c"
46: $c bind all <Any-Leave> "scrollLeave $c"
47: $c bind all <1> "scrollButton $c"
48: bind $c <2> "$c scan mark %x %y"
49: bind $c <B2-Motion> "$c scan dragto %x %y"
50: }
51:
52: proc scrollEnter canvas {
53: global oldFill
54: set id [$canvas find withtag current]
55: if {[lsearch [$canvas gettags current] text] >= 0} {
56: set id [expr $id-1]
57: }
58: set oldFill [lindex [$canvas itemconfig $id -fill] 4]
59: if {[winfo screendepth $canvas] > 4} {
60: $canvas itemconfigure $id -fill SeaGreen1
61: } else {
62: $canvas itemconfigure $id -fill black
63: $canvas itemconfigure [expr $id+1] -fill white
64: }
65: }
66:
67: proc scrollLeave canvas {
68: global oldFill
69: set id [$canvas find withtag current]
70: if {[lsearch [$canvas gettags current] text] >= 0} {
71: set id [expr $id-1]
72: }
73: $canvas itemconfigure $id -fill $oldFill
74: $canvas itemconfigure [expr $id+1] -fill black
75: }
76:
77: proc scrollButton canvas {
78: global oldFill
79: set id [$canvas find withtag current]
80: if {[lsearch [$canvas gettags current] text] < 0} {
81: set id [expr $id+1]
82: }
83: puts stdout "You buttoned at [lindex [$canvas itemconf $id -text] 4]"
84: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.