リスト

2010年2月11日

ファイル

19-list.tar.gz

内容

リストを作ります。GtkTreeView を使います。

	list = gtk_tree_view_new();

リストの作成には gtk_list_store_new() を使います。

	store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_UINT);
	gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store));

gtk_list_store_new() の第 1 引数は列の数、それ以降は列の数だけ列のデータタイプを指定しています。列の ID を次のように定義しています。

enum{
	COLUMN_ITEM,
	COLUMN_NUM,
	N_COLUMNS,
};

N_COLUMNS を一番下に置くことで、自然に列の個数として定義されます。

列を追加します。

	renderer = gtk_cell_renderer_text_new();
	g_object_set_data(G_OBJECT(renderer),
	  "column", GINT_TO_POINTER(COLUMN_ITEM));
	column = gtk_tree_view_column_new_with_attributes(
	  "Item", renderer,
	  "text", COLUMN_ITEM,
	  NULL);
	gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);

	renderer = gtk_cell_renderer_text_new();
	g_object_set_data(G_OBJECT(renderer),
	  "column", GINT_TO_POINTER(COLUMN_NUM));
	column = gtk_tree_view_column_new_with_attributes(
	  "Num", renderer,
	  "text", COLUMN_NUM,
	  "editable", TRUE,
	  NULL);
	gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);

g_object_set_data() で、後で使うために列 ID を設定しています。gtk_tree_view_column_new_with_attributes() の第 3 引数以降は属性のペアの列で、NULL で終わりを表わします。"Num" の列の "editable" に TRUE を指定することで、列を編集可能にしています。編集された値を設定できるように、"edited" イベントを拾っておきます。

	g_signal_connect(renderer, "edited", G_CALLBACK(cell_edited), store);

リストに項目を追加します。

	gtk_list_store_append(store, &iter);
	gtk_list_store_set(store, &iter,
	  COLUMN_ITEM, "apple",
	  COLUMN_NUM, 1,
	  -1);

	gtk_list_store_append(store, &iter);
	gtk_list_store_set(store, &iter,
	  COLUMN_ITEM, "lemon",
	  COLUMN_NUM, 2,
	  -1);

gtk_list_sotre_set() の第 3 引数以降は列の ID と値のペアで、-1 で終わりを表わします。

編集された値を有効にするには、"edited" イベントのコールバック関数で以下のようにします。

void cell_edited(GtkCellRendererText *cell, const char *path_str,
  const char *text, GtkListStore *store)
{
	GtkTreePath *path;
	GtkTreeIter iter;
	int column;

	path = gtk_tree_path_new_from_string(path_str);
	gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path);

編集されたセルの位置 iter を取得します。

	column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column"));

列の ID を取得します (g_object_set_data() で設定しておいたもの)。

	if(column == COLUMN_NUM){
		gtk_list_store_set(store, &iter, column, atoi(text), -1);
	}
}

目的の列であれば、値を更新します。

GTK+ プログラミング 目次へ