From f5f3c2e29f51a38261daa91073a3f227d4532325 Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Wed, 5 Sep 2007 02:19:56 +1000 Subject: [PATCH] gitk: Make it possible to lay out all the rows we have received so far This arranges things so that we can do the layout all the way up to the last commit that we have received from git log. If we get more commits we re-lay and redisplay (if necessary) the visible rows. Signed-off-by: Paul Mackerras --- gitk | 127 ++++++++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 91 insertions(+), 36 deletions(-) diff --git a/gitk b/gitk index 251e9242b3..a042efe260 100755 --- a/gitk +++ b/gitk @@ -82,11 +82,12 @@ proc dorunq {} { proc start_rev_list {view} { global startmsecs global commfd leftover tclencoding datemode - global viewargs viewfiles commitidx vnextroot + global viewargs viewfiles commitidx viewcomplete vnextroot global lookingforhead showlocalchanges set startmsecs [clock clicks -milliseconds] set commitidx($view) 0 + set viewcomplete($view) 0 set vnextroot($view) 0 set order "--topo-order" if {$datemode} { @@ -148,7 +149,7 @@ proc strrep {n} { proc getcommitlines {fd view} { global commitlisted global leftover commfd - global displayorder commitidx commitrow commitdata + global displayorder commitidx viewcomplete commitrow commitdata global parentlist children curview hlview global vparentlist vdisporder vcmitlisted global ordertok vnextroot idpending @@ -179,6 +180,7 @@ proc getcommitlines {fd view} { lappend vcmitlisted($view) 0 } } + set viewcomplete($view) 1 global viewname unset commfd($view) notbusy $view @@ -310,15 +312,12 @@ proc getcommitlines {fd view} { } proc chewcommits {view} { - global curview hlview commfd + global curview hlview viewcomplete global selectedline pending_select - set more 0 if {$view == $curview} { - set allread [expr {![info exists commfd($view)]}] - set tlimit [expr {[clock clicks -milliseconds] + 50}] - set more [layoutmore $tlimit $allread] - if {$allread && !$more} { + layoutmore + if {$viewcomplete($view)} { global displayorder commitidx phase global numcommits startmsecs @@ -339,7 +338,7 @@ proc chewcommits {view} { if {[info exists hlview] && $view == $hlview} { vhighlightmore } - return $more + return 0 } proc readcommit {id} { @@ -1949,7 +1948,7 @@ proc unflatten {var l} { proc showview {n} { global curview viewdata viewfiles - global displayorder parentlist rowidlist rowisopt + global displayorder parentlist rowidlist rowisopt rowfinal global colormap rowtextx commitrow nextcolor canvxmax global numcommits commitlisted global selectedline currentid canv canvy0 @@ -1985,13 +1984,11 @@ proc showview {n} { set vparentlist($curview) $parentlist set vdisporder($curview) $displayorder set vcmitlisted($curview) $commitlisted - if {$phase ne {}} { - set viewdata($curview) \ - [list $phase $rowidlist $rowisopt $numcommits] - } elseif {![info exists viewdata($curview)] - || [lindex $viewdata($curview) 0] ne {}} { + if {$phase ne {} || + ![info exists viewdata($curview)] || + [lindex $viewdata($curview) 0] ne {}} { set viewdata($curview) \ - [list {} $rowidlist $rowisopt] + [list $phase $rowidlist $rowisopt $rowfinal] } } catch {unset treediffs} @@ -2023,11 +2020,8 @@ proc showview {n} { set commitlisted $vcmitlisted($n) set rowidlist [lindex $v 1] set rowisopt [lindex $v 2] - if {$phase eq {}} { - set numcommits [llength $displayorder] - } else { - set numcommits [lindex $v 3] - } + set rowfinal [lindex $v 3] + set numcommits $commitidx($n) catch {unset colormap} catch {unset rowtextx} @@ -2660,7 +2654,7 @@ proc idcol {idlist id {i 0}} { } proc initlayout {} { - global rowidlist rowisopt displayorder commitlisted + global rowidlist rowisopt rowfinal displayorder commitlisted global numcommits canvxmax canv global nextcolor global parentlist @@ -2674,6 +2668,7 @@ proc initlayout {} { set nextcolor 0 set rowidlist {} set rowisopt {} + set rowfinal {} set canvxmax [$canv cget -width] catch {unset colormap} catch {unset rowtextx} @@ -2708,19 +2703,14 @@ proc visiblerows {} { return [list $r0 $r1] } -proc layoutmore {tmax allread} { - global commitidx numcommits +proc layoutmore {} { + global commitidx viewcomplete numcommits global uparrowlen downarrowlen mingaplen curview set show $commitidx($curview) - if {!$allread} { - set delay [expr {$uparrowlen + $mingaplen + $downarrowlen + 3}] - set show [expr {$show - $delay}] - } if {$show > $numcommits} { - showstuff $show $allread + showstuff $show $viewcomplete($curview) } - return 0 } proc showstuff {canshow last} { @@ -2901,6 +2891,21 @@ proc nextuse {id row} { return -1 } +proc prevuse {id row} { + global commitrow curview children + + set ret -1 + if {[info exists children($curview,$id)]} { + foreach kid $children($curview,$id) { + if {![info exists commitrow($curview,$kid)]} break + if {$commitrow($curview,$kid) < $row} { + set ret $commitrow($curview,$kid) + } + } + } + return $ret +} + proc make_idlist {row} { global displayorder parentlist uparrowlen downarrowlen mingaplen global commitidx curview ordertok children commitrow @@ -2964,11 +2969,42 @@ proc make_idlist {row} { return $idlist } +proc rowsequal {a b} { + while {[set i [lsearch -exact $a {}]] >= 0} { + set a [lreplace $a $i $i] + } + while {[set i [lsearch -exact $b {}]] >= 0} { + set b [lreplace $b $i $i] + } + return [expr {$a eq $b}] +} + +proc makeupline {id row rend col} { + global rowidlist uparrowlen downarrowlen mingaplen + + for {set r $rend} {1} {set r $rstart} { + set rstart [prevuse $id $r] + if {$rstart < 0} return + if {$rstart < $row} break + } + if {$rstart + $uparrowlen + $mingaplen + $downarrowlen < $rend} { + set rstart [expr {$rend - $uparrowlen - 1}] + } + for {set r $rstart} {[incr r] <= $row} {} { + set idlist [lindex $rowidlist $r] + if {$idlist ne {} && [lsearch -exact $idlist $id] < 0} { + set col [idcol $idlist $id $col] + lset rowidlist $r [linsert $idlist $col $id] + changedrow $r + } + } +} + proc layoutrows {row endrow} { - global rowidlist rowisopt displayorder + global rowidlist rowisopt rowfinal displayorder global uparrowlen downarrowlen maxwidth mingaplen global children parentlist - global commitidx curview commitrow + global commitidx viewcomplete curview commitrow set idlist {} if {$row > 0} { @@ -2982,14 +3018,20 @@ proc layoutrows {row endrow} { set rm1 [expr {$row - 1}] if {$rm1 < 0 || [lindex $rowidlist $rm1] eq {}} { set idlist [make_idlist $row] + set final 1 } else { set id [lindex $displayorder $rm1] + set final [lindex $rowfinal $rm1] set col [lsearch -exact $idlist $id] set idlist [lreplace $idlist $col $col] foreach p [lindex $parentlist $rm1] { if {[lsearch -exact $idlist $p] < 0} { set col [idcol $idlist $p $col] set idlist [linsert $idlist $col $p] + # if not the first child, we have to insert a line going up + if {$id ne [lindex $children($curview,$p) 0]} { + makeupline $p $rm1 $row $col + } } } set id [lindex $displayorder $row] @@ -3008,6 +3050,9 @@ proc layoutrows {row endrow} { if {$col < 0} { set col [idcol $idlist $id] set idlist [linsert $idlist $col $id] + if {$children($curview,$id) ne {}} { + makeupline $id $rm1 $row $col + } } set r [expr {$row + $uparrowlen - 1}] if {$r < $commitidx($curview)} { @@ -3032,18 +3077,28 @@ proc layoutrows {row endrow} { } } } + if {$final && !$viewcomplete($curview) && + $row + $uparrowlen + $mingaplen + $downarrowlen + >= $commitidx($curview)} { + set final 0 + } set l [llength $rowidlist] if {$row == $l} { lappend rowidlist $idlist lappend rowisopt 0 + lappend rowfinal $final } elseif {$row < $l} { - if {$idlist ne [lindex $rowidlist $row]} { + if {![rowsequal $idlist [lindex $rowidlist $row]]} { lset rowidlist $row $idlist + lset rowfinal $row $final changedrow $row } } else { - set rowidlist [concat $rowidlist [ntimes [expr {$row - $l}] {}]] + set pad [ntimes [expr {$row - $l}] {}] + set rowidlist [concat $rowidlist $pad] lappend rowidlist $idlist + set rowfinal [concat $rowfinal $pad] + lappend rowfinal $final set rowisopt [concat $rowisopt [ntimes [expr {$row - $l + 1}] 0]] } } @@ -3659,7 +3714,7 @@ proc drawcmitrow {row} { proc drawcommits {row {endrow {}}} { global numcommits iddrawn displayorder curview need_redisplay - global parentlist rowidlist uparrowlen downarrowlen nrows_drawn + global parentlist rowidlist rowfinal uparrowlen downarrowlen nrows_drawn if {$row < 0} { set row 0 @@ -3684,7 +3739,7 @@ proc drawcommits {row {endrow {}}} { set r2 $numcommits } for {set r $rl1} {$r < $r2} {incr r} { - if {[lindex $rowidlist $r] ne {}} { + if {[lindex $rowidlist $r] ne {} && [lindex $rowfinal $r]} { if {$rl1 < $r} { layoutrows $rl1 $r } -- 2.11.4.GIT