GtkTreeModel
GtkTreeModel — Деревовидный интерфейс, используемый GtkTreeView
Функции
| gboolean | gtk_tree_model_iter_nth_child () |
| gboolean | gtk_tree_model_iter_parent () |
| char * | gtk_tree_model_get_string_from-iter () |
| void | gtk_tree_model_ref_node () |
| void | gtk_tree_model_unref_node () |
| void | gtk_tree_model_get () |
| void | gtk_tree_model_get_valist () |
| void | gtk_tree_model_foreach () |
| void | gtk_tree_model_row_changed () |
| void | gtk_tree_model_row_inserted () |
| void | gtk_tree_model_row_has-child-toggled () |
| void | gtk_tree_model_row_deleted () |
| void | gtk_tree_model_rows-reordered () |
| void | gtk_tree_model_rows-reordered-with-length () |
Сигналы
| void | row-changed | Run Last |
| void | row-deleted | Run First |
| void | row-has-child-toggled | Run Last |
| void | row-inserted | Run First |
| void | rows-reordered | Run First |
Типы и значения
| GtkTreeModel | |
| struct | GtkTreeIter |
| GtkTreePath | |
| GtkTreeRowReference | |
| struct | GtkTreeModelIface |
| перечисление | GtkTreeModelFlags |
Иерархия объектов
GBoxed ├── GtkTreeIter ╰── GtkTreePath GInterface ╰── GtkTreeModel
Предварительные требования
GtkTreeModel требует GObject.
Известные производные интерфейсы
GtkTreeModel необходим для GtkTreeSortable.
Известные реализации
GtkTreeModel реализован в GtkListStore, GtkTreeModelFilter, GtkTreeModelSort и GtkTreeStore.
Файлы заголовочных определений
#include <gtk/gtk.h>
Описание
Интерфейс GtkTreeModel определяет общий интерфейс дерева, используемый виджетом GtkTreeView. Это абстрактный интерфейс, предназначенный для использования с любой подходящей структурой данных. Разработчик просто должен реализовать этот интерфейс для своего собственного типа данных, чтобы он отображался виджетом GtkTreeView.
Модель представляется иерархическим деревом данных со строгими типами и колонками. Другими словами, модель можно рассматривать как дерево, где каждый узел имеет различные значения в зависимости от запрашиваемой колонки. Тип данных в колонке определяется с помощью системы GType (например, G_TYPE_INT, GTK_TYPE_BUTTON, G_TYPE_POINTER и т.д.). Типы однородны по колонке во всех узлах. Важно отметить, что этот интерфейс предоставляет только способ проверки модели и наблюдения за изменениями. Реализация каждой отдельной модели определяет, как и будут ли происходить изменения.
Для упрощения работы программистов, которым не нужно писать свою специализированную модель, предоставляются две общие модели — GtkTreeStore и GtkListStore. Для их использования разработчик просто добавляет данные в эти модели по мере необходимости. Эти модели предоставляют структуру данных и все соответствующие интерфейсы дерева. В результате реализация перетаскивания, сортировки и хранения данных становится тривиальной. Для подавляющего большинства деревьев и списков этих двух моделей достаточно.
Модели обращаются к узлам на уровне узла/колонки. Можно запросить значение модели в определённом узле и определённой колонке этого узла. Для ссылки на конкретный узел в модели используются две структуры: GtkTreePath и GtkTreeIter («итер» — сокращение от «итератор»). Большая часть интерфейса состоит из операций с GtkTreeIter.
Путь, по сути, представляет собой потенциальный узел. Это местоположение в модели, которое может или не может фактически соответствовать узлу в конкретной модели. GtkTreePath может быть преобразован в массив целых беззнаковых чисел или строку. Строковая форма представляет собой список чисел, разделённых двоеточием. Каждое число относится к смещению на этом уровне. Таким образом, путь 0 относится к корневому узлу, а путь 2:4 — к пятому дочернему узлу третьего узла.
В отличие от этого, GtkTreeIter — это ссылка на конкретный узел в конкретной модели. Это общая структура с целым числом и тремя общими указателями. Они заполняются моделью специфичным для модели способом. Путь можно преобразовать в итератор, вызвав gtk_tree_model_get_iter(). Эти итераторы являются основным способом доступа к модели и похожи на итераторы, используемые GtkTextBuffer. Обычно они статически выделены в стеке и используются только непродолжительное время. Интерфейс модели определяет набор операций с их использованием для навигации по модели.
Ожидается, что модели заполнят итератор собственными данными. Например, модель GtkListStore, которая внутренне представляет собой простой связанный список, хранит узел списка в одном из указателей. GtkTreeModelSort хранит массив и смещение в двух указателях. Кроме того, есть поле целого типа. Это поле обычно заполняется уникальной меткой для каждой модели. Эта метка предназначена для обнаружения ошибок, возникающих при использовании недопустимых итераторов с моделью.
Жизненный цикл итератора может показаться сложным на первый взгляд. Ожидается, что итераторы всегда будут действительными, пока модель не изменится (и не выведет сигнал). Модель считается владельцем всех активных итераторов, и с точки зрения пользователя ничего делать не нужно, чтобы их освободить. Кроме того, некоторые модели гарантируют, что итератор действителен, пока узел, на который он ссылается, действителен (в первую очередь GtkTreeStore и GtkListStore). Хотя это обычно неинтересно, поскольку всегда нужно учитывать случай, когда итераторы не сохраняются после сигнала, были внесены некоторые очень важные улучшения производительности в модели сортировки. В результате был добавлен флаг GTK_TREE_MODEL_ITERS_PERSIST для указания этого поведения.
Для демонстрации некоторых общих операций модели приведены примеры. Первый пример показывает три способа получения итератора в местоположении 3:2:5. Хотя первый показанный метод проще, второй гораздо более распространён, поскольку вы часто получаете пути от обратных вызовов.
Получение GtkTreeIter
Этот второй пример демонстрирует быстрый способ перебора списка и получения строки и целого числа из каждой строки. Функция populate_model() ниже не показана, так как она специфична для GtkListStore. Сведения о написании такой функции см. в документации GtkListStore.
Чтение данных из GtkTreeModel
// 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_iter_nth_child (model, &iter,
NULL, 3);
parent_iter = iter;
gtk_tree_model_iter_nth_child (model, &iter,
&parent_iter, 2);
parent_iter = iter;
gtk_tree_model_iter_nth_child (model, &iter,
&parent_iter, 5);Интерфейс GtkTreeModel содержит два метода для управления счётчиками ссылок: gtk_tree_model_ref_node() и gtk_tree_model_unref_node(). Эти два метода необязательно реализовывать. Управление счётчиками ссылок предназначено для того, чтобы представления могли сообщать моделям, когда узлы отображаются. GtkTreeView будет брать ссылку на узел, когда он отображается, что означает, что узел находится на верхнем уровне или развернут. Отображение узла не означает, что он в данный момент непосредственно виден пользователю в области просмотра. Основываясь на этой схеме управления ссылками, модель кэширования, например, может решить, нужно ли кэшировать узел на основе количества ссылок. Модель, основанная на файловой системе, не должна хранить всю иерархию файлов в памяти, а только те папки, которые в настоящее время развернуты в каждом текущем представлении.
При работе с управлением ссылками необходимо учитывать следующие правила:
Никогда не берут ссылку на узел без владения ссылкой на его родительский узел. Это означает, что все родительские узлы ссылаемого узла также должны быть сохранены.
Невыпущенные ссылки на удалённый узел не освобождаются. Это невозможно, потому что узел уже был удалён к моменту получения сигнала об удалении строки.
Модели не обязаны генерировать сигнал для строк, ни один из его братьев или сестёр не ссылается. Другими словами, сигналы требуются только для уровней, где узлы имеют ссылки. Однако для корневого уровня сигналы должны генерироваться постоянно (но корневой уровень всегда связан, когда прикреплено любое представление).
Функции
GtkTreeModelForeachFunc ()
gboolean (*GtkTreeModelForeachFunc) (GtkTreeModel *model,GtkTreePath *path,GtkTreeIter *iter,gpointer data);
Тип обратного вызова, передаваемого в gtk_tree_model_foreach() для итерации по строкам в модели дерева.
Параметры
model | итерируемая модель GtkTreeModel | |
path | текущий GtkTreePath | |
iter | текущий GtkTreeIter | |
data | Данные пользователя, переданные в | [closure] |
Возвращаемое значение
TRUE для остановки итерации, FALSE для продолжения
gtk_tree_path_new ()
GtkTreePath *
gtk_tree_path_new (void); Создает новый GtkTreePath. Он относится к строке.
Возвращаемое значение
Созданный GtkTreePath.
gtk_tree_path_new_from_string ()
GtkTreePath *
gtk_tree_path_new_from_string (const char *path); Создает новый GtkTreePath, инициализированный значением path .
path должен представлять собой список чисел, разделенных двоеточиями. Например, строка “10:4:0” создает путь глубиной 3, указывающий на 11-го потомка узла корня, 5-го потомка этого 11-го потомка и 1-го потомка этого 5-го потомка. Если передана недопустимая строка пути, возвращается NULL.
Параметры
path | Строковое представление пути |
gtk_tree_path_new_from_indices ()
GtkTreePath * gtk_tree_path_new_from_indices (int first_index,...);
Создает новый путь с first_index и varargs в качестве индексов.
Параметры
first_index | первое целое число | |
... | список целых чисел, завершаемый -1 |
Возвращаемое значение
Созданный GtkTreePath
gtk_tree_path_new_from_indicesv ()
GtkTreePath * gtk_tree_path_new_from_indicesv (int *indices,gsize length);
Создает новый путь с заданным массивом indices индексов length .
[rename-to gtk_tree_path_new_from_indices]
Параметры
indices | массив индексов. | [array length=length] |
length | длина массива |
Возвращаемое значение
Созданный GtkTreePath
gtk_tree_path_to_string ()
char *
gtk_tree_path_to_string (GtkTreePath *path); Генерирует строковое представление пути.
Эта строка представляет собой список чисел, разделенных двоеточиями. Например, “4:10:0:3” — допустимое значение для этой строки. Если глубина пути равна 0, возвращается NULL.
Параметры
path |
Возвращаемое значение
Выделенная строка. Необходимо освободить с помощью g_free().
[nullable]
gtk_tree_path_new_first ()
GtkTreePath *
gtk_tree_path_new_first (void); Создает новый GtkTreePath.
Строковое представление этого пути — “0”.
Возвращаемое значение
Новый GtkTreePath
gtk_tree_path_append_index ()
void gtk_tree_path_append_index (GtkTreePath *path,int index_);
Добавляет новый индекс к пути.
В результате глубина пути увеличивается.
Параметры
path | ||
index_ | индекс |
gtk_tree_path_prepend_index ()
void gtk_tree_path_prepend_index (GtkTreePath *path,int index_);
Добавляет новый индекс к началу пути.
В результате глубина пути увеличивается.
Параметры
path | ||
index_ | индекс |
gtk_tree_path_get_depth ()
int
gtk_tree_path_get_depth (GtkTreePath *path); Возвращает текущую глубину path .
Параметры
path |
Возвращаемое значение
Глубина path
gtk_tree_path_get_indices ()
int *
gtk_tree_path_get_indices (GtkTreePath *path); Возвращает текущие индексы path .
Это массив целых чисел, каждый из которых представляет узел в дереве. Это значение не должно освобождаться.
Длина массива может быть получена с помощью gtk_tree_path_get_depth().
[skip]
Параметры
path |
Возвращаемое значение
Текущие индексы или NULL.
[nullable]
gtk_tree_path_get_indices_with_depth ()
int * gtk_tree_path_get_indices_with_depth (GtkTreePath *path,int *depth);
Возвращает текущие индексы path.
Это массив целых чисел, каждый из которых представляет узел в дереве. Также возвращается количество элементов в массиве. Массив не нужно освобождать.
[rename-to gtk_tree_path_get_indices]
Параметры
path | ||
depth | место для возврата количества элементов, возвращённых в целочисленном массиве, или | [out][allow-none] |
Возвращает
Текущие индексы, или NULL.
[array length=depth][transfer none]
gtk_tree_path_free ()
void
gtk_tree_path_free (GtkTreePath *path); Освобождает path. Если path равно NULL, функция просто возвращает.
Параметры
path | a GtkTreePath. | [allow-none] |
gtk_tree_path_copy ()
GtkTreePath *
gtk_tree_path_copy (const GtkTreePath *path); Создаёт новый GtkTreePath как копию path.
Параметры
path |
Возвращает
новый GtkTreePath
gtk_tree_path_compare ()
int gtk_tree_path_compare (const GtkTreePath *a,const GtkTreePath *b);
Сравнивает два пути.
Если a предшествует b в дереве, возвращается -1. Если b предшествует a, возвращается 1. Если два узла равны, возвращается 0.
Параметры
a | ||
b | a GtkTreePath для сравнения |
Возвращает
относительное положение a и b
gtk_tree_path_next ()
void
gtk_tree_path_next (GtkTreePath *path); Перемещает path для указания на следующий узел на текущей глубине.
Параметры
path |
gtk_tree_path_prev ()
gboolean
gtk_tree_path_prev (GtkTreePath *path); Перемещает path для указания на предыдущий узел на текущей глубине, если он существует.
Параметры
path |
Возвращает
TRUE если у path есть предыдущий узел и перемещение выполнено
gtk_tree_path_up ()
gboolean
gtk_tree_path_up (GtkTreePath *path); Перемещает path для указания на родительский узел, если он есть.
Параметры
path |
Возвращает
TRUE если у path есть родительский узел и перемещение выполнено
gtk_tree_path_down ()
void
gtk_tree_path_down (GtkTreePath *path); Перемещает path для указания на первый дочерний узел текущего пути.
Параметры
path |
gtk_tree_path_is_ancestor ()
gboolean gtk_tree_path_is_ancestor (GtkTreePath *path,GtkTreePath *descendant);
Возвращает TRUE если descendant является потомком path.
Параметры
path | ||
descendant | another GtkTreePath |
Возвращает
TRUE если descendant находится внутри path
gtk_tree_path_is_descendant ()
gboolean gtk_tree_path_is_descendant (GtkTreePath *path,GtkTreePath *ancestor);
Возвращает TRUE если path является потомком ancestor.
Параметры
path | ||
ancestor | another GtkTreePath |
Возвращает
TRUE если ancestor содержит path где-то ниже
gtk_tree_row_reference_new ()
GtkTreeRowReference * gtk_tree_row_reference_new (GtkTreeModel *model,GtkTreePath *path);
Создаёт ссылку на строку, основанную на path.
Эта ссылка будет продолжать указывать на узел, на который указывает path, пока он существует. Любые изменения, происходящие в model, будут проpropagated, и путь будет обновлён должным образом. Если path не является допустимым путём в model, то возвращается NULL.
Параметры
model | ||
path | допустимый GtkTreePath для отслеживания |
gtk_tree_row_reference_new_proxy ()
GtkTreeRowReference * gtk_tree_row_reference_new_proxy (GObject *proxy,GtkTreeModel *model,GtkTreePath *path);
Вам не нужно использовать эту функцию.
Создаёт ссылку на строку, базируясь на path .
Эта ссылка будет продолжать указывать на узел, на который указывает path, пока он существует. Если path не является допустимым путём в model, то возвращается NULL. Однако, в отличие от ссылок, созданных с помощью gtk_tree_row_reference_new(), она не отслеживает изменения в модели. Создатель ссылки на строку должен делать это явно, используя gtk_tree_row_reference_inserted(), gtk_tree_row_reference_deleted(), gtk_tree_row_reference_reordered().
Эти функции должны быть вызваны ровно один раз на каждый прокси при вызове соответствующего сигнала в модели. Этот единственный вызов обновляет все ссылки на строки для данного прокси. Поскольку встроенные объекты GTK, такие как GtkTreeView, уже используют этот механизм внутри себя, использование их в качестве объекта-прокси приведёт к непредсказуемым результатам. Кроме того, передача одного и того же объекта как model и proxy не работает по причинам внутренней реализации.
Этот тип ссылки на строку предназначен в первую очередь для структур, которым необходимо тщательно отслеживать, когда ссылка на строку обновляет себя, и обычно не требуется большинству приложений.
Параметры
proxy | прокси GObject | |
model | ||
path | допустимый GtkTreePath для мониторинга |
gtk_tree_row_reference_get_model ()
GtkTreeModel *
gtk_tree_row_reference_get_model (GtkTreeRowReference *reference); Возвращает модель, которую отслеживает ссылка на строку.
Параметры
reference |
Возвращаемое значение
модель.
[transfer none]
gtk_tree_row_reference_get_path ()
GtkTreePath *
gtk_tree_row_reference_get_path (GtkTreeRowReference *reference); Возвращает путь, на который в данный момент указывает ссылка на строку, или NULL если путь, на который она указывала, больше недоступен.
Параметры
reference |
Возвращаемое значение
текущий путь, или NULL.
[nullable][transfer full]
gtk_tree_row_reference_valid ()
gboolean
gtk_tree_row_reference_valid (GtkTreeRowReference *reference); Возвращает TRUE если reference не пусто и ссылается на текущий допустимый путь.
Параметры
reference | a GtkTreeRowReference, или | [allow-none] |
Возвращаемое значение
TRUE если reference указывает на допустимый путь
gtk_tree_row_reference_free ()
void
gtk_tree_row_reference_free (GtkTreeRowReference *reference); Освобождает reference . reference может быть NULL
Параметры
reference | a GtkTreeRowReference, или | [allow-none] |
gtk_tree_row_reference_copy ()
GtkTreeRowReference *
gtk_tree_row_reference_copy (GtkTreeRowReference *reference); Копирует GtkTreeRowReference.
Параметры
reference |
Возвращаемое значение
копию reference
gtk_tree-row-reference-inserted ()
void gtk_tree_row_reference_inserted (GObject *proxy,GtkTreePath *path);
Сообщает набору ссылок на строки, созданных с помощью gtk_tree_row_reference_new_proxy(), что модель выпустила сигнал “row-inserted”.
Параметры
proxy | a GObject | |
path | позиция вставленной строки |
gtk_tree-row-reference-deleted ()
void gtk_tree_row_reference_deleted (GObject *proxy,GtkTreePath *path);
Сообщает набору ссылок на строки, созданных с помощью gtk_tree_row_reference_new_proxy(), что модель выпустила сигнал “row-deleted”.
Параметры
proxy | a GObject | |
path | путь удалённой позиции |
gtk_tree-row-reference-reordered ()
void gtk_tree_row_reference_reordered (GObject *proxy,GtkTreePath *path,GtkTreeIter *iter,int *new_order);
Сообщает набору ссылок на строки, созданных с помощью gtk_tree_row_reference_new_proxy(), что модель выпустила сигнал “rows-reordered”.
[skip]
Параметры
proxy | a GObject | |
path | родительский путь сигнала reorder | |
iter | итератор, указывающий на родителя изменённого элемента | |
new_order | новый порядок строк. | [array] |
gtk_tree-iter-copy ()
GtkTreeIter *
gtk_tree_iter_copy (GtkTreeIter *iter); Создаёт динамически выделенный итератор дерева как копию iter .
Эта функция не предназначена для использования в приложениях, потому что вы можете просто скопировать структуры по значению (GtkTreeIter new_iter = iter;). Вы должны освободить этот итератор с помощью gtk_tree_iter_free().
Параметры
iter |
Возвращаемое значение
нововыделенная копия iter
gtk_tree_iter_free ()
void
gtk_tree_iter_free (GtkTreeIter *iter); Освобождает итератор, выделенный с помощью gtk_tree_iter_copy().
Эта функция в основном используется для языковых привязок.
Параметры
iter | динамически выделенный итератор дерева |
gtk_tree_model_get_flags ()
GtkTreeModelFlags
gtk_tree_model_get_flags (GtkTreeModel *tree_model); Возвращает набор флагов, поддерживаемых этим интерфейсом.
Флаги представляют собой побитовую комбинацию GtkTreeModelFlags. Поддерживаемые флаги не должны изменяться в течение всего времени существования tree_model .
Параметры
tree_model |
Возвращаемое значение
флаги, поддерживаемые этим интерфейсом
gtk_tree_model_get_n_columns ()
int
gtk_tree_model_get_n_columns (GtkTreeModel *tree_model); Возвращает количество столбцов, поддерживаемых tree_model .
Параметры
tree_model |
Возвращаемое значение
количество столбцов
gtk_tree_model_get_column_type ()
GType gtk_tree_model_get_column_type (GtkTreeModel *tree_model,int index_);
Возвращает тип столбца.
Параметры
tree_model | ||
index_ | индекс столбца |
Возвращаемое значение
тип столбца
gtk_tree_model_get_iter ()
gboolean gtk_tree_model_get_iter (GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreePath *path);
Устанавливает iter в действительный итератор, указывающий на path . Если path не существует, iter устанавливается в недействительный итератор, и возвращается FALSE.
Параметры
tree_model | ||
iter | неинициализированный GtkTreeIter. | [out] |
path | the GtkTreePath |
Возвращаемое значение
TRUE, если iter был установлен
gtk_tree_model_get_iter_from_string ()
gboolean gtk_tree_model_get_iter_from_string (GtkTreeModel *tree_model,GtkTreeIter *iter,const char *path_string);
Устанавливает iter в действительный итератор, указывающий на path_string , если он существует. В противном случае, iter остаётся недействительным, и возвращается FALSE.
Параметры
tree_model | ||
iter | неинициализированный GtkTreeIter. | [out] |
path_string | строковое представление GtkTreePath |
Возвращаемое значение
TRUE, если iter был установлен
gtk_tree_model_get_iter_first ()
gboolean gtk_tree_model_get_iter_first (GtkTreeModel *tree_model,GtkTreeIter *iter);
Инициализирует iter первым итератором в дереве (тем, что находится по пути "0") и возвращает TRUE. Возвращает FALSE, если дерево пусто.
Параметры
tree_model | ||
iter | неинициализированный GtkTreeIter. | [out] |
Возвращаемое значение
TRUE, если iter был установлен
gtk_tree_model_get_path ()
GtkTreePath * gtk_tree_model_get_path (GtkTreeModel *tree_model,GtkTreeIter *iter);
Возвращает вновь созданный GtkTreePath, на который ссылается iter .
Этот путь должен быть освобожден с помощью gtk_tree_path_free().
Параметры
tree_model | ||
iter | the GtkTreeIter |
Возвращаемое значение
вновь созданный GtkTreePath
gtk_tree_model_get_value ()
void gtk_tree_model_get_value (GtkTreeModel *tree_model,GtkTreeIter *iter,int column,GValue *value);
Инициализирует и устанавливает value в значение по column .
После завершения работы с value , необходимо вызвать g_value_unset() для освобождения выделенной памяти.
Параметры
tree_model | ||
iter | the GtkTreeIter | |
column | индекс столбца для поиска значения | |
value | пустое GValue для установки. | [out][transfer none] |
gtk_tree_model_iter_next ()
gboolean gtk_tree_model_iter_next (GtkTreeModel *tree_model,GtkTreeIter *iter);
Устанавливает iter для указания на следующий узел на текущем уровне.
Если следующего iter нет, возвращается FALSE, и iter устанавливается как недействительный.
Параметры
tree_model | ||
iter | the GtkTreeIter. | [in] |
Возвращаемое значение
TRUE если iter был изменён на следующий узел
gtk_tree_model_iter_previous ()
gboolean gtk_tree_model_iter_previous (GtkTreeModel *tree_model,GtkTreeIter *iter);
Устанавливает iter для указания предыдущего узла на текущем уровне.
Если предыдущего iter нет, возвращается FALSE, и iter устанавливается в недействительное состояние.
Параметры
tree_model | ||
iter | the GtkTreeIter. | [in] |
Возвращаемое значение
TRUE , если iter был изменён на предыдущий узел
gtk_tree_model_iter_children ()
gboolean gtk_tree_model_iter_children (GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *parent);
Устанавливает iter для указания первого дочернего узла parent .
Если у parent нет дочерних узлов, возвращается FALSE, и iter устанавливается в недействительное состояние. parent останется действительным узлом после вызова этой функции.
Если parent является NULL, возвращается первый узел, эквивалентный gtk_tree_model_get_iter_first (tree_model, iter);
Параметры
tree_model | ||
iter | the new GtkTreeIter to be set to the child. | [out] |
parent | the GtkTreeIter, или | [allow-none] |
Возвращаемое значение
TRUE, если iter был установлен для первого дочернего узла
gtk_tree_model_iter_has_child ()
gboolean gtk_tree_model_iter_has_child (GtkTreeModel *tree_model,GtkTreeIter *iter);
Возвращает TRUE, если у iter есть дочерние узлы, FALSE в противном случае.
Параметры
tree_model | ||
iter | the GtkTreeIter для проверки наличия дочерних узлов |
Возвращаемое значение
TRUE , если у iter есть дочерние узлы
gtk_tree_model_iter_n_children ()
int gtk_tree_model_iter_n_children (GtkTreeModel *tree_model,GtkTreeIter *iter);
Возвращает количество дочерних узлов, имеющихся у iter .
В качестве специального случая, если iter равно NULL, возвращается количество узлов верхнего уровня.
Параметры
tree_model | ||
iter | the GtkTreeIter, или | [allow-none] |
Возвращаемое значение
количество дочерних узлов iter
gtk_tree_model_iter_nth_child ()
gboolean gtk_tree_model_iter_nth_child (GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *parent,int n);
Устанавливает iter в качестве дочернего узла parent с помощью заданного индекса.
Первый индекс — 0. Если n слишком большой или parent не имеет дочерних узлов, iter устанавливается в недействительный итератор, и возвращается FALSE. parent останется действительным узлом после вызова функции. В качестве специального случая, если parent равно NULL, устанавливается n-й корневой узел.
Параметры
tree_model | ||
iter | the GtkTreeIter to set to the nth child. | [out] |
parent | the GtkTreeIter to get the child from, или | [allow-none] |
n | индекс нужного дочернего узла |
Возвращаемое значение
TRUE, если у parent есть n-й дочерний узел
gtk_tree_model_iter_parent ()
gboolean gtk_tree_model_iter_parent (GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *child);
Устанавливает iter в качестве родителя child .
Если child находится на верхнем уровне и не имеет родителя, iter устанавливается в недействительный итератор, и возвращается FALSE. child останется действительным узлом после вызова функции.
iter будет инициализирован до выполнения поиска, поэтому child и iter не могут указывать на одну и ту же область памяти.
Параметры
tree_model | ||
iter | the new GtkTreeIter to set to the parent. | [out] |
child | the GtkTreeIter |
Возвращаемое значение
TRUE, если iter установлен для родителя child
gtk_tree_model_get_string_from_iter ()
char * gtk_tree_model_get_string_from_iter (GtkTreeModel *tree_model,GtkTreeIter *iter);
Генерирует строковое представление итератора.
Эта строка представляет собой список чисел, разделённых двоеточием. Например, «4:10:0:3» — допустимое значение возвращаемой строки.
Параметры
tree_model | ||
iter |
Возвращаемое значение
новую строку. Должна быть освобождена с помощью g_free().
[nullable]
gtk_tree_model_ref_node ()
void gtk_tree_model_ref_node (GtkTreeModel *tree_model,GtkTreeIter *iter);
Разрешает дереву ссылаться на узел.
Это необязательный метод для моделей. Модели могут игнорировать этот вызов, так как он существует в основном для повышения производительности.
Эта функция в основном предназначена для того, чтобы представления могли сообщать кеширующим моделям, когда узлы отображаются (и, следовательно, следует ли кешировать этот узел). Отображение означает, что узел находится в развернутой ветви, независимо от того, виден ли он в данный момент в области просмотра. Например, модель на основе файловой системы не должна хранить всю иерархию файлов в памяти, а только те разделы, которые в данный момент отображаются каждым текущим представлением.
Ожидается, что модель сможет получить итератор независимо от своего состояния ссылок.
Параметры
tree_model | ||
iter | the GtkTreeIter |
gtk_tree_model_unref_node ()
void gtk_tree_model_unref_node (GtkTreeModel *tree_model,GtkTreeIter *iter);
Разрешает дереву отменить ссылку на узел.
Это необязательный метод для моделей. Модели могут игнорировать этот вызов, так как он существует в основном для повышения производительности. Более подробную информацию об этом см. в gtk_tree_model_ref_node().
Обратите внимание, что удаленные узлы не отменяют ссылки.
Параметры
tree_model | ||
iter | the GtkTreeIter |
gtk_tree_model_get ()
void gtk_tree_model_get (GtkTreeModel *tree_model,GtkTreeIter *iter,...);
Получает значение одной или нескольких ячеек в строке, на которую ссылается iter . Список аргументов должен содержать целые номера столбцов, каждый номер столбца за которым следует место для хранения извлекаемого значения. Список завершается значением -1. Например, чтобы получить значение из столбца 0 с типом G_TYPE_STRING, вы бы написали: gtk_tree_model_get (model, iter, 0, &place_string_here, -1), где place_string_here — это gchararray для заполнения строкой.
Возвращаемые значения с типом G_TYPE_OBJECT должны быть освобождены от ссылок, значения с типами G_TYPE_STRING или G_TYPE_BOXED должны быть освобождены. Другие значения передаются по значению.
Параметры
tree_model | ||
iter | строка в | |
... | пары номера столбца и места возврата значения, завершенные -1 |
gtk_tree_model_get_valist ()
void gtk_tree_model_get_valist (GtkTreeModel *tree_model,GtkTreeIter *iter,va_list var_args);
См. gtk_tree_model_get(), эта версия принимает va_list для использования языковыми связями.
Параметры
tree_model | ||
iter | строка в | |
var_args | va_list пар столбец/место возврата |
gtk_tree_model_foreach ()
void gtk_tree_model_foreach (GtkTreeModel *model,GtkTreeModelForeachFunc func,gpointer user_data);
Вызывает func для каждого узла в модели в порядке обхода в глубину.
Если func возвращает TRUE, то обход дерева прекращается, и gtk_tree_model_foreach() возвращает.
Параметры
model | ||
func | функция, которая должна вызываться для каждой строки. | [scope call] |
user_data | данные пользователя, передаваемые в | [closure] |
gtk_tree_model_row_changed ()
void gtk_tree_model_row_changed (GtkTreeModel *tree_model,GtkTreePath *path,GtkTreeIter *iter);
Вызывает сигнал “row-changed” для tree_model .
Параметры
tree_model | ||
path | a GtkTreePath, указывающий на изменённую строку | |
iter | корректный GtkTreeIter, указывающий на изменённую строку |
gtk_tree_model_row_inserted ()
void gtk_tree_model_row_inserted (GtkTreeModel *tree_model,GtkTreePath *path,GtkTreeIter *iter);
Вызывает сигнал “row-inserted” для tree_model .
Параметры
tree_model | ||
path | a GtkTreePath, указывающий на вставленную строку | |
iter | корректный GtkTreeIter, указывающий на вставленную строку |
gtk_tree_model_row_has-child-toggled ()
void gtk_tree_model_row_has_child_toggled (GtkTreeModel *tree_model,GtkTreePath *path,GtkTreeIter *iter);
Вызывает сигнал “row-has-child-toggled” для tree_model. Это следует вызывать моделям после изменения состояния дочернего узла.
Параметры
tree_model | ||
path | a GtkTreePath, указывающий на изменённую строку | |
iter | корректный GtkTreeIter, указывающий на изменённую строку |
gtk_tree_model_row_deleted ()
void gtk_tree_model_row_deleted (GtkTreeModel *tree_model,GtkTreePath *path);
Вызывает сигнал “row-deleted” для tree_model .
Это следует вызывать моделям после удаления строки. Место, на которое указывает path, должно быть местом, где строка находилась ранее. Оно может больше не быть корректным.
Удалённые узлы не отменяют ссылки, это означает, что любые активные ссылки на удалённый узел не должны быть освобождены.
Параметры
tree_model | ||
path | a GtkTreePath, указывающий на предыдущее местоположение удалённой строки |
gtk_tree_model_rows_reordered ()
void gtk_tree_model_rows_reordered (GtkTreeModel *tree_model,GtkTreePath *path,GtkTreeIter *iter,int *new_order);
Издаёт сигнал “rows-reordered” на tree_model.
Этот метод должен вызываться моделями, когда их строки были переупорядочены.
[skip]
Параметры
tree_model | ||
path | a GtkTreePath указывающий на узел дерева, подчинённые узлы которого были переупорядочены | |
iter | валидный GtkTreeIter указывающий на узел, подчинённые узлы которого были переупорядочены, или | |
new_order | массив целых чисел, отображающий текущее положение каждого подчинённого узла к его предыдущему положению до переупорядочения, т.е. |
gtk_tree_model_rows_reordered_with_length ()
void gtk_tree_model_rows_reordered_with_length (GtkTreeModel *tree_model,GtkTreePath *path,GtkTreeIter *iter,int *new_order,int length);
Издаёт сигнал “rows-reordered” на tree_model.
Этот метод должен вызываться моделями, когда их строки были переупорядочены.
[rename-to gtk_tree_model_rows_reordered]
Параметры
tree_model | ||
path | a GtkTreePath указывающий на узел дерева, подчинённые узлы которого были переупорядочены | |
iter | валидный GtkTreeIter указывающий на узел, подчинённые узлы которого были переупорядочены, или | [allow-none] |
new_order | массив целых чисел, отображающий текущее положение каждого подчинённого узла к его предыдущему положению до переупорядочения, т.е. | [array length=length] |
length | длина массива |
Типы и значения
GtkTreeModel
typedef struct _GtkTreeModel GtkTreeModel;
Структура GtkTreeIter
struct GtkTreeIter {
int stamp;
gpointer user_data;
gpointer user_data2;
gpointer user_data3;
};
Структура GtkTreeIter — основная структура для доступа к GtkTreeModel. Модели должны помещать уникальное целое число в член stamp, а модели-специфичные данные — в три члена user_data.
Члены
int | уникальный штамп для выявления некорректных итераторов | |
gpointer | данные, специфичные для модели | |
gpointer | данные, специфичные для модели | |
gpointer | данные, специфичные для модели |
GtkTreePath
typedef struct _GtkTreePath GtkTreePath;
GtkTreeRowReference
typedef struct _GtkTreeRowReference GtkTreeRowReference;
GtkTreeRowReference отслеживает изменения модели, чтобы всегда ссылаться на одну и ту же строку (GtkTreePath указывает на позицию, а не на фиксированную строку). Создайте новый GtkTreeRowReference с помощью gtk_tree_row_reference_new().
Структура GtkTreeModelIface
struct GtkTreeModelIface {
/* Signals */
void (* row_changed) (GtkTreeModel *tree_model,
GtkTreePath *path,
GtkTreeIter *iter);
void (* row_inserted) (GtkTreeModel *tree_model,
GtkTreePath *path,
GtkTreeIter *iter);
void (* row_has_child_toggled) (GtkTreeModel *tree_model,
GtkTreePath *path,
GtkTreeIter *iter);
void (* row_deleted) (GtkTreeModel *tree_model,
GtkTreePath *path);
void (* rows_reordered) (GtkTreeModel *tree_model,
GtkTreePath *path,
GtkTreeIter *iter,
int *new_order);
/* Virtual Table */
GtkTreeModelFlags (* get_flags) (GtkTreeModel *tree_model);
int (* get_n_columns) (GtkTreeModel *tree_model);
GType (* get_column_type) (GtkTreeModel *tree_model,
int index_);
gboolean (* get_iter) (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreePath *path);
GtkTreePath *(* get_path) (GtkTreeModel *tree_model,
GtkTreeIter *iter);
void (* get_value) (GtkTreeModel *tree_model,
GtkTreeIter *iter,
int column,
GValue *value);
gboolean (* iter_next) (GtkTreeModel *tree_model,
GtkTreeIter *iter);
gboolean (* iter_previous) (GtkTreeModel *tree_model,
GtkTreeIter *iter);
gboolean (* iter_children) (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreeIter *parent);
gboolean (* iter_has_child) (GtkTreeModel *tree_model,
GtkTreeIter *iter);
int (* iter_n_children) (GtkTreeModel *tree_model,
GtkTreeIter *iter);
gboolean (* iter_nth_child) (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreeIter *parent,
int n);
gboolean (* iter_parent) (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreeIter *child);
void (* ref_node) (GtkTreeModel *tree_model,
GtkTreeIter *iter);
void (* unref_node) (GtkTreeModel *tree_model,
GtkTreeIter *iter);
};
Члены
| Сигнал, генерируемый при изменении строки в модели. | |
| Сигнал, генерируемый при вставке новой строки в модель. | |
| Сигнал, генерируемый, когда строка получает первый дочерний элемент или теряет последний дочерний элемент. | |
| Сигнал, генерируемый при удалении строки. | |
| Сигнал, генерируемый при изменении порядка дочерних элементов узла в GtkTreeModel. | |
| Получение поддерживаемых GtkTreeModelFlags. | |
| Получение количества поддерживаемых столбцов модели. | |
| Получение типа столбца. | |
| Устанавливает iter в допустимый итератор, указывающий на путь. | |
| Возвращает новый GtkTreePath, на который ссылается iter. | |
| Инициализирует и устанавливает значение в столбце. | |
| Устанавливает iter в узел, следующий за текущим на текущем уровне. | |
| Устанавливает iter в предыдущий узел на текущем уровне. | |
| Устанавливает iter в первый дочерний элемент родителя. | |
|
| |
| Возвращает количество дочерних элементов у iter. | |
| Устанавливает iter в дочерний элемент родителя с указанным индексом. | |
| Устанавливает iter в родителя child. | |
| Позволяет дереву ссылаться на узел. | |
| Позволяет дереву снять ссылку с узла. |
Перечисление GtkTreeModelFlags
Эти флаги указывают на различные свойства GtkTreeModel.
Они возвращаются функцией gtk_tree_model_get_flags() и должны быть статическими на протяжении всего существования объекта. Более полное описание GTK_TREE_MODEL_ITERS_PERSIST можно найти в обзоре этого раздела.
Члены
GTK_TREE_MODEL_ITERS_PERSIST | итераторы сохраняются при всех сигналах, генерируемых деревом | |
GTK_TREE_MODEL_LIST_ONLY | модель представляет собой только список и никогда не имеет дочерних элементов |
Подробные сведения о сигналах
Сигнал “row-changed”
void user_function (GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data)
Этот сигнал генерируется, когда строка в модели изменилась.
Параметры
tree_model | объект GtkTreeModel, на котором генерируется сигнал | |
path | GtkTreePath, идентифицирующий изменённую строку | |
iter | валидный объект GtkTreeIter, указывающий на изменённую строку | |
user_data | данные пользователя, установленные при подключении обработчика сигнала. |
Флаги: Run Last
Сигнал “row-deleted”
void user_function (GtkTreeModel *tree_model, GtkTreePath *path, gpointer user_data)
Этот сигнал генерируется, когда строка была удалена.
Обратите внимание, что итератор не передаётся обработчику сигнала, так как строка уже удалена.
Этот сигнал должен вызываться моделями после удаления строки. Место, на которое указывает path, должно соответствовать месту, которое занимала строка ранее. Оно может быть больше не валидным.
Параметры
tree_model | объект GtkTreeModel, на котором генерируется сигнал | |
path | GtkTreePath, идентифицирующий строку | |
user_data | данные пользователя, установленные при подключении обработчика сигнала. |
Флаги: Run First
Сигнал “row-has-child-toggled”
void user_function (GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data)
Этот сигнал генерируется, когда строка получила первую дочернюю строку или потеряла последнюю дочернюю строку.
Параметры
tree_model | объект GtkTreeModel, на котором генерируется сигнал | |
path | GtkTreePath, идентифицирующий строку | |
iter | валидный объект GtkTreeIter, указывающий на строку | |
user_data | данные пользователя, установленные при подключении обработчика сигнала. |
Флаги: Run Last
Сигнал “row-inserted”
void user_function (GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data)
Этот сигнал генерируется, когда новая строка была вставлена в модель.
Обратите внимание, что строка может быть пустой на этом этапе, так как распространённым шаблоном является сначала вставка пустой строки, а затем заполнение её необходимыми значениями.
Параметры
tree_model | объект GtkTreeModel, на котором генерируется сигнал | |
path | GtkTreePath, идентифицирующий новую строку | |
iter | валидный объект GtkTreeIter, указывающий на новую строку | |
user_data | данные пользователя, установленные при подключении обработчика сигнала. |
Флаги: Run First
Сигнал “rows-reordered”
void user_function (GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gpointer new_order, gpointer user_data)
Этот сигнал генерируется, когда дочерние элементы узла в GtkTreeModel были переупорядочены.
Обратите внимание, что этот сигнал не генерируется при переупорядочении строк с помощью DND, так как это реализовано путём удаления, а затем повторной вставки строки.
[skip]
Параметры
tree_model | объект GtkTreeModel, на котором генерируется сигнал | |
path | GtkTreePath, идентифицирующий узел дерева, чьи дочерние элементы были переупорядочены | |
iter | валидный объект GtkTreeIter, указывающий на узел, чьи дочерние элементы были переупорядочены, или | |
new_order | массив целых чисел, отображающий текущую позицию каждого дочернего элемента на его прежнюю позицию перед переупорядочением, т. е. | |
user_data | данные пользователя, установленные при подключении обработчика сигнала. |
Флаги: Run First
См. также
GtkTreeView, GtkTreeStore, GtkListStore, перетаскивание в GtkTreeView GtkTreeSortable
© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer-old.gnome.org/gtk4/4.0/GtkTreeModel.html