Added various widgets

This commit is contained in:
Maarten Heremans
2024-04-11 14:52:32 +02:00
parent 9b3d5df603
commit 8befd14d13
8 changed files with 330 additions and 9 deletions

View File

@ -55,15 +55,17 @@ type Element struct {
Disabled bool `yaml:"disabled"`
Hidden bool `yaml:"hidden"`
// Properties shared by most widgets
Placeholder string `yaml:"placeholder"`
PlaceholderLocalized bool `yaml:"placeholderLocalized"`
// Calendar Properties
Time *string `yaml:"time"`
TimeFormat *string `yaml:"timeFormat"`
// Entry Properties
MultiLine bool `yaml:"multiLine"`
Placeholder string `yaml:"placeholder"`
PlaceholderLocalized bool `yaml:"placeholderLocalized"`
Validator string `yaml:"validator"`
MultiLine bool `yaml:"multiLine"`
Validator string `yaml:"validator"`
// List Properties
ItemTemplate string `yaml:"itemTemplate"`
@ -73,6 +75,10 @@ type Element struct {
// Check Properties
Checked bool `yaml:"checked"`
// Select Properties
SelectOptionsBinding string `yaml:"selectOptionsBinding"`
SelectOptions []string `yaml:"selectOptions"`
// Spacer Properties
FixHorizontal bool `yaml:"fixHorizontal"`
FixVertical bool `yaml:"fixVertical"`
@ -85,6 +91,7 @@ type Element struct {
OnSelected string `yaml:"onSelected"`
OnUnselected string `yaml:"onUnselected"`
OnDateSelected string `yaml:"onDateSelected"`
OnOptionSelected string `yaml:"onOptionSelected"`
OnValidationChanged string `yaml:"onValidationChanged"`
}

View File

@ -219,6 +219,7 @@ func (l Layout) buildFormLayout(
children = append(children, label, field)
}
c = container.New(layout.NewFormLayout(), children...)
return
}

View File

@ -24,6 +24,7 @@ type ListItemHandlerFn func(widget.ListItemID)
type ClickHandlerFn func()
type CheckHandlerFn func(bool)
type DateSelectedHandlerFn func(time.Time)
type OptionSelectedHandlerFn func(string)
type ValidationChangedHandlerFn func(error)
type UIElement struct {
@ -48,6 +49,7 @@ type ScreenHandler interface {
GetOnClickedHandler(string) ClickHandlerFn
GetOnCheckChangedHandler(string) CheckHandlerFn
GetOnDateSelectedHandler(string) DateSelectedHandlerFn
GetOnOptionSelectedHandler(string) OptionSelectedHandlerFn
GetOnValidationChangedHandler(string) ValidationChangedHandlerFn
}
@ -195,6 +197,10 @@ func (*TemplateScreenHandler) GetOnDateSelectedHandler(string) DateSelectedHandl
return func(time.Time) {}
}
func (*TemplateScreenHandler) GetOnOptionSelectedHandler(string) OptionSelectedHandlerFn {
return func(string) {}
}
func (*TemplateScreenHandler) GetOnValidationChangedHandler(string) ValidationChangedHandlerFn {
return func(error) {}
}

View File

@ -55,6 +55,8 @@ const (
// - onChanged: The function to call when the checkbox is changed
Check Widget = "Check"
DateEntry Widget = "DateEntry"
// Entry Widget
//
// Available yaml options:
@ -165,6 +167,12 @@ const (
// - onUnselect: The on unselect function for the list
List Widget = "List"
// Select Widget
Select Widget = "Select"
// SelectEntry Widget
SelectEntry Widget = "SelectEntry"
// Separator Widget
Separator Widget = "Separator"
@ -207,6 +215,8 @@ func (w Widget) Build(
widget, err = w.buildCalendarWidget(e, s)
case Check:
widget, err = w.buildCheckWidget(e, s)
case DateEntry:
widget, err = w.buildDateEntryWidget(e, s)
case Entry:
widget, err = w.buildEntryWidget(e, s)
case H1, H2, H3, H4, H5, H6:
@ -217,6 +227,10 @@ func (w Widget) Build(
widget, err = w.buildLabelWidget(e, s)
case List:
widget, err = w.buildListWidget(e, s)
case Select:
widget, err = w.buildSelectWidget(e, s)
case SelectEntry:
widget, err = w.buildSelectEntryWidget(e, s)
case Separator:
widget, err = w.buildSeparatorWidget(e, s)
case Spacer:
@ -317,6 +331,23 @@ func (w Widget) buildCheckWidget(
return
}
func (w Widget) buildDateEntryWidget(
e *Element,
s ScreenHandler,
) (c fyne.CanvasObject, err error) {
ent := uiwidget.NewDateEntry()
if e.OnDateSelected != "" {
ent.OnDateChanged = s.GetOnDateSelectedHandler(e.OnDateSelected)
}
if e.Disabled {
ent.Disable()
}
c = ent
return
}
func (w Widget) buildEntryWidget(
e *Element,
s ScreenHandler,
@ -452,6 +483,82 @@ func (w Widget) buildListWidget(
return
}
func (w Widget) buildSelectWidget(
e *Element,
s ScreenHandler,
) (c fyne.CanvasObject, err error) {
var slc *widget.Select
var options []string
if e.Binding != "" {
if lst, ok := s.GetBinding(e.SelectOptionsBinding).(binding.StringList); ok {
options, _ = lst.Get()
}
} else {
options = e.SelectOptions
}
slc = widget.NewSelect(options,
s.GetOnOptionSelectedHandler(e.OnOptionSelected))
slc.PlaceHolder = e.Placeholder
for opt, val := range e.Options {
switch opt {
case "alignment":
slc.Alignment = getTextAlignment(val)
}
}
if e.Disabled {
slc.Disable()
}
c = slc
return
}
func (w Widget) buildSelectEntryWidget(
e *Element,
s ScreenHandler,
) (c fyne.CanvasObject, err error) {
var slc *widget.SelectEntry
var options []string
if e.SelectOptionsBinding != "" {
if lst, ok := s.GetBinding(e.SelectOptionsBinding).(binding.StringList); ok {
options, _ = lst.Get()
lst.AddListener(binding.NewDataListener(func() {
options, _ = lst.Get()
if slc != nil {
slc.SetOptions(options)
}
}))
}
} else {
options = e.SelectOptions
}
slc = widget.NewSelectEntry(options)
if e.Binding != "" {
slc.Bind(s.GetBinding(e.Binding).(binding.String))
} else {
slc.Text = e.Text
}
slc.PlaceHolder = e.Placeholder
if e.Validator != "" {
slc.Validator = s.GetValidator(e.Validator)
}
if e.OnValidationChanged != "" {
slc.SetOnValidationChanged(s.GetOnValidationChangedHandler(e.OnValidationChanged))
}
if e.Disabled {
slc.Disable()
}
c = slc
return
}
func (w Widget) buildSeparatorWidget(
_ *Element,
_ ScreenHandler,
@ -477,7 +584,12 @@ func (w Widget) buildUpDownLabelWidget(
e *Element,
s ScreenHandler,
) (c fyne.CanvasObject, err error) {
var minSize *fyne.Size
if e.MinSize != nil {
minSize = &fyne.Size{Width: e.MinSize.Width, Height: e.MinSize.Height}
}
btn := uiwidget.NewUpDownLabelWithData(
minSize,
s.GetBinding(e.Binding).(binding.String),
s.GetOnClickedHandler(e.OnUpClicked),
s.GetOnClickedHandler(e.OnDownClicked))