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

レンジウィジェットの例

レンジウィジェットの例

range.png このプログラムは,testgtkから"range controls"のテスト部分を多少修正して作ったバージョンである. これは同じアジャストメントに接続された3つのレンジウィジェットを持つウィンドウを作り,また,2 つのコントロールを持っていて,この直前やアジャストメントに関する節で説明したように,いくつかのパラメーターを調整する. ユーザーの操作によって,これらのウィジェットの動きを確認できるだろう.

#! /usr/bin/env ruby

require 'gtk2'

class RangeControl < Gtk::Window
	def cb_digits_scale(adj)
		# 両方のスケールウィジェットに対して値の表示位置を設定する
		@hscale.digits = adj.value
		@vscale.digits = adj.value
	end

	def cb_page_size(get, set)
		# "Page Size"スケールで指定された値でアジャストメントのpage_sizeとpage_incrementを設定
		set.page_size = get.value
		set.page_increment = get.value

		# ここでアジャストメントに値を設定し,このアジャストメントにアタッチされている全てのウ  ィジェットを再構成するために"changed"シグナルを発行
		set.value = 
			if set.value > set.upper - set.page_size
				set.page_size
			elsif set.value < set.lower
				set.lower
			else
				set.value
			end

		set.signal_emit("changed")
	end

	def cb_draw_value(button)
		@hscale.draw_value = button.active?
		@vscale.draw_value = button.active?
	end

	def make_menu_item(name, callback, arg)
		item = Gtk::MenuItem.new(name)
		item.signal_connect("activate") {callback.call(arg)}
		item
	end

	def scale_set_default_values(scale)
		scale.update_policy = Gtk::UPDATE_CONTINUOUS
		scale.digits = 1
		scale.value_pos = Gtk::POS_TOP
		scale.draw_value = true
	end

	def initialize
		super(Gtk::Window::TOPLEVEL)

		cb_pos_menu_select = Proc.new do |pos|
			@hscale.value_pos = pos
			@vscale.value_pos = pos
		end

		cb_update_menu_select = Proc.new do |policy|
			@hscale.update_policy = policy
			@vscale.update_policy = policy
		end

		signal_connect("destroy") {Gtk::main_quit}
		title = "range controls"

		box1 = Gtk::VBox.new(false, 0)
		add(box1)

		box2 = Gtk::HBox.new(false, 10)
		box2.border_width = 10
		box1.pack_start(box2, true, true, 0)

		# value, lower, upper, step_increment, page_increment, page_size
		# page_sizeだけがスクロールバウィジェットと違うことに注意.
		# 取り得る最大値は(upper - page_size)
		adj1 = Gtk::Adjustment.new(0.0, 0.0, 101.0, 0.1, 1.0, 1.0)

		@vscale = Gtk::VScale.new(adj1)
		scale_set_default_values(@vscale)
		box2.pack_start(@vscale, true, true, 0)

		box3 = Gtk::VBox.new(false, 10)
		box2.pack_start(box3, true, true, 0)

		# Reuse the same adjustment
		@hscale = Gtk::HScale.new(adj1)
		@hscale.set_size_request(200, -1)
		box3.pack_start(@hscale, true, true, 0)

		# Reuse the same adjustment again
		scrollbar = Gtk::HScrollbar.new(adj1)
		# Notice how this causes the scales to always be updated continuously when the   scrollbar is moved
		scrollbar.update_policy = Gtk::UPDATE_CONTINUOUS
		box3.pack_start(scrollbar, true, true, 0)

		box2 = Gtk::HBox.new(false, 10)
		box2.border_width = 10
		box1.pack_start(box2, true, true, 0)

		# A checkbutton to control whether the value is displayed or not
		button = Gtk::CheckButton.new("Display value on scale widgets")
		button.active = true
		button.signal_connect("toggled") {|button| cb_draw_value(button)}
		box2.pack_start(button, true, true, 0)

		box2 = Gtk::HBox.new(false, 10)
		box2.border_width = 10

		# An option menu to change the position of the value
		label = Gtk::Label.new("Scale Value Position:")
		box2.pack_start(label, false, false, 0)

		opt = Gtk::OptionMenu.new
		menu = Gtk::Menu.new

		menu.append(make_menu_item("Top",    cb_pos_menu_select, Gtk::POS_TOP))
		menu.append(make_menu_item("Bottom", cb_pos_menu_select, Gtk::POS_BOTTOM))
		menu.append(make_menu_item("Left"  , cb_pos_menu_select, Gtk::POS_LEFT))
		menu.append(make_menu_item("Right" , cb_pos_menu_select, Gtk::POS_RIGHT))

		opt.menu = menu
		box2.pack_start(opt, true, true, 0)
		box1.pack_start(box2)

		box2 = Gtk::HBox.new(false, 10)
		box2.border_width = 10

		# Yet another option menu, this time for the update policy of the scale widgets 
		label = Gtk::Label.new("Scale Update Policy:")
		box2.pack_start(label, false, false, 0)

		opt = Gtk::OptionMenu.new
		menu = Gtk::Menu.new

		menu.append(make_menu_item("Continuous",    cb_update_menu_select,   Gtk::UPDATE_CONTINUOUS))
		menu.append(make_menu_item("Discontinuous", cb_update_menu_select,   Gtk::UPDATE_DISCONTINUOUS))
		menu.append(make_menu_item("Delayed"      , cb_update_menu_select, Gtk::UPDATE_DELAYED))

		opt.menu = menu
		box2.pack_start(opt, true, true, 0)
		box1.pack_start(box2, true, true, 0)

		box2 = Gtk::HBox.new(false, 10)
		box2.border_width = 10

		# An HScale widget for adjusting the number of digits on the sample scales.
		label = Gtk::Label.new("Scale Digits:")
		box2.pack_start(label, false, false, 0)

		adj2 = Gtk::Adjustment.new(1.0, 0.0, 5.0, 1.0, 1.0, 0.0)
		adj2.signal_connect("value_changed") {|adj| cb_digits_scale(adj)}

		scale = Gtk::HScale.new(adj2)
		scale.digits = 0
		box2.pack_start(scale, true, true, 0)
		box1.pack_start(box2, true, true, 0)

		box2 = Gtk::HBox.new(false, 10)
		box2.border_width = 10

		# And, one last HScale widget for adjusting the page size of the scrollbar.
		label = Gtk::Label.new("Scrollbar Page Size:")
		box2.pack_start(label, false, false, 0)

		adj2 = Gtk::Adjustment.new(1.0, 1.0, 101.0, 1.0, 1.0, 0.0)
		adj2.signal_connect("value_changed") {|adj| cb_page_size(adj, adj1)}

		scale = Gtk::HScale.new(adj2)
		scale.digits = 0
		box2.pack_start(scale, true, true, 0)

		box1.pack_start(box2, true, true, 0)

		separator = Gtk::HSeparator.new
		box1.pack_start(separator, false, true, 0)

		box2 = Gtk::VBox.new(false, 10)
		box2.border_width = 10
		box1.pack_start(box2, false, true, 0)

		button = Gtk::Button.new("Quit")
		button.signal_connect("clicked") {Gtk::main_quit}
		box2.pack_start(button, true, true, 0)
		button.can_default = true
		button.grab_default
	end
end

window = RangeControl.new
window.show_all
Gtk::main
更新日時:2006/07/02 14:33:37
キーワード:
参照:[gtk2-tut]