git-gui: Allow the user to control the blame/commit split point

At one point I tried to present the blame viewer to an audience of
people on a 640 by 480 pixel LCD projector.  This did not work at
all as the top area (the file data) was taking up all of the screen
realestate and the split point was not adjustable by the user.  In
general locking the user into a specific ratio of display is just
not user friendly.

So we now place a split pane control into the middle of our blame
window, so the user can adjust it to their current needs.  If the
window increases (or decreases) in height we assign the difference
to the file data area, as that is generally the area of the window
that users are trying to see more of when they grow the window.

Unfortunately there appears to be a bug in the "pack" layout manager
in Tcl/Tk 8.4.1.  The status bar and the lower commit pane was being
squashed if the window decreased in height.  I think the pack manager
was just not decreasing the size of the panedwindow slave properly if
the main window shrank.  Switching to the "grid" layout manager fixes
the problem, but is slightly uglier setup code.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Shawn O. Pearce 2007-06-01 17:55:43 -04:00
parent 223475a77c
commit d0b741dc08

View File

@ -13,6 +13,7 @@ field w_load
field w_file field w_file
field w_cmit field w_cmit
field status field status
field old_height
field highlight_line -1 ; # current line selected field highlight_line -1 ; # current line selected
field highlight_commit {} ; # sha1 of commit selected field highlight_commit {} ; # sha1 of commit selected
@ -59,10 +60,22 @@ constructor new {i_commit i_path} {
-borderwidth 1 \ -borderwidth 1 \
-relief sunken \ -relief sunken \
-font font_uibold -font font_uibold
pack $w.path -side top -fill x
frame $w.out panedwindow $w.file_pane -orient vertical
set w_load $w.out.loaded_t frame $w.file_pane.out
frame $w.file_pane.cm
$w.file_pane add $w.file_pane.out \
-sticky nsew \
-minsize 100 \
-height 100 \
-width 100
$w.file_pane add $w.file_pane.cm \
-sticky nsew \
-minsize 25 \
-height 25 \
-width 100
set w_load $w.file_pane.out.loaded_t
text $w_load \ text $w_load \
-background white -borderwidth 0 \ -background white -borderwidth 0 \
-state disabled \ -state disabled \
@ -72,7 +85,7 @@ constructor new {i_commit i_path} {
-font font_diff -font font_diff
$w_load tag conf annotated -background grey $w_load tag conf annotated -background grey
set w_line $w.out.linenumber_t set w_line $w.file_pane.out.linenumber_t
text $w_line \ text $w_line \
-background white -borderwidth 0 \ -background white -borderwidth 0 \
-state disabled \ -state disabled \
@ -82,7 +95,7 @@ constructor new {i_commit i_path} {
-font font_diff -font font_diff
$w_line tag conf linenumber -justify right $w_line tag conf linenumber -justify right
set w_cgrp $w.out.commit_t set w_cgrp $w.file_pane.out.commit_t
text $w_cgrp \ text $w_cgrp \
-background white -borderwidth 0 \ -background white -borderwidth 0 \
-state disabled \ -state disabled \
@ -91,18 +104,21 @@ constructor new {i_commit i_path} {
-width 4 \ -width 4 \
-font font_diff -font font_diff
set w_file $w.out.file_t set w_file $w.file_pane.out.file_t
text $w_file \ text $w_file \
-background white -borderwidth 0 \ -background white -borderwidth 0 \
-state disabled \ -state disabled \
-wrap none \ -wrap none \
-height 40 \ -height 40 \
-width 80 \ -width 80 \
-xscrollcommand [list $w.out.sbx set] \ -xscrollcommand [list $w.file_pane.out.sbx set] \
-font font_diff -font font_diff
scrollbar $w.out.sbx -orient h -command [list $w_file xview] scrollbar $w.file_pane.out.sbx \
scrollbar $w.out.sby -orient v \ -orient h \
-command [list $w_file xview]
scrollbar $w.file_pane.out.sby \
-orient v \
-command [list scrollbar2many [list \ -command [list scrollbar2many [list \
$w_load \ $w_load \
$w_line \ $w_line \
@ -114,12 +130,11 @@ constructor new {i_commit i_path} {
$w_line \ $w_line \
$w_load \ $w_load \
$w_file \ $w_file \
$w.out.sby \ $w.file_pane.out.sby \
-sticky nsew -sticky nsew
grid conf $w.out.sbx -column 3 -sticky we grid conf $w.file_pane.out.sbx -column 3 -sticky we
grid columnconfigure $w.out 3 -weight 1 grid columnconfigure $w.file_pane.out 3 -weight 1
grid rowconfigure $w.out 0 -weight 1 grid rowconfigure $w.file_pane.out 0 -weight 1
pack $w.out -fill both -expand 1
label $w.status \ label $w.status \
-textvariable @status \ -textvariable @status \
@ -127,18 +142,16 @@ constructor new {i_commit i_path} {
-justify left \ -justify left \
-borderwidth 1 \ -borderwidth 1 \
-relief sunken -relief sunken
pack $w.status -side bottom -fill x
frame $w.cm set w_cmit $w.file_pane.cm.t
set w_cmit $w.cm.t
text $w_cmit \ text $w_cmit \
-background white -borderwidth 0 \ -background white -borderwidth 0 \
-state disabled \ -state disabled \
-wrap none \ -wrap none \
-height 10 \ -height 10 \
-width 80 \ -width 80 \
-xscrollcommand [list $w.cm.sbx set] \ -xscrollcommand [list $w.file_pane.cm.sbx set] \
-yscrollcommand [list $w.cm.sby set] \ -yscrollcommand [list $w.file_pane.cm.sby set] \
-font font_diff -font font_diff
$w_cmit tag conf header_key \ $w_cmit tag conf header_key \
-tabs {3c} \ -tabs {3c} \
@ -148,12 +161,15 @@ constructor new {i_commit i_path} {
-background $active_color \ -background $active_color \
-font font_ui -font font_ui
$w_cmit tag raise sel $w_cmit tag raise sel
scrollbar $w.cm.sbx -orient h -command [list $w_cmit xview] scrollbar $w.file_pane.cm.sbx \
scrollbar $w.cm.sby -orient v -command [list $w_cmit yview] -orient h \
pack $w.cm.sby -side right -fill y -command [list $w_cmit xview]
pack $w.cm.sbx -side bottom -fill x scrollbar $w.file_pane.cm.sby \
-orient v \
-command [list $w_cmit yview]
pack $w.file_pane.cm.sby -side right -fill y
pack $w.file_pane.cm.sbx -side bottom -fill x
pack $w_cmit -expand 1 -fill both pack $w_cmit -expand 1 -fill both
pack $w.cm -side bottom -fill x
menu $w.ctxm -tearoff 0 menu $w.ctxm -tearoff 0
$w.ctxm add command \ $w.ctxm add command \
@ -172,7 +188,7 @@ constructor new {i_commit i_path} {
$w_load \ $w_load \
$w_line \ $w_line \
$w_file \ $w_file \
] yview $w.out.sby] ] yview $w.file_pane.out.sby]
bind $i <Button-1> " bind $i <Button-1> "
[cb _hide_tooltip] [cb _hide_tooltip]
[cb _click $i @%x,%y] [cb _click $i @%x,%y]
@ -212,6 +228,29 @@ constructor new {i_commit i_path} {
bind $top <Visibility> [list focus $top] bind $top <Visibility> [list focus $top]
bind $top <Destroy> [list delete_this $this] bind $top <Destroy> [list delete_this $this]
grid configure $w.path -sticky ew
grid configure $w.file_pane -sticky nsew
grid configure $w.status -sticky ew
grid columnconfigure $top 0 -weight 1
grid rowconfigure $top 0 -weight 0
grid rowconfigure $top 1 -weight 1
grid rowconfigure $top 2 -weight 0
set req_w [winfo reqwidth $top]
set req_h [winfo reqheight $top]
if {$req_w < 600} {set req_w 600}
if {$req_h < 400} {set req_h 400}
set g "${req_w}x${req_h}"
wm geometry $top $g
update
set old_height [winfo height $w.file_pane]
$w.file_pane sash place 0 \
[lindex [$w.file_pane sash coord 0] 0] \
[expr {int($old_height * 0.70)}]
bind $w.file_pane <Configure> \
"if {{$w.file_pane} eq {%W}} {[cb _resize %h]}"
if {$commit eq {}} { if {$commit eq {}} {
set fd [open $path r] set fd [open $path r]
} else { } else {
@ -633,4 +672,19 @@ method _hide_tooltip {} {
} }
} }
method _resize {new_height} {
set diff [expr {$new_height - $old_height}]
if {$diff == 0} return
set my [expr {[winfo height $w.file_pane] - 25}]
set o [$w.file_pane sash coord 0]
set ox [lindex $o 0]
set oy [expr {[lindex $o 1] + $diff}]
if {$oy < 0} {set oy 0}
if {$oy > $my} {set oy $my}
$w.file_pane sash place 0 $ox $oy
set old_height $new_height
}
} }