git-gui: Extract blame viewer status bar into mega-widget
[git/git-svn.git] / lib / status_bar.tcl
bloba6dea2900657a569fdd1047753806a9a6d194c23
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
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
45 set status $msg
46 set prefix $msg
47 set units $uds
50 method update {have total} {
51 set pdone 0
52 if {$total > 0} {
53 set pdone [expr {100 * $have / $total}]
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
61 method stop {msg} {
62 destroy $w_c
63 set status $msg
66 method show {msg} {
67 set status $msg
70 method _delete {current} {
71 if {$current eq $w} {
72 delete_this