-
Notifications
You must be signed in to change notification settings - Fork 1
/
progress.go
119 lines (98 loc) · 2.38 KB
/
progress.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package progress
import (
"github.com/diamondburned/gotk4/pkg/gtk/v4"
"github.com/diamondburned/gotk4/pkg/pango"
"github.com/diamondburned/gotkit/gtkutil/cssutil"
)
var barCSS = cssutil.Applier("progress-bar", `
.progress-label {
font-size: 0.85em;
}
.progress-error progressbar,
.progress-error label.progress-label {
color: @error_color;
}
.progress-error progressbar trough {
background-color: alpha(@error_color, 0.2);
}
.progress-error progressbar progress {
background-color: @error_color;
}
`)
// Bar describes a progress bar.
type Bar struct {
*gtk.Box
Label *gtk.Label
ProgressBar *gtk.ProgressBar
label func(n, max int64) string
n int64
maxi int64
maxf float64
error bool
}
// NewBar creates a new progress bar.
func NewBar() *Bar {
b := Bar{}
b.ProgressBar = gtk.NewProgressBar()
b.Label = gtk.NewLabel("")
b.Label.AddCSSClass("progress-label")
b.Label.SetEllipsize(pango.EllipsizeMiddle)
b.Label.Hide()
b.Box = gtk.NewBox(gtk.OrientationVertical, 0)
b.Box.Append(b.Label)
b.Box.Append(b.ProgressBar)
barCSS(b)
return &b
}
// SetMax sets the max value of the bar.
func (b *Bar) SetMax(max int64) {
b.maxi = max
b.maxf = float64(max)
}
// Add adds the given n value.
func (b *Bar) Add(n int64) {
b.Set(b.n + n)
}
// Set sets the given n value.
func (b *Bar) Set(n int64) {
b.n = n
if b.error {
b.RemoveCSSClass("progress-error")
b.error = false
}
if b.maxi == 0 {
b.ProgressBar.Pulse()
return
}
b.ProgressBar.SetFraction(float64(b.n) / b.maxf)
if b.label != nil {
b.ProgressBar.SetText(b.label(b.n, b.maxi))
}
}
// Error changes bar to indicate an error.
func (b *Bar) Error(err error) {
if !b.error {
b.AddCSSClass("progress-error")
b.error = true
}
b.SetText("Error: " + err.Error())
}
// SetLabelFunc sets the function to render the progress bar label. It only does
// something if Max is set to a value. This method must only be called before
// Add is called, otherwise the state is invalid.
func (b *Bar) SetLabelFunc(labelFn func(n, max int64) string) {
b.label = labelFn
b.SetShowText(labelFn != nil)
if labelFn != nil {
b.SetText(labelFn(b.n, b.maxi))
}
}
// SetText sets the bar's text.
func (b *Bar) SetText(text string) {
b.Label.SetText(text)
b.SetTooltipText(text)
}
// SetShowText sets whether or not the bar shows the label.
func (b *Bar) SetShowText(showText bool) {
b.Label.SetVisible(showText)
}