summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--progressbar.go64
-rw-r--r--sysdata.go4
2 files changed, 68 insertions, 0 deletions
diff --git a/progressbar.go b/progressbar.go
new file mode 100644
index 0000000..b40a53c
--- /dev/null
+++ b/progressbar.go
@@ -0,0 +1,64 @@
+// 25 february 2014
+package ui
+
+import (
+ // ...
+)
+
+// A ProgressBar is a horizontal rectangle that fills up from left to right to indicate the progress of a long-running task.
+// This progress is typically a percentage, so within the range [0,100].
+// Alternatively, a progress bar can be "indeterminate": it indicates progress is being made, but is unclear as to how much.
+// The presentation of indeterminate progress bars is system-specific (for instance, on Windows and many GTK+ skins, this is represented by a small chunk of progress going back and forth across the width of the bar).
+type ProgressBar struct {
+ lock sync.Mutex
+ created bool
+ sysData *sysData
+ initProg int
+}
+
+// NewProgressBar creates a new ProgressBar.
+func NewProgressBar() *ProgressBar {
+ return &ProgressBar{
+ sysData: mksysdata(c_progressbar),
+ }
+}
+
+// SetProgress sets the currently indicated progress amount on the ProgressBar. If this amount is outside the range [0,100] (ideally -1), the progress bar is indeterminate.
+func (p *ProgressBar) SetProgress(percent int) {
+ p.lock.Lock()
+ defer p.lock.Unlock()
+
+ if p.created {
+ p.sysData.setProgress(percent)
+ return
+ }
+ p.initProg = percent
+}
+
+func (p *ProgressBar) make(window *sysData) error {
+ p.lock.Lock()
+ defer p.lock.Unlock()
+
+ err := p.sysData.make("", window)
+ if err != nil {
+ return err
+ }
+ p.sysData.setProgress(p.initProg)
+ p.created = true
+ return nil
+}
+
+func (p *ProgressBar) setRect(x int, y int, width int, height int) error {
+ p.lock.Lock()
+ defer p.lock.Unlock()
+
+ return p.sysData.setRect(x, y, width, height)
+}
+
+func (p *ProgressBar) preferredSize() (width int, height int, err error) {
+ p.lock.Lock()
+ defer p.lock.Unlock()
+
+ width, height = p.sysData.preferredSize()
+ return
+}
diff --git a/sysdata.go b/sysdata.go
index 9659a1e..51f1d5e 100644
--- a/sysdata.go
+++ b/sysdata.go
@@ -64,6 +64,9 @@ func (c *cSysData) delete(int) error {
func (c *cSysData) preferredSize() (int, int) {
panic(runtime.GOOS + " sysData does not define preferredSize()")
}
+func (c *cSysData) setProgress(int) {
+ panic(runtime.GOOS + " sysData does not define setProgress()")
+}
// signal sends the event signal. This raise is done asynchronously to avoid deadlocking the UI task.
// Thanks skelterjohn for this techinque: if we can't queue any more events, drop them
@@ -86,6 +89,7 @@ const (
c_lineedit
c_label
c_listbox
+ c_progressbar
nctypes
)