Make getting file lists asynchronous
Add some scrollbars
This commit is contained in:
parent
b5721c72b7
commit
d2610d110e
111
gitk
111
gitk
@ -7,7 +7,7 @@ exec wish "$0" -- "${1+$@}"
|
||||
# and distributed under the terms of the GNU General Public Licence,
|
||||
# either version 2, or (at your option) any later version.
|
||||
|
||||
# CVS $Revision: 1.4 $
|
||||
# CVS $Revision: 1.5 $
|
||||
|
||||
set datemode 0
|
||||
set boldnames 0
|
||||
@ -115,20 +115,6 @@ proc readcommit {id} {
|
||||
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 {} {
|
||||
global canv canv2 canv3 linespc charspc ctext cflist
|
||||
panedwindow .ctop -orient vertical
|
||||
@ -155,13 +141,24 @@ proc makewindow {} {
|
||||
|
||||
panedwindow .ctop.cdet -orient horizontal
|
||||
.ctop add .ctop.cdet
|
||||
set ctext .ctop.cdet.ctext
|
||||
text $ctext -bg white -state disabled
|
||||
.ctop.cdet add $ctext
|
||||
#pack $ctext -side top -fill x -expand 1
|
||||
set cflist .ctop.cdet.cfiles
|
||||
listbox $cflist -width 30 -bg white
|
||||
.ctop.cdet add $cflist
|
||||
frame .ctop.cdet.left
|
||||
set ctext .ctop.cdet.left.ctext
|
||||
text $ctext -bg white -state disabled \
|
||||
-yscrollcommand ".ctop.cdet.left.sb set"
|
||||
scrollbar .ctop.cdet.left.sb -command "$ctext yview"
|
||||
pack .ctop.cdet.left.sb -side right -fill y
|
||||
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
|
||||
|
||||
bindall <1> {selcanvline %x %y}
|
||||
@ -437,13 +434,23 @@ proc selcanvline {x y} {
|
||||
}
|
||||
|
||||
proc selectline {l} {
|
||||
global canv ctext commitinfo selectedline lineid linehtag
|
||||
global canvy canvy0 linespc nparents
|
||||
global cflist treediffs
|
||||
global canv canv2 canv3 ctext commitinfo selectedline
|
||||
global lineid linehtag linentag linedtag
|
||||
global canvy canvy0 linespc nparents treepending
|
||||
global cflist treediffs currentid
|
||||
if {![info exists lineid($l)] || ![info exists linehtag($l)]} return
|
||||
$canv select clear
|
||||
$canv select from $linehtag($l) 0
|
||||
$canv select to $linehtag($l) end
|
||||
$canv delete secsel
|
||||
set t [eval $canv create rect [$canv bbox $linehtag($l)] -outline {{}} \
|
||||
-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 ytop [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 delete 0.0 end
|
||||
set info $commitinfo($id)
|
||||
$ctext insert end "Author: [lindex $info 1] \t[lindex $info 2]\n"
|
||||
$ctext insert end "Committer: [lindex $info 3] \t[lindex $info 4]\n"
|
||||
$ctext insert end "Author: [lindex $info 1] [lindex $info 2]\n"
|
||||
$ctext insert end "Committer: [lindex $info 3] [lindex $info 4]\n"
|
||||
$ctext insert end "\n"
|
||||
$ctext insert end [lindex $info 0]
|
||||
$ctext conf -state disabled
|
||||
|
||||
$cflist delete 0 end
|
||||
set currentid $id
|
||||
if {$nparents($id) == 1} {
|
||||
if {![info exists treediffs($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} {
|
||||
global selectedline
|
||||
if {![info exists selectedline]} return
|
||||
|
Loading…
Reference in New Issue
Block a user