Merge git://ozlabs.org/~paulus/gitk

* git://ozlabs.org/~paulus/gitk:
  gitk: Display important heads even when there are many
  gitk: Improve display of list of nearby tags and heads
  gitk: Fix display of branch names on some commits
  gitk: Update Swedish translation (296t)
  gitk: When searching, only highlight files when in Patch mode
  gitk: Fix error message when clicking on a connecting line
  gitk: Fix crash when not using themed widgets
  gitk: Use bindshiftfunctionkey to bind Shift-F5
  gitk: Refactor code for binding modified function keys
  gitk: Work around empty back and forward images when buttons are disabled
  gitk: Highlight first search result immediately on incremental search
  gitk: Highlight current search hit in orange
  gitk: Synchronize highlighting in file view when scrolling diff
This commit is contained in:
Junio C Hamano
2013-01-23 08:35:03 -08:00
2 changed files with 504 additions and 365 deletions

View File

@ -2161,7 +2161,7 @@ proc makewindow {} {
trace add variable sha1string write sha1change trace add variable sha1string write sha1change
pack $sha1entry -side left -pady 2 pack $sha1entry -side left -pady 2
image create bitmap bm-left -data { set bm_left_data {
#define left_width 16 #define left_width 16
#define left_height 16 #define left_height 16
static unsigned char left_bits[] = { static unsigned char left_bits[] = {
@ -2169,7 +2169,7 @@ proc makewindow {} {
0x0e, 0x00, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x0e, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x0e, 0x00, 0x1c, 0x00,
0x38, 0x00, 0x70, 0x00, 0xe0, 0x00, 0xc0, 0x01}; 0x38, 0x00, 0x70, 0x00, 0xe0, 0x00, 0xc0, 0x01};
} }
image create bitmap bm-right -data { set bm_right_data {
#define right_width 16 #define right_width 16
#define right_height 16 #define right_height 16
static unsigned char right_bits[] = { static unsigned char right_bits[] = {
@ -2177,11 +2177,24 @@ proc makewindow {} {
0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c, 0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c,
0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01}; 0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01};
} }
${NS}::button .tf.bar.leftbut -image bm-left -command goback \ image create bitmap bm-left -data $bm_left_data
-state disabled -width 26 image create bitmap bm-left-gray -data $bm_left_data -foreground "#999"
image create bitmap bm-right -data $bm_right_data
image create bitmap bm-right-gray -data $bm_right_data -foreground "#999"
${NS}::button .tf.bar.leftbut -command goback -state disabled -width 26
if {$use_ttk} {
.tf.bar.leftbut configure -image [list bm-left disabled bm-left-gray]
} else {
.tf.bar.leftbut configure -image bm-left
}
pack .tf.bar.leftbut -side left -fill y pack .tf.bar.leftbut -side left -fill y
${NS}::button .tf.bar.rightbut -image bm-right -command goforw \ ${NS}::button .tf.bar.rightbut -command goforw -state disabled -width 26
-state disabled -width 26 if {$use_ttk} {
.tf.bar.rightbut configure -image [list bm-right disabled bm-right-gray]
} else {
.tf.bar.rightbut configure -image bm-right
}
pack .tf.bar.rightbut -side left -fill y pack .tf.bar.rightbut -side left -fill y
${NS}::label .tf.bar.rowlabel -text [mc "Row"] ${NS}::label .tf.bar.rowlabel -text [mc "Row"]
@ -2361,6 +2374,8 @@ proc makewindow {} {
$ctext tag conf mresult -font textfontbold $ctext tag conf mresult -font textfontbold
$ctext tag conf msep -font textfontbold $ctext tag conf msep -font textfontbold
$ctext tag conf found -back yellow $ctext tag conf found -back yellow
$ctext tag conf currentsearchhit -back orange
$ctext tag conf wwrap -wrap word
.pwbottom add .bleft .pwbottom add .bleft
if {!$use_ttk} { if {!$use_ttk} {
@ -2495,10 +2510,9 @@ proc makewindow {} {
bindkey ? {dofind -1 1} bindkey ? {dofind -1 1}
bindkey f nextfile bindkey f nextfile
bind . <F5> updatecommits bind . <F5> updatecommits
bind . <Shift-F5> reloadcommits bindmodfunctionkey Shift 5 reloadcommits
bind . <F2> showrefs bind . <F2> showrefs
bind . <Shift-F4> {newview 0} bindmodfunctionkey Shift 4 {newview 0}
catch { bind . <Shift-Key-XF86_Switch_VT_4> {newview 0} }
bind . <F4> edit_or_newview bind . <F4> edit_or_newview
bind . <$M1B-q> doquit bind . <$M1B-q> doquit
bind . <$M1B-f> {dofind 1 1} bind . <$M1B-f> {dofind 1 1}
@ -2523,6 +2537,7 @@ proc makewindow {} {
bind $cflist $ctxbut {pop_flist_menu %W %X %Y %x %y} bind $cflist $ctxbut {pop_flist_menu %W %X %Y %x %y}
bind $ctext $ctxbut {pop_diff_menu %W %X %Y %x %y} bind $ctext $ctxbut {pop_diff_menu %W %X %Y %x %y}
bind $ctext <Button-1> {focus %W} bind $ctext <Button-1> {focus %W}
bind $ctext <<Selection>> rehighlight_search_results
set maincursor [. cget -cursor] set maincursor [. cget -cursor]
set textcursor [$ctext cget -cursor] set textcursor [$ctext cget -cursor]
@ -2646,6 +2661,11 @@ proc bindkey {ev script} {
} }
} }
proc bindmodfunctionkey {mod n script} {
bind . <$mod-F$n> $script
catch { bind . <$mod-XF86_Switch_VT_$n> $script }
}
# set the focus back to the toplevel for any click outside # set the focus back to the toplevel for any click outside
# the entry widgets # the entry widgets
proc click {w} { proc click {w} {
@ -2702,7 +2722,7 @@ proc savestuff {w} {
global cmitmode wrapcomment datetimeformat limitdiffs global cmitmode wrapcomment datetimeformat limitdiffs
global colors uicolor bgcolor fgcolor diffcolors diffcontext selectbgcolor global colors uicolor bgcolor fgcolor diffcolors diffcontext selectbgcolor
global autoselect autosellen extdifftool perfile_attrs markbgcolor use_ttk global autoselect autosellen extdifftool perfile_attrs markbgcolor use_ttk
global hideremotes want_ttk global hideremotes want_ttk maxrefs
if {$stuffsaved} return if {$stuffsaved} return
if {![winfo viewable .]} return if {![winfo viewable .]} return
@ -2724,6 +2744,7 @@ proc savestuff {w} {
puts $f [list set autoselect $autoselect] puts $f [list set autoselect $autoselect]
puts $f [list set autosellen $autosellen] puts $f [list set autosellen $autosellen]
puts $f [list set showneartags $showneartags] puts $f [list set showneartags $showneartags]
puts $f [list set maxrefs $maxrefs]
puts $f [list set hideremotes $hideremotes] puts $f [list set hideremotes $hideremotes]
puts $f [list set showlocalchanges $showlocalchanges] puts $f [list set showlocalchanges $showlocalchanges]
puts $f [list set datetimeformat $datetimeformat] puts $f [list set datetimeformat $datetimeformat]
@ -3309,6 +3330,7 @@ proc sel_flist {w x y} {
} else { } else {
catch {$ctext yview [lindex $difffilestart [expr {$l - 2}]]} catch {$ctext yview [lindex $difffilestart [expr {$l - 2}]]}
} }
suppress_highlighting_file_for_current_scrollpos
} }
proc pop_flist_menu {w X Y x y} { proc pop_flist_menu {w X Y x y} {
@ -6857,7 +6879,7 @@ proc viewnextline {dir} {
# add a list of tag or branch names at position pos # add a list of tag or branch names at position pos
# returns the number of names inserted # returns the number of names inserted
proc appendrefs {pos ids var} { proc appendrefs {pos ids var} {
global ctext linknum curview $var maxrefs global ctext linknum curview $var maxrefs mainheadid
if {[catch {$ctext index $pos}]} { if {[catch {$ctext index $pos}]} {
return 0 return 0
@ -6870,24 +6892,54 @@ proc appendrefs {pos ids var} {
lappend tags [list $tag $id] lappend tags [list $tag $id]
} }
} }
set sep {}
set tags [lsort -index 0 -decreasing $tags]
set nutags 0
if {[llength $tags] > $maxrefs} { if {[llength $tags] > $maxrefs} {
$ctext insert $pos "[mc "many"] ([llength $tags])" # If we are displaying heads, and there are too many,
} else { # see if there are some important heads to display.
set tags [lsort -index 0 -decreasing $tags] # Currently this means "master" and the current head.
set sep {} set itags {}
foreach ti $tags { if {$var eq "idheads"} {
set id [lindex $ti 1] set utags {}
set lk link$linknum foreach ti $tags {
incr linknum set hname [lindex $ti 0]
$ctext tag delete $lk set id [lindex $ti 1]
$ctext insert $pos $sep if {($hname eq "master" || $id eq $mainheadid) &&
$ctext insert $pos [lindex $ti 0] $lk [llength $itags] < $maxrefs} {
setlink $id $lk lappend itags $ti
set sep ", " } else {
lappend utags $ti
}
}
set tags $utags
} }
if {$itags ne {}} {
set str [mc "and many more"]
set sep " "
} else {
set str [mc "many"]
}
$ctext insert $pos "$str ([llength $tags])"
set nutags [llength $tags]
set tags $itags
} }
foreach ti $tags {
set id [lindex $ti 1]
set lk link$linknum
incr linknum
$ctext tag delete $lk
$ctext insert $pos $sep
$ctext insert $pos [lindex $ti 0] $lk
setlink $id $lk
set sep ", "
}
$ctext tag add wwrap "$pos linestart" "$pos lineend"
$ctext conf -state disabled $ctext conf -state disabled
return [llength $tags] return [expr {[llength $tags] + $nutags}]
} }
# called when we have finished computing the nearby tags # called when we have finished computing the nearby tags
@ -7947,32 +7999,45 @@ proc changediffdisp {} {
$ctext tag conf dresult -elide [lindex $diffelide 1] $ctext tag conf dresult -elide [lindex $diffelide 1]
} }
proc highlightfile {loc cline} { proc highlightfile {cline} {
global ctext cflist cflist_top global cflist cflist_top
if {![info exists cflist_top]} return
$ctext yview $loc
$cflist tag remove highlight $cflist_top.0 "$cflist_top.0 lineend" $cflist tag remove highlight $cflist_top.0 "$cflist_top.0 lineend"
$cflist tag add highlight $cline.0 "$cline.0 lineend" $cflist tag add highlight $cline.0 "$cline.0 lineend"
$cflist see $cline.0 $cflist see $cline.0
set cflist_top $cline set cflist_top $cline
} }
proc highlightfile_for_scrollpos {topidx} {
global cmitmode difffilestart
if {$cmitmode eq "tree"} return
if {![info exists difffilestart]} return
set top [lindex [split $topidx .] 0]
if {$difffilestart eq {} || $top < [lindex $difffilestart 0]} {
highlightfile 0
} else {
highlightfile [expr {[bsearch $difffilestart $top] + 2}]
}
}
proc prevfile {} { proc prevfile {} {
global difffilestart ctext cmitmode global difffilestart ctext cmitmode
if {$cmitmode eq "tree"} return if {$cmitmode eq "tree"} return
set prev 0.0 set prev 0.0
set prevline 1
set here [$ctext index @0,0] set here [$ctext index @0,0]
foreach loc $difffilestart { foreach loc $difffilestart {
if {[$ctext compare $loc >= $here]} { if {[$ctext compare $loc >= $here]} {
highlightfile $prev $prevline $ctext yview $prev
return return
} }
set prev $loc set prev $loc
incr prevline
} }
highlightfile $prev $prevline $ctext yview $prev
} }
proc nextfile {} { proc nextfile {} {
@ -7980,11 +8045,9 @@ proc nextfile {} {
if {$cmitmode eq "tree"} return if {$cmitmode eq "tree"} return
set here [$ctext index @0,0] set here [$ctext index @0,0]
set line 1
foreach loc $difffilestart { foreach loc $difffilestart {
incr line
if {[$ctext compare $loc > $here]} { if {[$ctext compare $loc > $here]} {
highlightfile $loc $line $ctext yview $loc
return return
} }
} }
@ -8030,7 +8093,6 @@ proc settabs {{firstab {}}} {
proc incrsearch {name ix op} { proc incrsearch {name ix op} {
global ctext searchstring searchdirn global ctext searchstring searchdirn
$ctext tag remove found 1.0 end
if {[catch {$ctext index anchor}]} { if {[catch {$ctext index anchor}]} {
# no anchor set, use start of selection, or of visible area # no anchor set, use start of selection, or of visible area
set sel [$ctext tag ranges sel] set sel [$ctext tag ranges sel]
@ -8043,12 +8105,17 @@ proc incrsearch {name ix op} {
} }
} }
if {$searchstring ne {}} { if {$searchstring ne {}} {
set here [$ctext search $searchdirn -- $searchstring anchor] set here [$ctext search -count mlen $searchdirn -- $searchstring anchor]
if {$here ne {}} { if {$here ne {}} {
$ctext see $here $ctext see $here
set mend "$here + $mlen c"
$ctext tag remove sel 1.0 end
$ctext tag add sel $here $mend
suppress_highlighting_file_for_current_scrollpos
highlightfile_for_scrollpos $here
} }
searchmarkvisible 1
} }
rehighlight_search_results
} }
proc dosearch {} { proc dosearch {} {
@ -8071,9 +8138,12 @@ proc dosearch {} {
return return
} }
$ctext see $match $ctext see $match
suppress_highlighting_file_for_current_scrollpos
highlightfile_for_scrollpos $match
set mend "$match + $mlen c" set mend "$match + $mlen c"
$ctext tag add sel $match $mend $ctext tag add sel $match $mend
$ctext mark unset anchor $ctext mark unset anchor
rehighlight_search_results
} }
} }
@ -8097,21 +8167,41 @@ proc dosearchback {} {
return return
} }
$ctext see $match $ctext see $match
suppress_highlighting_file_for_current_scrollpos
highlightfile_for_scrollpos $match
set mend "$match + $ml c" set mend "$match + $ml c"
$ctext tag add sel $match $mend $ctext tag add sel $match $mend
$ctext mark unset anchor $ctext mark unset anchor
rehighlight_search_results
}
}
proc rehighlight_search_results {} {
global ctext searchstring
$ctext tag remove found 1.0 end
$ctext tag remove currentsearchhit 1.0 end
if {$searchstring ne {}} {
searchmarkvisible 1
} }
} }
proc searchmark {first last} { proc searchmark {first last} {
global ctext searchstring global ctext searchstring
set sel [$ctext tag ranges sel]
set mend $first.0 set mend $first.0
while {1} { while {1} {
set match [$ctext search -count mlen -- $searchstring $mend $last.end] set match [$ctext search -count mlen -- $searchstring $mend $last.end]
if {$match eq {}} break if {$match eq {}} break
set mend "$match + $mlen c" set mend "$match + $mlen c"
$ctext tag add found $match $mend if {$sel ne {} && [$ctext compare $match == [lindex $sel 0]]} {
$ctext tag add currentsearchhit $match $mend
} else {
$ctext tag add found $match $mend
}
} }
} }
@ -8137,8 +8227,23 @@ proc searchmarkvisible {doall} {
} }
} }
proc suppress_highlighting_file_for_current_scrollpos {} {
global ctext suppress_highlighting_file_for_this_scrollpos
set suppress_highlighting_file_for_this_scrollpos [$ctext index @0,0]
}
proc scrolltext {f0 f1} { proc scrolltext {f0 f1} {
global searchstring global searchstring cmitmode ctext
global suppress_highlighting_file_for_this_scrollpos
set topidx [$ctext index @0,0]
if {![info exists suppress_highlighting_file_for_this_scrollpos]
|| $topidx ne $suppress_highlighting_file_for_this_scrollpos} {
highlightfile_for_scrollpos $topidx
}
catch {unset suppress_highlighting_file_for_this_scrollpos}
.bleft.bottom.sb set $f0 $f1 .bleft.bottom.sb set $f0 $f1
if {$searchstring ne {}} { if {$searchstring ne {}} {
@ -10509,13 +10614,13 @@ proc anctags {id} {
# including id itself if it has a head. # including id itself if it has a head.
proc descheads {id} { proc descheads {id} {
global arcnos arcstart arcids archeads idheads cached_dheads global arcnos arcstart arcids archeads idheads cached_dheads
global allparents global allparents arcout
if {![info exists allparents($id)]} { if {![info exists allparents($id)]} {
return {} return {}
} }
set aret {} set aret {}
if {[llength $arcnos($id)] == 1 && [llength $allparents($id)] == 1} { if {![info exists arcout($id)]} {
# part-way along an arc; check it first # part-way along an arc; check it first
set a [lindex $arcnos($id) 0] set a [lindex $arcnos($id) 0]
if {$archeads($a) ne {}} { if {$archeads($a) ne {}} {
@ -10864,7 +10969,7 @@ proc create_prefs_page {w} {
proc prefspage_general {notebook} { proc prefspage_general {notebook} {
global NS maxwidth maxgraphpct showneartags showlocalchanges global NS maxwidth maxgraphpct showneartags showlocalchanges
global tabstop limitdiffs autoselect autosellen extdifftool perfile_attrs global tabstop limitdiffs autoselect autosellen extdifftool perfile_attrs
global hideremotes want_ttk have_ttk global hideremotes want_ttk have_ttk maxrefs
set page [create_prefs_page $notebook.general] set page [create_prefs_page $notebook.general]
@ -10893,9 +10998,12 @@ proc prefspage_general {notebook} {
${NS}::label $page.tabstopl -text [mc "Tab spacing"] ${NS}::label $page.tabstopl -text [mc "Tab spacing"]
spinbox $page.tabstop -from 1 -to 20 -width 4 -textvariable tabstop spinbox $page.tabstop -from 1 -to 20 -width 4 -textvariable tabstop
grid x $page.tabstopl $page.tabstop -sticky w grid x $page.tabstopl $page.tabstop -sticky w
${NS}::checkbutton $page.ntag -text [mc "Display nearby tags"] \ ${NS}::checkbutton $page.ntag -text [mc "Display nearby tags/heads"] \
-variable showneartags -variable showneartags
grid x $page.ntag -sticky w grid x $page.ntag -sticky w
${NS}::label $page.maxrefsl -text [mc "Maximum # tags/heads to show"]
spinbox $page.maxrefs -from 1 -to 1000 -width 4 -textvariable maxrefs
grid x $page.maxrefsl $page.maxrefs -sticky w
${NS}::checkbutton $page.ldiff -text [mc "Limit diffs to listed paths"] \ ${NS}::checkbutton $page.ldiff -text [mc "Limit diffs to listed paths"] \
-variable limitdiffs -variable limitdiffs
grid x $page.ldiff -sticky w grid x $page.ldiff -sticky w

File diff suppressed because it is too large Load Diff