機能 #1034
完了Form DSLを使った、Gtkに依存しない入力ダイアログボックスを表示する機能
0%
説明
ユーザにインタラクティブに入力を求める時に、Gtkに依存しないでダイアログボックスを表示して入力させたい。
問題¶
現在でも mikutter_shinkansen_tokaido_sanyo のようなプラグインでGtkを用いたダイアログボックスの表示を利用しているケースがあるが、これによってgtkプラグインに依存してしまう問題がある。
また、 #981 でも、World生成ウィザードにGtk依存が含まれてしまうという問題に直面した。
解決策¶
#1033 で、Form DSLが実装されたことで設定DSLと同様のことが他のGtkウィジェットでも出来るようになった。これを利用すれば、Gtkへの依存を間接的なものにすることができ、異なるUI Toolkitの実装もGtkに依存する必要がなくなる。
例¶
こんな感じにできると良さそう。 dialog
は defdsl
で定義するもので、gtkプラグインに依存しなくても使えるようにguiプラグインが提供。
guiプラグインはイベントなどでgtkプラグインに内容を渡し、 Gtk::FormDSL
を使ってダイアログボックスを表示する。
戻り値はDeferredとし、ユーザの入力を完了したらnext、中断したらtrapが呼ばれるようにする。ブロックには各エレメントに入力された値をHashで格納する。
入力バリデーションもあったほうがいいかもしれないが、少なくともこのチケットでは考えない。実際に使ってみて需要がありそうなら実装する
dialog("ダイアログサンプル") {
select "新幹線の種別", :train do
option "ノォゾォミィ", "のぞみ"
option "ヒィカァリィ", "ひかり"
option "コダァマァ", "こだま"
end
select "行き先", :station do
option "トーキョー", "東京"
option "ナァゴォヤ", "名古屋"
option "シィンオォサァカ", "新大阪"
end
}.next{ |obj|
# positive buttonが押された場合
p obj #=> {success: true, train: "ノォゾォミィ", station: "トーキョー"}
}.trap{ |exception|
# キャンセルされた場合
p exception #=> {success: false}
}
ファイル
関連するチケット
toshi_a 初音 さんが7年以上前に更新
- ファイル 20170425060310.png 20170425060310.png を追加
- 説明 を更新 (差分)
- ステータス を 新規 から 終了 に変更
上記のサンプルがそのまま実行できるようになった。ただ、nextブロックにHashを渡すと、成否の値とキーとエレメントのキーの名前が衝突するので、レスポンス用の特別なオブジェクトを渡すようにした。
このオブジェクトは、 []
と []=
を実装していてHashのように扱える他、 to_h
でHashを返す。
nextブロックに渡されるレスポンスの例
#<Plugin::Gtk::DialogWindow::Response::Ok:0x007f9394a87788 @values={:train=>"コダァマァ", :station=>"シィンオォサァカ"}>
#981 の実装では、ウィザードのような複数画面で構成され、ステップの間で待ち時間が入るようなことをしたいので、中断機能などが必要になってくるが、それについては他にチケットを作るか、 #981 の中でやってしまうことにする。