mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-06 18:05:35 +00:00
layout: fix ambiguous parsing of stack and flex arguments
Fixed gio#44 Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
+48
-26
@@ -195,27 +195,30 @@ func formatWidget(gtx *Context, f *formatter, widgets []Widget) {
|
|||||||
|
|
||||||
func formatStack(gtx *Context, f *formatter, widgets []Widget) {
|
func formatStack(gtx *Context, f *formatter, widgets []Widget) {
|
||||||
st := Stack{}
|
st := Stack{}
|
||||||
|
backup := *f
|
||||||
// Parse alignment, if present.
|
// Parse alignment, if present.
|
||||||
switch peek(f) {
|
name := parseName(f)
|
||||||
case 'r', 'e', ')':
|
align, ok := dirFor(name)
|
||||||
default:
|
if ok {
|
||||||
name := parseName(f)
|
|
||||||
align, ok := dirFor(name)
|
|
||||||
if !ok {
|
|
||||||
errorf("invalid stack alignment: %q", name)
|
|
||||||
}
|
|
||||||
st.Alignment = align
|
st.Alignment = align
|
||||||
expect(f, ",")
|
expect(f, ",")
|
||||||
|
backup = *f
|
||||||
|
} else {
|
||||||
|
*f = backup
|
||||||
}
|
}
|
||||||
var children []StackChild
|
var children []StackChild
|
||||||
|
commaOK := false
|
||||||
// First, lay out rigid children.
|
// First, lay out rigid children.
|
||||||
backup := *f
|
|
||||||
loop:
|
loop:
|
||||||
for {
|
for {
|
||||||
switch peek(f) {
|
switch peek(f) {
|
||||||
case ')':
|
case ')':
|
||||||
break loop
|
break loop
|
||||||
case ',':
|
case ',':
|
||||||
|
if !commaOK {
|
||||||
|
errorf("unexpected ,")
|
||||||
|
}
|
||||||
|
commaOK = false
|
||||||
expect(f, ",")
|
expect(f, ",")
|
||||||
case 'r':
|
case 'r':
|
||||||
expect(f, "r(")
|
expect(f, "r(")
|
||||||
@@ -223,6 +226,7 @@ loop:
|
|||||||
formatExpr(gtx, f, widgets)
|
formatExpr(gtx, f, widgets)
|
||||||
}))
|
}))
|
||||||
expect(f, ")")
|
expect(f, ")")
|
||||||
|
commaOK = true
|
||||||
case 'e':
|
case 'e':
|
||||||
expect(f, "e(")
|
expect(f, "e(")
|
||||||
f.skip++
|
f.skip++
|
||||||
@@ -230,6 +234,7 @@ loop:
|
|||||||
children = append(children, StackChild{})
|
children = append(children, StackChild{})
|
||||||
f.skip--
|
f.skip--
|
||||||
expect(f, ")")
|
expect(f, ")")
|
||||||
|
commaOK = true
|
||||||
default:
|
default:
|
||||||
errorf("invalid flex child")
|
errorf("invalid flex child")
|
||||||
}
|
}
|
||||||
@@ -268,34 +273,29 @@ loop:
|
|||||||
|
|
||||||
func formatFlex(gtx *Context, axis Axis, f *formatter, widgets []Widget) {
|
func formatFlex(gtx *Context, axis Axis, f *formatter, widgets []Widget) {
|
||||||
fl := Flex{Axis: axis}
|
fl := Flex{Axis: axis}
|
||||||
|
backup := *f
|
||||||
// Parse alignment, if present.
|
// Parse alignment, if present.
|
||||||
switch peek(f) {
|
name := parseName(f)
|
||||||
case 'r', 'f', ')':
|
al, ok := alignmentFor(name)
|
||||||
default:
|
if ok {
|
||||||
name := parseName(f)
|
fl.Alignment = al
|
||||||
switch name {
|
|
||||||
case "start":
|
|
||||||
fl.Alignment = Start
|
|
||||||
case "middle":
|
|
||||||
fl.Alignment = Middle
|
|
||||||
case "end":
|
|
||||||
fl.Alignment = End
|
|
||||||
case "baseline":
|
|
||||||
fl.Alignment = Baseline
|
|
||||||
default:
|
|
||||||
errorf("invalid flex alignment: %q", name)
|
|
||||||
}
|
|
||||||
expect(f, ",")
|
expect(f, ",")
|
||||||
|
backup = *f
|
||||||
|
} else {
|
||||||
|
*f = backup
|
||||||
}
|
}
|
||||||
var children []FlexChild
|
var children []FlexChild
|
||||||
|
commaOK := false
|
||||||
// First, lay out rigid children.
|
// First, lay out rigid children.
|
||||||
backup := *f
|
|
||||||
loop:
|
loop:
|
||||||
for {
|
for {
|
||||||
switch peek(f) {
|
switch peek(f) {
|
||||||
case ')':
|
case ')':
|
||||||
break loop
|
break loop
|
||||||
case ',':
|
case ',':
|
||||||
|
if !commaOK {
|
||||||
|
errorf("unexpected ,")
|
||||||
|
}
|
||||||
expect(f, ",")
|
expect(f, ",")
|
||||||
case 'r':
|
case 'r':
|
||||||
expect(f, "r(")
|
expect(f, "r(")
|
||||||
@@ -303,6 +303,7 @@ loop:
|
|||||||
formatExpr(gtx, f, widgets)
|
formatExpr(gtx, f, widgets)
|
||||||
}))
|
}))
|
||||||
expect(f, ")")
|
expect(f, ")")
|
||||||
|
commaOK = true
|
||||||
case 'f':
|
case 'f':
|
||||||
expect(f, "f(")
|
expect(f, "f(")
|
||||||
parseFloat(f)
|
parseFloat(f)
|
||||||
@@ -312,6 +313,7 @@ loop:
|
|||||||
children = append(children, FlexChild{})
|
children = append(children, FlexChild{})
|
||||||
f.skip--
|
f.skip--
|
||||||
expect(f, ")")
|
expect(f, ")")
|
||||||
|
commaOK = true
|
||||||
default:
|
default:
|
||||||
errorf("invalid flex child")
|
errorf("invalid flex child")
|
||||||
}
|
}
|
||||||
@@ -408,6 +410,7 @@ func parseValue(f *formatter) unit.Value {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func parseName(f *formatter) string {
|
func parseName(f *formatter) string {
|
||||||
|
skipWhitespace(f)
|
||||||
i := 0
|
i := 0
|
||||||
loop:
|
loop:
|
||||||
for ; i < len(f.expr); i++ {
|
for ; i < len(f.expr); i++ {
|
||||||
@@ -425,6 +428,7 @@ loop:
|
|||||||
}
|
}
|
||||||
|
|
||||||
func parseFloat(f *formatter) float32 {
|
func parseFloat(f *formatter) float32 {
|
||||||
|
skipWhitespace(f)
|
||||||
i := 0
|
i := 0
|
||||||
for ; i < len(f.expr); i++ {
|
for ; i < len(f.expr); i++ {
|
||||||
c := f.expr[i]
|
c := f.expr[i]
|
||||||
@@ -442,6 +446,7 @@ func parseFloat(f *formatter) float32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func parseInt(f *formatter) int {
|
func parseInt(f *formatter) int {
|
||||||
|
skipWhitespace(f)
|
||||||
i := 0
|
i := 0
|
||||||
for ; i < len(f.expr); i++ {
|
for ; i < len(f.expr); i++ {
|
||||||
c := f.expr[i]
|
c := f.expr[i]
|
||||||
@@ -486,6 +491,23 @@ func skipWhitespace(f *formatter) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func alignmentFor(name string) (Alignment, bool) {
|
||||||
|
var a Alignment
|
||||||
|
switch name {
|
||||||
|
case "start":
|
||||||
|
a = Start
|
||||||
|
case "middle":
|
||||||
|
a = Middle
|
||||||
|
case "end":
|
||||||
|
a = End
|
||||||
|
case "baseline":
|
||||||
|
a = Baseline
|
||||||
|
default:
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
return a, true
|
||||||
|
}
|
||||||
|
|
||||||
func dirFor(name string) (Direction, bool) {
|
func dirFor(name string) (Direction, bool) {
|
||||||
var d Direction
|
var d Direction
|
||||||
switch name {
|
switch name {
|
||||||
|
|||||||
Reference in New Issue
Block a user