From ae710db0e9ed08ff7ae1c90d440af3ee3efe721f Mon Sep 17 00:00:00 2001
From: Pietro Gagliardi <pietro10@mac.com>
Date: Sat, 12 Dec 2015 18:44:35 -0500
Subject: [PATCH] Added ProgressBar.

---
 progressbar.go | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++
 zz_test.go     | 25 ++++++++++++++--
 2 files changed, 100 insertions(+), 2 deletions(-)
 create mode 100644 progressbar.go

diff --git a/progressbar.go b/progressbar.go
new file mode 100644
index 0000000..ef5116c
--- /dev/null
+++ b/progressbar.go
@@ -0,0 +1,77 @@
+// 12 december 2015
+
+package ui
+
+import (
+	"unsafe"
+)
+
+// #include "ui.h"
+import "C"
+
+// ProgressBar is a Control that represents a horizontal bar that
+// is filled in progressively over time as a process completes.
+type ProgressBar struct {
+	c	*C.uiControl
+	p	*C.uiProgressBar
+}
+
+// NewProgressBar creates a new ProgressBar.
+func NewProgressBar() *ProgressBar {
+	p := new(ProgressBar)
+
+	p.p = C.uiNewProgressBar()
+	p.c = (*C.uiControl)(unsafe.Pointer(p.p))
+
+	return p
+}
+
+// Destroy destroys the ProgressBar.
+func (p *ProgressBar) Destroy() {
+	C.uiControlDestroy(p.c)
+}
+
+// LibuiControl returns the libui uiControl pointer that backs
+// the Window. This is only used by package ui itself and should
+// not be called by programs.
+func (p *ProgressBar) LibuiControl() uintptr {
+	return uintptr(unsafe.Pointer(p.c))
+}
+
+// Handle returns the OS-level handle associated with this ProgressBar.
+// On Windows this is an HWND of a standard Windows API
+// PROGRESS_CLASS class (as provided by Common Controls
+// version 6).
+// On GTK+ this is a pointer to a GtkProgressBar.
+// On OS X this is a pointer to a NSProgressIndicator.
+func (p *ProgressBar) Handle() uintptr {
+	return uintptr(C.uiControlHandle(p.c))
+}
+
+// Show shows the ProgressBar.
+func (p *ProgressBar) Show() {
+	C.uiControlShow(p.c)
+}
+
+// Hide hides the ProgressBar.
+func (p *ProgressBar) Hide() {
+	C.uiControlHide(p.c)
+}
+
+// Enable enables the ProgressBar.
+func (p *ProgressBar) Enable() {
+	C.uiControlEnable(p.c)
+}
+
+// Disable disables the ProgressBar.
+func (p *ProgressBar) Disable() {
+	C.uiControlDisable(p.c)
+}
+
+// TODO Value
+
+// SetValue sets the ProgressBar's currently displayed percentage
+// to value. value must be between 0 and 100 inclusive.
+func (p *ProgressBar) SetValue(value int) {
+	C.uiProgressBarSetValue(p.p, C.int(value))
+}
diff --git a/zz_test.go b/zz_test.go
index 0b24300..657f5dc 100644
--- a/zz_test.go
+++ b/zz_test.go
@@ -2,17 +2,38 @@
 
 package ui
 
+import "time"
 import "testing"
 
 func TestIt(t *testing.T) {
 	err := Main(func() {
 		w := NewWindow("Hello", 320, 240, false)
+		stop := make(chan struct{})
 		w.OnClosing(func(w *Window) bool {
+			stop <- struct{}{}
 			Quit()
 			return true
 		})
-		l := NewLabel("A Label")
-		w.SetChild(l)
+		p := NewProgressBar()
+		w.SetChild(p)
+		go func() {
+			value := 0
+			ticker := time.NewTicker(time.Second / 2)
+			for {
+				select {
+				case <-ticker.C:
+					QueueMain(func() {
+						value++
+						if value > 100 {
+							value = 0
+						}
+						p.SetValue(value)
+					})
+				case <-stop:
+					return
+				}
+			}
+		}()
 		w.Show()
 	})
 	if err != nil {