HOMEUP

Ruby Gtk::TreeView ツリー形式での表示

ツリー形式での表示は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

実行結果

Ruby Gtk::TreeView ツリー表示 初期状態

プログラムを走らせて直後はこのようになります。ウィンドウは少し縮めてあります。

Ruby Gtk::TreeView ツリー表示 すべてのツリーを展開した状態

すべてのツリーを展開するとこんな感じです。

カラムのresizableをtrueにしておくと展開した時に勝手にカラムが広がってくれました。これはうれしい。

Gtk::TreeStore

RubyのGtk::TreeViewのサンプルとか探してもあまり見つからないのでcとかのコードを探して見よう見まねでやってみたところちゃんと動きました。

Gtk::TreeStore#new(type1,type2,type3, ...)
Gtk::TreeStoreを作成します。Gtk::ListStoreと同じような形式でカラムの型を指定します。
Gtk::TreeStore#append(parent)
新しい行を作成します。parentには親となるGtk::TreeIterを指定します。
parentにnilを指定するとルート要素(トップレベル?)になります。
作成された新しいGtk::TreeIterを返却します。
Gtk::TreeIter#set_value(column,value)
Gtk::TreeIterのカラムに値を設定します。

メインウィンドウのinitializeメソッドの中でGtk::TreeStoreを作成してGtk::TreeViewを作成する際にモデルとして与えています。ここでGtk::TreeStoreをGtk::ListStoreに変更しても他の部分はまったく変更なしで動作する。Gtk::TreeViewって便利ですね。

次回はGtk::TreeViewのイベント処理に挑戦してみます。

HOMEUP