From bb3edc8b0473192da11bf7f9e961ea0fcc444c63 Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Thu, 27 Sep 2007 11:00:25 +1000 Subject: [PATCH] gitk: Add progress bars for reading in stuff and for finding This uses the space formerly occupied by the find string entry field to make a status label (unused for now) and a canvas to display a couple of progress bars. The bar for reading in commits is a short green bar that oscillates back and forth as commits come in. The bar for showing the progress of a Find operation is yellow and advances from left to right. This also arranges to stop a Find operation if the user selects another commit or pops up a context menu, and fixes the "highlight this" popup menu items in the file list window. Signed-off-by: Paul Mackerras --- gitk | 186 ++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 153 insertions(+), 33 deletions(-) diff --git a/gitk b/gitk index 34fe337..4e168e9 100755 --- a/gitk +++ b/gitk @@ -84,6 +84,7 @@ proc start_rev_list {view} { global commfd leftover tclencoding datemode global viewargs viewfiles commitidx viewcomplete vnextroot global showlocalchanges commitinterest mainheadid + global progressdirn progresscoords proglastnc curview set startmsecs [clock clicks -milliseconds] set commitidx($view) 0 @@ -111,6 +112,11 @@ proc start_rev_list {view} { } filerun $fd [list getcommitlines $fd $view] nowbusy $view + if {$view == $curview} { + set progressdirn 1 + set progresscoords {0 0} + set proglastnc 0 + } } proc stop_rev_list {} { @@ -183,9 +189,11 @@ proc getcommitlines {fd view} { } } set viewcomplete($view) 1 - global viewname + global viewname progresscoords unset commfd($view) notbusy $view + set progresscoords {0 0} + adjustprogress # set it blocking so we wait for the process to terminate fconfigure $fd -blocking 1 if {[catch {close $fd} err]} { @@ -315,6 +323,33 @@ proc getcommitlines {fd view} { } if {$gotsome} { run chewcommits $view + if {$view == $curview} { + # update progress bar + global progressdirn progresscoords proglastnc + set inc [expr {($commitidx($view) - $proglastnc) * 0.0002}] + set proglastnc $commitidx($view) + set l [lindex $progresscoords 0] + set r [lindex $progresscoords 1] + if {$progressdirn} { + set r [expr {$r + $inc}] + if {$r >= 1.0} { + set r 1.0 + set progressdirn 0 + } + if {$r > 0.2} { + set l [expr {$r - 0.2}] + } + } else { + set l [expr {$l - $inc}] + if {$l <= 0.0} { + set l 0.0 + set progressdirn 1 + } + set r [expr {$l + 0.2}] + } + set progresscoords [list $l $r] + adjustprogress + } } return 2 } @@ -589,7 +624,8 @@ proc makewindow {} { global highlight_files gdttype global searchstring sstring global bgcolor fgcolor bglist fglist diffcolors selectbgcolor - global headctxmenu + global headctxmenu progresscanv progressitem progresscoords statusw + global fprogitem fprogcoord lastprogupdate progupdatepending menu .bar .bar add cascade -label "File" -menu .bar.file @@ -706,6 +742,22 @@ proc makewindow {} { -state disabled -width 26 pack .tf.bar.rightbut -side left -fill y + # Status label and progress bar + set statusw .tf.bar.status + label $statusw -width 15 -relief sunken -font $uifont + pack $statusw -side left -padx 5 + set h [expr {[font metrics $uifont -linespace] + 2}] + set progresscanv .tf.bar.progress + canvas $progresscanv -relief sunken -height $h -borderwidth 2 + set progressitem [$progresscanv create rect -1 0 0 $h -fill green] + set fprogitem [$progresscanv create rect -1 0 0 $h -fill yellow] + pack $progresscanv -side right -expand 1 -fill x + set progresscoords {0 0} + set fprogcoord 0 + bind $progresscanv adjustprogress + set lastprogupdate [clock clicks -milliseconds] + set progupdatepending 0 + # build up the bottom bar of upper window label .tf.lbar.flabel -text "Find " -font $uifont button .tf.lbar.fnext -text "next" -command dofind -font $uifont @@ -1051,6 +1103,37 @@ proc click {w} { focus . } +# Adjust the progress bar for a change in requested extent or canvas size +proc adjustprogress {} { + global progresscanv progressitem progresscoords + global fprogitem fprogcoord lastprogupdate progupdatepending + + set w [expr {[winfo width $progresscanv] - 4}] + set x0 [expr {$w * [lindex $progresscoords 0]}] + set x1 [expr {$w * [lindex $progresscoords 1]}] + set h [winfo height $progresscanv] + $progresscanv coords $progressitem $x0 0 $x1 $h + $progresscanv coords $fprogitem 0 0 [expr {$w * $fprogcoord}] $h + set now [clock clicks -milliseconds] + if {$now >= $lastprogupdate + 100} { + set progupdatepending 0 + update + } elseif {!$progupdatepending} { + set progupdatepending 1 + after [expr {$lastprogupdate + 100 - $now}] doprogupdate + } +} + +proc doprogupdate {} { + global lastprogupdate progupdatepending + + if {$progupdatepending} { + set progupdatepending 0 + set lastprogupdate [clock clicks -milliseconds] + update + } +} + proc savestuff {w} { global canv canv2 canv3 ctext cflist mainfont textfont uifont tabstop global stuffsaved findmergefiles maxgraphpct @@ -1626,6 +1709,7 @@ proc pop_flist_menu {w X Y x y} { global ctext cflist cmitmode flist_menu flist_menu_file global treediffs diffids + stopfinding set l [lindex [split [$w index "@$x,$y"] "."] 0] if {$l <= 1} return if {$cmitmode eq "tree"} { @@ -1639,14 +1723,15 @@ proc pop_flist_menu {w X Y x y} { } proc flist_hl {only} { - global flist_menu_file highlight_files + global flist_menu_file findstring gdttype set x [shellquote $flist_menu_file] - if {$only || $highlight_files eq {}} { - set highlight_files $x + if {$only || $findstring eq {} || $gdttype ne "touching paths:"} { + set findstring $x } else { - append highlight_files " " $x + append findstring " " $x } + set gdttype "touching paths:" } # Functions for adding and removing shell-type quoting @@ -2210,6 +2295,7 @@ proc hfiles_change {} { proc gdttype_change {name ix op} { global gdttype highlight_files findstring findpattern + stopfinding if {$findstring ne {}} { if {$gdttype eq "containing:"} { if {$highlight_files ne {}} { @@ -2233,6 +2319,7 @@ proc gdttype_change {name ix op} { proc find_change {name ix op} { global gdttype findstring highlight_files + stopfinding if {$gdttype eq "containing:"} { findcom_change } else { @@ -2248,6 +2335,7 @@ proc findcom_change {} { global nhighlights mainfont boldnamerows global findpattern findtype findstring gdttype + stopfinding # delete previous highlights, if any foreach row $boldnamerows { bolden_name $row $mainfont @@ -4174,6 +4262,18 @@ proc dofind {{rev 0}} { } } +proc stopfinding {} { + global find_dirn findcurline fprogcoord + + if {[info exists find_dirn]} { + unset find_dirn + unset findcurline + notbusy finding + set fprogcoord 0 + adjustprogress + } +} + proc findnext {restart} { global findcurline find_dirn @@ -4207,8 +4307,11 @@ proc findprev {} { proc findmore {} { global commitdata commitinfo numcommits findpattern findloc global findstartline findcurline displayorder - global find_dirn gdttype fhighlights + global find_dirn gdttype fhighlights fprogcoord + if {![info exists find_dirn]} { + return 0 + } set fldtypes {Headline Author Date Committer CDate Comments} set l [expr {$findcurline + 1}] if {$l >= $numcommits} { @@ -4258,32 +4361,41 @@ proc findmore {} { } } } - if {$found} { + if {$found || ($domore && $l == $findstartline + 1)} { + unset findcurline unset find_dirn - findselectline $l notbusy finding + set fprogcoord 0 + adjustprogress + if {$found} { + findselectline $l + } else { + bell + } return 0 } if {!$domore} { flushhighlights - return 0 + } else { + set findcurline [expr {$l - 1}] } - if {$l == $findstartline + 1} { - bell - unset findcurline - unset find_dirn - notbusy finding - return 0 + set n [expr {$findcurline - ($findstartline + 1)}] + if {$n < 0} { + incr n $numcommits } - set findcurline [expr {$l - 1}] - return 1 + set fprogcoord [expr {$n * 1.0 / $numcommits}] + adjustprogress + return $domore } proc findmorerev {} { global commitdata commitinfo numcommits findpattern findloc global findstartline findcurline displayorder - global find_dirn gdttype fhighlights + global find_dirn gdttype fhighlights fprogcoord + if {![info exists find_dirn]} { + return 0 + } set fldtypes {Headline Author Date Committer CDate Comments} set l $findcurline if {$l == 0} { @@ -4333,25 +4445,31 @@ proc findmorerev {} { } } } - if {$found} { + if {$found || ($domore && $l == $findstartline - 1)} { + unset findcurline unset find_dirn - findselectline $l notbusy finding + set fprogcoord 0 + adjustprogress + if {$found} { + findselectline $l + } else { + bell + } return 0 } if {!$domore} { flushhighlights - return 0 + } else { + set findcurline [expr {$l + 1}] } - if {$l == -1} { - bell - unset findcurline - unset find_dirn - notbusy finding - return 0 + set n [expr {($findstartline - 1) - $findcurline}] + if {$n < 0} { + incr n $numcommits } - set findcurline [expr {$l + 1}] - return 1 + set fprogcoord [expr {$n * 1.0 / $numcommits}] + adjustprogress + return $domore } proc findselectline {l} { @@ -4398,12 +4516,11 @@ proc markmatches {canv l str tag matches font row} { } proc unmarkmatches {} { - global findids markingmatches findcurline + global markingmatches allcanvs delete matches - catch {unset findids} set markingmatches 0 - catch {unset findcurline} + stopfinding } proc selcanvline {w x y} { @@ -4626,6 +4743,7 @@ proc selectline {l isnew} { $canv delete hover normalline unsel_reflist + stopfinding if {$l < 0 || $l >= $numcommits} return set y [expr {$canvy0 + $l * $linespc}] set ymax [lindex [$canv cget -scrollregion] 3] @@ -5815,6 +5933,7 @@ proc rowmenu {x y id} { global rowctxmenu commitrow selectedline rowmenuid curview global nullid nullid2 fakerowmenu mainhead + stopfinding set rowmenuid $id if {![info exists selectedline] || $commitrow($curview,$id) eq $selectedline} { @@ -6293,6 +6412,7 @@ proc readresetstat {fd w} { proc headmenu {x y id head} { global headmenuid headmenuhead headctxmenu mainhead + stopfinding set headmenuid $id set headmenuhead $head set state normal -- 2.23.0