From a6357cd717df78009e4dbcbff6307388df7163d8 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Thu, 22 Jul 2021 20:36:25 +0100 Subject: [PATCH] Disable form labels for disabled widgets In 2.1 we could return to using Label as RichText would allow colours. But for now using Text works :). Fixes #1530 --- layout/formlayout.go | 13 +++++++++++-- widget/form.go | 24 +++++++++++++++++------- widget/form_test.go | 22 ++++++++++++++++++++-- widget/testdata/form/disabled.png | Bin 0 -> 2935 bytes widget/testdata/form/layout.xml | 8 ++------ widget/testdata/form/theme_changed.png | Bin 6690 -> 6686 bytes 6 files changed, 50 insertions(+), 17 deletions(-) create mode 100644 widget/testdata/form/disabled.png 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 0000000000000000000000000000000000000000..b624542db56552e3cad6527483ab442bb8f8389d GIT binary patch literal 2935 zcmai$c{tSH9>-;=2}z}r>=ZJVO7T=B^Ho= zd}ZowsPjv)$)-Ff_XRIUk`TR87idXTv6PZG zfwMfj9Z`E3a#pa75@}&|RApC}h2spgFzJ4?IlyKkHJWSUX0YpWBfzVOpqc1B1QQGcYh<*F^*d?nP)yNJyw-*Kvu$qbobw#Tzp% zA>cvn-*a)fxw#ItY8fHwSe>KooOf<>s`AGIF2-BddF8$Y+d|)S?6`^w9|Xdvesz+x zIQK3NBv!Q8*47r-w)V!kEv#en!&MLtgTct!)wciY<`NPTvbMHHAMIS8+4^{UxcNb? zEBff7d~w9L2IS`s)fMobMx*s+2*siA6b=pR93SHJ5+#ixAYY{dV%OhO0Zl&YHh9=O zw;;xkA#<%An7O&R%V+Yp?<&b7`n#n z7QDET4;bD95LcM42 z?%MR;)}Vql-yIE&X)3kJvp2)eHO8j;^OmNLqT+LUWl71mRE5r;8ygC8azoX%wror? z4XwaRFEz{zptbG*KI(#Yc6YT8R!O4AZ{NP1o14oJ(suYOddvMh5D)W#rtcUxH$yihgm;vdGO-?cgWQn5j35kj5znO~@6ShC4%FD~OkG99~ zc>Dv`OR3k0j*eR2D+0W|z3<)QdNBkiiGs3>*u}=DrZ_)L2X+Y|)flzF8*7rR^+EMu zF4G~eTd^F%e#(XOw@74~s!8I^w&F&0lF1eQYOpZ|V<pf>RQ~<$y8W4u;fvDk$Kr#*uCB8!A&Ya>5L46iv85U!F|iW` zXgRXuF_5B8O#w8rA62S2dUR|I2poW)4wpb_zWv?lK(4F9gl?-Ys5StVjgGyd9*@{- zfe#<9of3&=xn0UCp5lQPgWP=I{$agS?x_KI_huAlwdLK-@TTBknoxRBbTnn7|TEaAh>?Kfv1;+0^{J<4U}T z?tdpU0PXy%N9WZ5)6gjN#aC4!5eR8Bn4Nn>guP7Oix>W1>P~#x8ECja))Qk$nXemO zOzmB00I#50KYTDS!Zz-=j6~)a7Z)F(F={Wfgwz zjP&$Jf>OrW;K30D3WZV<&b<8D7uUBz1licwnDC^0yaa^fd@{SfrQbx2Wt9uYJ7d8f z^LYuC3>6nhFBpOslrL;H88~83l!5QkC74!|^id8?p<@ zlEwi|8iG8snEn0zA3xx#iaP4*RiBZ5etyS?4DqG0>8AG!n*e;@ zdIO5gPWj;&B&edSe0}g%gf55{GOTqnPM0@+WW-Xn>}-FiAkQh(YxLnJ;BY08c$S^D zt}xAeG9e)$Ir((67e9RAL%PG#1nkDeG**iQc}dx4!&TS1&dFlU7-%-;WV=hCsvw-d z9FO;eUK{d{8Z|du_ zN-AMDLg%}mEiW$vQAltfT|$ZSHfM|h3?RPBPV&voah*OR$4YNoZyf}P@?5#_Oz?}O zlAn7AaqmQ7S{BaEgvK7I_z8|g3Jy?*x{xGqIg4GdOhn)+BF_Aj#KrWcazQ z_-yR#P8k#}de-y5r!@FGJJWhnFI(eb;7f5-kX5Q~6*wSkYb!X(lsEpa=qsiD2T)5? z8?8hdD7H@CwzEY#|&}6CLhaBHb=qGH>u=X74{06!~x`r?}Oi^d=)b$2-47+8*)QWsG1-+Erzuz zxU~OiBq?c}(!0Q?PXJ!w?)*_EpbdNGgU;xd#>Pe*?gYlAL^>latrAwXzaN>?4|8(5 z3SyrLXzKBB=TBH<0#^2YxZveW_O2`=sDsl#GkvNNAJp}r-X1B%)=&P73{?_H?_B_@ z#R`?!wfr}Ce$)scYKlY?zw}VouMU6Nr0}(<7g8SLK=dX`bI`ZPHpUk2v&H_ zcB;L&sev_9@UnO{Thq+9DtPWbu~uh9?xe*MP!*~VOv|hqz$9>6L(I~^dNTM+29-{| z=ys`}OoVAxr#Qj)4VzE@AO4jb&iW3XRKp&b$9hRn{)K-`bKnnseEitBsVOc`stA~{ N80(usYawn={{cXT+JFE6 literal 0 HcmV?d00001 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 f806ca71e6cc9059931fc05eafbb88e0b68c26a9..91c7c2f885c577707ae955f19816383551c47acd 100644 GIT binary patch delta 6073 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 BaGwAG