プロジェクト

全般

プロフィール

機能 #1034

toshi_a 初音6ヶ月前に更新

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

戻る