1 # git-gui status bar mega-widget
2 # Copyright (C) 2007 Shawn Pearce
6 field w
; # our own window path
7 field w_l
; # text widget we draw messages into
8 field w_c
; # canvas we draw a progress bar into
9 field c_pack
; # script to pack the canvas with
10 field status
{}; # single line of text we show
11 field prefix
{}; # text we format into status
12 field units
{}; # unit of progress
13 field meter
{}; # current core git progress meter (if active)
15 constructor new
{path
} {
23 $w configure
-borderwidth 1 -relief sunken
26 -textvariable @status
\
30 set c_pack
[cb _oneline_pack
]
32 bind $w <Destroy
> [cb _delete
%W
]
36 method _oneline_pack
{} {
41 constructor two_line
{path
} {
49 -textvariable @status
\
52 pack $w_l -anchor w
-fill x
53 set c_pack
[list pack $w_c -fill x
]
55 bind $w <Destroy
> [cb _delete
%W
]
59 method start
{msg uds
} {
60 if {[winfo exists
$w_c]} {
61 $w_c coords bar
0 0 0 20
64 -height [expr {int
([winfo reqheight
$w_l] * 0.6)}] \
68 $w_c create rectangle
0 0 0 20 -tags bar
-fill navy
78 method
update {have total
} {
81 set pdone
[expr {100 * $have / $total}]
82 set cdone
[expr {[winfo width
$w_c] * $have / $total}]
85 set prec
[string length
[format %i
$total]]
86 set status
[mc
"%s ... %*i of %*i %s (%3i%%)" \
91 $w_c coords bar
0 0 $cdone 20
94 method update_meter
{buf
} {
96 set r
[string last
"\r" $meter]
101 set prior
[string range
$meter 0 $r]
102 set meter
[string range
$meter [expr {$r + 1}] end
]
103 set p
"\\((\\d+)/(\\d+)\\)"
104 if {[regexp ":\\s*\\d+% $p\(?:, done.\\s*\n|\\s*\r)\$" $prior _j a b
]} {
106 } elseif
{[regexp "$p\\s+done\r\$" $prior _j a b
]} {
111 method stop
{{msg
{}}} {
118 method show
{msg
{test
{}}} {
119 if {$test eq
{} ||
$status eq
$test} {
124 method _delete
{current
} {
125 if {$current eq
$w} {