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