Skip to content

Commit

Permalink
Rewrite fromInt using generics
Browse files Browse the repository at this point in the history
  • Loading branch information
Jacalz committed Jan 31, 2025
1 parent 62a30ea commit f56ea95
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 94 deletions.
39 changes: 1 addition & 38 deletions data/binding/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,52 +42,15 @@ func FloatToStringWithFormat(v Float, format string) String {
return toStringWithFormatComparable[float64](v, format, "%f", formatFloat, parseFloat)
}

type intToFloat struct {
base
from Int
}

// IntToFloat creates a binding that connects an Int data item to a Float.
//
// Since: 2.5
func IntToFloat(val Int) Float {
v := &intToFloat{from: val}
v := &fromIntTo[float64]{from: val, parser: internalFloatToInt, formatter: internalIntToFloat}
val.AddListener(v)
return v
}

func (s *intToFloat) Get() (float64, error) {
val, err := s.from.Get()
if err != nil {
return 0.0, err
}
return internalIntToFloat(val)
}

func (s *intToFloat) Set(val float64) error {
i, err := internalFloatToInt(val)
if err != nil {
return err
}
old, err := s.from.Get()
if i == old {
return nil
}
if err != nil {
return err
}
if err = s.from.Set(i); err != nil {
return err
}

queueItem(s.DataChanged)
return nil
}

func (s *intToFloat) DataChanged() {
s.trigger()
}

// FloatToInt creates a binding that connects a Float data item to an Int.
//
// Since: 2.5
Expand Down
56 changes: 0 additions & 56 deletions data/binding/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,53 +11,6 @@ import (
"fyne.io/fyne/v2"
)

const fromIntTemplate = `
type intTo{{ .Name }} struct {
base
from Int
}
// IntTo{{ .Name }} creates a binding that connects an Int data item to a {{ .Name }}.
//
// Since: 2.5
func IntTo{{ .Name }}(val Int) {{ .Name }} {
v := &intTo{{ .Name }}{from: val}
val.AddListener(v)
return v
}
func (s *intTo{{ .Name }}) Get() ({{ .Type }}, error) {
val, err := s.from.Get()
if err != nil {
return {{ .Default }}, err
}
return {{ .FromInt }}(val)
}
func (s *intTo{{ .Name }}) Set(val {{ .Type }}) error {
i, err := {{ .ToInt }}(val)
if err != nil {
return err
}
old, err := s.from.Get()
if i == old {
return nil
}
if err != nil {
return err
}
if err = s.from.Set(i); err != nil {
return err
}
queueItem(s.DataChanged)
return nil
}
func (s *intTo{{ .Name }}) DataChanged() {
s.trigger()
}
`
const fromStringTemplate = `
type stringTo{{ .Name }} struct {
base
Expand Down Expand Up @@ -210,7 +163,6 @@ func internalIntToFloat(val int) (float64, error) {
`)

fromString := template.Must(template.New("fromString").Parse(fromStringTemplate))
fromInt := template.Must(template.New("fromInt").Parse(fromIntTemplate))
binds := []bindValues{
{Name: "Bool", Type: "bool", Default: "false", Format: "%t"},
{Name: "Bytes", Type: "[]byte", Default: "nil", Since: "2.2", Comparator: "bytes.Equal"},
Expand All @@ -221,15 +173,7 @@ func internalIntToFloat(val int) (float64, error) {
{Name: "URI", Type: "fyne.URI", Default: "fyne.URI(nil)", Since: "2.1",
FromString: "uriFromString", ToString: "uriToString", Comparator: "compareURI"},
}
for _, b := range binds {
if b.Since == "" {
b.Since = "2.0"
}

if b.FromInt != "" {
writeFile(convertFile, fromInt, b)
}
}
// add StringTo... at the bottom of the convertFile for correct ordering
for _, b := range binds {
if b.Since == "" {
Expand Down
41 changes: 41 additions & 0 deletions data/binding/generic.go
Original file line number Diff line number Diff line change
Expand Up @@ -829,3 +829,44 @@ func (s *toInt[T]) Set(v int) error {
func (s *toInt[T]) DataChanged() {
s.trigger()
}

type fromIntTo[T float64] struct {
base

formatter func(int) (T, error)
parser func(T) (int, error)
from bindableItem[int]
}

func (s *fromIntTo[T]) Get() (T, error) {
val, err := s.from.Get()
if err != nil {
return 0.0, err
}
return s.formatter(val)
}

func (s *fromIntTo[T]) Set(val T) error {
i, err := s.parser(val)
if err != nil {
return err
}
old, err := s.from.Get()
if i == old {
return nil
}
if err != nil {
return err
}
err = s.from.Set(i)
if err != nil {
return err
}

queueItem(s.DataChanged)
return nil
}

func (s *fromIntTo[T]) DataChanged() {
s.trigger()
}

0 comments on commit f56ea95

Please sign in to comment.