// Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build example // // This build tag means that "go install golang.org/x/exp/shiny/..." doesn't // install this example program. Use "go run main.go" to run it or "go install // -tags=example" to install it. // Widgetgallery exhibits the shiny/widget package's widget set. package main import ( "image" "image/color" "image/draw" "log" "golang.org/x/exp/shiny/driver" "golang.org/x/exp/shiny/gesture" "golang.org/x/exp/shiny/screen" "golang.org/x/exp/shiny/widget" "golang.org/x/exp/shiny/widget/node" ) var uniforms = [...]*image.Uniform{ image.NewUniform(color.RGBA{0xbf, 0x00, 0x00, 0xff}), image.NewUniform(color.RGBA{0x9f, 0x9f, 0x00, 0xff}), image.NewUniform(color.RGBA{0x00, 0xbf, 0x00, 0xff}), image.NewUniform(color.RGBA{0x00, 0x9f, 0x9f, 0xff}), image.NewUniform(color.RGBA{0x00, 0x00, 0xbf, 0xff}), image.NewUniform(color.RGBA{0x9f, 0x00, 0x9f, 0xff}), } // custom is a custom widget. type custom struct { node.LeafEmbed index int } func newCustom() *custom { w := &custom{} w.Wrapper = w return w } func (w *custom) OnInputEvent(e interface{}, origin image.Point) node.EventHandled { switch e := e.(type) { case gesture.Event: if e.Type != gesture.TypeTap { break } w.index++ if w.index == len(uniforms) { w.index = 0 } w.Mark(node.MarkNeedsPaintBase) } return node.Handled } func (w *custom) PaintBase(ctx *node.PaintBaseContext, origin image.Point) error { w.Marks.UnmarkNeedsPaintBase() draw.Draw(ctx.Dst, w.Rect.Add(origin), uniforms[w.index], image.Point{}, draw.Src) return nil } func main() { log.SetFlags(0) driver.Main(func(s screen.Screen) { // TODO: create a bunch of standard widgets: buttons, labels, etc. w := widget.NewSheet(newCustom()) if err := widget.RunWindow(s, w, &widget.RunWindowOptions{ NewWindowOptions: screen.NewWindowOptions{ Title: "WidgetGallery Shiny Example", }, }); err != nil { log.Fatal(err) } }) }