Tableのモデルとデータ供給
Tableはセルの値を保持しません。アプリケーションが保持する配列やレコードを、Table::Model::Handlerのコールバック経由で読み取ります。この分離により、表示とデータの更新を別々に扱えます。
モデルの契約
読み取り専用のModelでは、Handlerに次の4つを登録します。
num_columns: モデル列数column_type: 各モデル列のTable::Value::Typenum_rows: 現在の行数cell_value: 指定された行・列の値
スキーマ(列数と列型)は、Handlerを最初にModelへ渡した時点で固定されます。行数とセル値はその後も問い合わせられるため、元データを参照するクロージャにします。
rows = ["Crystal", "Ruby"]
handler = UIng::Table::Model::Handler.new do
num_columns { 1 }
column_type { |_column| UIng::Table::Value::Type::String }
num_rows { rows.size }
cell_value do |row, _column|
UIng::Table::Value.new(rows[row])
end
end
model = UIng::Table::Model.new(handler)
set_cell_valueは、編集可能なセルの変更やボタン列のクリックを扱うときだけ追加します。
読み取り専用のTableでは省略できます。受け取る値はコールバック中だけ有効です。編集を
元データへ反映する例は次の章で扱います。
行番号とモデル列番号は0始まりです。表示列が参照するモデル列は、append_text_column("Name", 0, ...)のように指定します。
値の型と所有権
column_typeが返す型とcell_valueが返すTable::Valueの型は一致させます。主な型はString、Image、Int、Colorです。チェックボックスと進捗バーはIntを使います。
cell_valueは呼ばれるたびに新しいTable::Valueを返します。返した値の所有権はlibui-ngへ移るため、再利用やfreeはしません。一方、set_cell_valueで受け取る値は借用値であり、そのコールバック内だけで読み取ります。
HandlerはModelが保持します。ただし、Handlerのクロージャが参照する元データは、Tableを使う間はアプリケーション側でも有効に保ちます。
次は、モデル列をネイティブの表示列へ対応付け、編集と選択を追加します: 列・編集・選択。