HOMEUP

Ruby Gtk::TreeView 表形式での表示

Ruby/GtkでGtk::TreeViewを使ったサンプルとか少なかったので自分用のメモです。

MVC(Model View Controller)に関して

注: MVCページを新たに作成予定?

Model (モデル)
データと手続きを担当する。
View (ビュー)
ModelのデータをGUI表示する。
Controller (コントローラ)
ユーザがマウスでクリックしたとか、キーボードからの入力があった時の処理を担当する。ControllerはViewへの描画やModelのデータ変更を直接行ってはいけないとの事。
参考 : Model View Controller (Wikipedia)

Ruby Gtk::TreeViewでの表示

以下、とりあえず動いたサンプルコードです。

現時点(2008-08-14)ではRubyは久しぶりなのでいろいろと変な事をやっていると思います。Gtk::TreeViewを継承したTVクラスを作成してその中でModel作ったりとか…

実際にはGtk::Windowを継承したMainWindowクラス内でモデルを作成してビューを作成して関連付ける。のようにするのが正しそうなんですが…次回からはそうやってコーディングします。

    1 #!/usr/bin/env ruby
    2 
    3 require 'gtk2'
    4 
    5 # TreeViewクラス
    6 class TV < Gtk::TreeView
    7   # カラム
    8   COLUMNS = ["行", "データ"]
    9 
   10   # コンストラクタ
   11   def initialize()
   12     # モデルの作成
   13     @model = Gtk::ListStore.new(Integer,String)
   14     # TreeViewの作成
   15     super @model
   16     # カラムの設定 リサイズ可能にする
   17     crText = Gtk::CellRendererText.new
   18     COLUMNS.each_with_index do |name, idx|
   19       col = Gtk::TreeViewColumn.new name, crText, :text => idx
   20       col.resizable = true
   21       append_column col
   22     end
   23     # データの設定
   24     0.upto(100) do |row|
   25       iter = @model.append
   26       iter[0] = row
   27       iter[1] = "データ#{row}"
   28     end
   29   end
   30 end
   31 
   32 # MainWindow
   33 class MainWindow < Gtk::Window
   34   # コンストラクタ
   35   def initialize()
   36     super
   37     set_title "TreeViewのテスト"
   38     set_default_size 100, 100
   39     # ScrolledWindow
   40     sw = Gtk::ScrolledWindow.new
   41     sw.set_policy Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC
   42     # TreeView(TV)を作成して追加
   43     tv = TV.new
   44     add(sw.add(tv))
   45     # シグナル
   46     signal_connect "destroy" do
   47       Gtk.main_quit
   48     end
   49   end
   50 end
   51 
   52 #
   53 w = MainWindow.new
   54 w.show_all
   55 Gtk.main

このソース、コピペして使いにくい。ちゃんとコピペできるようにこっちへ再アップしました→Ruby Hpricot + GNU Source-highlight

13 : モデル作成
Gtk::ListStore.newでModelを作成しています。引数のInteger, Stringはカラムに入るデータの型です。24-28で0から100までのデータを作成してモデルに設定しています。
最初のカラムにはrowつまりInteger、2番目のカラムに文字列を設定しているのでGtk::ListStore.newの引数がInteger, Stringとなります。
Gtk::CellRendererTextがうまく表示してくれるみたいです。
14 : ビュー作成
スーパークラスのコンストラクタを呼び出しています。
17-22 : カラムの設定
17でGtk::CellRendererTextを作成。他にもGtk::CellRendererXXXXがいろいろとあるのでその内試してみます。
18-22でカラムを設定しています。20ではセルのサイズをマウスで変えられるようにしています。
24-28 : データの設定
モデルにデータを設定しています。(ここをコーディング時にモデルをビュー内にいれたのが失敗と気づく OTL)
31- : メインウィンドウ作成
メインウィンドウを作成し、Gtk.mainループに入ります。
Ruby Gtk::TreeView 表形式での表示

実行結果は左のような感じです。デフォルトサイズ100×100はちょっと小さすぎたので実行後にリサイズしてスナップショットを撮っています。


HOMEUP