[FF] 2007-05-15 - This is part of my code snippets. Check my page for an index. ---- ====== set halo 2 proc item:upd {w} { $w itemconfigure object -outline {} $w itemconfigure hover -outline red $w itemconfigure moveit -outline purple } proc item:move {w x y {init 0}} { global oldx oldy if $init { set oldx $x; set oldy $y $w addtag moveit closest $x $y $::halo $w dtag !moveable moveit $w raise moveit } else { $w move moveit [expr $x-$oldx] [expr $y-$oldy] set oldx $x; set oldy $y } item:upd $w } proc item:endmove {w x y} { $w dtag moveit item:upd $w } proc item:hover {w x y st} { if $st { $w addtag hover closest $x $y $::halo $w dtag !moveable hover } else { $w dtag hover } item:upd $w } proc item:toggletag {w x y tag} { set ttt tagtotoggle $w addtag $ttt closest $x $y $::halo $tag if {[lsearch [$w gettags $ttt] $tag] >= 0} { $w dtag ($ttt&&$tag) $tag item:hover $w $x $y 0 } else { $w addtag $tag withtag ($ttt&&!$tag) item:hover $w $x $y 1 } $w dtag $ttt } pack [canvas .c -width 200 -height 130 -background white] # some ugly test objects .c create polygon 10 10 10 40 18 10 -fill green -tags {object moveable} .c create polygon 50 50 60 50 60 60 50 60 -fill gray -tags {object moveable} .c create polygon 70 50 90 50 90 70 70 70 -fill blue -tags {object} # bind necessary actions .c bind moveable {item:move %W %x %y 1} .c bind moveable {item:endmove %W %x %y} .c bind moveable {item:hover %W %x %y 1} .c bind moveable {item:hover %W %x %y 0} .c bind moveit {item:move %W %x %y} .c bind all {item:toggletag %W %x %y moveable} # update item styles item:upd .c ====== <>Category Widget