ui/eg/forms/main.go

286 lines
6.5 KiB
Go

package main
import (
"fmt"
"git.kirsle.net/go/render"
"git.kirsle.net/go/render/sdl"
"git.kirsle.net/go/ui"
"git.kirsle.net/go/ui/magicform"
"git.kirsle.net/go/ui/style"
)
func init() {
sdl.DefaultFontFilename = "../DejaVuSans.ttf"
}
var (
MenuFont = render.Text{
Size: 12,
PadX: 4,
PadY: 2,
}
TabFont = render.Text{
Size: 12,
PadX: 4,
PadY: 2,
}
)
var ButtonStylePrimary = &style.Button{
Background: render.RGBA(0, 60, 153, 255),
Foreground: render.White,
HoverBackground: render.RGBA(0, 153, 255, 255),
HoverForeground: render.White,
OutlineColor: render.DarkGrey,
OutlineSize: 1,
BorderStyle: style.BorderRaised,
BorderSize: 2,
}
func main() {
mw, err := ui.NewMainWindow("Forms Test", 500, 375)
if err != nil {
panic(err)
}
// Tabbed UI.
tabFrame := ui.NewTabFrame("Tabs")
makeAppFrame(mw, tabFrame)
makeAboutFrame(mw, tabFrame)
tabFrame.Supervise(mw.Supervisor())
mw.Pack(tabFrame, ui.Pack{
Side: ui.N,
Expand: true,
Padding: 10,
})
mw.SetBackground(render.Grey)
mw.MainLoop()
}
func makeAppFrame(mw *ui.MainWindow, tf *ui.TabFrame) *ui.Frame {
frame := tf.AddTab("Index", ui.NewLabel(ui.Label{
Text: "Form Controls",
Font: TabFont,
}))
// Form variables
var (
bgcolor = render.Grey
letter string
checkBool1 bool
checkBool2 = true
pagerLabel = "Page 1 of 20"
)
// Magic Form is a handy module for easily laying out forms of widgets.
form := magicform.Form{
Supervisor: mw.Supervisor(),
Engine: mw.Engine,
Vertical: true,
LabelWidth: 120,
PadY: 2,
PadX: 8,
}
// You add to it a list of fields which support all sorts of different
// form control types.
fields := []magicform.Field{
// Simple text sections - you can write paragraphs or use a bold font
// to make section labels that span the full width of your frame.
{
Label: "Checkbox controls bound to bool values:",
Font: MenuFont,
},
// Checkbox widgets: just bind a BoolVariable and this row will draw
// with a checkbox next to a label.
{
Label: "Check this box to toggle a boolean",
Font: MenuFont,
BoolVariable: &checkBool1,
OnClick: func() {
fmt.Printf("The checkbox was clicked! Value is now: %+v\n", checkBool1)
},
},
{
Label: "Uncheck this one",
Font: MenuFont,
BoolVariable: &checkBool2,
OnClick: func() {
fmt.Printf("The checkbox was clicked! Value is now: %+v\n", checkBool1)
},
},
// SelectBox widgets: just bind a SelectValue and provide Options and
// it will draw with a label (LabelWidth wide) next to a SelectBox button.
{
Label: "Window color:",
Font: MenuFont,
SelectValue: &bgcolor,
Options: []magicform.Option{
{
Label: "Grey",
Value: render.Grey,
},
{
Label: "White",
Value: render.White,
},
{
Label: "Yellow",
Value: render.Yellow,
},
{
Label: "Cyan",
Value: render.Cyan,
},
{
Label: "Green",
Value: render.Green,
},
{
Label: "Blue",
Value: render.RGBA(0, 153, 255, 255),
},
{
Label: "Pink",
Value: render.Pink,
},
},
OnSelect: func(v interface{}) {
value, _ := v.(render.Color)
mw.SetBackground(value)
},
},
// ListBox widgets
{
Type: magicform.Listbox,
Label: "Favorite letter:",
Font: MenuFont,
SelectValue: &letter,
Options: []magicform.Option{
{Label: "A is for apple", Value: "A"},
{Label: "B is for boy", Value: "B"},
{Label: "C is for cat", Value: "C"},
{Label: "D is for dog", Value: "D"},
{Label: "E is for elephant", Value: "E"},
{Label: "F is for far", Value: "F"},
{Label: "G is for ghost", Value: "G"},
{Label: "H is for high", Value: "H"},
{Label: "I is for inside", Value: "I"},
{Label: "J is for joker", Value: "J"},
{Label: "K is for kangaroo", Value: "K"},
{Label: "L is for lion", Value: "L"},
{Label: "M is for mouse", Value: "M"},
{Label: "N is for night", Value: "N"},
{Label: "O is for over", Value: "O"},
{Label: "P is for parry", Value: "P"},
{Label: "Q is for quarry", Value: "Q"},
{Label: "R is for reality", Value: "R"},
{Label: "S is for sunshine", Value: "S"},
{Label: "T is for tree", Value: "T"},
{Label: "U is for under", Value: "U"},
{Label: "V is for vehicle", Value: "V"},
{Label: "W is for watermelon", Value: "W"},
{Label: "X is for xylophone", Value: "X"},
{Label: "Y is for yellow", Value: "Y"},
{Label: "Z is for zebra", Value: "Z"},
},
OnSelect: func(v interface{}) {
value, _ := v.(string)
fmt.Printf("You clicked on: %s\n", value)
},
},
// Pager rows to show an easy paginated UI.
// TODO: this is currently broken and Supervisor doesn't pick it up
{
Label: "A paginator when you need one. You can limit MaxPageButtons\n" +
"and the right arrow can keep selecting past the last page.",
},
{
LabelVariable: &pagerLabel,
Label: "Page:",
Pager: ui.NewPager(ui.Pager{
Page: 1,
Pages: 20,
PerPage: 10,
MaxPageButtons: 8,
Font: MenuFont,
OnChange: func(page, perPage int) {
fmt.Printf("Pager clicked: page=%d perPage=%d\n", page, perPage)
pagerLabel = fmt.Sprintf("Page %d of %d", page, 20)
},
}),
},
// Simple variable bindings.
{
Type: magicform.Value,
Label: "The first bool var:",
TextVariable: &pagerLabel,
},
// Buttons for the bottom of your form.
{
Buttons: []magicform.Field{
{
Label: "Save",
ButtonStyle: ButtonStylePrimary,
Font: MenuFont,
OnClick: func() {
fmt.Println("Primary button clicked")
},
},
{
Label: "Cancel",
Font: MenuFont,
OnClick: func() {
fmt.Println("Secondary button clicked")
},
},
},
},
}
form.Create(frame, fields)
return frame
}
func makeAboutFrame(mw *ui.MainWindow, tf *ui.TabFrame) *ui.Frame {
frame := tf.AddTab("About", ui.NewLabel(ui.Label{
Text: "About",
Font: TabFont,
}))
form := magicform.Form{
Supervisor: mw.Supervisor(),
Engine: mw.Engine,
Vertical: true,
LabelWidth: 120,
PadY: 2,
PadX: 8,
}
fields := []magicform.Field{
{
Label: "About",
Font: MenuFont,
},
{
Label: "This example shows off the UI toolkit's use for form controls,\n" +
"and how the magicform helper module can make simple forms\n" +
"easy to compose quickly.",
Font: MenuFont,
},
}
form.Create(frame, fields)
return frame
}