1 # git-gui status bar mega-widget
2 # Copyright (C) 2007 Shawn Pearce
4 class status_bar {
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 status {}; # single line of text we show
10 field prefix {}; # text we format into status
11 field units {}; # unit of progress
13 constructor new {path} {
14 set w $path
15 set w_l $w.l
16 set w_c $w.c
18 frame $w \
19 -borderwidth 1 \
20 -relief sunken
21 label $w_l \
22 -textvariable @status \
23 -anchor w \
24 -justify left
25 pack $w_l -side left
27 bind $w <Destroy> [cb _delete %W]
28 return $this
29 }
31 method start {msg uds} {
32 if {[winfo exists $w_c]} {
33 $w_c coords bar 0 0 0 20
34 } else {
35 canvas $w_c \
36 -width 100 \
37 -height [expr {int([winfo reqheight $w_l] * 0.6)}] \
38 -borderwidth 1 \
39 -relief groove \
40 -highlightt 0
41 $w_c create rectangle 0 0 0 20 -tags bar -fill navy
42 pack $w_c -side right
43 }
45 set status $msg
46 set prefix $msg
47 set units $uds
48 }
50 method update {have total} {
51 set pdone 0
52 if {$total > 0} {
53 set pdone [expr {100 * $have / $total}]
54 }
56 set status [format "%s ... %i of %i %s (%2i%%)" \
57 $prefix $have $total $units $pdone]
58 $w_c coords bar 0 0 $pdone 20
59 }
61 method stop {msg} {
62 destroy $w_c
63 set status $msg
64 }
66 method show {msg {test {}}} {
67 if {$test eq {} || $status eq $test} {
68 set status $msg
69 }
70 }
72 method _delete {current} {
73 if {$current eq $w} {
74 delete_this
75 }
76 }
78 }