GtkTreeView

Gtk+-1.2にあったGtkCListやGtkTree、GtkCTreeに代わるもの。GtkTreeViewでは、見た目やデータを分離したModel/View/Controllerという設計が取られている。

関連するWidgetやデータ型

GtkTreeView

 ツリー型のViewを実現するWidget。後述のGtkTreeViewColumnのコンテナとなっている。なお、GtkTreeModelなどと接続されるまで実際の描画は行われない模様。(Modelの中身は空でも良い。)

生成するための関数プロトタイプ

  1. GtkWidget* gtk_tree_view_new(void);

他のWidgetと同じでGtkWidget型へのポインタを返すことに注意。

GtkTreeViewColumn

GtkTreeViewに列を表現するためのWidget。後述のGtkCellRendererのコンテナとなっている。

生成するための関数プロトタイプ

  1. GtkTreeViewColumn* gtk_tree_view_column_new (void);

こいつはまんまGtkTreeViewColumn型へのポインタを返す。

GtkTreeViewとの関連付け関数

  1. gint gtk_tree_view_append_column (GtkTreeView *tree_view,
  2. GtkTreeViewColumn *column);
  3. gint gtk_tree_view_insert_column (GtkTreeView *tree_view,
  4. GtkTreeViewColumn *column,
  5. gint position);

などがある。ともに何番目の列となったかが戻り値となる。

GtkCellRenderer

セルを表現するためのWidget。文字列や画像、真偽のいずれを扱うかによってGtkCellRendererTextGtkCellRendererPixbufGtkCellRendererToggleに分類される。真偽は、トグルボタンとして表現される。その特性上、一つのGtkTreeColumnに対して複数のGtkCellRendererをパッキングすることが可能。

生成するための関数プロトタイプ

  1. GtkCellRenderer* gtk_cell_renderer_text_new (void);
  2. GtkCellRenderer* gtk_cell_renderer_pixbuf_new(void);
  3. GtkCellRenderer* gtk_cell_renderer_toggle_new(void);

順にGtkCellRendererTextGtkCellRendererPixbufGtkCellRendererToggleを生成するが、全てGtkCellRenderer型へのポインタを返す。

GtkCellRenderで設定可能なプロパティ

gtk_tree_view_column_add_attributeなどで設定できるプロパティの種類

GtkCellRendererText

"attributes"PangoAttrListRead / Write
"background"gchararrayWrite
"background-gdk"GdkColorRead / Write
"background-set"gbooleanRead / Write
"editable"gbooleanRead / Write
"editable-set"gbooleanRead / Write
"family"gchararrayRead / Write
"family-set"gbooleanRead / Write
"font"gchararrayRead / Write
"font-desc"PangoFontDescriptionRead / Write
"foreground"gchararrayWrite
"foreground-gdk"GdkColorRead / Write
"foreground-set"gbooleanRead / Write
"language"gchararrayRead / Write
"language-set"gbooleanRead / Write
"markup"gchararrayWrite
"rise"gintRead / Write
"rise-set"gbooleanRead / Write
"scale"gdoubleRead / Write
"scale-set"gbooleanRead / Write
"single-paragraph-mode"gbooleanRead / Write
"size"gintRead / Write
"size-points"gdoubleRead / Write
"size-set"gbooleanRead / Write
"stretch"PangoStretchRead / Write
"stretch-set"gbooleanRead / Write
"strikethrough"gbooleanRead / Write打ち消し線
"strikethrough-set"gbooleanRead / Write
"style"PangoStyleRead / Write
"style-set"gbooleanRead / Write
"text"gchararrayRead / Write
"underline"PangoUnderlineRead / Write
"underline-set"gbooleanRead / Write
"variant"PangoVariantRead / Write
"variant-set"gbooleanRead / Write
"weight"gintRead / Write
"weight-set"gbooleanRead / Write

GtkCellRendererPixbuf

"pixbuf"GdkPixbufRead / Write
"pixbuf-expander-closed"GdkPixbufRead / Write
"pixbuf-expander-open"GdkPixbufRead / Write
"stock-detail"gchararrayRead / Write
"stock-id"gchararrayRead / Write
"stock-size"guintRead / Write

GtkCellRendererToggle

"activatable"gbooleanRead / Write
"active"gbooleanRead / Write
"inconsistent"gbooleanRead / Write
"radio"gbooleanRead / Write

GtkTreeModel

GtkTreeStore,GtkListStore

列(フィールド)に設定できる型

  • G_TYPE_BOOLEAN
  • G_TYPE_INT, G_TYPE_UINT
  • G_TYPE_LONG, G_TYPE_ULONG, G_TYPE_INT64, G_TYPE_UINT64 (these are not supported in early gtk+-2.0.x versions)
  • G_TYPE_FLOAT, G_TYPE_DOUBLE
  • G_TYPE_STRING - stores a string in the store (オリジナルの文字列のコピーを作成する。)
  • G_TYPE_POINTER - stores a pointer value (Storeの中には、全くコピーを作成せず、ただポインタのみが保存される。)
  • GDK_TYPE_PIXBUF - stores a GdkPixbuf in the store (increases the pixbuf's refcount, see below)

G_TYPE_POINTERを除いてメモリの解放を心配する必要はない。GtkTreeViewが破棄されると同時に解放される。つまり、G_TYPE_POINTER型のフィールドについては、プログラマでメモリの解放の面倒を見る必要がある。

関連リンク

その他のメモ

カーソル位置

  • gtk_tree_view_set_cursor ()
  • gtk_tree_view_set_cursor_on_cell ()
  • gtk_tree_view_get_cursor ()

ノードの展開と省略

  • gtk_tree_view_expand_all ()
  • gtk_tree_view_collapse_all ()
  • gtk_tree_view_expand_to_path ()
  • gtk_tree_view_expand_row ()
  • gtk_tree_view_collapse_row ()

検索

  • gtk_tree_view_set_enable_search ()
  • gtk_tree_view_get_enable_search ()
  • gtk_tree_view_get_search_column ()
  • gtk_tree_view_set_search_column ()
  • gtk_tree_view_get_search_equal_func ()
  • gtk_tree_view_set_search_equal_func ()

gtk_tree_model_getでG_TYPE_STRING型の項目を取得する場合

  1. gchar *path; // 初期化の必要無し
  2. (中略)
  3. gtk_tree_model_get (GTK_TREE_MODEL (store), iter, COL_FULL_PATH, &path, -1);

受け取るgchar型のポインタについては、初期化の必要はないが、&を用いてポインタへのポインタを渡すこと。

実際に表示する項目については、UTF-8化して置くこと

でないとPangoがレンダリングできない。

  • g_convert
  • g_locale_to_utf8

などを利用。非表示の項目についてはそのままでも可。

ダミーノードを使って展開されたときに新たにchildを作る

ダミーノードを削除するのは、必要なchildを作成してから。でないと削除した時点で展開が解かれてしまう。

gtk_list_store_setでは、コピーが格納される。(G_TYPE_POINTERを除く)

http://scentric.net/tutorial/sec-treemodel-data-manipulation.html

You do not need to worry about allocating and freeing memory for the data to store. The model (or more precisely: the GLib/GObject GType and GValue system) will take care of that for you. If you store a string, for example, the model will make a copy of the string and store that. If you then set the field to a new string later on, the model will automatically free the old string and again make a copy of the new string and store the copy. This applies to almost all types, be it G_TYPE_STRING or GDK_TYPE_PIXBUF.

gtk_tree_model_getで取得したデータは、解放する必要がある

http://scentric.net/tutorial/sec-treemodel-data-retrieval.html より

  1. gchar *first_name, *last_name, *tree_path_str;
  2. guint year_of_birth;
  3. /* Note: here we use 'iter' and not '&iter', because we did not allocate
  4. * the iter on the stack and are already getting the pointer to a tree iter */
  5. gtk_tree_model_get (model, iter,
  6. COL_FIRST_NAME, &first_name,
  7. COL_LAST_NAME, &last_name,
  8. COL_YEAR_BORN, &year_of_birth,
  9. -1);
  10. tree_path_str = gtk_tree_path_to_string(path);
  11. g_print ("Row %s: %s %s, born %u\n", tree_path_str,
  12. first_name, last_name, year_of_birth);
  13. g_free(tree_path_str);
  14. g_free(first_name); /* gtk_tree_model_get made copies of */
  15. g_free(last_name); /* the strings for us when retrieving them */

GdkCellRendererPixbufでストックアイコンを表示したい場合

Gtk+で標準で用意されているストックアイコンを使用するには、GdkCellRendererPixbufの"stock-id"プロパティを設定する。その場合、関係する列は、G_TYPE_STRINGである必要があり、ストックアイコンのストックIDを格納する。

ストックIDについては、以下を参照。

http://developer.gnome.org/doc/API/2.0/gtk/gtk-Stock-Items.html

GtkTreeStoreと違ってGtkListStoreは、二度と取得できない?

GtkTreeModelを取得して、GTK_LIST_STOREでキャストすると大丈夫。

GDK_TYPE_PIXBUFのフィールドがある時

gtk_tree_store_set()において画像がない場合には、明示的にNULLをセットすること。でないとセグフォが起こる。