Uma estrutura de GUI de plataforma cruzada rápida para Go com base no Dear Imgui e no Great Go Binding IMGUI-GO.
Qualquer contribuição (recursos, widgets, tutoriais, documentos, etc ...) é apreciada!
(Esta biblioteca está disponível sob uma licença gratuita e permissiva, mas precisa de apoio financeiro para sustentar suas melhorias contínuas. Além da manutenção e da estabilidade, existem muitos recursos desejáveis ainda a serem adicionados. Se você está usando o GIU, considere alcançar.)
Empresas: Apoie o desenvolvimento e a manutenção contínuos por meio de suporte técnico, manutenção, patrocínio de contratos:
E-mail: [email protected]
Indivíduos: Apoie o desenvolvimento e a manutenção contínuos aqui.
Para documentação, consulte nosso wiki, exemplos, GODOC ou apenas dê uma olhada nos comentários no código.
O GIU é construído no GLFW v3.3, para que o GIU possa suportar todas as plataformas que o GLFW v3.3 suporta.
Comparado a outras encadernações de querido Imgui Golang, o GIU possui os seguintes recursos:
package main
import (
"fmt"
g "github.com/AllenDang/giu"
)
func onClickMe () {
fmt . Println ( "Hello world!" )
}
func onImSoCute () {
fmt . Println ( "Im sooooooo cute!!" )
}
func loop () {
g . SingleWindow (). Layout (
g . Label ( "Hello world from giu" ),
g . Row (
g . Button ( "Click Me" ). OnClick ( onClickMe ),
g . Button ( "I'm so cute" ). OnClick ( onImSoCute ),
),
)
}
func main () {
wnd := g . NewMasterWindow ( "Hello world" , 400 , 200 , g . MasterWindowFlagsNotResizable )
wnd . Run ( loop )
}
Aqui está o resultado:
Sistema de GUI de modo imediato significa que o controle da interface do usuário não mantém seu estado e valor. Por exemplo, chamando giu.InputText(&str)
exibirá uma caixa de texto de entrada na tela e o valor inserido do usuário será armazenado em &str
. A caixa de texto de entrada não sabe nada sobre isso.
E o método loop
no exemplo do Hello World é responsável por desenhar todos os widgets com base nos parâmetros passados para eles. Este método será invocado 30 vezes por segundo para refletir estados interativos (como clicados, pairados, troca de valor etc.). Será o lugar em que você definirá a estrutura da interface do usuário.
Por padrão, qualquer widget colocado dentro Layout
de um contêiner será colocado verticalmente.
Para criar uma fileira de widgets (ou seja, widgets, um por um horizontalmente), use o método Row()
. Por exemplo giu.Row(Label(...), Button(...))
criará um rótulo ao lado de um botão.
Para criar uma coluna de widgets (ou seja, os widgets de local um por um verticalmente) dentro de uma linha, use o método Column()
.
Qualquer widget que possua um método Size()
pode definir seu tamanho explicitamente. Observe que você pode passar um valor negativo para Size()
, que preencherá o valor restante da largura/altura. Por exemplo, InputText(...).Size(giu.Auto)
criará uma caixa de texto de entrada com a largura mais longa que seu contêiner deixou.
Um MasterWindow
significa a janela nativa da plataforma implementada pelo sistema operacional. Todas as subtidentes e widgets serão colocados dentro dele.
Uma Window
é um contêiner com uma barra de título e pode ser desmoronado. SingleWindow
é um tipo especial de janela que ocupará todo o espaço disponível do MasterWindow
.
Uma Child
é como um painel em outras estruturas da GUI - ela pode ter uma cor e borda de fundo.
Verifique examples/widgets
para todos os tipos de widgets.
O back -end do GIU depende do OpenGL 3.3, verifique se o seu ambiente o suporta (até onde eu sei, algumas máquinas virtuais como o VirtualBox não o suportam).
xcode-select --install
go get github.com/AllenDang/giu
Primeiro você precisa instalar as dependências necessárias:
sudo apt install libx11-dev libxcursor-dev libxrandr-dev libxinerama-dev libxi-dev libglx-dev libgl1-mesa-dev libxxf86vm-dev
Em distribuições baseadas em Red Hat:
sudo dnf install libX11-devel libXcursor-devel libXrandr-devel libXinerama-devel libXi-devel libGL-devel libXxf86vm-devel
Você também pode precisar instalar o compilador C/C ++ (como G ++) se ele ainda não estiver instalado. Siga os avisos do Go Compiler.
Então, uma simples go build
vai funcionará.
A compilação cruzada é um pouco mais complicada. Digamos que você deseja construir para o ARM64. É isso que você precisaria fazer:
sudo dpkg --add-architecture arm64
sudo apt update
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
libx11-dev:arm64 libxcursor-dev:arm64 libxrandr-dev:arm64 libxinerama-dev:arm64 libxi-dev:arm64 libglx-dev:arm64 libgl1-mesa-dev:arm64 libxxf86vm-dev:arm64
GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ HOST=aarch64-linux-gnu go build -v
go build -ldflags " -s -w " .
go build -ldflags " -s -w -H=windowsgui -extldflags=-static " .
no Mac:
brew install mingw-w64
no Linux:
sudo dnf install mingw64-gcc mingw64-gcc-c++ mingw64-winpthreads-static
cat > YourExeName.rc << EOL
id ICON "./res/app_win.ico"
GLFW_ICON ICON "./res/app_win.ico"
EOL
x86_64-w64-mingw32-windres YourExeName.rc -O coff -o YourExeName.syso
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ HOST=x86_64-w64-mingw32 go build -ldflags " -s -w -H=windowsgui -extldflags=-static " -p 4 -v -o YourExeName.exe
rm YourExeName.syso
rm YourExeName.rc
Todos os tipos de solicitações de tração (documento, demonstração, capturas de tela, código etc.) são mais do que bem -vindas!