From dd50b908925469bea3f6067ea6c43ec5978e554b Mon Sep 17 00:00:00 2001 From: coder-in-go Date: Wed, 11 Dec 2024 17:21:53 +0530 Subject: [PATCH 1/4] Resolved bug 1966: Cannot replace FormItem Widget --- widget/form.go | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/widget/form.go b/widget/form.go index 2aa43ed9ac..ee0c085862 100644 --- a/widget/form.go +++ b/widget/form.go @@ -256,27 +256,32 @@ func (f *Form) checkValidation(err error) { } func (f *Form) ensureRenderItems() { - done := len(f.itemGrid.Objects) / 2 - if done >= len(f.Items) { - f.itemGrid.Objects = f.itemGrid.Objects[0 : len(f.Items)*2] + existingItemCount := len(f.itemGrid.Objects) / 2 + if existingItemCount > len(f.Items) { + f.itemGrid.Objects = f.itemGrid.Objects[:len(f.Items)*2] return } - adding := len(f.Items) - done - objects := make([]fyne.CanvasObject, adding*2) - off := 0 for i, item := range f.Items { - if i < done { - continue + labelIndex := i * 2 + widgetIndex := labelIndex + 1 + + if labelIndex < len(f.itemGrid.Objects) { + f.itemGrid.Objects[labelIndex] = f.createLabel(item.Text) + } else { + f.itemGrid.Objects = append(f.itemGrid.Objects, f.createLabel(item.Text)) } - objects[off] = f.createLabel(item.Text) - off++ - f.setUpValidation(item.Widget, i) - objects[off] = f.createInput(item) - off++ + if widgetIndex < len(f.itemGrid.Objects) { + f.setUpValidation(item.Widget, i) + f.itemGrid.Objects[widgetIndex] = item.Widget + } else { + f.setUpValidation(item.Widget, i) + f.itemGrid.Objects = append(f.itemGrid.Objects, item.Widget) + } } - f.itemGrid.Objects = append(f.itemGrid.Objects, objects...) + + f.itemGrid.Refresh() } func (f *Form) isVertical() bool { From f024435ee3a71386772e3e9677dbf9861224f49f Mon Sep 17 00:00:00 2001 From: coder-in-go Date: Fri, 13 Dec 2024 15:58:09 +0530 Subject: [PATCH 2/4] Optimized the fix for the issue: 1966 --- widget/form.go | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/widget/form.go b/widget/form.go index ee0c085862..27a1f916c2 100644 --- a/widget/form.go +++ b/widget/form.go @@ -256,31 +256,35 @@ func (f *Form) checkValidation(err error) { } func (f *Form) ensureRenderItems() { - existingItemCount := len(f.itemGrid.Objects) / 2 - if existingItemCount > len(f.Items) { - f.itemGrid.Objects = f.itemGrid.Objects[:len(f.Items)*2] - return + // Calculate the required capacity based on the number of items in the form + requiredCapacity := len(f.Items) * 2 + + // Pre-allocate capacity if necessary + if cap(f.itemGrid.Objects) < requiredCapacity { + newObjects := make([]fyne.CanvasObject, len(f.itemGrid.Objects), requiredCapacity) + copy(newObjects, f.itemGrid.Objects) + f.itemGrid.Objects = newObjects } + // Adjust the length to match the number of items (each with label and widget) + f.itemGrid.Objects = f.itemGrid.Objects[:requiredCapacity] + for i, item := range f.Items { labelIndex := i * 2 widgetIndex := labelIndex + 1 - if labelIndex < len(f.itemGrid.Objects) { + // Update or create label for the item + if labelIndex < len(f.itemGrid.Objects) && f.itemGrid.Objects[labelIndex] != nil { f.itemGrid.Objects[labelIndex] = f.createLabel(item.Text) } else { - f.itemGrid.Objects = append(f.itemGrid.Objects, f.createLabel(item.Text)) + f.itemGrid.Objects[labelIndex] = f.createLabel(item.Text) } - if widgetIndex < len(f.itemGrid.Objects) { - f.setUpValidation(item.Widget, i) - f.itemGrid.Objects[widgetIndex] = item.Widget - } else { - f.setUpValidation(item.Widget, i) - f.itemGrid.Objects = append(f.itemGrid.Objects, item.Widget) - } + f.setUpValidation(item.Widget, i) + f.itemGrid.Objects[widgetIndex] = item.Widget } + // Refresh the grid to apply changes f.itemGrid.Refresh() } From 30fc273e3a5c6bca31c79030d40d950f2d944ee4 Mon Sep 17 00:00:00 2001 From: coder-in-go Date: Fri, 13 Dec 2024 16:12:27 +0530 Subject: [PATCH 3/4] Added test for the bug fix: 1966 --- widget/form_test.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/widget/form_test.go b/widget/form_test.go index c79742ba6c..99ccfdc9c7 100644 --- a/widget/form_test.go +++ b/widget/form_test.go @@ -436,3 +436,28 @@ func TestForm_RefreshFromStructInit(t *testing.T) { }) } + +func TestEnsureRenderItemsCapacity(t *testing.T) { + form := &Form{ + Items: []*FormItem{ + {Text: "Label1", Widget: NewEntry()}, + {Text: "Label2", Widget: NewCheck("Check", nil)}, + }, + itemGrid: &fyne.Container{ + Objects: []fyne.CanvasObject{}, + }, + } + + // Call ensureRenderItems + form.ensureRenderItems() + + // Check that the capacity is sufficient + if cap(form.itemGrid.Objects) < len(form.Items)*2 { + t.Errorf("Expected capacity >= %d, got %d", len(form.Items)*2, cap(form.itemGrid.Objects)) + } + + // Check that objects are updated correctly + if len(form.itemGrid.Objects) != len(form.Items)*2 { + t.Errorf("Expected %d objects, got %d", len(form.Items)*2, len(form.itemGrid.Objects)) + } +} From 77640b010659b4305401370dc7b9b52b93ab67b2 Mon Sep 17 00:00:00 2001 From: coder-in-go Date: Mon, 16 Dec 2024 11:09:22 +0530 Subject: [PATCH 4/4] Resolved the comment for the bug fix --- widget/form.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widget/form.go b/widget/form.go index 27a1f916c2..8b9d73e5be 100644 --- a/widget/form.go +++ b/widget/form.go @@ -281,7 +281,7 @@ func (f *Form) ensureRenderItems() { } f.setUpValidation(item.Widget, i) - f.itemGrid.Objects[widgetIndex] = item.Widget + f.itemGrid.Objects[widgetIndex] = f.createInput(item) } // Refresh the grid to apply changes