Make getting file lists asynchronous

Add some scrollbars
maint
Paul Mackerras 2005-05-11 00:45:38 +00:00
parent b5721c72b7
commit d2610d110e
1 changed files with 81 additions and 34 deletions

115
gitk
View File

@ -7,7 +7,7 @@ exec wish "$0" -- "${1+$@}"
# and distributed under the terms of the GNU General Public Licence, # and distributed under the terms of the GNU General Public Licence,
# either version 2, or (at your option) any later version. # either version 2, or (at your option) any later version.


# CVS $Revision: 1.4 $ # CVS $Revision: 1.5 $


set datemode 0 set datemode 0
set boldnames 0 set boldnames 0
@ -115,20 +115,6 @@ proc readcommit {id} {
set commitsummary($id) [list $headline $auname $audate] set commitsummary($id) [list $headline $auname $audate]
} }


proc gettreediffs {id} {
global treediffs parents
set p [lindex $parents($id) 0]
set diff {}
foreach line [split [exec git-diff-tree -r $p $id] "\n"] {
set type [lindex $line 1]
set file [lindex $line 3]
if {$type == "blob"} {
lappend diff $file
}
}
set treediffs($id) $diff
}

proc makewindow {} { proc makewindow {} {
global canv canv2 canv3 linespc charspc ctext cflist global canv canv2 canv3 linespc charspc ctext cflist
panedwindow .ctop -orient vertical panedwindow .ctop -orient vertical
@ -155,13 +141,24 @@ proc makewindow {} {


panedwindow .ctop.cdet -orient horizontal panedwindow .ctop.cdet -orient horizontal
.ctop add .ctop.cdet .ctop add .ctop.cdet
set ctext .ctop.cdet.ctext frame .ctop.cdet.left
text $ctext -bg white -state disabled set ctext .ctop.cdet.left.ctext
.ctop.cdet add $ctext text $ctext -bg white -state disabled \
#pack $ctext -side top -fill x -expand 1 -yscrollcommand ".ctop.cdet.left.sb set"
set cflist .ctop.cdet.cfiles scrollbar .ctop.cdet.left.sb -command "$ctext yview"
listbox $cflist -width 30 -bg white pack .ctop.cdet.left.sb -side right -fill y
.ctop.cdet add $cflist pack $ctext -side left -fill both -expand 1
.ctop.cdet add .ctop.cdet.left

frame .ctop.cdet.right
set cflist .ctop.cdet.right.cfiles
listbox $cflist -width 30 -bg white \
-yscrollcommand ".ctop.cdet.right.sb set"
scrollbar .ctop.cdet.right.sb -command "$cflist yview"
pack .ctop.cdet.right.sb -side right -fill y
pack $cflist -side left -fill both -expand 1
.ctop.cdet add .ctop.cdet.right

pack .ctop -side top -fill both -expand 1 pack .ctop -side top -fill both -expand 1


bindall <1> {selcanvline %x %y} bindall <1> {selcanvline %x %y}
@ -437,13 +434,23 @@ proc selcanvline {x y} {
} }


proc selectline {l} { proc selectline {l} {
global canv ctext commitinfo selectedline lineid linehtag global canv canv2 canv3 ctext commitinfo selectedline
global canvy canvy0 linespc nparents global lineid linehtag linentag linedtag
global cflist treediffs global canvy canvy0 linespc nparents treepending
global cflist treediffs currentid
if {![info exists lineid($l)] || ![info exists linehtag($l)]} return if {![info exists lineid($l)] || ![info exists linehtag($l)]} return
$canv select clear $canv delete secsel
$canv select from $linehtag($l) 0 set t [eval $canv create rect [$canv bbox $linehtag($l)] -outline {{}} \
$canv select to $linehtag($l) end -tags secsel -fill [$canv cget -selectbackground]]
$canv lower $t
$canv2 delete secsel
set t [eval $canv2 create rect [$canv2 bbox $linentag($l)] -outline {{}} \
-tags secsel -fill [$canv2 cget -selectbackground]]
$canv2 lower $t
$canv3 delete secsel
set t [eval $canv3 create rect [$canv3 bbox $linedtag($l)] -outline {{}} \
-tags secsel -fill [$canv3 cget -selectbackground]]
$canv3 lower $t
set y [expr {$canvy0 + $l * $linespc}] set y [expr {$canvy0 + $l * $linespc}]
set ytop [expr {($y - $linespc / 2.0) / $canvy}] set ytop [expr {($y - $linespc / 2.0) / $canvy}]
set ybot [expr {($y + $linespc / 2.0) / $canvy}] set ybot [expr {($y + $linespc / 2.0) / $canvy}]
@ -460,24 +467,64 @@ proc selectline {l} {
$ctext conf -state normal $ctext conf -state normal
$ctext delete 0.0 end $ctext delete 0.0 end
set info $commitinfo($id) set info $commitinfo($id)
$ctext insert end "Author: [lindex $info 1] \t[lindex $info 2]\n" $ctext insert end "Author: [lindex $info 1] [lindex $info 2]\n"
$ctext insert end "Committer: [lindex $info 3] \t[lindex $info 4]\n" $ctext insert end "Committer: [lindex $info 3] [lindex $info 4]\n"
$ctext insert end "\n" $ctext insert end "\n"
$ctext insert end [lindex $info 0] $ctext insert end [lindex $info 0]
$ctext conf -state disabled $ctext conf -state disabled


$cflist delete 0 end $cflist delete 0 end
set currentid $id
if {$nparents($id) == 1} { if {$nparents($id) == 1} {
if {![info exists treediffs($id)]} { if {![info exists treediffs($id)]} {
gettreediffs $id if {![info exists treepending]} {
} gettreediffs $id
foreach f $treediffs($id) { }
$cflist insert end $f } else {
addtocflist $id
} }
} }


} }


proc addtocflist {id} {
global currentid treediffs cflist treepending
if {$id != $currentid} {
gettreediffs $currentid
return
}
foreach f $treediffs($currentid) {
$cflist insert end $f
}
}

proc gettreediffs {id} {
global treediffs parents treepending
set treepending $id
set treediffs($id) {}
set p [lindex $parents($id) 0]
if [catch {set gdtf [open "|git-diff-tree -r $p $id" r]}] return
fconfigure $gdtf -blocking 0
fileevent $gdtf readable "gettreediffline $gdtf $id"
}

proc gettreediffline {gdtf id} {
global treediffs treepending
set n [gets $gdtf line]
if {$n < 0} {
if {![eof $gdtf]} return
close $gdtf
unset treepending
addtocflist $id
return
}
set type [lindex $line 1]
set file [lindex $line 3]
if {$type == "blob"} {
lappend treediffs($id) $file
}
}

proc selnextline {dir} { proc selnextline {dir} {
global selectedline global selectedline
if {![info exists selectedline]} return if {![info exists selectedline]} return