Zoom "à la xdvi"

 

dc 20/12/05 xdvi est un visualisateur de fichier dvi, il permet avec les 3 boutons de la souris de zoomer sur une partie de texte.

Il y a eu récemment des discussions ou pages actualiées sur le wiki anglophone qui m'ont fait penser à cela.

 # le canvas
 set c [canvas .c]
 pack $c
 #
 $c create polygon 10 200 50 50 100 100 250 150 -fill lightblue
 $c create line 10 10 150 10 150 150 -fill red -width 4
 $c create oval 0 0 200 200 -outline green -width 7
 $c create rectangle 10 10 250 150
 $c create text 120 120 -text "Le texte ne zoome pas :(" -font {Helvetica 16}

 # le bind
 bind $c <B1-Motion> "zoom %x %y %X %Y 100 1.4"
 bind $c <B2-Motion> "zoom %x %y %X %Y 100 2"
 bind $c <B3-Motion> "zoom %x %y %X %Y 100 4"

 proc partie {x y marge} {
     set x1 [expr {$x-$marge}]
     set y1 [expr {$y-$marge}]
     set x2 [expr {$x+$marge}]
     set y2 [expr {$y+$marge}]
     set l [.c find overlapping $x1 $y1 $x2 $y2]
 }

 proc zoom {x y xfen yfen marge coef} {
     destroy .zoom
     toplevel .zoom
     pack [canvas .zoom.c]
     wm overrideredirect .zoom 1
     set dim [expr {2*$marge}]
     wm geometry .zoom  ${dim}x${dim}+${xfen}+${yfen}
     #
     set contenu [partie $x $y $marge]
     foreach w $contenu {
 	set id [eval .zoom.c create [.c type $w] [.c coords $w]]
 	foreach {cle a b c valeur}  [join [.c itemconfigure $w]] {
 	    .zoom.c itemconfigure $id $cle $valeur
 	}
     }
     .zoom.c move all [expr {$marge-$x}] [expr {$marge-$y}]
     .zoom.c scale all $marge $marge $coef $coef
 }