ツリー形式での表示はGtk::TreeStoreを作成してデータを設定します。
とりあえずサンプルのコードを。前に書いたGtk::ListStoreを使う時のコードと違ってモデルを独立させています。
#!/usr/bin/env ruby require 'gtk2' # TestModelクラス class TestModel < Gtk::TreeStore # コンストラクタ def initialize() super String, String iter0 = append nil iter0.set_value 0, "モビルスーツ" iter1 = append iter0 iter1.set_value 0, "地球連邦" iter2 = append iter1 iter2.set_value 0, "RX-78-2" iter2.set_value 1, "ガンダム" iter2 = append iter1 iter2.set_value 0, "RX-77-2" iter2.set_value 1, "ガンキャノン" iter1 = append iter0 iter1.set_value 0, "ジオン公国" iter2 = append iter1 iter2.set_value 0, "MS-06A" iter2.set_value 1, "ザクII" iter0 = append nil iter0.set_value 0, "コロニー" end end # TreeViewクラス class TV < Gtk::TreeView # カラム COLUMNS = %w( 行 データ ) # コンストラクタ def initialize(model = nil) # TreeViewの作成 super model # カラムの設定 リサイズ可能にする crText = Gtk::CellRendererText.new COLUMNS.each_with_index do |name, idx| col = Gtk::TreeViewColumn.new name, crText, :text => idx col.resizable = true append_column col end end end # MainWindow class MainWindow < Gtk::Window # コンストラクタ def initialize() super set_title "TreeViewのテスト" set_default_size 600, 400 # ScrolledWindow sw = Gtk::ScrolledWindow.new sw.set_policy Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC # テストモデルを作成 @model = TestModel.new # TreeView(TV)を作成して追加 @tv = TV.new @model add(sw.add(@tv)) # シグナル signal_connect "destroy" do Gtk.main_quit end end end # w = MainWindow.new w.show_all Gtk.main
プログラムを走らせて直後はこのようになります。ウィンドウは少し縮めてあります。
すべてのツリーを展開するとこんな感じです。
カラムのresizableをtrueにしておくと展開した時に勝手にカラムが広がってくれました。これはうれしい。
RubyのGtk::TreeViewのサンプルとか探してもあまり見つからないのでcとかのコードを探して見よう見まねでやってみたところちゃんと動きました。
メインウィンドウのinitializeメソッドの中でGtk::TreeStoreを作成してGtk::TreeViewを作成する際にモデルとして与えています。ここでGtk::TreeStoreをGtk::ListStoreに変更しても他の部分はまったく変更なしで動作する。Gtk::TreeViewって便利ですね。
次回はGtk::TreeViewのイベント処理に挑戦してみます。