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