From 1adeb8a6cdffd459fbd930625c6474cf54897a84 Mon Sep 17 00:00:00 2001 From: lucor Date: Mon, 7 Nov 2022 21:14:56 +0100 Subject: [PATCH] dialog/form: update to handle HintText and validation errors Fixes #2781 --- dialog/form.go | 16 ++----- dialog/form_test.go | 62 ++++++++++++++++++++++++++ dialog/testdata/form/hint_initial.png | Bin 0 -> 9253 bytes dialog/testdata/form/hint_invalid.png | Bin 0 -> 10634 bytes dialog/testdata/form/hint_valid.png | Bin 0 -> 10207 bytes 5 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 dialog/testdata/form/hint_initial.png create mode 100644 dialog/testdata/form/hint_invalid.png create mode 100644 dialog/testdata/form/hint_valid.png diff --git a/dialog/form.go b/dialog/form.go index 67cea6ceef..306fd588d9 100644 --- a/dialog/form.go +++ b/dialog/form.go @@ -46,14 +46,9 @@ func (d *formDialog) validateItems(err error) { // // Since: 2.0 func NewForm(title, confirm, dismiss string, items []*widget.FormItem, callback func(bool), parent fyne.Window) Dialog { - var itemObjects = make([]fyne.CanvasObject, len(items)*2) - for i, item := range items { - itemObjects[i*2] = widget.NewLabel(item.Text) - itemObjects[i*2+1] = item.Widget - } - content := container.New(layout.NewFormLayout(), itemObjects...) + form := widget.NewForm(items...) - d := &dialog{content: content, callback: callback, title: title, parent: parent} + d := &dialog{content: form, callback: callback, title: title, parent: parent} d.layout = &dialogLayout{d: d} d.dismiss = &widget.Button{Text: dismiss, Icon: theme.CancelIcon(), OnTapped: d.Hide, @@ -70,11 +65,8 @@ func NewForm(title, confirm, dismiss string, items []*widget.FormItem, callback formDialog.validateItems(nil) - for _, item := range items { - if validatable, ok := item.Widget.(fyne.Validatable); ok { - validatable.SetOnValidationChanged(formDialog.validateItems) - } - } + form.SetOnValidationChanged(formDialog.validateItems) + d.create(container.NewHBox(layout.NewSpacer(), d.dismiss, confirmBtn, layout.NewSpacer())) return formDialog } diff --git a/dialog/form_test.go b/dialog/form_test.go index b913f46f2c..8a46383ce5 100644 --- a/dialog/form_test.go +++ b/dialog/form_test.go @@ -6,8 +6,10 @@ import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/test" + "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) // formDialogResult is the result of the test form dialog callback. @@ -81,6 +83,42 @@ func TestFormDialog_CanCancelNoValidation(t *testing.T) { assert.Equal(t, formDialogCancel, result, "Expected cancel result") } +func TestFormDialog_Hints(t *testing.T) { + + test.NewApp() + defer test.NewApp() + test.ApplyTheme(t, theme.LightTheme()) + w := test.NewWindow(nil) + w.SetFullScreen(true) + + var result formDialogResult + fd := hintsFormDialog(&result, w) + w.Resize(fd.MinSize()) + fd.Show() + assert.False(t, fd.win.Hidden) + + assert.True(t, fd.confirm.Disabled(), "Confirm button should be disabled due to validation state") + + test.AssertImageMatches(t, "form/hint_initial.png", w.Canvas().Capture()) + + validatingEntry, ok := fd.items[0].Widget.(*widget.Entry) + require.True(t, ok, "First item's widget should be an Entry (check hintsFormDialog)") + + validatingEntry.SetText("n") + test.AssertImageMatches(t, "form/hint_invalid.png", w.Canvas().Capture()) + assert.True(t, fd.confirm.Disabled()) + + validatingEntry.SetText("abc") + test.AssertImageMatches(t, "form/hint_valid.png", w.Canvas().Capture()) + assert.False(t, fd.confirm.Disabled()) + + test.Tap(fd.confirm) + assert.Equal(t, formDialogConfirm, result, "Valid form should be able to be confirmed") + + test.Tap(fd.dismiss) + assert.Equal(t, formDialogCancel, result, "Expected cancel result") +} + func validatingFormDialog(result *formDialogResult, parent fyne.Window) *formDialog { validatingEntry := widget.NewEntry() validatingEntry.Validator = func(input string) error { @@ -129,3 +167,27 @@ func controlFormDialog(result *formDialogResult, parent fyne.Window) *formDialog } }, parent).(*formDialog) } + +func hintsFormDialog(result *formDialogResult, parent fyne.Window) *formDialog { + validatingEntry := widget.NewEntry() + validatingEntry.Validator = func(input string) error { + if input != "abc" { + return errors.New("only accepts 'abc'") + } + return nil + } + validatingItem := &widget.FormItem{ + Text: "Only accepts 'abc'", + Widget: validatingEntry, + HintText: "Type abc", + } + + items := []*widget.FormItem{validatingItem} + return NewForm("Validating Form Dialog With Hints", "Submit", "Cancel", items, func(confirm bool) { + if confirm { + *result = formDialogConfirm + } else { + *result = formDialogCancel + } + }, parent).(*formDialog) +} diff --git a/dialog/testdata/form/hint_initial.png b/dialog/testdata/form/hint_initial.png new file mode 100644 index 0000000000000000000000000000000000000000..7c8f9438ee594b6cd40cec8386b1ecff8db59aed GIT binary patch literal 9253 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 literal 0 HcmV?d00001 diff --git a/dialog/testdata/form/hint_valid.png b/dialog/testdata/form/hint_valid.png new file mode 100644 index 0000000000000000000000000000000000000000..e97dc33aacbbc2e20328867a56748e0cdac72811 GIT binary patch literal 10207 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