diff --git a/layout/formlayout.go b/layout/formlayout.go index 7695dcf7b6..46c75b2c0d 100644 --- a/layout/formlayout.go +++ b/layout/formlayout.go @@ -2,6 +2,7 @@ package layout import ( "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/theme" ) @@ -53,6 +54,9 @@ func (f *formLayout) tableCellsSize(objects []fyne.CanvasObject, containerWidth } labelCell := currentRow[0].MinSize() + if _, ok := currentRow[0].(*canvas.Text); ok { + labelCell.Width += theme.Padding() * 4 + } labelCellMaxWidth = fyne.Max(labelCellMaxWidth, labelCell.Width) contentCell := currentRow[1].MinSize() @@ -92,8 +96,13 @@ func (f *formLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { } tableRow := table[row] - objects[i].Move(fyne.NewPos(0, y)) - objects[i].Resize(fyne.NewSize(tableRow[0].Width, tableRow[0].Height)) + if _, ok := objects[i].(*canvas.Text); ok { + objects[i].Move(fyne.NewPos(theme.Padding()*2, y+theme.Padding()*2)) + objects[i].Resize(fyne.NewSize(tableRow[0].Width-theme.Padding()*4, objects[i].MinSize().Height)) + } else { + objects[i].Move(fyne.NewPos(0, y)) + objects[i].Resize(fyne.NewSize(tableRow[0].Width, tableRow[0].Height)) + } if i+1 < len(objects) { objects[i+1].Move(fyne.NewPos(theme.Padding()+tableRow[0].Width, y)) diff --git a/widget/form.go b/widget/form.go index 489daf7ed7..5f2b96b508 100644 --- a/widget/form.go +++ b/widget/form.go @@ -108,8 +108,11 @@ func (f *Form) createInput(item *FormItem) fyne.CanvasObject { return fyne.NewContainerWithLayout(layout.NewVBoxLayout(), item.Widget, fyne.NewContainerWithoutLayout(text)) } -func (f *Form) createLabel(text string) *Label { - return NewLabelWithStyle(text, fyne.TextAlignTrailing, fyne.TextStyle{Bold: true}) +func (f *Form) createLabel(text string) *canvas.Text { + return &canvas.Text{Text: text, + Alignment: fyne.TextAlignTrailing, + TextSize: theme.TextSize(), + TextStyle: fyne.TextStyle{Bold: true}} } func (f *Form) updateButtons() { @@ -193,12 +196,18 @@ func (f *Form) updateHelperText(item *FormItem) { func (f *Form) updateLabels() { for i, item := range f.Items { - l := f.itemGrid.Objects[i*2].(*Label) - if l.Text == item.Text { - continue + l := f.itemGrid.Objects[i*2].(*canvas.Text) + l.TextSize = theme.TextSize() + if dis, ok := item.Widget.(fyne.Disableable); ok { + if dis.Disabled() { + l.Color = theme.DisabledColor() + } else { + l.Color = theme.ForegroundColor() + } } - l.SetText(item.Text) + l.Text = item.Text + l.Refresh() f.updateHelperText(item) } } @@ -221,7 +230,8 @@ func (f *Form) CreateRenderer() fyne.WidgetRenderer { f.itemGrid = fyne.NewContainerWithLayout(layout.NewFormLayout(), objects...) renderer := &simpleRenderer{content: fyne.NewContainerWithLayout(layout.NewVBoxLayout(), f.itemGrid, f.buttonBox)} - f.updateButtons() // will set correct visibility on the submit/cancel btns + f.updateButtons() + f.updateLabels() f.checkValidation(nil) // will trigger a validation check for correct intial validation status return renderer } diff --git a/widget/form_test.go b/widget/form_test.go index 9537fa4f53..b9978cfd7a 100644 --- a/widget/form_test.go +++ b/widget/form_test.go @@ -5,6 +5,7 @@ import ( "testing" "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/data/validation" "fyne.io/fyne/v2/test" "fyne.io/fyne/v2/theme" @@ -104,11 +105,11 @@ func TestForm_ChangeText(t *testing.T) { renderer := test.WidgetRenderer(form) c := renderer.Objects()[0].(*fyne.Container).Objects[0].(*fyne.Container) - assert.Equal(t, "Test", c.Objects[0].(*Label).Text) + assert.Equal(t, "Test", c.Objects[0].(*canvas.Text).Text) item.Text = "Changed" form.Refresh() - assert.Equal(t, "Changed", c.Objects[0].(*Label).Text) + assert.Equal(t, "Changed", c.Objects[0].(*canvas.Text).Text) } func TestForm_ChangeTheme(t *testing.T) { @@ -133,6 +134,23 @@ func TestForm_ChangeTheme(t *testing.T) { }) } +func TestForm_Disabled(t *testing.T) { + app := test.NewApp() + defer test.NewApp() + app.Settings().SetTheme(theme.LightTheme()) + + disabled := NewEntry() + disabled.Disable() + f := NewForm( + NewFormItem("Form Item 1", NewEntry()), + NewFormItem("Form Item 2", disabled)) + + w := test.NewWindow(f) + defer w.Close() + + test.AssertImageMatches(t, "form/disabled.png", w.Canvas().Capture()) +} + func TestForm_Hints(t *testing.T) { app := test.NewApp() defer test.NewApp() diff --git a/widget/testdata/form/disabled.png b/widget/testdata/form/disabled.png new file mode 100644 index 0000000000..b624542db5 Binary files /dev/null and b/widget/testdata/form/disabled.png differ diff --git a/widget/testdata/form/layout.xml b/widget/testdata/form/layout.xml index cbcf06d2a4..23d237557f 100644 --- a/widget/testdata/form/layout.xml +++ b/widget/testdata/form/layout.xml @@ -3,9 +3,7 @@ - - test1 - + test1 @@ -20,9 +18,7 @@ - - test2 - + test2 diff --git a/widget/testdata/form/theme_changed.png b/widget/testdata/form/theme_changed.png index f806ca71e6..91c7c2f885 100644 Binary files a/widget/testdata/form/theme_changed.png and b/widget/testdata/form/theme_changed.png differ