新規作成  編集  Ruby-GNOME2 Project Website  ページ一覧  検索  更新履歴  編集履歴  RSS  Back  ログイン

gtk2-tut-adjustment-detail 差分 - Ruby-GNOME2 Project Website

  • 最後の更新で追加された部分はこのように表示します。
  • 最後の更新で削除された部分はこのように表示します。

= アジャストメントの内部
「OK,それは素晴らしいが,ユーザーがレンジウィジェットやスピンボタンを調節したときにそれに反応するハンドラを自分で作りたいときにはどうすればよいのか?
それとそのハンドラの中からアジャストメントの値を取得するには?」
これらの疑問やそれ以上のことに答えるために、まずはGtk::Adjustment自身について見ることにしよう.

  Gtk::Adjustment.new(value, lower, upper, step_increment, page_increment, page_size)

次のアクセサメソッドでアジャストメントのvalueの値を取得することができる.

  Gtk::Adjustment#value

アジャストメントのvalueをセットしたら,ふつうこのアジャストメントを使用している全てのウィジェットにその変化を反映させたいと思うだろう.
Ruby/GTK2では次のメソッドでこれを実現している.

  Gtk::Adjustment#set_value(value)
  Gtk::Adjustment#value=(value)

先に述べたように,全ての様々なウィジェットと同様Gtk::AdjustmentはGLib::Instantiatableのサブクラスなので,シグナルを発行することができる.
そのおかげで,スクロールバーとその他の調整可能なウィジェットでアジャストメントを共有しているときに自動的に状態が更新されるのである.
つまり,全ての調整可能なウィジェットは,アジャストメントのvalue_changedシグナルにシグナルハンドラを接続しているのである.

アジャストメントを使用する様々なウィジェットは,値を変更するときは常にアジャストメント上でこのシグナルを発行する.
これはプログラムがGtk::Adjustment#set_valueやGtk::Adjustment#value=を用いて明示的に値を変更したときだけではなく,ユーザーがレンジウィジェットのスライダーを動した際にも起こる.
従って,例えばスケールウィジェットを操作することで絵を回転させたいような場合は,次のようにすればよい:

  adj.gtk_signal_connect("value_changed") do |adj|
    picture.set_rotation(adj.value)
  end

例えばユーザーがテキストウィジェットにさらにテキストを加えるなど,ウィジェットがアジャスメントのupperまたはlowerの値を変更する場合はどうだろうか?
このような場合,アジャストメントはchangedシグナルを発行する.

レンジウィジェットはこのシグナルにハンドラを接続している典型的なウィジェットで,upperやlowerの値が変更されると,その変化を反映して外見を変化させる.
例えば,スクロールバーのスライダーのサイズは,そのアジャストメントのlowerとupperの差の比率に反比例して大きくなったり小さくなったりする.

新しいタイプのレンジウィジェットを書かない限り,あなたがハンドラをこのシグナルに接続する必要はまず無いだろう.
しかし,もしGtk::Adjustmentのいかなる値でも直接変更した場合には,そのアジャストメントを使用している全てのウィジェットを再度設定しなおすためにこのシグナルを発行する必要がある:

  adj.signal_emit("changed")

それでは先に進んで,実際に調節してみよう!