go - Cómo agregar dinámicamente una columna al contenedor.NewGridWithColumns()

CorePress2024-01-25  12

¿Cómo puedo agregar una columna adicional a un contenedor.NewGridWithColumns en Go/Fyne?

Tengo varios elementos (contenedores) representados en un ColumnGrid. Luego, a través de un cuadro de diálogo, quiero agregar un elemento. El problema es que no puedo encontrar una manera de extender el ColumnGrid original.

Mi código:

func main() {

    a := app.New()
    w = a.NewWindow("myApp")

    window = container.NewBorder(toolbar(), footer(), nil, nil, content())

    w.SetContent(window)
    w.ShowAndRun()
}


func content() *fyne.Container {

    top := topRow()
    bottom := bottomRow()

    return container.NewGridWithRows(2, top, bottom)
}

var items []*fyne.Container

func bottomRow() *fyne.Container {

    items = nil

    db := sql.NewDB()
    list, err := db.List()
    if err != nil {
        //handle error
    }

    for _, l := range list {
        items = append(items, renderChart(l))
    }

    ct = container.NewGridWithColumns(len(items))

    for _, item := range items {
        ct.Add(item)
    }

    return ct
}

func dlgAdd() {

    entry := widget.NewEntry()
    entry.PlaceHolder = "name"
    e := container.NewGridWithRows(2, entry)

    d := dialog.NewCustomConfirm(
        "Add Item",
        "Add",
        "Cancel",
        e,
        func(v bool) {

            if !v {
                //Cancelled
                return
            }
            if entry.Text == "" {
                //without input 
                return
            }
            //write entry.Text to db
            db := sql.NewDB()
            err := db.AddItem(entry.Text)
            if err != nil {
                return
            }
            //report succes
            i := dialog.NewInformation("Succes", fmt.Sprintf("Item %s added", entry.Text), w)
            i.Show()
            i.SetOnClosed(func() {

Aquí está el problema, cómo agregar una columna adicional al contenedor ct y luego agregue el elemento del cuadro de diálogo a la nueva columna Esto no funcionará

                ct = container.NewGridWithColumns(len(ct.Objects) + 1)
                items = append(items, renderChart(entry.Text))

                for _, item := range items {
                    ct.Add(item)
                }

Esto tampoco funcionará

        bottomRow()

            w.Canvas().Refresh(window)
        })
    }, w)
d.Show()

I am really stuck here.


------------------------------------

Encontré la solución:

ct.Add(newObject)
ct.Layout = (container.NewGridWithColumns(len(ct.Objects))).Layout
ct.Refresh()

1

¡Gracias! Me ayudó. Pero yo uso: ct.Layout = layout.NewGridLayoutWithColumns(len(ct.Objects))

- vinser

18 de octubre de 2022 a las 5:04



------------------------------------

Sí, Container.Add es la solución, solo necesitaba guardar una referencia al contenedor en lugar de crear una nueva. Dependiendo del diseño, puede que no siempre sea necesariopara cambiarlo, por ejemplo GridWithRows(...) seguirá agregando columnas si aumenta el número de elementos (porque el recuento de filas es fijo).

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare