Project

General

Profile

機能 #1034

Updated by toshi_a 初音 almost 3 years ago

ユーザにインタラクティブに入力を求める時に、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> 

Back