mirror of
https://github.com/git/git.git
synced 2024-11-06 01:03:02 +01:00
gitk: Restore scrolling position of diff pane on back/forward in history
This arranges to save the scrolling position of the diff display pane when we move from displaying one thing to another, and then scroll the pane to the same position when we go back to the previous thing using the back or forward buttons. This works if we have clicked on a commit and are in patch display mode, or if we have clicked on a line or a tag, or have done a diff between two commits with the context menu. It doesn't currently restore the pane to where it was if is was displaying a commit in tree display mode. For future extensibility, addtohistory now takes an extra optional argument which is a script to invoke when moving from this thing to another. The script needs to return a list of pairs of variable name and value. If we go back to this thing, the godo procedure will set the named variables to the values given. At present that is just used to store the $ctext scrolling position, but in future we will use it to store the state of which directories are open in the file list pane. Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
e11601381e
commit
354af6bd69
1 changed files with 75 additions and 9 deletions
84
gitk
84
gitk
|
@ -6618,7 +6618,7 @@ proc selectline {l isnew {desired_loc {}}} {
|
|||
make_secsel $id
|
||||
|
||||
if {$isnew} {
|
||||
addtohistory [list selbyid $id]
|
||||
addtohistory [list selbyid $id 0] savecmitpos
|
||||
}
|
||||
|
||||
$sha1entry delete 0 end
|
||||
|
@ -6770,10 +6770,12 @@ proc reselectline {} {
|
|||
}
|
||||
}
|
||||
|
||||
proc addtohistory {cmd} {
|
||||
proc addtohistory {cmd {saveproc {}}} {
|
||||
global history historyindex curview
|
||||
|
||||
set elt [list $curview $cmd]
|
||||
unset_posvars
|
||||
save_position
|
||||
set elt [list $curview $cmd $saveproc {}]
|
||||
if {$historyindex > 0
|
||||
&& [lindex $history [expr {$historyindex - 1}]] == $elt} {
|
||||
return
|
||||
|
@ -6793,14 +6795,45 @@ proc addtohistory {cmd} {
|
|||
.tf.bar.rightbut conf -state disabled
|
||||
}
|
||||
|
||||
# save the scrolling position of the diff display pane
|
||||
proc save_position {} {
|
||||
global historyindex history
|
||||
|
||||
if {$historyindex < 1} return
|
||||
set hi [expr {$historyindex - 1}]
|
||||
set fn [lindex $history $hi 2]
|
||||
if {$fn ne {}} {
|
||||
lset history $hi 3 [eval $fn]
|
||||
}
|
||||
}
|
||||
|
||||
proc unset_posvars {} {
|
||||
global last_posvars
|
||||
|
||||
if {[info exists last_posvars]} {
|
||||
foreach {var val} $last_posvars {
|
||||
global $var
|
||||
catch {unset $var}
|
||||
}
|
||||
unset last_posvars
|
||||
}
|
||||
}
|
||||
|
||||
proc godo {elt} {
|
||||
global curview
|
||||
global curview last_posvars
|
||||
|
||||
set view [lindex $elt 0]
|
||||
set cmd [lindex $elt 1]
|
||||
set pv [lindex $elt 3]
|
||||
if {$curview != $view} {
|
||||
showview $view
|
||||
}
|
||||
unset_posvars
|
||||
foreach {var val} $pv {
|
||||
global $var
|
||||
set $var $val
|
||||
}
|
||||
set last_posvars $pv
|
||||
eval $cmd
|
||||
}
|
||||
|
||||
|
@ -6809,6 +6842,7 @@ proc goback {} {
|
|||
focus .
|
||||
|
||||
if {$historyindex > 1} {
|
||||
save_position
|
||||
incr historyindex -1
|
||||
godo [lindex $history [expr {$historyindex - 1}]]
|
||||
.tf.bar.rightbut conf -state normal
|
||||
|
@ -6823,6 +6857,7 @@ proc goforw {} {
|
|||
focus .
|
||||
|
||||
if {$historyindex < [llength $history]} {
|
||||
save_position
|
||||
set cmd [lindex $history $historyindex]
|
||||
incr historyindex
|
||||
godo $cmd
|
||||
|
@ -7189,6 +7224,34 @@ proc getblobdiffs {ids} {
|
|||
filerun $bdf [list getblobdiffline $bdf $diffids]
|
||||
}
|
||||
|
||||
proc savecmitpos {} {
|
||||
global ctext cmitmode
|
||||
|
||||
if {$cmitmode eq "tree"} {
|
||||
return {}
|
||||
}
|
||||
return [list target_scrollpos [$ctext index @0,0]]
|
||||
}
|
||||
|
||||
proc savectextpos {} {
|
||||
global ctext
|
||||
|
||||
return [list target_scrollpos [$ctext index @0,0]]
|
||||
}
|
||||
|
||||
proc maybe_scroll_ctext {ateof} {
|
||||
global ctext target_scrollpos
|
||||
|
||||
if {![info exists target_scrollpos]} return
|
||||
if {!$ateof} {
|
||||
set nlines [expr {[winfo height $ctext]
|
||||
/ [font metrics textfont -linespace]}]
|
||||
if {[$ctext compare "$target_scrollpos + $nlines lines" <= end]} return
|
||||
}
|
||||
$ctext yview $target_scrollpos
|
||||
unset target_scrollpos
|
||||
}
|
||||
|
||||
proc setinlist {var i val} {
|
||||
global $var
|
||||
|
||||
|
@ -7383,6 +7446,7 @@ proc getblobdiffline {bdf ids} {
|
|||
if {[info exists seehere]} {
|
||||
mark_ctext_line [lindex [split $seehere .] 0]
|
||||
}
|
||||
maybe_scroll_ctext [eof $bdf]
|
||||
$ctext conf -state disabled
|
||||
if {[eof $bdf]} {
|
||||
close $bdf
|
||||
|
@ -7877,7 +7941,7 @@ proc lineclick {x y id isnew} {
|
|||
}
|
||||
|
||||
if {$isnew} {
|
||||
addtohistory [list lineclick $x $y $id 0]
|
||||
addtohistory [list lineclick $x $y $id 0] savectextpos
|
||||
}
|
||||
# fill the details pane with info about this line
|
||||
$ctext conf -state normal
|
||||
|
@ -7908,6 +7972,7 @@ proc lineclick {x y id isnew} {
|
|||
$ctext insert end "\n\t[mc "Date"]:\t$date\n"
|
||||
}
|
||||
}
|
||||
maybe_scroll_ctext 1
|
||||
$ctext conf -state disabled
|
||||
init_flist {}
|
||||
}
|
||||
|
@ -7921,10 +7986,10 @@ proc normalline {} {
|
|||
}
|
||||
}
|
||||
|
||||
proc selbyid {id} {
|
||||
proc selbyid {id {isnew 1}} {
|
||||
global curview
|
||||
if {[commitinview $id $curview]} {
|
||||
selectline [rowofcommit $id] 1
|
||||
selectline [rowofcommit $id] $isnew
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7974,7 +8039,7 @@ proc diffvssel {dirn} {
|
|||
set oldid $rowmenuid
|
||||
set newid [commitonrow $selectedline]
|
||||
}
|
||||
addtohistory [list doseldiff $oldid $newid]
|
||||
addtohistory [list doseldiff $oldid $newid] savectextpos
|
||||
doseldiff $oldid $newid
|
||||
}
|
||||
|
||||
|
@ -9886,7 +9951,7 @@ proc showtag {tag isnew} {
|
|||
global ctext tagcontents tagids linknum tagobjid
|
||||
|
||||
if {$isnew} {
|
||||
addtohistory [list showtag $tag 0]
|
||||
addtohistory [list showtag $tag 0] savectextpos
|
||||
}
|
||||
$ctext conf -state normal
|
||||
clear_ctext
|
||||
|
@ -9903,6 +9968,7 @@ proc showtag {tag isnew} {
|
|||
set text "[mc "Tag"]: $tag\n[mc "Id"]: $tagids($tag)"
|
||||
}
|
||||
appendwithlinks $text {}
|
||||
maybe_scroll_ctext
|
||||
$ctext conf -state disabled
|
||||
init_flist {}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue