Skip to content

Commit

Permalink
gitk: Restore scrolling position of diff pane on back/forward in history
Browse files Browse the repository at this point in the 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>
  • Loading branch information
Paul Mackerras committed Nov 23, 2008
1 parent e116013 commit 354af6b
Showing 1 changed file with 75 additions and 9 deletions.
84 changes: 75 additions & 9 deletions gitk
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
}

Expand All @@ -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
Expand All @@ -6823,6 +6857,7 @@ proc goforw {} {
focus .

if {$historyindex < [llength $history]} {
save_position
set cmd [lindex $history $historyindex]
incr historyindex
godo $cmd
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 {}
}
Expand All @@ -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
}
}

Expand Down Expand Up @@ -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
}

Expand Down Expand Up @@ -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
Expand All @@ -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 {}
}
Expand Down

0 comments on commit 354af6b

Please sign in to comment.