This repository has been archived by the owner on Jan 14, 2024. It is now read-only.
forked from fyne-io/fyne
/
bind.go
111 lines (95 loc) · 3.1 KB
/
bind.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package tutorials
import (
"fmt"
"github.com/Anwert/fyne/v2"
"github.com/Anwert/fyne/v2/container"
"github.com/Anwert/fyne/v2/data/binding"
"github.com/Anwert/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("")
}
}