[ruby-list:43065] GTK2のListStoreとTreeViewについての質問

From: ruby-philia@...
Date: 2006-12-18 13:01:05 UTC
List: ruby-list #43065
はじめまして、本日登録いたしました佐藤と申します。

Ruby/Gtk2について困っております。
WindowsにGtk+をインストールすると付いてくるGtk-demoなるサンプルプログラム集があります。
それのTreeView->ListStoreというサンプルのC言語で書かれたソースがあったので、Ruby/Gtk2サイトの
リファレンスを見ながら自分なりにRubyに書き換えて移植してみました。
しかし、とりあえずエラーが出ないで実行できるところまでこぎつけたものの、実行してもリストビュ
ーに何も表示されないのです。
困ったことに、デバッグのやり方が思いつかないため、頓挫しております。
内部データは変更されているが、ビューが更新されてないため表示されないのではないか?という疑惑
があるのですが、何かビューの更新の仕組みを書き足すだけで表示されるようになるのでしょうか?
一応自分なりにリファレンスを調べて見ましたが、更新するシグナルも発見できずにあきらめている状
態です。
もし、こうしたら表示されるというのをご存知の方がいましたら教えて頂けないでしょうか。
よろしくお願いします。こういうサンプルがあるから見たらわかるよというのでも結構です。
ソースは以下のようになっております。よろしくお願いします。

require 'gtk2'

COLUMN_FIXED       = 0
COLUMN_NUMBER      = 1
COLUMN_SEVERITY    = 2
COLUMN_DESCRIPTION = 3
NUM_COLUMNS        = 4

$data = [
  [ false, 60482, "Normal",     "scrollable notebooks and hidden tabs" ],
  [ false, 60620, "Critical",   "gdk_window_clear_area (gdkwindow-win32.c) is not thread-saf
e" ],
  [ false, 50214, "Major",      "Xft support does not clean up correctly" ],
  [ true,  52877, "Major",      "GtkFileSelection needs a refresh method. " ],
  [ false, 56070, "Normal",     "Can't click button after setting in sensitive" ],
  [ true,  56355, "Normal",     "GtkLabel - Not all changes propagate correctly" ],
  [ false, 50055, "Normal",     "Rework width/height computations for TreeView" ],
  [ false, 58278, "Normal",     "gtk_dialog_set_response_sensitive () doesn't work" ],
  [ false, 55767, "Normal",     "Getters for all setters" ],
  [ false, 56925, "Normal",     "Gtkcalender size" ],
  [ false, 56221, "Normal",     "Selectable label needs right-click copy menu" ],
  [ true,  50939, "Normal",     "Add shift clicking to GtkTextView" ],
  [ false, 6112,  "Enhancement","netscape-like collapsable toolbars" ],
  [ false, 1,     "Normal",     "First bug :=)" ],
]

def create_model()
#  /* create list store */
  store = Gtk::ListStore.new(Object,Integer,String,String)
#  /* add data to the list store */
	for data in $data do
		iter = store.append
		store.set_value(iter,COLUMN_FIXED, data[COLUMN_FIXED]).
		      set_value(iter,COLUMN_NUMBER, data[COLUMN_NUMBER]).
					set_value(iter,COLUMN_SEVERITY, data[COLUMN_SEVERITY]).
					set_value(iter,COLUMN_DESCRIPTION, data[COLUMN_DESCRIPTION])
  end
  store
end

def fixed_toggled(cell,path_str,data)
	model = data
	path = Gtk::TreePath.new(path_str)
	iter = model.get_iter(path)
	model.set_value(iter,COLUMN_FIXED,!model.get_value(iter,COLUMN_FIXED))
end

def add_columns(treeview)
  model = treeview.model
	renderer = Gtk::CellRendererToggle.new
	renderer.signal_connect("toggled"){|w,e|
	  fixed_toggled(w,e,model)
	}
  column = Gtk::TreeViewColumn.new("Fixed?",renderer,"active",COLUMN_FIXED,nil)

#  /* set this column to a fixed sizing (of 50 pixels) */
  column.set_sizing(Gtk::TreeViewColumn::FIXED)
  column.set_fixed_width(50)
  treeview.append_column(column)

#  /* column for bug numbers */
	renderer = Gtk::CellRendererText.new
  column = Gtk::TreeViewColumn.new("Bug number",renderer,"text",1,nil)
	column.set_sort_column_id(COLUMN_NUMBER)
  treeview.append_column(column)
#  /* column for severities */
	renderer = Gtk::CellRendererText.new
	column = Gtk::TreeViewColumn.new("Severity",renderer,"text",2,nil)
	column.set_sort_column_id(COLUMN_SEVERITY)
	treeview.append_column(column)
#  /* column for description */
	renderer = Gtk::CellRendererText.new
  column = Gtk::TreeViewColumn.new("Description",renderer,"text",3,nil)
  column.set_sort_column_id(COLUMN_DESCRIPTION)
  treeview.append_column(column)
end

window = Gtk::Window.new
window.set_title("GtkListStore demo")
window.signal_connect("destroy"){Gtk.main_quit}
window.set_border_width(8)
vbox = Gtk::VBox.new(false,8)
window.add(vbox)
label = Gtk::Label.new("This is the bug list (note: not based on real data, it would be nice
 to have a nice ODBC interface to bugzilla or so, though).")
vbox.pack_start(label,false,false,0)
sw = Gtk::ScrolledWindow.new(nil,nil)
sw.set_shadow_type(Gtk::SHADOW_ETCHED_IN)
sw.set_policy(Gtk::POLICY_NEVER,Gtk::POLICY_AUTOMATIC)
vbox.pack_start(sw,true,true,0)
model = create_model()
treeview = Gtk::TreeView.new(model)
treeview.set_rules_hint(true)
treeview.set_search_column(COLUMN_DESCRIPTION)
sw.add(treeview)
add_columns(treeview)
window.set_default_size(280,250)
window.show_all
Gtk.main

以上がソースです。
ソースをそのまま貼り付けて良いのかわかりませんでしたが、これしか方法が無いため貼り付けさせて
いただきます。もし、この様なことは避けた方が良い、他に良い方法があるというのであればご教授く
ださい。よろしくお願いします。

In This Thread

Prev Next