Compress the graph horizontally if it gets too wide.

If the graph gets to use more than a certain percentage (default 50%)
of the width of the top-left pane, we now reduce the amount of space
allowed for each graph line.  This means it doesn't look quite as
nice but you can still see the headline for the commit.  (Currently
the only way to customize the percentage is to edit your ~/.gitk
file manually.)
This commit is contained in:
Paul Mackerras 2005-08-05 09:52:16 +10:00
parent 1115fb38df
commit 8d858d1a3a

103
gitk
View File

@ -480,7 +480,7 @@ proc click {w} {
proc savestuff {w} { proc savestuff {w} {
global canv canv2 canv3 ctext cflist mainfont textfont global canv canv2 canv3 ctext cflist mainfont textfont
global stuffsaved findmergefiles gaudydiff global stuffsaved findmergefiles gaudydiff maxgraphpct
if {$stuffsaved} return if {$stuffsaved} return
if {![winfo viewable .]} return if {![winfo viewable .]} return
@ -490,6 +490,7 @@ proc savestuff {w} {
puts $f [list set textfont $textfont] puts $f [list set textfont $textfont]
puts $f [list set findmergefiles $findmergefiles] puts $f [list set findmergefiles $findmergefiles]
puts $f [list set gaudydiff $gaudydiff] puts $f [list set gaudydiff $gaudydiff]
puts $f [list set maxgraphpct $maxgraphpct]
puts $f "set geometry(width) [winfo width .ctop]" puts $f "set geometry(width) [winfo width .ctop]"
puts $f "set geometry(height) [winfo height .ctop]" puts $f "set geometry(height) [winfo height .ctop]"
puts $f "set geometry(canv1) [expr [winfo width $canv]-2]" puts $f "set geometry(canv1) [expr [winfo width $canv]-2]"
@ -694,7 +695,7 @@ proc bindline {t id} {
proc drawcommitline {level} { proc drawcommitline {level} {
global parents children nparents nchildren todo global parents children nparents nchildren todo
global canv canv2 canv3 mainfont namefont canvx0 canvy linespc global canv canv2 canv3 mainfont namefont canvy linespc
global lineid linehtag linentag linedtag commitinfo global lineid linehtag linentag linedtag commitinfo
global colormap numcommits currentparents dupparents global colormap numcommits currentparents dupparents
global oldlevel oldnlines oldtodo global oldlevel oldnlines oldtodo
@ -728,7 +729,7 @@ proc drawcommitline {level} {
} }
} }
} }
set x [expr $canvx0 + $level * $linespc] set x [xcoord $level $level $lineno]
set y1 $canvy set y1 $canvy
set canvy [expr $canvy + $linespc] set canvy [expr $canvy + $linespc]
allcanvs conf -scrollregion \ allcanvs conf -scrollregion \
@ -756,7 +757,7 @@ proc drawcommitline {level} {
-fill $ofill -outline black -width 1] -fill $ofill -outline black -width 1]
$canv raise $t $canv raise $t
$canv bind $t <1> {selcanvline {} %x %y} $canv bind $t <1> {selcanvline {} %x %y}
set xt [expr $canvx0 + [llength $todo] * $linespc] set xt [xcoord [llength $todo] $level $lineno]
if {[llength $currentparents] > 2} { if {[llength $currentparents] > 2} {
set xt [expr {$xt + ([llength $currentparents] - 2) * $linespc}] set xt [expr {$xt + ([llength $currentparents] - 2) * $linespc}]
} }
@ -832,8 +833,8 @@ proc drawtags {id x xt y1} {
proc updatetodo {level noshortcut} { proc updatetodo {level noshortcut} {
global currentparents ncleft todo global currentparents ncleft todo
global mainline oldlevel oldtodo oldnlines global mainline oldlevel oldtodo oldnlines
global canvx0 canvy linespc mainline global canvy linespc mainline
global commitinfo global commitinfo lineno xspc1
set oldlevel $level set oldlevel $level
set oldtodo $todo set oldtodo $todo
@ -842,10 +843,11 @@ proc updatetodo {level noshortcut} {
set p [lindex $currentparents 0] set p [lindex $currentparents 0]
if {$ncleft($p) == 1 && [lsearch -exact $todo $p] < 0} { if {$ncleft($p) == 1 && [lsearch -exact $todo $p] < 0} {
set ncleft($p) 0 set ncleft($p) 0
set x [expr $canvx0 + $level * $linespc] set x [xcoord $level $level $lineno]
set y [expr $canvy - $linespc] set y [expr $canvy - $linespc]
set mainline($p) [list $x $y] set mainline($p) [list $x $y]
set todo [lreplace $todo $level $level $p] set todo [lreplace $todo $level $level $p]
set xspc1([expr {$lineno + 1}]) $xspc1($lineno)
return 0 return 0
} }
} }
@ -891,10 +893,36 @@ proc notecrossings {id lo hi corner} {
} }
} }
proc drawslants {} { proc xcoord {i level ln} {
global canv mainline sidelines canvx0 canvy linespc global canvx0 xspc1 xspc2
set x [expr {$canvx0 + $i * $xspc1($ln)}]
if {$i > 0 && $i == $level} {
set x [expr {$x + 0.5 * ($xspc2 - $xspc1($ln))}]
} elseif {$i > $level} {
set x [expr {$x + $xspc2 - $xspc1($ln)}]
}
return $x
}
proc drawslants {level} {
global canv mainline sidelines canvx0 canvy xspc1 xspc2 lthickness
global oldlevel oldtodo todo currentparents dupparents global oldlevel oldtodo todo currentparents dupparents
global lthickness linespc canvy colormap global lthickness linespc canvy colormap lineno geometry
global maxgraphpct
# decide on the line spacing for the next line
set lj [expr {$lineno + 1}]
set maxw [expr {$maxgraphpct * $geometry(canv1) / 100}]
set n [llength $todo]
if {$n <= 1 || $canvx0 + $n * $xspc2 <= $maxw} {
set xspc1($lj) $xspc2
} else {
set xspc1($lj) [expr {($maxw - $canvx0 - $xspc2) / ($n - 1)}]
if {$xspc1($lj) < $lthickness} {
set xspc1($lj) $lthickness
}
}
set y1 [expr $canvy - $linespc] set y1 [expr $canvy - $linespc]
set y2 $canvy set y2 $canvy
@ -902,17 +930,17 @@ proc drawslants {} {
foreach id $oldtodo { foreach id $oldtodo {
incr i incr i
if {$id == {}} continue if {$id == {}} continue
set xi [expr {$canvx0 + $i * $linespc}] set xi [xcoord $i $oldlevel $lineno]
if {$i == $oldlevel} { if {$i == $oldlevel} {
foreach p $currentparents { foreach p $currentparents {
set j [lsearch -exact $todo $p] set j [lsearch -exact $todo $p]
set coords [list $xi $y1] set coords [list $xi $y1]
set xj [expr {$canvx0 + $j * $linespc}] set xj [xcoord $j $level $lj]
if {$j < $i - 1} { if {$xj < $xi - $linespc} {
lappend coords [expr $xj + $linespc] $y1 lappend coords [expr {$xj + $linespc}] $y1
notecrossings $p $j $i [expr {$j + 1}] notecrossings $p $j $i [expr {$j + 1}]
} elseif {$j > $i + 1} { } elseif {$xj > $xi + $linespc} {
lappend coords [expr $xj - $linespc] $y1 lappend coords [expr {$xj - $linespc}] $y1
notecrossings $p $i $j [expr {$j - 1}] notecrossings $p $i $j [expr {$j - 1}]
} }
if {[lsearch -exact $dupparents $p] >= 0} { if {[lsearch -exact $dupparents $p] >= 0} {
@ -924,28 +952,48 @@ proc drawslants {} {
} }
} else { } else {
# normal case, no parent duplicated # normal case, no parent duplicated
set yb $y2
set dx [expr {abs($xi - $xj)}]
if {0 && $dx < $linespc} {
set yb [expr {$y1 + $dx}]
}
if {![info exists mainline($p)]} { if {![info exists mainline($p)]} {
if {$i != $j} { if {$xi != $xj} {
lappend coords $xj $y2 lappend coords $xj $yb
} }
set mainline($p) $coords set mainline($p) $coords
} else { } else {
lappend coords $xj $yb
if {$yb < $y2} {
lappend coords $xj $y2 lappend coords $xj $y2
}
lappend sidelines($p) [list $coords 1] lappend sidelines($p) [list $coords 1]
} }
} }
} }
} elseif {[lindex $todo $i] != $id} { } else {
set j $i
if {[lindex $todo $i] != $id} {
set j [lsearch -exact $todo $id] set j [lsearch -exact $todo $id]
set xj [expr {$canvx0 + $j * $linespc}] }
lappend mainline($id) $xi $y1 $xj $y2 if {$j != $i || $xspc1($lineno) != $xspc1($lj)
|| ($oldlevel <= $i && $i <= $level)
|| ($level <= $i && $i <= $oldlevel)} {
set xj [xcoord $j $level $lj]
set dx [expr {abs($xi - $xj)}]
set yb $y2
if {0 && $dx < $linespc} {
set yb [expr {$y1 + $dx}]
}
lappend mainline($id) $xi $y1 $xj $yb
}
} }
} }
} }
proc decidenext {{noread 0}} { proc decidenext {{noread 0}} {
global parents children nchildren ncleft todo global parents children nchildren ncleft todo
global canv canv2 canv3 mainfont namefont canvx0 canvy linespc global canv canv2 canv3 mainfont namefont canvy linespc
global datemode cdate global datemode cdate
global commitinfo global commitinfo
global currentparents oldlevel oldnlines oldtodo global currentparents oldlevel oldnlines oldtodo
@ -1036,7 +1084,7 @@ proc drawcommit {id} {
return return
} }
while 1 { while 1 {
drawslants drawslants $level
drawcommitline $level drawcommitline $level
if {[updatetodo $level $datemode]} { if {[updatetodo $level $datemode]} {
set level [decidenext 1] set level [decidenext 1]
@ -1065,8 +1113,8 @@ proc finishcommits {} {
-font $mainfont -tags textitems -font $mainfont -tags textitems
set phase {} set phase {}
} else { } else {
drawslants
set level [decidenext] set level [decidenext]
drawslants $level
drawrest $level [llength $startcommits] drawrest $level [llength $startcommits]
} }
. config -cursor $maincursor . config -cursor $maincursor
@ -1114,7 +1162,7 @@ proc drawrest {level startix} {
if {$hard} { if {$hard} {
set level [decidenext] set level [decidenext]
if {$level < 0} break if {$level < 0} break
drawslants drawslants $level
} }
if {[clock clicks -milliseconds] >= $nextupdate} { if {[clock clicks -milliseconds] >= $nextupdate} {
update update
@ -2451,10 +2499,14 @@ proc listboxsel {} {
proc setcoords {} { proc setcoords {} {
global linespc charspc canvx0 canvy0 mainfont global linespc charspc canvx0 canvy0 mainfont
global xspc1 xspc2
set linespc [font metrics $mainfont -linespace] set linespc [font metrics $mainfont -linespace]
set charspc [font measure $mainfont "m"] set charspc [font measure $mainfont "m"]
set canvy0 [expr 3 + 0.5 * $linespc] set canvy0 [expr 3 + 0.5 * $linespc]
set canvx0 [expr 3 + 0.5 * $linespc] set canvx0 [expr 3 + 0.5 * $linespc]
set xspc1(0) $linespc
set xspc2 $linespc
} }
proc redisplay {} { proc redisplay {} {
@ -2941,6 +2993,7 @@ set mainfont {Helvetica 9}
set textfont {Courier 9} set textfont {Courier 9}
set findmergefiles 0 set findmergefiles 0
set gaudydiff 0 set gaudydiff 0
set maxgraphpct 50
set colors {green red blue magenta darkgrey brown orange} set colors {green red blue magenta darkgrey brown orange}