seedとGtkTreeView関係とMVCモデル
SeedでList表示しようと思い、いろいろ調べていたんだけど、結局完全には理解できていない。基本的には、seed-exampleの gtktreeview.js を使い回しすれば良いのですが、微妙に納得できていないところがあるので、思うままに書きます。
devhelp では "Tree and List Widget Overview" がList表示の概念で、MVC モデルになっています。
まず、モデルから。モデルは GtkListStore と GtkTreeStore が使えますが、sample にもあるので、 GtkListStore を使います。イテレーターとして、 GtkTreeIter を使ってそれぞれの要素を保持します。
次にビューだが、リスト形式のviewは無いので、 GtkTreeView を使います。GteTreeView の個々の列は、 GtkTreeViewColumn とし、 セルひとつひとつは GtkCellRendererText を使って表示します。セルの表示には、 GtkCellRendererText GtkCellRendererPixbuf GtkCellRendererToggle があり、テキストや画像やブール値を表示できます。
ここまでできれば、後はプログラムを書くだけです。
#! /usr/bin/env seed var Gtk = imports.gi.Gtk; var GObject = imports.gi.GObject; Gtk.init(Seed.argv); // model var store = new Gtk.ListStore(); store.set_column_types(1, [GObject.TYPE_STRING]); var iter = new Gtk.TreeIter(); store.append(iter); store.set_value(iter, 0, [GObject.TYPE_STRING, "first"]); store.append(iter); store.set_value(iter, 0, [GObject.TYPE_STRING, "second"]); store.append(iter); store.set_value(iter, 0, [GObject.TYPE_STRING, "third"]); store.append(iter); store.set_value(iter, 0, [GObject.TYPE_STRING, "short"]); // view var column = new Gtk.TreeViewColumn(); var cell = new Gtk.CellRendererText(); column.pack_start(cell); column.add_attribute(cell, "text", 0); var tree = new Gtk.TreeView(); tree.append_column(column); tree.set_model(store); var win = new Gtk.Window(); win.signal.destroy.connect(Gtk.main_quit); win.add(tree); win.show_all(); Gtk.main();
初めはモデルを作ります。
var store = new Gtk.ListStore(); で GtkListStore を作成し、store.set_column_types(1, [GObject.TYPE_STRING]); で、コラムは1列に形式はGObject.TYPE_STRING (文字列)にします。本来なら、形式を指定して Gtk.ListView を new すべきですが、、、やり方が分からないので後から指定します。
var iter = new Gtk.TreeIter(); で要素ひとつのオブジェクトを作り、 store.append(iter); で、第一要素を追加します。内部ソースは確認してないが、この時 GtkTreeIter iter 分のメモリが確保されると思います。次に、 store.set_value(iter, 0, [GObject.TYPE_STRING, "first"]); で、 iter 形式の 0 列目(1列しか無いけど)を [GObject.TYPE_STRING, "first"] にします。
その後、次々に要素を追加し、値を代入していきます。
次にビューを作ります。
var column = new Gtk.TreeViewColumn();
これで、 GtkTreeView に挿入する列オブジェクトを作成します。次に、各セルの表示用 widget を var cell = new Gtk.CellRendererText(); で作成し、 column.pack_start(cell); で cell を 最初の列に pack を開始します。そして、
column.add_attribute(cell, "text", 0); で属性を "text" にします。 0 は最初の列を意味します。 GtkCellRendererText の場合は "text" で問題ありません。
そして、 var tree = new Gtk.TreeView(); で GtkTreeView を作り、 tree.append_column(column); で、列のビューを追加します。そして、tree.set_model(store); で GtkTreeView のモデルを GtkListStore にします。
最後に、 var win = new Gtk.Window(); でトップレベルの widget を作っていつもどおりの処理になります。
流れとして、モデルを作成し、ビューを作って表示する感じになります。本来なら、コントロール(signal処理)が必要になりますが、今回はありません。
やっと、seedでMVCプログラムが書けそうです。