Un cadre d'interface graphique multiplateforme rapide pour GO basé sur Dear Imgui et le Great Go Binding Imgui-Go.
Toute contribution (fonctionnalités, widgets, tutoriels, documents, etc ...) est appréciée!
(Cette bibliothèque est disponible sous une licence gratuite et permissive, mais a besoin d'un soutien financier pour maintenir ses améliorations continues. En plus de la maintenance et de la stabilité, il reste de nombreuses fonctionnalités souhaitables. Si vous utilisez GIU, veuillez envisager de tendre la main.)
Entreprises: Soutenir le développement et la maintenance continus via un support technique facturé, une maintenance, un parrainage des contrats:
Courriel: [email protected]
Individus: Soutenez le développement et la maintenance continus ici.
Pour la documentation, reportez-vous à notre wiki, Exemples, Godoc ou jetez un coup d'œil aux commentaires dans le code.
GIU est construit sur GLFW v3.3, donc idéalement GIU pourrait prendre en charge toutes les plates-formes que GLFW V3.3 supporte.
Par rapport aux autres liaisons de chère Imgui Golang, GIU a les caractéristiques suivantes:
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 )
}
Voici le résultat:
Le système GUI de mode immédiat signifie que le contrôle de l'interface utilisateur ne conserve pas son état et sa valeur. Par exemple, l'appel giu.InputText(&str)
affichera une zone de texte d'entrée à l'écran, et la valeur entrée par l'utilisateur sera stockée dans &str
. La zone de texte d'entrée n'en sait rien.
Et la méthode loop
dans l'exemple Hello World est chargée de dessiner tous les widgets en fonction des paramètres qui y sont transmis. Cette méthode sera invoquée 30 fois par seconde pour refléter les états interactifs (comme cliqué, planant, modifié de valeur, etc.). Ce sera l'endroit où vous définissez la structure de l'interface utilisateur.
Par défaut, tout widget placé dans Layout
d'un conteneur sera placé verticalement.
Pour créer une ligne de widgets (c'est-à-dire les widgets de place un par un horizontalement), utilisez la méthode Row()
. Par exemple, giu.Row(Label(...), Button(...))
créera une étiquette à côté d'un bouton.
Pour créer une colonne de widgets (c'est-à-dire les widgets de place un par un verticalement) à l'intérieur d'une ligne, utilisez la méthode Column()
.
Tout widget qui a une méthode Size()
peut régler explicitement sa taille. Notez que vous pouvez transmettre une valeur négative à Size()
, qui remplira la valeur de largeur / hauteur restante. Par exemple, InputText(...).Size(giu.Auto)
créera une zone de texte d'entrée avec la largeur la plus longue que son conteneur a laissé.
Un MasterWindow
signifie la fenêtre native de la plate-forme implémentée par le système d'exploitation. Tous les sous-fenêtres et widgets seront placés à l'intérieur.
Une Window
est un conteneur avec une barre de titre et peut être effondré. SingleWindow
est un type spécial de fenêtre qui occupera tout l'espace disponible de MasterWindow
.
Un Child
est comme un panneau dans d'autres cadres de l'interface graphique - il peut avoir une couleur de fond et une bordure.
Vérifiez examples/widgets
pour toutes sortes de widgets.
Le backend de GIU dépend de OpenGL 3.3, assurez-vous que votre environnement le prend en charge (pour autant que je sache, certaines machines virtuelles comme VirtualBox ne le prennent pas en charge).
xcode-select --install
go get github.com/AllenDang/giu
Vous devez d'abord installer les dépendances requises:
sudo apt install libx11-dev libxcursor-dev libxrandr-dev libxinerama-dev libxi-dev libglx-dev libgl1-mesa-dev libxxf86vm-dev
Sur les distributions basées sur un chapeau rouge:
sudo dnf install libX11-devel libXcursor-devel libXrandr-devel libXinerama-devel libXi-devel libGL-devel libXxf86vm-devel
Vous devrez peut-être également installer le compilateur C / C ++ (comme G ++) s'il n'est pas déjà installé. Suivez les invites de compilateur.
Ensuite, une simple go build
fonctionnera.
La compilation croisée est un peu plus compliquée. Disons que vous voulez construire pour ARM64. C'est ce que vous auriez besoin de faire:
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 " .
sur Mac:
brew install mingw-w64
sur 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
Toutes sortes de demandes de traction (document, démo, captures d'écran, code, etc.) sont plus que bienvenues!