操作
機能 #1034
完了Form DSLを使った、Gtkに依存しない入力ダイアログボックスを表示する機能
開始日:
2017-04-25
期日:
進捗率:
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}
}
ファイル
関連するチケット
操作