プロジェクト

全般

プロフィール

機能 #1034

Form DSLを使った、Gtkに依存しない入力ダイアログボックスを表示する機能

toshi_a 初音3ヶ月前に追加. 3ヶ月前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
開始日:
2017-04-25
期日:
進捗率:

0%

プラグイン名:

説明

ユーザにインタラクティブに入力を求める時に、Gtkに依存しないでダイアログボックスを表示して入力させたい。

問題

現在でも mikutter_shinkansen_tokaido_sanyo のようなプラグインでGtkを用いたダイアログボックスの表示を利用しているケースがあるが、これによってgtkプラグインに依存してしまう問題がある。
また、 #981 でも、World生成ウィザードにGtk依存が含まれてしまうという問題に直面した。

解決策

#1033 で、Form DSLが実装されたことで設定DSLと同様のことが他のGtkウィジェットでも出来るようになった。これを利用すれば、Gtkへの依存を間接的なものにすることができ、異なるUI Toolkitの実装もGtkに依存する必要がなくなる。

こんな感じにできると良さそう。 dialogdefdsl で定義するもので、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}
}

20170425060310.png 表示 (20.6 KB) toshi_a 初音, 2017-04-25 06:30


関連するチケット

関連している 機能 #1033: Setting DSLのクラスを他のプラグインでも使えるようにする 終了 2017-04-20
ブロック先 機能 #981: カスタムアカウント 新規 2017-01-30

関係しているリビジョン

リビジョン 100bce41 (差分)
toshi_a 初音3ヶ月前に追加

Gtkに依存しないダイアログボックスを表示するためのDSLメソッド refs #1034

履歴

#1 toshi_a 初音3ヶ月前に更新

  • 関連している 機能 #1033: Setting DSLのクラスを他のプラグインでも使えるようにする を追加

#2 toshi_a 初音3ヶ月前に更新

  • ブロック先 機能 #981: カスタムアカウント を追加

#3 toshi_a 初音3ヶ月前に更新

上記のサンプルがそのまま実行できるようになった。ただ、nextブロックにHashを渡すと、成否の値とキーとエレメントのキーの名前が衝突するので、レスポンス用の特別なオブジェクトを渡すようにした。
このオブジェクトは、 [][]= を実装していてHashのように扱える他、 to_h でHashを返す。

nextブロックに渡されるレスポンスの例

#<Plugin::Gtk::DialogWindow::Response::Ok:0x007f9394a87788 @values={:train=>"コダァマァ", :station=>"シィンオォサァカ"}>

#981 の実装では、ウィザードのような複数画面で構成され、ステップの間で待ち時間が入るようなことをしたいので、中断機能などが必要になってくるが、それについては他にチケットを作るか、 #981 の中でやってしまうことにする。

他の形式にエクスポート: Atom PDF