?? gtktreemodel.sgml
字號:
<!-- ##### SECTION Title ##### -->GtkTreeModel<!-- ##### SECTION Short_Description ##### -->The tree interface used by #GtkTreeView<!-- ##### SECTION Long_Description ##### --><para>The #GtkTreeModel interface defines a generic tree interface for use bythe #GtkTreeView widget. It is an abstract interface, and is designedto be usable with any appropriate data structure. The programmer justhas to implement this interface on their own data type for it to beviewable by a #GtkTreeView widget.</para><para>The model is represented as a hierarchical tree of strongly-typed,columned data. In other words, the model can be seen as a tree whereevery node has different values depending on which column is beingqueried. The type of data found in a column is determined by using theGType system (ie. #G_TYPE_INT, #GTK_TYPE_BUTTON, #G_TYPE_POINTER, etc.).The types are homogeneous per column across all nodes. It is importantto note that this interface only provides a way of examining a model andobserving changes. The implementation of each individual model decideshow and if changes are made.</para><para>In order to make life simpler for programmers who do not need to writetheir own specialized model, two generic models are provided — the#GtkTreeStore and the #GtkListStore. To use these, the developer simplypushes data into these models as necessary. These models provide thedata structure as well as all appropriate tree interfaces. As a result,implementing drag and drop, sorting, and storing data is trivial. Forthe vast majority of trees and lists, these two models are sufficient.</para><para>Models are accessed on a node/column level of granularity. One canquery for the value of a model at a certain node and a certain columnon that node. There are two structures used to reference a particularnode in a model. They are the #GtkTreePath and the #GtkTreeIter<footnote><para>Here, <abbrev>iter</abbrev> is short for <quote>iterator</quote></para></footnote>Most of the interface consists of operations on a #GtkTreeIter.</para><para>A path is essentially a potential node. It is a location on a modelthat may or may not actually correspond to a node on a specific model.The #GtkTreePath struct can be converted into either an array ofunsigned integers or a string. The string form is a list of numbersseparated by a colon. Each number refers to the offset at that level.Thus, the path <quote>0</quote> refers to the root node and the path<quote>2:4</quote> refers to the fifth child of the third node.</para><para>By contrast, a #GtkTreeIter is a reference to a specific node on aspecific model. It is a generic struct with an integer and threegeneric pointers. These are filled in by the model in a model-specificway. One can convert a path to an iterator by callinggtk_tree_model_get_iter(). These iterators are the primary way ofaccessing a model and are similar to the iterators used by#GtkTextBuffer. They are generally statically allocated on the stack andonly used for a short time. The model interface defines a set ofoperations using them for navigating the model.</para><para>It is expected that models fill in the iterator with private data. Forexample, the #GtkListStore model, which is internally a simple linkedlist, stores a list node in one of the pointers. The #GtkTreeModelSortstores an array and an offset in two of the pointers. Additionally,there is an integer field. This field is generally filled with a uniquestamp per model. This stamp is for catching errors resulting from usinginvalid iterators with a model.</para><para>The lifecycle of an iterator can be a little confusing at first.Iterators are expected to always be valid for as long as the model isunchanged (and doesn't emit a signal). The model is considered to ownall outstanding iterators and nothing needs to be done to free them fromthe user's point of view. Additionally, some models guarantee that aniterator is valid for as long as the node it refers to is valid (mostnotably the #GtkTreeStore and #GtkListStore). Although generallyuninteresting, as one always has to allow for the case where iteratorsdo not persist beyond a signal, some very important performanceenhancements were made in the sort model. As a result, the#GTK_TREE_MODEL_ITERS_PERSIST flag was added to indicate this behavior.</para><para>To help show some common operation of a model, some examples areprovided. The first example shows three ways of getting the iter at thelocation <quote>3:2:5</quote>. While the first method shown is easier,the second is much more common, as you often get paths from callbacks.</para><para><example><title>Acquiring a <structname>GtkTreeIter</structname></title><programlisting>/* Three ways of getting the iter pointing to the location */{ GtkTreePath *path; GtkTreeIter iter; GtkTreeIter parent_iter; /* get the iterator from a string */ gtk_tree_model_get_iter_from_string (model, &iter, "3:2:5"); /* get the iterator from a path */ path = gtk_tree_path_new_from_string ("3:2:5"); gtk_tree_model_get_iter (model, &iter, path); gtk_tree_path_free (path); /* walk the tree to find the iterator */ gtk_tree_model_get_nth_child (model, &iter, NULL, 3); parent_iter = iter; gtk_tree_model_get_nth_child (model, &iter, &parent_iter, 2); parent_iter = iter; gtk_tree_model_get_nth_child (model, &iter, &parent_iter, 5);}</programlisting></example></para><para>This second example shows a quick way of iterating through a list andgetting a string and an integer from each row. The<function>populate_model</function> function used below is not shown, asit is specific to the #GtkListStore. For information on how to writesuch a function, see the #GtkListStore documentation.<example><title>Reading data from a <structname>GtkTreeModel</structname></title><programlisting>enum{ STRING_COLUMN, INT_COLUMN, N_COLUMNS};{ GtkTreeModel *list_store; GtkTreeIter iter; gboolean valid; gint row_count = 0; /* make a new list_store */ list_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_INT); /* Fill the list store with data */ populate_model (list_store); /* Get the first iter in the list */ valid = gtk_tree_model_get_iter_first (list_store, &iter); while (valid) { /* Walk through the list, reading each row */ gchar *str_data; gint int_data; /* Make sure you terminate calls to gtk_tree_model_get(<!-- -->) * with a '-1' value */ gtk_tree_model_get (list_store, &iter, STRING_COLUMN, &str_data, INT_COLUMN, &int_data, -1); /* Do something with the data */ g_print ("Row %d: (%s,%d)\n", row_count, str_data, int_data); g_free (str_data); row_count ++; valid = gtk_tree_model_iter_next (list_store, &iter); }}</programlisting></example></para><!-- ##### SECTION See_Also ##### --><para>#GtkTreeView, #GtkTreeStore, #GtkListStore, <link linkend="gtk-GtkTreeView-drag-and-drop">GtkTreeDnd</link>, #GtkTreeSortable</para><!-- ##### SECTION Stability_Level ##### --><!-- ##### STRUCT GtkTreeModel ##### --><para></para><!-- ##### SIGNAL GtkTreeModel::row-changed ##### --><para></para>@treemodel: the object which received the signal.@arg1: @arg2: <!-- ##### SIGNAL GtkTreeModel::row-deleted ##### --><para></para>@treemodel: the object which received the signal.@arg1: <!-- ##### SIGNAL GtkTreeModel::row-has-child-toggled ##### --><para></para>@treemodel: the object which received the signal.@arg1: @arg2: <!-- ##### SIGNAL GtkTreeModel::row-inserted ##### --><para></para>@treemodel: the object which received the signal.@arg1: @arg2: <!-- ##### SIGNAL GtkTreeModel::rows-reordered ##### --><para></para>@treemodel: the object which received the signal.@arg1: @arg2: @arg3: <!-- ##### STRUCT GtkTreeIter ##### --><para>The <structname>GtkTreeIter</structname> is the primary structure foraccessing a structure. Models are expected to put a unique integer inthe <structfield>stamp</structfield> member, and put model-specificdata in the three <structfield>user_data</structfield> members.</para>@stamp: A unique stamp to catch invalid iterators@user_data: Model specific data@user_data2: Model specific data@user_data3: Model specific data<!-- ##### STRUCT GtkTreePath ##### --><para></para><!-- ##### STRUCT GtkTreeRowReference ##### --><para></para><!-- ##### STRUCT GtkTreeModelIface ##### --><para></para>@g_iface: @row_changed: @row_inserted: @row_has_child_toggled: @row_deleted: @rows_reordered: @get_flags: @get_n_columns: @get_column_type: @get_iter: @get_path: @get_value: @iter_next: @iter_children: @iter_has_child: @iter_n_children: @iter_nth_child: @iter_parent: @ref_node: @unref_node: <!-- ##### USER_FUNCTION GtkTreeModelForeachFunc ##### --><para></para>@model: @path: @iter: @data: @Returns: <!-- ##### ENUM GtkTreeModelFlags ##### --><para>These flags indicate various properties of a #GtkTreeModel. They arereturned by gtk_tree_model_get_flags(), and must be static for thelifetime of the object. A more complete description of#GTK_TREE_MODEL_ITERS_PERSIST can be found in the overview of thissection.</para>@GTK_TREE_MODEL_ITERS_PERSIST: Iterators survive all signals emitted by the tree.@GTK_TREE_MODEL_LIST_ONLY: The model is a list only, and never has children<!-- ##### FUNCTION gtk_tree_path_new ##### --><para></para>@Returns: <!-- ##### FUNCTION gtk_tree_path_new_from_string ##### --><para></para>@path: @Returns: <!-- ##### FUNCTION gtk_tree_path_new_from_indices ##### --><para></para>@first_index: @Varargs: @Returns: <!-- ##### FUNCTION gtk_tree_path_to_string ##### --><para></para>@path: @Returns: <!-- ##### FUNCTION gtk_tree_path_new_first ##### --><para></para>@Returns: <!-- ##### MACRO gtk_tree_path_new_root ##### --><para>An alternate name for gtk_tree_path_new_first() provided forcompatibility reasons.</para>@Returns: A new #GtkTreePath.@Deprecated: Use gtk_tree_path_new_first() instead.<!-- ##### FUNCTION gtk_tree_path_append_index ##### --><para></para>@path: @index_: <!-- ##### FUNCTION gtk_tree_path_prepend_index ##### --><para></para>@path: @index_: <!-- ##### FUNCTION gtk_tree_path_get_depth ##### --><para></para>@path: @Returns: <!-- ##### FUNCTION gtk_tree_path_get_indices ##### --><para></para>@path: @Returns: <!-- ##### FUNCTION gtk_tree_path_free ##### --><para></para>@path: <!-- ##### FUNCTION gtk_tree_path_copy ##### --><para></para>@path: @Returns: <!-- ##### FUNCTION gtk_tree_path_compare ##### --><para>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -