From 8d183ef96a57e3a2f42c0cb4ec0ab4c256e0d47e Mon Sep 17 00:00:00 2001 From: Clement Benard Date: Wed, 7 Aug 2019 16:02:33 +0200 Subject: Made the layout package actually usable --- examples/layout/blinker.go | 37 +++++++++++----- examples/layout/button.go | 7 +++ examples/layout/card.go | 24 +++++++++++ examples/layout/label.go | 35 +++++++++++++++ examples/layout/layout | Bin 5564792 -> 5614432 bytes examples/layout/main.go | 103 +++++++++++++++++++++++++++------------------ 6 files changed, 155 insertions(+), 51 deletions(-) create mode 100644 examples/layout/card.go create mode 100644 examples/layout/label.go (limited to 'examples/layout') 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 Binary files a/examples/layout/layout and b/examples/layout/layout 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) } } } -- cgit v1.2.3