gioでいろいろやってみるよー
#golang #gui #gio
Goでデスクトップアプリを作りたいってことで、
#fyne を試してたんやけど、ちょっとつらいところがあったからGioを試してみることにする。
Gioとは
まず、Gioは本当に情報が少ない。
一応参考URLは並べるつもりやけど、参考URLには詳細なことは書かれてないかもなので、
分かる範囲でここで紹介する。
概要
Goのみで書けるGUIライブラリで、
WindowsやMacといったPCのみじゃなく、AndroidやiOSといったスマートフォン、
さらにはブラウザまで同じソースコードで動くものを作ることができることも目的として作られている。
すごいのは、Go以外に何もいらないこと。
gccも要らないし、他のGUI開発ツールキットも必要ない。
Gioは完全にGoの上で動作するわけです。
即時モード
Immediate Mode GUI Programming
というのが頻繁に出てくる。
Google翻訳的には即時モードのGUIプログラミングとなっていまいちわからない。
Immediate Mode GUI Programming
で、即時モードとは何か説明がある。
既存のWebページのDOMとイベントの作りは保持モードと表現されていて、
ラベルとボタンはウィジェット階層に登録され、UIライブラリの都合のいいタイミングでハンドラーコールバックが行なわれる。と言われています。
これだけじゃ分からないですね。
即時モードであると言われているGioでは、イベントハンドラーを自分で実装します。
イベントを起こすのはユーザというのは変わりませんが、ボタンのイベントが発生してからそれを反映するまではプログラムの責務になる。
他のイベントが詰まってて全然動作が反映されない。みたいなのは回避できる作りになってる。
だから即時なのかな?と認識。
これが頭にないと、手動でloop関数を実装してるのは何故?ってなると思う。
なんでこんなめんどくさいことをしてるの?と。
GitHubじゃない
ソースハットとかよばれるホスティングサービスでソースが管理されている。
~eliasnaur/gio - sourcehut git
GitHubとかGitLabといったUIになれてると頼りなく感じてしまう。
んで、go getの先はgioui.orgになる。
その下を指定して取得することもできるけど、結局全部必要やからgioui.orgを取ったほうが楽ってなる。
ホスト名だけ指定してgo getしたのはじめてでびっくりする。
githubじゃないからなのか、全然情報が見つからない。
参考ページ
Gio - immediate mode GUI in Go
公式
Architecture
公式にあるGioの説明っぽいやつ
何ができるか、どういう思想で動かしてるかってのが見える
Immediate Mode GUI Programming
公式ブログ 即時モードGUIプログラミング
~eliasnaur/gio - sourcehut git
ソースコード
example - GoDoc
GoDocから追えるexample
Simple, Portable and Efficient Graphical Interfaces in Go
gGophercon 2019登壇資料
Hello, World! Hello, Gio!!!
https://gyazo.com/3242b4c59a640129ce0874853f0d1c2b
やったこと
mainでapp.Main()でメインスレッドをブロック
<-make(chan error)でブロックしても問題なかった
メインスレッドとは非同期でイベントリスナーを起動
system.DestroyEventを受け取ったらエラーを返す
エラーがない場合もある
system.DestroyEventはWindowが最後に出すイベント = 終了イベント
でもタスクバーから右クリックで閉じるとイベントが出ない
system.FrameEventを受け取ったら描画内容を処理する
system.FrameEventは新しいフレームが出た時に発生するイベントで、このタイミングで何を描画するかを決定する
描画内容はH1にHello, Gio!!!を入れて表示するだけ
どんなイベントがあるのかみたいから、デバッグのために型と内容をlog.Printlnでだしてる
気になること
やったことにもかいてるけど、タスクバーから右クリックで閉じると終了イベントが出ない
キータイプすると画面がハングアップする
引き続き確認を進めることで解決されると嬉しいけど、どうなんでしょ
Build
Hello, Worldしたのをビルドしてみる。
今使ってるホストマシンがWindowsなので、Windows用のビルドを実行。
$ go build -ldflags="-H windowsgui" 01-hello-gio/main.go
じゃあexeファイルが吐き出されて、それを実行したらプロンプトは出ずにウィンドウが開かれた。
キーを押したらハングアップするのは変わらないからgo runするのと変わらん感じ。
TODO
日本語フォントを放り込んでこんにちわーるど
Build
ボタンの追加とボタンによる終了
入力欄
1行
複数行
パスワード
ラジオボタン・チェックボックス・セレクトボックス
ページ遷移
ダイアログ
複数ウィンドウ
分割
スクロール
デスクトップ通知
キー入力
スタイル・レイアウト
四角や丸の配置
イベント
ホバー
クリック
ドラッグ
つくってみる
タイピングゲーム
TODOアプリ
スネークゲーム
2046
チャットアプリ
色々やろうかと思ったけど中止
まあ仕方がないんやけど、キー入力があるとハングアップしてしまうのの対処ができなくて一回やめる。
githubで管理されてればissueたてたりもできるんやけど、
git依存を少なくするのも試されているとのことで、メーリングリストで議論が前提になってた。
ちょっとそこまでして貢献はきびしい~ってことでそっとじ
#2020/07/26週
更新履歴
2020/07/24 諦めた!
2020/07/24 書き始め