Skip to content

Commit

Permalink
Merge pull request #37 from sdassow/feature/editor-onchanged-callback
Browse files Browse the repository at this point in the history
Add onchanged callback to support actions on widget change
  • Loading branch information
andydotxyz authored Feb 3, 2025
2 parents d06e590 + 918d7df commit ba84006
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 37 deletions.
2 changes: 1 addition & 1 deletion internal/guibuilder/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ func (b *Builder) choose(o fyne.CanvasObject) {
editForm.Refresh()
editForm.Items = append([]*widget.FormItem{nameItem}, items...)
editForm.Refresh()
})
}, nil)

items = append([]*widget.FormItem{nameItem}, items...)
b.meta[o] = props
Expand Down
24 changes: 20 additions & 4 deletions internal/guidefs/containers.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@ func initContainers() {
Create: func() fyne.CanvasObject {
return container.NewVBox()
},
Edit: func(obj fyne.CanvasObject, props map[string]string, refresh func([]*widget.FormItem)) []*widget.FormItem {
Edit: func(obj fyne.CanvasObject, props map[string]string, refresh func([]*widget.FormItem), onchanged func()) []*widget.FormItem {
c := obj.(*fyne.Container)

choose := widget.NewFormItem("Layout", widget.NewSelect(layoutNames, nil))
items := []*widget.FormItem{choose}
ready := false
choose.Widget.(*widget.Select).OnChanged = func(l string) {
lay := Layouts[l]
props["layout"] = l
Expand All @@ -37,8 +38,12 @@ func initContainers() {
}

refresh(items)
if ready {
onchanged()
}
}
choose.Widget.(*widget.Select).SetSelected(props["layout"])
ready = true
return items
},
Gostring: func(obj fyne.CanvasObject, props map[fyne.CanvasObject]map[string]string, defs map[string]string) string {
Expand Down Expand Up @@ -83,7 +88,7 @@ func initContainers() {
Create: func() fyne.CanvasObject {
return container.NewAppTabs(container.NewTabItem("Untitled", container.NewStack()))
},
Edit: func(obj fyne.CanvasObject, props map[string]string, setItems func([]*widget.FormItem)) []*widget.FormItem {
Edit: func(obj fyne.CanvasObject, props map[string]string, setItems func([]*widget.FormItem), onchanged func()) []*widget.FormItem {
tabs := obj.(*container.AppTabs)
items := make([]*widget.FormItem, len(tabs.Items)+2)
itemNames := make([]string, len(tabs.Items))
Expand All @@ -92,12 +97,14 @@ func initContainers() {
icon := newIconSelectorButton(item.Icon, func(i fyne.Resource) {
item.Icon = i
tabs.Refresh()
onchanged()
}, false)
edit := widget.NewEntry()
edit.SetText(item.Text)
edit.OnChanged = func(s string) {
item.Text = s
tabs.Refresh()
onchanged()
}
del := widget.NewButtonWithIcon("", theme.DeleteIcon(), func() {
if i == len(tabs.Items)-1 {
Expand All @@ -111,6 +118,7 @@ func initContainers() {
}
tabs.Refresh()
setItems(items)
onchanged()
})
del.Importance = widget.DangerImportance

Expand All @@ -135,12 +143,18 @@ func initContainers() {

tabs.Append(item)
setItems(items)
onchanged()
}))
ready := false
selected := widget.NewSelect(itemNames, nil)
selected.OnChanged = func(_ string) {
tabs.SelectIndex(selected.SelectedIndex())
if ready {
onchanged()
}
}
selected.SetSelectedIndex(tabs.SelectedIndex())
ready = true
items[len(items)-1] = widget.NewFormItem("Selected", selected)
return items
},
Expand Down Expand Up @@ -193,7 +207,7 @@ func initContainers() {
Create: func() fyne.CanvasObject {
return container.NewScroll(container.NewStack())
},
Edit: func(obj fyne.CanvasObject, props map[string]string, _ func([]*widget.FormItem)) []*widget.FormItem {
Edit: func(obj fyne.CanvasObject, props map[string]string, _ func([]*widget.FormItem), _ func()) []*widget.FormItem {
return []*widget.FormItem{}
},
Gostring: func(obj fyne.CanvasObject, props map[fyne.CanvasObject]map[string]string, defs map[string]string) string {
Expand Down Expand Up @@ -226,19 +240,21 @@ func initContainers() {
Create: func() fyne.CanvasObject {
return container.NewHSplit(container.NewStack(), container.NewStack())
},
Edit: func(obj fyne.CanvasObject, _ map[string]string, _ func([]*widget.FormItem)) []*widget.FormItem {
Edit: func(obj fyne.CanvasObject, _ map[string]string, _ func([]*widget.FormItem), onchanged func()) []*widget.FormItem {
split := obj.(*container.Split)
offset := widget.NewEntry()
offset.SetText(fmt.Sprintf("%f", split.Offset))
offset.OnChanged = func(s string) {
if f, err := strconv.ParseFloat(s, 64); err == nil {
split.SetOffset(f)
}
onchanged()
}
// TODO - add Fyne split.OnChanged
vert := widget.NewCheck("", func(on bool) {
split.Horizontal = !on
split.Refresh()
onchanged()
})
vert.Checked = !split.Horizontal
return []*widget.FormItem{
Expand Down
15 changes: 12 additions & 3 deletions internal/guidefs/graphics.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,22 +27,25 @@ func initGraphics() {
Create: func() fyne.CanvasObject {
return &canvas.LinearGradient{StartColor: color.White}
},
Edit: func(obj fyne.CanvasObject, _ map[string]string, _ func([]*widget.FormItem)) []*widget.FormItem {
Edit: func(obj fyne.CanvasObject, _ map[string]string, _ func([]*widget.FormItem), onchanged func()) []*widget.FormItem {
r := obj.(*canvas.LinearGradient)
angleSlide := widget.NewSlider(0, 360)
angleSlide.Step = 90
angleSlide.OnChanged = func(f float64) {
r.Angle = f
r.Refresh()
onchanged()
}
return []*widget.FormItem{
widget.NewFormItem("Start", newColorButton(r.StartColor, func(c color.Color) {
r.StartColor = c
r.Refresh()
onchanged()
})),
widget.NewFormItem("End", newColorButton(r.EndColor, func(c color.Color) {
r.EndColor = c
r.Refresh()
onchanged()
})),
widget.NewFormItem("Angle", angleSlide),
}
Expand All @@ -56,16 +59,18 @@ func initGraphics() {
Create: func() fyne.CanvasObject {
return &canvas.RadialGradient{StartColor: color.White}
},
Edit: func(obj fyne.CanvasObject, _ map[string]string, _ func([]*widget.FormItem)) []*widget.FormItem {
Edit: func(obj fyne.CanvasObject, _ map[string]string, _ func([]*widget.FormItem), onchanged func()) []*widget.FormItem {
r := obj.(*canvas.RadialGradient)
return []*widget.FormItem{
widget.NewFormItem("Start", newColorButton(r.StartColor, func(c color.Color) {
r.StartColor = c
r.Refresh()
onchanged()
})),
widget.NewFormItem("End", newColorButton(r.EndColor, func(c color.Color) {
r.EndColor = c
r.Refresh()
onchanged()
})),
}
},
Expand All @@ -80,24 +85,28 @@ func initGraphics() {
rect.StrokeColor = color.Black
return rect
},
Edit: func(obj fyne.CanvasObject, _ map[string]string, _ func([]*widget.FormItem)) []*widget.FormItem {
Edit: func(obj fyne.CanvasObject, _ map[string]string, _ func([]*widget.FormItem), onchanged func()) []*widget.FormItem {
r := obj.(*canvas.Rectangle)
return []*widget.FormItem{
widget.NewFormItem("Fill", newColorButton(r.FillColor, func(c color.Color) {
r.FillColor = c
r.Refresh()
onchanged()
})),
widget.NewFormItem("Corner", newSliderButton(float64(r.CornerRadius), 0, 32, func(f float64) {
r.CornerRadius = float32(f)
r.Refresh()
onchanged()
})),
widget.NewFormItem("Stroke", newSliderButton(float64(r.StrokeWidth), 0, 32, func(f float64) {
r.StrokeWidth = float32(f)
r.Refresh()
onchanged()
})),
widget.NewFormItem("Color", newColorButton(r.StrokeColor, func(c color.Color) {
r.StrokeColor = c
r.Refresh()
onchanged()
})),
}
},
Expand Down
Loading

0 comments on commit ba84006

Please sign in to comment.