Как сделать развернутый и растянутый макет коробки с Fyne - PullRequest
0 голосов
/ 06 марта 2020

Мне нужен расширенный и растянутый блок для макетов виджетов, чтобы мое приложение выглядело так: enter image description here

Т.е. верхний и средний прямоугольники оба длинны в обоих направлениях.

Я пытался использовать этот код с Box (поскольку в документации не нашел "свободного" макета):

package main

import (
    "fyne.io/fyne"
    "fyne.io/fyne/app"
    "fyne.io/fyne/layout"
    "fyne.io/fyne/widget"
)

func main() {
    f := app.New()
    w := f.NewWindow("")
    label1 := widget.NewLabel("Label1")

    b1 := widget.NewButton("Button1", func() {})
    b2 := widget.NewButton("Button2", func() {})
    label2 := widget.NewLabel("Label3")

    w.SetContent(
        fyne.NewContainerWithLayout(
            layout.NewVBoxLayout(),
            fyne.NewContainerWithLayout(layout.NewVBoxLayout(), label1),
            fyne.NewContainerWithLayout(layout.NewHBoxLayout(), layout.NewSpacer(), b1, b2, layout.NewSpacer()),
            label2),
    )

    w.ShowAndRun()
}

Но это определенно не то же самое:

enter image description here

Поддерживает ли fyne такой макет и как это сделать правильно?

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Если вы хотите, чтобы центральный контент расширялся, я бы рекомендовал использовать BorderLayout, виджет Box предназначен для упаковки элементов, а не их растягивания. VBox увеличит ширину и использует minSize элементов для их высоты (чтобы создать четный список), а HBox увеличит высоту, сохраняя элементы на их минимальной ширине (например, панель кнопок).

Для упаковки всего приложения Пользовательский интерфейс, более вероятно, что вы хотите использовать контейнер напрямую, например fyne.NewContainerWithLayout(layout.NewBorderLayout(...), ...). Вам может пригодиться раздел макета Fyne Tour , в частности BorderLayout .

1 голос
/ 06 марта 2020

enter image description here

Понравилось? Или опишите более подробно.

package main

import (
    "fyne.io/fyne"
    "fyne.io/fyne/app"
    "fyne.io/fyne/layout"
    "fyne.io/fyne/widget"
)

func main() {
    f := app.New()
    w := f.NewWindow("")
    label1 := widget.NewLabel("Label1")

    b1 := widget.NewButton("Button1", func() {})
    b2 := widget.NewButton("Button2", func() {})
    label2 := widget.NewLabel("Label3")

    w.SetContent(
        fyne.NewContainerWithLayout(
            layout.NewVBoxLayout(),
            fyne.NewContainerWithLayout(layout.NewHBoxLayout(), layout.NewSpacer(), label1, layout.NewSpacer()),
            layout.NewSpacer(),
            fyne.NewContainerWithLayout(layout.NewHBoxLayout(), layout.NewSpacer(), b1, b2, layout.NewSpacer()),
            layout.NewSpacer(),
            fyne.NewContainerWithLayout(layout.NewHBoxLayout(), layout.NewSpacer(), label2, layout.NewSpacer()),
        ),
    )

    w.Resize(fyne.Size{Height: 320, Width: 480})

    w.ShowAndRun()
}


РЕДАКТИРОВАТЬ: попытался NewBorderLayout, но не уверен, что это то, что вы хотите.

Не забудьте сказать мне правильный путь, когда вы возьми. Удачи!

package main

import (
    "fmt"

    "fyne.io/fyne"
    "fyne.io/fyne/app"
    "fyne.io/fyne/layout"
    "fyne.io/fyne/widget"
)

func main() {
    f := app.New()
    w := f.NewWindow("")
    label1 := widget.NewLabel("Label1")

    b1 := widget.NewButton("Button1", func() { fmt.Println("button1") })
    b1.ExtendBaseWidget(b1)

    b2 := widget.NewButton("Button2", func() { fmt.Println("button2") })
    b2.ExtendBaseWidget(b2)

    label2 := widget.NewLabel("Label3")

    labox1 := fyne.NewContainerWithLayout(layout.NewGridLayoutWithRows(3),
        fyne.NewContainerWithLayout(
            layout.NewCenterLayout(),
            label1,
        ))

    labox2 := fyne.NewContainerWithLayout(layout.NewCenterLayout(), label2)

    w.SetContent(
        fyne.NewContainerWithLayout(
            layout.NewBorderLayout(
                labox1,
                labox2,
                nil,
                nil,
            ),
            labox1,
            labox2,
            fyne.NewContainerWithLayout(
                layout.NewAdaptiveGridLayout(2),
                b1,
                b2,
            ),
        ),
    )

    w.Resize(fyne.Size{Height: 320, Width: 480})

    w.ShowAndRun()
}

enter image description here

...