git-gui: add horizontal scrollbar to commit buffer
[gitweb.git] / lib / status_bar.tcl
index 769ef81c4bfd153e55ae4cfcacbaaa6ac2c4ffd5..02111a1742f92eff7efc6b8e54323919029867bc 100644 (file)
@@ -6,24 +6,51 @@ class status_bar {
 field w         ; # our own window path
 field w_l       ; # text widget we draw messages into
 field w_c       ; # canvas we draw a progress bar into
+field c_pack    ; # script to pack the canvas with
 field status  {}; # single line of text we show
 field prefix  {}; # text we format into status
 field units   {}; # unit of progress
 field meter   {}; # current core git progress meter (if active)
 
 constructor new {path} {
+       global use_ttk NS
        set w $path
        set w_l $w.l
        set w_c $w.c
 
-       frame $w \
-               -borderwidth 1 \
-               -relief sunken
-       label $w_l \
+       ${NS}::frame $w
+       if {!$use_ttk} {
+               $w configure -borderwidth 1 -relief sunken
+       }
+       ${NS}::label $w_l \
                -textvariable @status \
                -anchor w \
                -justify left
        pack $w_l -side left
+       set c_pack [cb _oneline_pack]
+
+       bind $w <Destroy> [cb _delete %W]
+       return $this
+}
+
+method _oneline_pack {} {
+       $w_c conf -width 100
+       pack $w_c -side right
+}
+
+constructor two_line {path} {
+       global NS
+       set w $path
+       set w_l $w.l
+       set w_c $w.c
+
+       ${NS}::frame $w
+       ${NS}::label $w_l \
+               -textvariable @status \
+               -anchor w \
+               -justify left
+       pack $w_l -anchor w -fill x
+       set c_pack [list pack $w_c -fill x]
 
        bind $w <Destroy> [cb _delete %W]
        return $this
@@ -34,13 +61,12 @@ method start {msg uds} {
                $w_c coords bar 0 0 0 20
        } else {
                canvas $w_c \
-                       -width 100 \
                        -height [expr {int([winfo reqheight $w_l] * 0.6)}] \
                        -borderwidth 1 \
                        -relief groove \
                        -highlightt 0
                $w_c create rectangle 0 0 0 20 -tags bar -fill navy
-               pack $w_c -side right
+               eval $c_pack
        }
 
        set status $msg
@@ -51,13 +77,19 @@ method start {msg uds} {
 
 method update {have total} {
        set pdone 0
+       set cdone 0
        if {$total > 0} {
                set pdone [expr {100 * $have / $total}]
+               set cdone [expr {[winfo width $w_c] * $have / $total}]
        }
 
-       set status [mc "%s ... %i of %i %s (%2i%%)" \
-               $prefix $have $total $units $pdone]
-       $w_c coords bar 0 0 $pdone 20
+       set prec [string length [format %i $total]]
+       set status [mc "%s ... %*i of %*i %s (%3i%%)" \
+               $prefix \
+               $prec $have \
+               $prec $total \
+               $units $pdone]
+       $w_c coords bar 0 0 $cdone 20
 }
 
 method update_meter {buf} {
@@ -69,7 +101,10 @@ method update_meter {buf} {
 
        set prior [string range $meter 0 $r]
        set meter [string range $meter [expr {$r + 1}] end]
-       if {[regexp "\\((\\d+)/(\\d+)\\)\\s+done\r\$" $prior _j a b]} {
+       set p "\\((\\d+)/(\\d+)\\)"
+       if {[regexp ":\\s*\\d+% $p\(?:, done.\\s*\n|\\s*\r)\$" $prior _j a b]} {
+               update $this $a $b
+       } elseif {[regexp "$p\\s+done\r\$" $prior _j a b]} {
                update $this $a $b
        }
 }