aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/layout/blinker.go37
-rw-r--r--examples/layout/button.go7
-rw-r--r--examples/layout/card.go24
-rw-r--r--examples/layout/label.go35
-rwxr-xr-xexamples/layout/layoutbin5564792 -> 5614432 bytes
-rw-r--r--examples/layout/main.go103
6 files changed, 155 insertions, 51 deletions
diff --git a/examples/layout/blinker.go b/examples/layout/blinker.go
index 8c380c3..65dce43 100644
--- a/examples/layout/blinker.go
+++ b/examples/layout/blinker.go
@@ -2,13 +2,15 @@ package main
import (
"image"
+ "image/color"
"image/draw"
"log"
+ "math/rand"
+ "sync"
"time"
"github.com/faiface/gui"
"github.com/faiface/gui/win"
- "golang.org/x/image/colornames"
)
func Blinker(env gui.Env) {
@@ -17,23 +19,33 @@ func Blinker(env gui.Env) {
log.Print("recovered blinker")
}
}()
-
- var r image.Rectangle
- var visible bool = true
-
- redraw := func() func(draw.Image) image.Rectangle {
+ buf := make([]byte, 3)
+ rand.Read(buf)
+ defaultColor := image.NewUniform(color.RGBA{buf[0], buf[1], buf[2], 255})
+ rand.Read(buf)
+ blinkColor := image.NewUniform(color.RGBA{buf[0], buf[1], buf[2], 255})
+ redraw := func(r image.Rectangle, visible bool) func(draw.Image) image.Rectangle {
return func(drw draw.Image) image.Rectangle {
+ if r == image.ZR {
+ return r
+ }
if visible {
- draw.Draw(drw, r, image.White, image.ZP, draw.Src)
+ draw.Draw(drw, r, defaultColor, image.ZP, draw.Src)
} else {
- draw.Draw(drw, r, &image.Uniform{colornames.Firebrick}, image.ZP, draw.Src)
+ draw.Draw(drw, r, blinkColor, image.ZP, draw.Src)
}
return r
}
}
+ var mu sync.Mutex
+ var (
+ r image.Rectangle
+ visible bool = true
+ )
+
// first we draw a white rectangle
- env.Draw() <- redraw()
+ // env.Draw() <- redraw(b)
func() {
for event := range env.Events() {
switch event := event.(type) {
@@ -41,15 +53,18 @@ func Blinker(env gui.Env) {
if event.Point.In(r) {
go func() {
for i := 0; i < 6; i++ {
+ mu.Lock()
visible = !visible
- env.Draw() <- redraw()
+ env.Draw() <- redraw(r, visible)
+ mu.Unlock()
+
time.Sleep(time.Second / 3)
}
}()
}
case gui.Resize:
r = event.Rectangle
- env.Draw() <- redraw()
+ env.Draw() <- redraw(r, visible)
}
}
}()
diff --git a/examples/layout/button.go b/examples/layout/button.go
index 0693e06..cf13c3d 100644
--- a/examples/layout/button.go
+++ b/examples/layout/button.go
@@ -40,6 +40,13 @@ func Button(env gui.Env, theme *Theme, text string, action func()) {
r = e.Rectangle
env.Draw() <- redraw(r, over, pressed)
+ case win.MoMove:
+ nover := e.Point.In(r)
+ if nover != over {
+ over = nover
+ env.Draw() <- redraw(r, over, pressed)
+ }
+
case win.MoDown:
newPressed := e.Point.In(r)
if newPressed != pressed {
diff --git a/examples/layout/card.go b/examples/layout/card.go
new file mode 100644
index 0000000..501e4e3
--- /dev/null
+++ b/examples/layout/card.go
@@ -0,0 +1,24 @@
+package main
+
+import (
+ "github.com/faiface/gui"
+ "github.com/faiface/gui/layout"
+ "golang.org/x/image/colornames"
+)
+
+func Card(env gui.Env, theme *Theme, title, content string) {
+ box := layout.Grid{
+ Rows: []int{1, 1},
+ // Flip: true,
+ // Gap: 4,
+ Background: colornames.Pink,
+ }
+ fields := makeEnvPtr(2)
+ layout.NewMux(env,
+ fields,
+ box,
+ )
+ go Label(*fields[0], theme, title, colornames.Lightgray)
+ go Label(*fields[1], theme, content, colornames.Slategray)
+ // go Blinker(*fields[1])
+}
diff --git a/examples/layout/label.go b/examples/layout/label.go
new file mode 100644
index 0000000..f46f25f
--- /dev/null
+++ b/examples/layout/label.go
@@ -0,0 +1,35 @@
+package main
+
+import (
+ "image"
+ "image/color"
+ "image/draw"
+
+ "github.com/faiface/gui"
+)
+
+func Label(env gui.Env, theme *Theme, text string, colr color.Color) {
+ textImg := MakeTextImage(text, theme.Face, theme.Text)
+
+ redraw := func(r image.Rectangle) func(draw.Image) image.Rectangle {
+ return func(drw draw.Image) image.Rectangle {
+ draw.Draw(drw, r, &image.Uniform{colr}, image.ZP, draw.Src)
+ DrawLeftCentered(drw, r.Add(image.Pt(5, 0)), textImg, draw.Over)
+ return r
+ }
+ }
+
+ var (
+ r image.Rectangle
+ )
+
+ for e := range env.Events() {
+ switch e := e.(type) {
+ case gui.Resize:
+ r = e.Rectangle
+ env.Draw() <- redraw(r)
+ }
+ }
+
+ close(env.Draw())
+}
diff --git a/examples/layout/layout b/examples/layout/layout
index 0d51021..e7e9c5b 100755
--- a/examples/layout/layout
+++ b/examples/layout/layout
Binary files differ
diff --git a/examples/layout/main.go b/examples/layout/main.go
index c672e63..83a170d 100644
--- a/examples/layout/main.go
+++ b/examples/layout/main.go
@@ -1,9 +1,11 @@
package main
import (
+ "fmt"
"image"
"image/draw"
"log"
+ "os"
"time"
"github.com/faiface/gui"
@@ -14,6 +16,14 @@ import (
"golang.org/x/image/font/gofont/goregular"
)
+func makeEnvPtr(n int) []*gui.Env {
+ elsp := make([]*gui.Env, n)
+ for i := 0; i < len(elsp); i++ {
+ elsp[i] = new(gui.Env)
+ }
+ return elsp
+}
+
func run() {
face, err := TTFToFace(goregular.TTF, 18)
if err != nil {
@@ -26,7 +36,8 @@ func run() {
Text: colornames.Black,
Highlight: colornames.Blueviolet,
ButtonUp: colornames.Lightgrey,
- ButtonDown: colornames.Grey,
+ ButtonOver: colornames.Grey,
+ ButtonDown: colornames.Dimgrey,
}
w, err := win.New(win.Title("gui test")) // win.Resizable(),
if err != nil {
@@ -39,7 +50,7 @@ func run() {
// Hack for non-reparenting window managers (I think)
e := mux.MakeEnv()
for {
- time.Sleep(time.Second / 5)
+ time.Sleep(time.Second / 10)
e.Draw() <- func(drw draw.Image) image.Rectangle {
r := image.Rect(0, 0, 10, 10)
draw.Draw(drw, r, image.Transparent, image.ZP, draw.Over)
@@ -60,21 +71,21 @@ func run() {
&left, &right,
&bottomLeft, &bottom, &bottomRight},
layout.Grid{
- Rows: []int{1, 2, 3},
- Gap: 10,
- Background: colornames.Sandybrown,
- SplitY: func(els int, width int) []int {
+ Rows: []int{1, 2, 3},
+ Gap: 10,
+ Margin: -6,
+ Border: 1,
+ // Flip: true,
+ BorderColor: image.White,
+ Background: colornames.Sandybrown,
+ SplitRows: func(els int, width int) []int {
ret := make([]int, els)
total := 0
- for i := 0; i < els; i++ {
- if i == els-1 {
- ret[i] = width - total
- } else {
- v := (width - total) / 2
- ret[i] = v
- total += v
- }
+ for i := 0; i < els-1; i++ {
+ ret[i] = (width - total) / 2
+ total += ret[i]
}
+ ret[els-1] = width - total
return ret
},
},
@@ -83,22 +94,36 @@ func run() {
go Blinker(left)
go Blinker(bottomRight)
- var (
- b1, b2, b3, b4, b5, b6 gui.Env
- )
+ subGrid := makeEnvPtr(3)
layout.NewMux(top,
- []*gui.Env{&b1, &b2, &b3},
- layout.Box{
- Length: 3,
+ subGrid,
+ layout.Grid{
+ Rows: []int{len(subGrid)},
Gap: 10,
Background: colornames.Lightblue,
},
)
- go Blinker(b1)
- go Blinker(b2)
- box := layout.Box{
- Length: 3,
- Vertical: true,
+
+ elsp := makeEnvPtr(100)
+ scrl := &layout.Scroller{
+ Background: colornames.Red,
+ Length: len(elsp),
+ Gap: 2,
+ ChildHeight: 80,
+ }
+ layout.NewMux(*subGrid[0],
+ elsp,
+ scrl,
+ )
+ for i, el := range elsp {
+ // go Blinker(*el)
+ go Card(*el, theme, "hello", fmt.Sprintf("I'm card #%d", i))
+ }
+
+ go Blinker(*subGrid[1])
+ box := layout.Grid{
+ Rows: []int{3},
+ Flip: true,
Gap: 4,
Background: colornames.Pink,
Split: func(els int, width int) []int {
@@ -113,28 +138,25 @@ func run() {
return ret
},
}
-
- layout.NewMux(b3,
- []*gui.Env{
- &b4, &b5, &b6,
- },
+ blinkers := makeEnvPtr(3)
+ layout.NewMux(*subGrid[2],
+ blinkers,
box,
)
- go Blinker(b4)
- go Blinker(b5)
- go Blinker(b6)
+ go Blinker(*blinkers[0])
+ go Blinker(*blinkers[1])
+ go Blinker(*blinkers[2])
- var (
- btn1, btn2, btn3 gui.Env
- )
+ btns := makeEnvPtr(3)
layout.NewMux(
bottom,
- []*gui.Env{&btn1, &btn2, &btn3},
+ btns,
layout.Grid{
Rows: []int{2, 1},
Background: colornames.Darkgrey,
Gap: 4,
+ Flip: true,
},
)
btn := func(env gui.Env, name string) {
@@ -142,15 +164,16 @@ func run() {
log.Print(name)
})
}
- go btn(btn1, "Hey")
- go btn(btn2, "Ho")
- go btn(btn3, "Hu")
+ go btn(*btns[0], "Hey")
+ go btn(*btns[1], "Ho")
+ go btn(*btns[2], "Hu")
// we use the master env now, w is used by the mux
for event := range env.Events() {
switch event.(type) {
case win.WiClose:
close(env.Draw())
+ os.Exit(0)
}
}
}