mirror of
https://github.com/AynaLivePlayer/AynaLivePlayer.git
synced 2025-12-11 12:48:12 +08:00
112 lines
3.1 KiB
Go
112 lines
3.1 KiB
Go
package tutorials
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"fyne.io/fyne/v2"
|
|
"fyne.io/fyne/v2/container"
|
|
"fyne.io/fyne/v2/data/binding"
|
|
"fyne.io/fyne/v2/widget"
|
|
)
|
|
|
|
func bindingScreen(_ fyne.Window) fyne.CanvasObject {
|
|
f := 0.2
|
|
data := binding.BindFloat(&f)
|
|
label := widget.NewLabelWithData(binding.FloatToStringWithFormat(data, "Float value: %0.2f"))
|
|
entry := widget.NewEntryWithData(binding.FloatToString(data))
|
|
floats := container.NewGridWithColumns(2, label, entry)
|
|
|
|
slide := widget.NewSliderWithData(0, 1, data)
|
|
slide.Step = 0.01
|
|
bar := widget.NewProgressBarWithData(data)
|
|
|
|
buttons := container.NewGridWithColumns(4,
|
|
widget.NewButton("0%", func() {
|
|
data.Set(0)
|
|
}),
|
|
widget.NewButton("30%", func() {
|
|
data.Set(0.3)
|
|
}),
|
|
widget.NewButton("70%", func() {
|
|
data.Set(0.7)
|
|
}),
|
|
widget.NewButton("100%", func() {
|
|
data.Set(1)
|
|
}))
|
|
|
|
boolData := binding.NewBool()
|
|
check := widget.NewCheckWithData("Check me!", boolData)
|
|
checkLabel := widget.NewLabelWithData(binding.BoolToString(boolData))
|
|
checkEntry := widget.NewEntryWithData(binding.BoolToString(boolData))
|
|
checks := container.NewGridWithColumns(3, check, checkLabel, checkEntry)
|
|
item := container.NewVBox(floats, slide, bar, buttons, widget.NewSeparator(), checks, widget.NewSeparator())
|
|
|
|
dataList := binding.BindFloatList(&[]float64{0.1, 0.2, 0.3})
|
|
|
|
button := widget.NewButton("Append", func() {
|
|
dataList.Append(float64(dataList.Length()+1) / 10)
|
|
})
|
|
|
|
list := widget.NewListWithData(dataList,
|
|
func() fyne.CanvasObject {
|
|
return container.NewBorder(nil, nil, nil, widget.NewButton("+", nil),
|
|
widget.NewLabel("item x.y"))
|
|
},
|
|
func(item binding.DataItem, obj fyne.CanvasObject) {
|
|
f := item.(binding.Float)
|
|
text := obj.(*fyne.Container).Objects[0].(*widget.Label)
|
|
text.Bind(binding.FloatToStringWithFormat(f, "item %0.1f"))
|
|
|
|
btn := obj.(*fyne.Container).Objects[1].(*widget.Button)
|
|
btn.OnTapped = func() {
|
|
val, _ := f.Get()
|
|
_ = f.Set(val + 1)
|
|
}
|
|
})
|
|
|
|
formStruct := struct {
|
|
Name, Email string
|
|
Subscribe bool
|
|
}{}
|
|
|
|
formData := binding.BindStruct(&formStruct)
|
|
form := newFormWithData(formData)
|
|
form.OnSubmit = func() {
|
|
fmt.Println("Struct:\n", formStruct)
|
|
}
|
|
|
|
listPanel := container.NewBorder(nil, button, nil, nil, list)
|
|
return container.NewBorder(item, nil, nil, nil, container.NewGridWithColumns(2, listPanel, form))
|
|
}
|
|
|
|
func newFormWithData(data binding.DataMap) *widget.Form {
|
|
keys := data.Keys()
|
|
items := make([]*widget.FormItem, len(keys))
|
|
for i, k := range keys {
|
|
data, err := data.GetItem(k)
|
|
if err != nil {
|
|
items[i] = widget.NewFormItem(k, widget.NewLabel(err.Error()))
|
|
}
|
|
items[i] = widget.NewFormItem(k, createBoundItem(data))
|
|
}
|
|
|
|
return widget.NewForm(items...)
|
|
}
|
|
|
|
func createBoundItem(v binding.DataItem) fyne.CanvasObject {
|
|
switch val := v.(type) {
|
|
case binding.Bool:
|
|
return widget.NewCheckWithData("", val)
|
|
case binding.Float:
|
|
s := widget.NewSliderWithData(0, 1, val)
|
|
s.Step = 0.01
|
|
return s
|
|
case binding.Int:
|
|
return widget.NewEntryWithData(binding.IntToString(val))
|
|
case binding.String:
|
|
return widget.NewEntryWithData(val)
|
|
default:
|
|
return widget.NewLabel("")
|
|
}
|
|
}
|