Update gio version. Add side grid for year selection to cmd/cal.
This commit is contained in:
		
							parent
							
								
									25847d5921
								
							
						
					
					
						commit
						014ace99a6
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,2 +1,3 @@
 | 
				
			||||||
cmd/hello/hello
 | 
					cmd/hello/hello
 | 
				
			||||||
cmd/cal/cal
 | 
					cmd/cal/cal
 | 
				
			||||||
 | 
					*.apk
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,6 +31,10 @@ func _newMonth(y int, m time.Month) SelectableMonth {
 | 
				
			||||||
	return *NewMonth(time.Date(y,m,1,0,0,0,0,time.Local))
 | 
						return *NewMonth(time.Date(y,m,1,0,0,0,0,time.Local))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (sm *SelectableMonth) Refresh() {
 | 
				
			||||||
 | 
						*sm = _newMonth(sm.Year, sm.Month)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (sm *SelectableMonth) Previous() {
 | 
					func (sm *SelectableMonth) Previous() {
 | 
				
			||||||
	m, y := sm.Month - 1, sm.Year
 | 
						m, y := sm.Month - 1, sm.Year
 | 
				
			||||||
	if m > 11 {
 | 
						if m > 11 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,6 @@ import (
 | 
				
			||||||
	"gioui.org/ui"
 | 
						"gioui.org/ui"
 | 
				
			||||||
	"gioui.org/ui/app"
 | 
						"gioui.org/ui/app"
 | 
				
			||||||
	"gioui.org/ui/layout"
 | 
						"gioui.org/ui/layout"
 | 
				
			||||||
	//"gioui.org/ui/measure"
 | 
					 | 
				
			||||||
	"gioui.org/ui/text"
 | 
						"gioui.org/ui/text"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"golang.org/x/image/font/sfnt"
 | 
						"golang.org/x/image/font/sfnt"
 | 
				
			||||||
| 
						 | 
					@ -33,7 +32,7 @@ func main() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewButton(t string, lops ...gio.LabelOption) gio.Clickable {
 | 
					func NewButton(t string, lops ...gio.LabelOption) gio.Clickable {
 | 
				
			||||||
	lops = append([]gio.LabelOption{gio.Face(face), gio.Align(text.Center)}, lops...)
 | 
						lops = append([]gio.LabelOption{gio.Face(face), gio.Align(text.Middle)}, lops...)
 | 
				
			||||||
	lbl := gio.NewLabel(t, lops...)
 | 
						lbl := gio.NewLabel(t, lops...)
 | 
				
			||||||
	bg := gio.NewBackground(
 | 
						bg := gio.NewBackground(
 | 
				
			||||||
		gio.Color(color.RGBA{A: 0xff, R: 0xf0, G: 0xf0, B: 0xe0}),
 | 
							gio.Color(color.RGBA{A: 0xff, R: 0xf0, G: 0xf0, B: 0xe0}),
 | 
				
			||||||
| 
						 | 
					@ -96,8 +95,10 @@ func NewCal(sm *SelectableMonth) gio.Widget {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func eventloop() {
 | 
					func eventloop() {
 | 
				
			||||||
	w := app.NewWindow(&app.WindowOptions{
 | 
						w := app.NewWindow(
 | 
				
			||||||
		Width: ui.Dp(600), Height: ui.Dp(600), Title: "Tickets"})
 | 
							app.WithWidth(ui.Dp(600)),
 | 
				
			||||||
 | 
							app.WithHeight(ui.Dp(600)),
 | 
				
			||||||
 | 
							app.WithTitle("Calendar"))
 | 
				
			||||||
	ctx := gio.NewContext(w)
 | 
						ctx := gio.NewContext(w)
 | 
				
			||||||
	sm := NewMonth(time.Now())
 | 
						sm := NewMonth(time.Now())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -105,18 +106,24 @@ func eventloop() {
 | 
				
			||||||
	face = ctx.Faces.For(regular, ui.Sp(20))
 | 
						face = ctx.Faces.For(regular, ui.Sp(20))
 | 
				
			||||||
	if err != nil { log.Fatal("Cannot parse font.") }
 | 
						if err != nil { log.Fatal("Cannot parse font.") }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	margin := gio.NewInset(gio.Size(ui.Dp(10)))
 | 
					 | 
				
			||||||
	topgrid := gio.NewGrid(3)
 | 
					 | 
				
			||||||
	lbtn := NewButton("   <   ")
 | 
					 | 
				
			||||||
	mth := gio.NewLabel("", gio.Face(face), gio.Align(text.Center))
 | 
					 | 
				
			||||||
	rbtn := NewButton("   >   ")
 | 
					 | 
				
			||||||
	f1 := gio.NewFlex(gio.Axis(layout.Vertical))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	bg := gio.NewBackground(
 | 
						bg := gio.NewBackground(
 | 
				
			||||||
		gio.Color(color.RGBA{A: 0xff, R: 0xf0, G: 0xf0, B: 0xe0}))
 | 
							gio.Color(color.RGBA{A: 0xff, R: 0xf0, G: 0xf0, B: 0xe0}))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						margin := gio.NewInset(gio.Size(ui.Dp(10)))
 | 
				
			||||||
 | 
						f1 := gio.NewFlex(gio.Axis(layout.Vertical))
 | 
				
			||||||
 | 
						f2 := gio.NewFlex(gio.Axis(layout.Horizontal))
 | 
				
			||||||
 | 
						sidegrid := gio.NewGrid(1)
 | 
				
			||||||
 | 
						yrs := make([]gio.Widget,6)
 | 
				
			||||||
 | 
						curyr := sm.Year
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						topgrid := gio.NewGrid(3)
 | 
				
			||||||
 | 
						lbtn := NewButton("   <   ")
 | 
				
			||||||
 | 
						mth := gio.NewLabel("", gio.Face(face), gio.Align(text.Middle))
 | 
				
			||||||
 | 
						rbtn := NewButton("   >   ")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var cal gio.Widget
 | 
						var cal gio.Widget
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						f3 := gio.NewFlex(gio.Axis(layout.Vertical))
 | 
				
			||||||
	daygrid := gio.NewGrid(7)
 | 
						daygrid := gio.NewGrid(7)
 | 
				
			||||||
	sun := NewSLabel("Sun",&sm.Ws[time.Sunday], gio.Align(text.End))
 | 
						sun := NewSLabel("Sun",&sm.Ws[time.Sunday], gio.Align(text.End))
 | 
				
			||||||
	mon := NewSLabel("Mon",&sm.Ws[time.Monday], gio.Align(text.End))
 | 
						mon := NewSLabel("Mon",&sm.Ws[time.Monday], gio.Align(text.End))
 | 
				
			||||||
| 
						 | 
					@ -128,6 +135,10 @@ func eventloop() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resetCal := func() {
 | 
						resetCal := func() {
 | 
				
			||||||
		cal = NewCal(sm)
 | 
							cal = NewCal(sm)
 | 
				
			||||||
 | 
							for i,_ := range yrs {
 | 
				
			||||||
 | 
								yrs[i] = NewButton(fmt.Sprintf("%d",curyr - i),
 | 
				
			||||||
 | 
									gio.Align(text.Start))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		w.Invalidate()
 | 
							w.Invalidate()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	resetCal()
 | 
						resetCal()
 | 
				
			||||||
| 
						 | 
					@ -137,7 +148,7 @@ func eventloop() {
 | 
				
			||||||
		switch e := e.(type) {
 | 
							switch e := e.(type) {
 | 
				
			||||||
		case app.DestroyEvent:
 | 
							case app.DestroyEvent:
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		case app.DrawEvent:
 | 
							case app.UpdateEvent:
 | 
				
			||||||
			ctx.Reset(e)
 | 
								ctx.Reset(e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			mth.SetText(fmt.Sprintf("%s %d",sm.Month.String(),sm.Year))
 | 
								mth.SetText(fmt.Sprintf("%s %d",sm.Month.String(),sm.Year))
 | 
				
			||||||
| 
						 | 
					@ -145,10 +156,15 @@ func eventloop() {
 | 
				
			||||||
			ows := sm.Ws
 | 
								ows := sm.Ws
 | 
				
			||||||
			bg(margin(f1(
 | 
								bg(margin(f1(
 | 
				
			||||||
			    topgrid(lbtn,mth,rbtn),
 | 
								    topgrid(lbtn,mth,rbtn),
 | 
				
			||||||
 | 
								    f2(
 | 
				
			||||||
 | 
									sidegrid(yrs...),
 | 
				
			||||||
 | 
									f3(
 | 
				
			||||||
				    daygrid(sun,mon,tue,wed,thu,fri,sat),
 | 
									    daygrid(sun,mon,tue,wed,thu,fri,sat),
 | 
				
			||||||
				    cal,
 | 
									    cal,
 | 
				
			||||||
 | 
									),
 | 
				
			||||||
 | 
								    ),
 | 
				
			||||||
			))).Layout(ctx)
 | 
								))).Layout(ctx)
 | 
				
			||||||
			ctx.Draw()
 | 
								ctx.Update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for i := time.Sunday; i < 7; i++ {
 | 
								for i := time.Sunday; i < 7; i++ {
 | 
				
			||||||
				switch {
 | 
									switch {
 | 
				
			||||||
| 
						 | 
					@ -168,6 +184,13 @@ func eventloop() {
 | 
				
			||||||
				sm.Next()
 | 
									sm.Next()
 | 
				
			||||||
				resetCal()
 | 
									resetCal()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								for i,y := range yrs {
 | 
				
			||||||
 | 
									if y.(gio.Clickable).Clicked(ctx) {
 | 
				
			||||||
 | 
										sm.Year = curyr - i
 | 
				
			||||||
 | 
										sm.Refresh()
 | 
				
			||||||
 | 
										resetCal()
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			sm.CheckSel()
 | 
								sm.CheckSel()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}}
 | 
						}}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,7 @@ package main
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"git.wow.st/gmp/giowrap"
 | 
						"git.wow.st/gmp/giowrap"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"image"
 | 
				
			||||||
	"image/color"
 | 
						"image/color"
 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
| 
						 | 
					@ -13,7 +14,7 @@ import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"gioui.org/ui"
 | 
						"gioui.org/ui"
 | 
				
			||||||
	"gioui.org/ui/app"
 | 
						"gioui.org/ui/app"
 | 
				
			||||||
	gdraw "gioui.org/ui/draw"
 | 
						"gioui.org/ui/paint"
 | 
				
			||||||
	"gioui.org/ui/f32"
 | 
						"gioui.org/ui/f32"
 | 
				
			||||||
	"gioui.org/ui/gesture"
 | 
						"gioui.org/ui/gesture"
 | 
				
			||||||
	"gioui.org/ui/layout"
 | 
						"gioui.org/ui/layout"
 | 
				
			||||||
| 
						 | 
					@ -35,7 +36,7 @@ var (
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewButton(face text.Face, t string, c color.RGBA) giowrap.Clickable {
 | 
					func NewButton(face text.Face, t string, c color.RGBA) giowrap.Clickable {
 | 
				
			||||||
	lbl := giowrap.NewLabel(t, giowrap.Face(face), giowrap.Align(text.Center))
 | 
						lbl := giowrap.NewLabel(t, giowrap.Face(face), giowrap.Align(text.Middle))
 | 
				
			||||||
	bg := giowrap.NewBackground(giowrap.Color(c), giowrap.Radius(ui.Dp(4)))
 | 
						bg := giowrap.NewBackground(giowrap.Color(c), giowrap.Radius(ui.Dp(4)))
 | 
				
			||||||
	return giowrap.AsClickable(bg(lbl))
 | 
						return giowrap.AsClickable(bg(lbl))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -79,7 +80,7 @@ hello [main1|main2]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main1() {
 | 
					func main1() {
 | 
				
			||||||
	w := app.NewWindow(nil)
 | 
						w := app.NewWindow()
 | 
				
			||||||
	regular, err := sfnt.Parse(goregular.TTF)
 | 
						regular, err := sfnt.Parse(goregular.TTF)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		log.Fatal("Cannot parse font.")
 | 
							log.Fatal("Cannot parse font.")
 | 
				
			||||||
| 
						 | 
					@ -114,7 +115,7 @@ func main1() {
 | 
				
			||||||
			switch e := e.(type) {
 | 
								switch e := e.(type) {
 | 
				
			||||||
			case app.DestroyEvent:
 | 
								case app.DestroyEvent:
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			case app.DrawEvent:
 | 
								case app.UpdateEvent:
 | 
				
			||||||
				ctx.Reset(e)
 | 
									ctx.Reset(e)
 | 
				
			||||||
				OuterInset(
 | 
									OuterInset(
 | 
				
			||||||
					    f1(
 | 
										    f1(
 | 
				
			||||||
| 
						 | 
					@ -128,7 +129,7 @@ func main1() {
 | 
				
			||||||
							InnerInset(btn2),
 | 
												InnerInset(btn2),
 | 
				
			||||||
						),
 | 
											),
 | 
				
			||||||
					)).Layout(ctx)
 | 
										)).Layout(ctx)
 | 
				
			||||||
				ctx.Draw()
 | 
									ctx.Update()
 | 
				
			||||||
				if btn1.Clicked(ctx) {
 | 
									if btn1.Clicked(ctx) {
 | 
				
			||||||
					log.Print("Clicked: " + e1.Text() )
 | 
										log.Print("Clicked: " + e1.Text() )
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					@ -161,7 +162,7 @@ func main1() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main2() {
 | 
					func main2() {
 | 
				
			||||||
	w := app.NewWindow(nil)
 | 
						w := app.NewWindow()
 | 
				
			||||||
	q := w.Queue()
 | 
						q := w.Queue()
 | 
				
			||||||
	ops := new(ui.Ops)
 | 
						ops := new(ui.Ops)
 | 
				
			||||||
	var faces measure.Faces
 | 
						var faces measure.Faces
 | 
				
			||||||
| 
						 | 
					@ -216,7 +217,7 @@ func main2() {
 | 
				
			||||||
			switch e := e.(type) {
 | 
								switch e := e.(type) {
 | 
				
			||||||
			case app.DestroyEvent:
 | 
								case app.DestroyEvent:
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			case app.DrawEvent:
 | 
								case app.UpdateEvent:
 | 
				
			||||||
				c := &e.Config
 | 
									c := &e.Config
 | 
				
			||||||
				ops.Reset()
 | 
									ops.Reset()
 | 
				
			||||||
				faces.Reset(c)
 | 
									faces.Reset(c)
 | 
				
			||||||
| 
						 | 
					@ -239,14 +240,14 @@ func main2() {
 | 
				
			||||||
				cs = b1ins.Begin(c, ops, cs)
 | 
									cs = b1ins.Begin(c, ops, cs)
 | 
				
			||||||
				dims = btn1.Layout(ops, cs)
 | 
									dims = btn1.Layout(ops, cs)
 | 
				
			||||||
				dims = b1ins.End(dims)
 | 
									dims = b1ins.End(dims)
 | 
				
			||||||
				pointer.RectAreaOp{Size: dims.Size}.Add(ops)
 | 
									pointer.RectAreaOp{image.Rect(0,0,dims.Size.X,dims.Size.Y)}.Add(ops)
 | 
				
			||||||
				click1.Add(ops)
 | 
									click1.Add(ops)
 | 
				
			||||||
				bg1.Stop()
 | 
									bg1.Stop()
 | 
				
			||||||
				wi, h := float32(dims.Size.X), float32(dims.Size.Y)
 | 
									wi, h := float32(dims.Size.X), float32(dims.Size.Y)
 | 
				
			||||||
				r := float32(c.Px(ui.Dp(4)))
 | 
									r := float32(c.Px(ui.Dp(4)))
 | 
				
			||||||
				giowrap.Rrect(ops, wi, h, r, r, r, r)
 | 
									giowrap.Rrect(ops, wi, h, r, r, r, r)
 | 
				
			||||||
				gdraw.ColorOp{Color: color.RGBA{A: 0xff, R: 0x3c, G: 0x98, B: 0xc6}}.Add(ops)
 | 
									paint.ColorOp{Color: color.RGBA{A: 0xff, R: 0x3c, G: 0x98, B: 0xc6}}.Add(ops)
 | 
				
			||||||
				gdraw.DrawOp{Rect: f32.Rectangle{Max: f32.Point{X: wi, Y: h}}}.Add(ops)
 | 
									paint.PaintOp{Rect: f32.Rectangle{Max: f32.Point{X: wi, Y: h}}}.Add(ops)
 | 
				
			||||||
				bg1.Add(ops)
 | 
									bg1.Add(ops)
 | 
				
			||||||
				dims = InnerInset.End(dims)
 | 
									dims = InnerInset.End(dims)
 | 
				
			||||||
				f2c1 := f2.End(dims)
 | 
									f2c1 := f2.End(dims)
 | 
				
			||||||
| 
						 | 
					@ -256,13 +257,13 @@ func main2() {
 | 
				
			||||||
				cs = b2ins.Begin(c, ops, cs)
 | 
									cs = b2ins.Begin(c, ops, cs)
 | 
				
			||||||
				dims = btn2.Layout(ops, cs)
 | 
									dims = btn2.Layout(ops, cs)
 | 
				
			||||||
				dims = b2ins.End(dims)
 | 
									dims = b2ins.End(dims)
 | 
				
			||||||
				pointer.RectAreaOp{Size: dims.Size}.Add(ops)
 | 
									pointer.RectAreaOp{image.Rect(0,0,dims.Size.X,dims.Size.Y)}.Add(ops)
 | 
				
			||||||
				click2.Add(ops)
 | 
									click2.Add(ops)
 | 
				
			||||||
				bg2.Stop()
 | 
									bg2.Stop()
 | 
				
			||||||
				wi, h = float32(dims.Size.X), float32(dims.Size.Y)
 | 
									wi, h = float32(dims.Size.X), float32(dims.Size.Y)
 | 
				
			||||||
				giowrap.Rrect(ops, wi, h, r, r, r, r)
 | 
									giowrap.Rrect(ops, wi, h, r, r, r, r)
 | 
				
			||||||
				gdraw.ColorOp{Color: color.RGBA{A: 0xff, R: 0x3c, G: 0x98, B: 0xc6}}.Add(ops)
 | 
									paint.ColorOp{Color: color.RGBA{A: 0xff, R: 0x3c, G: 0x98, B: 0xc6}}.Add(ops)
 | 
				
			||||||
				gdraw.DrawOp{Rect: f32.Rectangle{Max: f32.Point{X: wi, Y: h}}}.Add(ops)
 | 
									paint.PaintOp{Rect: f32.Rectangle{Max: f32.Point{X: wi, Y: h}}}.Add(ops)
 | 
				
			||||||
				bg2.Add(ops)
 | 
									bg2.Add(ops)
 | 
				
			||||||
				dims = InnerInset.End(dims)
 | 
									dims = InnerInset.End(dims)
 | 
				
			||||||
				f2c2 := f2.End(dims)
 | 
									f2c2 := f2.End(dims)
 | 
				
			||||||
| 
						 | 
					@ -270,13 +271,13 @@ func main2() {
 | 
				
			||||||
				f1c3 := f1.End(dims)
 | 
									f1c3 := f1.End(dims)
 | 
				
			||||||
				dims = f1.Layout(f1c1, f1c2, f1c3)
 | 
									dims = f1.Layout(f1c1, f1c2, f1c3)
 | 
				
			||||||
				dims = OuterInset.End(dims)
 | 
									dims = OuterInset.End(dims)
 | 
				
			||||||
				w.Draw(ops)
 | 
									w.Update(ops)
 | 
				
			||||||
				for _,ev := range click1.Events(q) {
 | 
									for ev, ok := click1.Next(q); ok; ev, ok = click1.Next(q) {
 | 
				
			||||||
					if ev.Type == gesture.TypeClick {
 | 
										if ev.Type == gesture.TypeClick {
 | 
				
			||||||
						log.Print("Clicked: " + e1.Text() )
 | 
											log.Print("Clicked: " + e1.Text() )
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				for _, ev := range click2.Events(q) {
 | 
									for ev, ok := click2.Next(q); ok; ev, ok = click2.Next(q) {
 | 
				
			||||||
					if ev.Type == gesture.TypeClick {
 | 
										if ev.Type == gesture.TypeClick {
 | 
				
			||||||
						log.Print("Clicked: " + e2.Text() )
 | 
											log.Print("Clicked: " + e2.Text() )
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										76
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										76
									
								
								main.go
									
									
									
									
									
								
							| 
						 | 
					@ -14,7 +14,7 @@ import (
 | 
				
			||||||
	"gioui.org/ui/text"
 | 
						"gioui.org/ui/text"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"gioui.org/ui/f32"
 | 
						"gioui.org/ui/f32"
 | 
				
			||||||
	gdraw "gioui.org/ui/draw"
 | 
						"gioui.org/ui/paint"
 | 
				
			||||||
	"gioui.org/ui/gesture"
 | 
						"gioui.org/ui/gesture"
 | 
				
			||||||
	"gioui.org/ui/pointer"
 | 
						"gioui.org/ui/pointer"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -56,15 +56,15 @@ func NewContext(w *app.Window) *Context {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ctx *Context) Reset(e app.DrawEvent) {
 | 
					func (ctx *Context) Reset(e app.UpdateEvent) {
 | 
				
			||||||
	ctx.c = &e.Config
 | 
						ctx.c = &e.Config
 | 
				
			||||||
	ctx.ops.Reset()
 | 
						ctx.ops.Reset()
 | 
				
			||||||
	ctx.cs = layout.RigidConstraints(e.Size)
 | 
						ctx.cs = layout.RigidConstraints(e.Size)
 | 
				
			||||||
	ctx.Faces.Reset(ctx.c)
 | 
						ctx.Faces.Reset(ctx.c)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ctx *Context) Draw() {
 | 
					func (ctx *Context) Update() {
 | 
				
			||||||
	ctx.w.Draw(ctx.ops)
 | 
						ctx.w.Update(ctx.ops)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Layout func(*Context)
 | 
					type Layout func(*Context)
 | 
				
			||||||
| 
						 | 
					@ -193,22 +193,18 @@ func Rigid() Widget {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type AxisOpt struct { axis layout.Axis }
 | 
					type AxisOpt struct { axis layout.Axis }
 | 
				
			||||||
func Axis(x layout.Axis) AxisOpt { return AxisOpt{ x } }
 | 
					func Axis(x layout.Axis) AxisOpt { return AxisOpt{ x } }
 | 
				
			||||||
type MainAxisAlignmentOpt struct { mainAxisAlignment layout.MainAxisAlignment }
 | 
					type AlignmentOpt struct { alignment layout.Alignment }
 | 
				
			||||||
func MainAxisAlignment(x layout.MainAxisAlignment) MainAxisAlignmentOpt { return MainAxisAlignmentOpt{ x } }
 | 
					func Alignment(x layout.Alignment) AlignmentOpt { return AlignmentOpt{ x } }
 | 
				
			||||||
type CrossAxisAlignmentOpt struct { crossAxisAlignment layout.CrossAxisAlignment }
 | 
					 | 
				
			||||||
func CrossAxisAlignment(x layout.CrossAxisAlignment) CrossAxisAlignmentOpt { return CrossAxisAlignmentOpt{ x } }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
type FlexOpts struct {
 | 
					type FlexOpts struct {
 | 
				
			||||||
	AxisOpt
 | 
						AxisOpt
 | 
				
			||||||
	MainAxisAlignmentOpt
 | 
						AlignmentOpt
 | 
				
			||||||
	CrossAxisAlignmentOpt
 | 
					 | 
				
			||||||
	flexible float32
 | 
						flexible float32
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type FlexOption interface { DoFlexOption(*FlexOpts) }
 | 
					type FlexOption interface { DoFlexOption(*FlexOpts) }
 | 
				
			||||||
func (x AxisOpt) DoFlexOption(o *FlexOpts) { o.axis = x.axis }
 | 
					func (x AxisOpt) DoFlexOption(o *FlexOpts) { o.axis = x.axis }
 | 
				
			||||||
func (x MainAxisAlignmentOpt) DoFlexOption(o *FlexOpts) { o.mainAxisAlignment = x.mainAxisAlignment }
 | 
					func (x AlignmentOpt) DoFlexOption(o *FlexOpts) { o.alignment = x.alignment }
 | 
				
			||||||
func (x CrossAxisAlignmentOpt) DoFlexOption(o *FlexOpts) { o.crossAxisAlignment = x.crossAxisAlignment }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewFlex returns a WidgetCombinator that wraps the layout.Flex element.
 | 
					// NewFlex returns a WidgetCombinator that wraps the layout.Flex element.
 | 
				
			||||||
func NewFlex(fos ...FlexOption) Flex {
 | 
					func NewFlex(fos ...FlexOption) Flex {
 | 
				
			||||||
| 
						 | 
					@ -216,8 +212,7 @@ func NewFlex(fos ...FlexOption) Flex {
 | 
				
			||||||
	for _,o := range fos { o.DoFlexOption(opts) }
 | 
						for _,o := range fos { o.DoFlexOption(opts) }
 | 
				
			||||||
	f := layout.Flex{
 | 
						f := layout.Flex{
 | 
				
			||||||
		Axis: opts.axis,
 | 
							Axis: opts.axis,
 | 
				
			||||||
		MainAxisAlignment: opts.mainAxisAlignment,
 | 
							Alignment: opts.alignment,
 | 
				
			||||||
		CrossAxisAlignment: opts.crossAxisAlignment,
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	index := extra.New()
 | 
						index := extra.New()
 | 
				
			||||||
	extra.data[index] = opts
 | 
						extra.data[index] = opts
 | 
				
			||||||
| 
						 | 
					@ -361,8 +356,8 @@ func (bg *Background) End(ctx *Context) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		Rrect(ctx.ops, w, h, r, r, r, r)
 | 
							Rrect(ctx.ops, w, h, r, r, r, r)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	gdraw.ColorOp{Color: bg.Color}.Add(ctx.ops)
 | 
						paint.ColorOp{Color: bg.Color}.Add(ctx.ops)
 | 
				
			||||||
	gdraw.DrawOp{Rect: f32.Rectangle{Max: f32.Point{X: w, Y: h}}}.Add(ctx.ops)
 | 
						paint.PaintOp{Rect: f32.Rectangle{Max: f32.Point{X: w, Y: h}}}.Add(ctx.ops)
 | 
				
			||||||
	bg.macro.Add(ctx.ops)
 | 
						bg.macro.Add(ctx.ops)
 | 
				
			||||||
	stack.Pop()
 | 
						stack.Pop()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -371,7 +366,7 @@ func (bg *Background) End(ctx *Context) {
 | 
				
			||||||
func Rrect(ops *ui.Ops, width, height, se, sw, nw, ne float32) {
 | 
					func Rrect(ops *ui.Ops, width, height, se, sw, nw, ne float32) {
 | 
				
			||||||
	w, h := float32(width), float32(height)
 | 
						w, h := float32(width), float32(height)
 | 
				
			||||||
	const c = 0.55228475 // 4*(sqrt(2)-1)/3
 | 
						const c = 0.55228475 // 4*(sqrt(2)-1)/3
 | 
				
			||||||
	var b gdraw.PathBuilder
 | 
						var b paint.PathBuilder
 | 
				
			||||||
	b.Init(ops)
 | 
						b.Init(ops)
 | 
				
			||||||
	b.Move(f32.Point{X: w, Y: h - se})
 | 
						b.Move(f32.Point{X: w, Y: h - se})
 | 
				
			||||||
	b.Cube(f32.Point{X: 0, Y: se * c}, f32.Point{X: -se + se*c, Y: se}, f32.Point{X: -se, Y: se}) // SE
 | 
						b.Cube(f32.Point{X: 0, Y: se * c}, f32.Point{X: -se + se*c, Y: se}, f32.Point{X: -se, Y: se}) // SE
 | 
				
			||||||
| 
						 | 
					@ -397,12 +392,12 @@ type cWidget struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (w cWidget) Layout(ctx *Context) {
 | 
					func (w cWidget) Layout(ctx *Context) {
 | 
				
			||||||
	w.w.Layout(ctx)
 | 
						w.w.Layout(ctx)
 | 
				
			||||||
	pointer.RectAreaOp{Size: ctx.dims.Size}.Add(ctx.ops)
 | 
						pointer.RectAreaOp{image.Rect(0,0,ctx.dims.Size.X,ctx.dims.Size.Y)}.Add(ctx.ops)
 | 
				
			||||||
	w.click.Add(ctx.ops)
 | 
						w.click.Add(ctx.ops)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (w cWidget) Clicked(ctx *Context) bool {
 | 
					func (w cWidget) Clicked(ctx *Context) bool {
 | 
				
			||||||
	for _,e := range w.click.Events(ctx.q) {
 | 
						for e, ok := w.click.Next(ctx.q); ok; e, ok = w.click.Next(ctx.q) {
 | 
				
			||||||
		if e.Type == gesture.TypeClick {
 | 
							if e.Type == gesture.TypeClick {
 | 
				
			||||||
			ctx.w.Invalidate()
 | 
								ctx.w.Invalidate()
 | 
				
			||||||
			return true
 | 
								return true
 | 
				
			||||||
| 
						 | 
					@ -417,9 +412,8 @@ func AsClickable(w Widget) cWidget {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Grid struct {
 | 
					type Grid struct {
 | 
				
			||||||
	Axis layout.Axis
 | 
					 | 
				
			||||||
	Cols int
 | 
						Cols int
 | 
				
			||||||
	Height int
 | 
						Height, Width int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	macro ui.MacroOp
 | 
						macro ui.MacroOp
 | 
				
			||||||
	ops *ui.Ops
 | 
						ops *ui.Ops
 | 
				
			||||||
| 
						 | 
					@ -446,11 +440,14 @@ func (g *Grid) Init(ops *ui.Ops, cs layout.Constraints) layout.Constraints {
 | 
				
			||||||
	g.row, g.col = 0, 0
 | 
						g.row, g.col = 0, 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cs.Height.Min = 0
 | 
						cs.Height.Min = 0
 | 
				
			||||||
	if g.Height != 0 {
 | 
					
 | 
				
			||||||
		cs.Height.Max = g.Height
 | 
						if g.Height != 0 { g.cs.Height.Max = g.Height }
 | 
				
			||||||
	}
 | 
						if g.Width != 0 { g.cs.Width.Max = g.Width }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cs.Width.Max = g.cs.Width.Max / g.Cols
 | 
						cs.Width.Max = g.cs.Width.Max / g.Cols
 | 
				
			||||||
 | 
						if g.Cols > 1 {
 | 
				
			||||||
		cs.Width.Min = cs.Width.Max
 | 
							cs.Width.Min = cs.Width.Max
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return cs
 | 
						return cs
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -470,6 +467,7 @@ func (g *Grid) Layout(cs ...GridChild) layout.Dimens {
 | 
				
			||||||
	rowheight := 0
 | 
						rowheight := 0
 | 
				
			||||||
	height := 0
 | 
						height := 0
 | 
				
			||||||
	var width float32
 | 
						var width float32
 | 
				
			||||||
 | 
						var maxwidth float32
 | 
				
			||||||
	for _,c := range cs {
 | 
						for _,c := range cs {
 | 
				
			||||||
		var stack ui.StackOp
 | 
							var stack ui.StackOp
 | 
				
			||||||
		stack.Push(g.ops)
 | 
							stack.Push(g.ops)
 | 
				
			||||||
| 
						 | 
					@ -479,10 +477,17 @@ func (g *Grid) Layout(cs ...GridChild) layout.Dimens {
 | 
				
			||||||
			rowheight = c.dims.Size.Y
 | 
								rowheight = c.dims.Size.Y
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		g.col = g.col+1
 | 
							g.col = g.col+1
 | 
				
			||||||
		x := float32(g.cs.Width.Max / g.Cols)
 | 
							var x float32
 | 
				
			||||||
 | 
							if g.Cols == 1 {
 | 
				
			||||||
 | 
								x = float32(c.dims.Size.X)
 | 
				
			||||||
 | 
								if x > maxwidth { maxwidth = x }
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								x = float32(g.cs.Width.Max / g.Cols)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if g.col < g.Cols {
 | 
				
			||||||
			ui.TransformOp{}.Offset(f32.Point{X: x}).Add(g.ops)
 | 
								ui.TransformOp{}.Offset(f32.Point{X: x}).Add(g.ops)
 | 
				
			||||||
			width = width + x
 | 
								width = width + x
 | 
				
			||||||
		if g.col >= g.Cols {
 | 
							} else {
 | 
				
			||||||
			g.col = 0
 | 
								g.col = 0
 | 
				
			||||||
			ui.TransformOp{}.Offset(f32.Point{ X: -width, Y: float32(rowheight) }).Add(g.ops)
 | 
								ui.TransformOp{}.Offset(f32.Point{ X: -width, Y: float32(rowheight) }).Add(g.ops)
 | 
				
			||||||
			g.row = g.row + 1
 | 
								g.row = g.row + 1
 | 
				
			||||||
| 
						 | 
					@ -493,15 +498,30 @@ func (g *Grid) Layout(cs ...GridChild) layout.Dimens {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if height == 0 { height = rowheight }
 | 
						if height == 0 { height = rowheight }
 | 
				
			||||||
	g.mode = modeNone
 | 
						g.mode = modeNone
 | 
				
			||||||
	return layout.Dimens{ Size: image.Point{ g.cs.Width.Max, height } }
 | 
						var dwidth int
 | 
				
			||||||
 | 
						if g.Cols == 1 {
 | 
				
			||||||
 | 
							dwidth = int(maxwidth)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							dwidth = g.cs.Width.Max
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return layout.Dimens{ Size: image.Point{ dwidth, height } }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func toPointF(p image.Point) f32.Point {
 | 
					func toPointF(p image.Point) f32.Point {
 | 
				
			||||||
	return f32.Point{X: float32(p.X), Y: float32(p.Y)}
 | 
						return f32.Point{X: float32(p.X), Y: float32(p.Y)}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewGrid(cols int) WidgetCombinator {
 | 
					type GridOption interface { DoGridOption(*Grid) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type HeightOpt struct { height int }
 | 
				
			||||||
 | 
					func Height(x int) HeightOpt { return HeightOpt{ x } }
 | 
				
			||||||
 | 
					func (x HeightOpt) DoGridOption(g *Grid) { g.Height = x.height }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewGrid(cols int, gops ...GridOption) WidgetCombinator {
 | 
				
			||||||
	g := &Grid{ Cols: cols }
 | 
						g := &Grid{ Cols: cols }
 | 
				
			||||||
 | 
						for _, gop := range gops {
 | 
				
			||||||
 | 
							gop.DoGridOption(g)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	gcs := make([]GridChild,0)
 | 
						gcs := make([]GridChild,0)
 | 
				
			||||||
	return func(ws ...Widget) Widget {
 | 
						return func(ws ...Widget) Widget {
 | 
				
			||||||
		return NewfWidget(func(ctx *Context) {
 | 
							return NewfWidget(func(ctx *Context) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user