機能 #1034
toshi_a 初音 さんが7年以上前に更新
ユーザにインタラクティブに入力を求める時に、Gtkに依存しないでダイアログボックスを表示して入力させたい。 h1. 問題 現在でも "mikutter_shinkansen_tokaido_sanyo":https://github.com/Akkiesoft/mikutter_shinkansen_tokaido_sanyo のようなプラグインでGtkを用いたダイアログボックスの表示を利用しているケースがあるが、これによってgtkプラグインに依存してしまう問題がある。 また、 #981 でも、World生成ウィザードにGtk依存が含まれてしまうという問題に直面した。 h1. 解決策 #1033 で、Form DSLが実装されたことで設定DSLと同様のことが他のGtkウィジェットでも出来るようになった。これを利用すれば、Gtkへの依存を間接的なものにすることができ、異なるUI Toolkitの実装もGtkに依存する必要がなくなる。 h1. 例 こんな感じにできると良さそう。 @dialog@ は @defdsl@ で定義するもので、gtkプラグインに依存しなくても使えるようにguiプラグインが提供。 guiプラグインはイベントなどでgtkプラグインに内容を渡し、 @Gtk::FormDSL@ を使ってダイアログボックスを表示する。 戻り値はDeferredとし、ユーザの入力を完了したらnext、中断したらtrapが呼ばれるようにする。ブロックには各エレメントに入力された値をHashで格納する。 入力バリデーションもあったほうがいいかもしれないが、少なくともこのチケットでは考えない。実際に使ってみて需要がありそうなら実装する <pre><code class="ruby"> dialog("ダイアログサンプル") 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} } </code></pre>