[ruby-gnome2-doc-cvs] [Hiki] update - tut-gtk-spinbuttons

Back to archive index

ruby-****@sourc***** ruby-****@sourc*****
2003年 8月 17日 (日) 00:16:24 JST


-------------------------
REMOTE_ADDR = 61.26.70.211
REMOTE_HOST = 
        URL = http://ruby-gnome2.sourceforge.jp/?tut-gtk-spinbuttons
-------------------------
  =スピンボタン 
  スピンボタンウィジェットは一般にユーザがある範囲から数値を選択できるようにするために用いられる.
  これはテキストエントリボックスとその横にある上および下向きのアロウボタンから構成される.
  これらのボタンを押すことで選択可能な範囲内で値が "スピン" アップまたはダウンする.
  エントリボックスに直接値を入力することもできる.
  
  スピンボタンは0以上の小数点以下の桁数を扱うことができ,任意の大きさでインクリメント/デクリメントを行うことができる.
  ボタンの1つを押し続けた場合,押し続けた時間によって値の変化を加速するようにオプションで設定できる.
  
  スピンボタンは,扱うことができる値の範囲に関する情報を保持するために((<アジャストメント>))を使用する.
  アジャストメントを使用するおかげで,スピンボタンはより強力なものとなる.
  
  アジャストメントウィジェットは以下のようにして生成することを思い出そう.
  引数を見ればアジャストメントがどのような情報を保持しているかが分かる:
  
    Gtk::Adjustment.new(value, lower, upper, step_increment, page_increment, page_size)
  
  アジャストメントのこれらの属性はスピンボタンでは次のように用いられる:
  
  :value
    スピンボタンの初期値 
  :lower
    値の下限値 
  :upper
    値の上限値 
  :step_increment
    ボタンをマウスボタン1で押した場合のインクリメント/デクリメント値
  :page_increment
    ボタンをマウスボタン2で押した場合のインクリメント/デクリメント値
  :page_size
    使用しない 
  
  さらに,ボタンの1つをマウスボタン3で押すことで,直接上限値または下限値にジャンプすることができる.
  
  それではスピンボタンを作成する方法を見てみよう: 
  
    Gtk::SpinButton.new(adjustment, climb_rate, digits)
  
  adjustment引数でスピンボタンで使用するアジャストメントオブジェクトを指定する.
  climb_rate引数は0.0から1.0の間の値を取り,スピンボタンの加速の割合を指定する.
  digits引数は表示される数値の小数点以下の桁数である.
  
  スピンボタン作成後も以下のメソッドを用いてこれらの属性を再設定できる:
  
    Gtk::SpinButton#configure(adjustment, climb_rate, digits)
  
  またアジャストメント,climb_rate,小数点以下の桁数は以下のメソッドを用いて個別に取得,設定することができる
  
    Gtk::SpinButton#adjustment
    Gtk::SpinButton#climb_rate
    Gtk::SpinButton#digits
  
    Gtk::SpinButton#adjustment=(adjustment)
    Gtk::SpinButton#climb_rate=(climb_rate)
    Gtk::SpinButton#digits=(digits)
  
    Gtk::SpinButton#set_adjustment(adjustment)
    Gtk::SpinButton#set_climb_rate(clibm_rate)
    Gtk::SpinButton#set_digits(digits)
  
  スピンボタンに現在表示されている値は次のメソッドで変えることができる:
  
    Gtk::SpinButton#value=(value)
    Gtk::SpinButton#set_value(value)
  
  スピンボタンの現在の値は次のメソッドで浮動小数点または整数値として取得することができる:
  
    Gtk::SpinButton#value          # 浮動小数点数
    Gtk::SpinButton#value_as_int   # 整数
  
  スピンボタンの値を相対的に変えたいときは次のメソッドを使用する: 
  
    Gtk::SpinButton#spin(direction, increment)
  
  direction引数には以下のいずれかを指定する.
  
  :Gtk::SpinButton::STEP_FORWARDまたはGtk::SpinButton::STEP_BACKWARD
    スピンボタンの値はincrementによって指定された量だけ変化する.ただしincrementが0の場合はアジャストメントのstep_increment分だけ変化する.
  :Gtk::SpinButton::PAGE_FORWARDまたはGtk::SpinButton::PAGE_BACKWARD
    incrementの値に関わらず,アジャストメントのpage_increment分だけ変化する.
  :Gtk::SpinButton::HOME
    アジャストメントのlowerにスピンボタンの値を設定する.
  :Gtk::SpinButton::END
    アジャストメントのupperにスピンボタンの値を設定する.
  :Gtk::SpinButton::USER_DEFINED
    incrementで指定された量だけ変化する.
  
  スピンボタンの範囲の属性を設定したり取得したりするメソッドについてはこのくらいにして,今度はスピンボタンの動作に関するメソッドを見てみよう.
  
  最初のメソッドはスピンボタンのテキストボックスが数値のみを含むように制限するもので,ユーザが数値以外のものをスピンボタンのテキストボックスに入力することを防ぐことができる.
  
    Gtk::SpinButton#numetic=(numeric)
    Gtk::SpinButton#set_numetic(numeric)
  
  numericにはtrueまたはfalseを指定する.
  trueを指定すれば数値のみ入力可能となる.
  
  現在の状態はGtk::SpinButton#numeric?で取得できる.
  
  スピンボタンが上限値と下限値を連続的に繋ぐ(wrap around)かどうかは以下のメソッドで設定できる:
  
    Gtk::SpinButton#wrap=(wrap)
    Gtk::SpinButton#set_wrap(wrap)
  
  値を最も近いアジャストメントのstep_incrementの倍数に丸めるには次のメソッドを使用する:
  
    Gtk::SpinButton#snap_to_ticks=(snap_to_ticks)
    Gtk::SpinButton#set_snap_to_ticks(snap_to_ticks)
  
  
  スピンボタンのアップデートポリシは次の関数で変更できる: 
  
    Gtk::SpinButton#update_policy=(policy)
    Gtk::SpinButton#set_update_policy(policy)
  
  policyに指定できる値はGtk::SpinButton::UPDATE_ALWAYSまたはGtk::SpinButton::UPDATE_IF_VALIDのいずれかである.
  
  これらのポリシィは入力されたテキストを解析しアジャストメントの値に適合させる時のスピンボタンの動作に影響を与える.
  
  :Gtk::SpinButton::UPDATE_IF_VALID
    スピンボタンは入力テキストがアジャストメントで指定された範囲内の数値の場合だけその値を変える.そうでない場合は現在の値が再設定される.
  :Gtk::SpinButton::UPDATE_ALWAYS
    テキストを数値に変換する間エラーは無視される。 
  
  最後に,次のメソッドを用いて明示的にスピンボタンをアップデートできる:
  
    Gtk::SpinButton#update
  
+ {{image_right "spinbutton.png"}}
  それではいつものようにサンプルを見てみよう.
+ 
  
    #! /usr/bin/env ruby
    
    require 'gtk2'
    
    def get_value(spin, label, type)
    	label.set_text(
    		case type
    		when :Int
    			"%d" % spin.value
    		when :Float
    			"%0.*f" % [spin.digits, spin.value]
    		else
    			"0"
    		end
    	)
    end
    
    Gtk.init
    
    window = Gtk::Window.new
    window.signal_connect("destroy") {Gtk.main_quit}
    window.title = "Spin Button"
    
    main_vbox = Gtk::VBox.new(false, 5)
    main_vbox.border_width = 10
    window.add(main_vbox)
    
    frame = Gtk::Frame.new("Not accelerated")
    main_vbox.pack_start(frame, true, true, 0)
    
    vbox = Gtk::VBox.new(false, 0)
    vbox.border_width = 5
    frame.add(vbox)
    
    hbox = Gtk::HBox.new(false, 0)
    vbox.pack_start(hbox, true, true, 5)
    
    vbox2 = Gtk::VBox.new(false, 0)
    hbox.pack_start(vbox2, true, true, 5)
    
    label = Gtk::Label.new("Day :")
    label.set_alignment(0, 0.5)
    vbox2.pack_start(label, false, true, 0)
    
    adj = Gtk::Adjustment.new(1.0, 1.0, 31.0, 1.0, 5.0, 0.0)
    
    spinner = Gtk::SpinButton.new(adj, 0, 0)
    spinner.wrap = true
    #spinner.shadow_type = Gtk::SHADOW_OUT
    vbox2.pack_start(spinner, false, true, 0)
    
    vbox2 = Gtk::VBox.new(false, 0)
    hbox.pack_start(vbox2, true, true, 5)
    
    label = Gtk::Label.new("Month :")
    label.set_alignment(0, 0.5)
    vbox2.pack_start(label, false, true, 0)
    
    adj = Gtk::Adjustment.new(1.0, 1.0, 12.0, 1.0, 5.0, 0.0)
    
    spinner = Gtk::SpinButton.new(adj, 0, 0)
    spinner.wrap = true
    #spinner.shadow_type = Gtk::SHADOW_ETCHED_IN
    vbox2.pack_start(spinner, false, true, 0)
    
    vbox2 = Gtk::VBox.new(false, 0)
    hbox.pack_start(vbox2, true, true, 5)
    
    label = Gtk::Label.new("Year :")
    label.set_alignment(0, 0.5)
    vbox2.pack_start(label, false, true, 0)
    
    adj = Gtk::Adjustment.new(1998.0, 0.0, 2100.0, 1.0, 100.0, 0.0)
    
    spinner = Gtk::SpinButton.new(adj, 0, 0)
    spinner.wrap = true
    #spinner.shadow_type = Gtk::SHADOW_IN
    spinner.set_size_request(55, -1)
    vbox2.pack_start(spinner, false, true, 0)
    
    frame = Gtk::Frame.new("Accelerated")
    main_vbox.pack_start(frame, true, true, 0)
    
    vbox = Gtk::VBox.new(false, 0)
    vbox.border_width = 5
    frame.add(vbox)
     
    hbox = Gtk::HBox.new(false, 0)
    vbox.pack_start(hbox, false, true, 5)
    
    vbox2 = Gtk::VBox.new(false, 0)
    hbox.pack_start(vbox2, true, true, 5)
     
    label = Gtk::Label.new("Value :")
    label.set_alignment(0, 0.5)
    vbox2.pack_start(label, false, true, 0)
    
    adj = Gtk::Adjustment.new(0.0, -10000.0, 10000.0, 0.5, 100.0, 0.0)
    
    spinner1 = Gtk::SpinButton.new(adj, 1.0, 2)
    spinner.wrap = true
    spinner.set_size_request(100, -1)
    vbox2.pack_start(spinner1, false, true, 0)
     
    vbox2 = Gtk::VBox.new(false, 0)
    hbox.pack_start(vbox2, true, true, 5)
     
    label = Gtk::Label.new("Digits :")
    label.set_alignment(0, 0.5)
    vbox2.pack_start(label, false, true, 0)
     
    adj = Gtk::Adjustment.new(2, 1, 5, 1, 1, 0)
    spinner2 = Gtk::SpinButton.new(adj, 0.0, 0)
    spinner2.wrap = true
    spinner2.signal_connect("value_changed") do |w|
    	spinner1.digits = w.value
    end
    vbox2.pack_start(spinner2, false, true, 0)
     
    hbox = Gtk::HBox.new(false, 0)
    vbox.pack_start(hbox, false, true, 5)
     
    button = Gtk::CheckButton.new("Snap to 0.5-ticks")
    button.signal_connect("clicked") do |w|
    	spinner1.snap_to_ticks = w.active?
    end
    vbox.pack_start(button, true, true, 0)
    button.active = true
     
    button = Gtk::CheckButton.new("Numeric only input mode")
    button.signal_connect("clicked") do |w|
    	spinner1.numeric = w.active?
    end
    vbox.pack_start(button, true, true, 0)
    button.active = true
    
    val_label = Gtk::Label.new 
     
    hbox = Gtk::HBox.new(false, 0)
    vbox.pack_start(hbox, false, true, 5)
    button = Gtk::Button.new("Value as Int")
    button.signal_connect("clicked") do
    	get_value(spinner1, val_label, :Int)
    end
    hbox.pack_start(button, true, true, 5)
     
    button = Gtk::Button.new("Value as Float")
    button.signal_connect("clicked") do
    	get_value(spinner1, val_label, :Float)
    end
    hbox.pack_start(button, true, true, 5)
    
    vbox.pack_start(val_label, true, true, 0)
    val_label.set_text("0")
     
    hbox = Gtk::HBox.new(false, 0)
    main_vbox.pack_start(hbox, false, true, 0)
    
    button = Gtk::Button.new("Close")
    button.signal_connect("clicked") {window.destroy}
    hbox.pack_start(button, true, true, 5)
    
    window.show_all
    Gtk.main
    





ruby-gnome2-cvs メーリングリストの案内
Back to archive index