GtkTreeModel
GtkTreeModel — Деревовидный интерфейс, используемый GtkTreeView
Функции
Сигналы
| 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 («iter» — сокращение от итератор). Большая часть интерфейса состоит из операций с 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] |
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 gchar *path); Создаёт новый GtkTreePath, инициализированный path .
path ожидается в формате списка чисел, разделённых двоеточиями. Например, строка “10:4:0” создаст путь глубиной 3, указывающий на 11-го потомка корневого узла, 5-го потомка этого 11-го потомка и 1-го потомка этого 5-го потомка. Если передана некорректная строка пути, возвращается NULL.
Параметры
path | Строковое представление пути |
Возвращаемое значение
Новый созданный GtkTreePath или NULL
gtk_tree_path_new_from_indices ()
GtkTreePath * gtk_tree_path_new_from_indices (gint first_index,...);
Создаёт новый путь с first_index и varargs в качестве индексов.
Параметры
first_index | первый целое число | |
... | список целых чисел, завершаемых -1 |
Возвращаемое значение
Новый созданный GtkTreePath
С: 2.2
gtk_tree_path_new_from_indicesv ()
GtkTreePath * gtk_tree_path_new_from_indicesv (gint *indices,gsize length);
Создаёт новый путь с заданным массивом indices индексов length .
[rename-to gtk_tree_path_new_from_indices]
Параметры
indices | массив индексов. | [array length=length] |
length | длина массива |
Возвращаемое значение
Новый созданный GtkTreePath
С: 3.12
gtk_tree_path_to_string ()
gchar *
gtk_tree_path_to_string (GtkTreePath *path); Генерирует строковое представление пути.
Эта строка — список чисел, разделённых двоеточием. Например, “4:10:0:3” — допустимое возвращаемое значение для этой строки.
Параметры
path |
Возвращаемое значение
Новая выделенная строка. Должна быть освобождена с помощью g_free().
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,gint index_);
Добавляет новый индекс к пути.
В результате глубина пути увеличивается.
Параметры
path | ||
index_ | индекс |
gtk_tree_path_prepend_index ()
void gtk_tree_path_prepend_index (GtkTreePath *path,gint index_);
Добавляет новый индекс в начало пути.
В результате глубина пути увеличивается.
Параметры
path | ||
index_ | индекс |
gtk_tree_path_get_depth ()
gint
gtk_tree_path_get_depth (GtkTreePath *path); Возвращает текущую глубину path .
Параметры
path |
Возвращаемое значение
Глубина path
gtk_tree_path_get_indices ()
gint *
gtk_tree_path_get_indices (GtkTreePath *path); Возвращает текущие индексы path .
Это массив целых чисел, каждый из которых представляет узел в дереве. Это значение не должно освобождаться.
Длина массива может быть получена с помощью gtk_tree_path_get_depth().
[skip]
Параметры
path |
Возвращаемое значение
Текущие индексы или NULL
gtk_tree_path_get_indices_with_depth ()
gint * gtk_tree_path_get_indices_with_depth (GtkTreePath *path,gint *depth);
Возвращает текущие индексы path.
Это массив целых чисел, каждый из которых представляет узел в дереве. Также возвращается количество элементов в массиве. Массив освобождать не нужно.
[rename-to gtk_tree_path_get_indices]
Параметры
path | ||
depth | место для возврата количества элементов, возвращённых в массиве целых чисел, или | [out][allow-none] |
С: 3.0
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 ()
gint 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 | другой GtkTreePath |
Возвращаемое значение
TRUE, если descendant содержится внутри path
gtk_tree_path_is_descendant ()
gboolean gtk_tree_path_is_descendant (GtkTreePath *path,GtkTreePath *ancestor);
Возвращает TRUE, если path является потомком ancestor.
Параметры
path | ||
ancestor | другой GtkTreePath |
Возвращаемое значение
TRUE, если ancestor содержит path где-то ниже
gtk_tree_row_reference_new ()
GtkTreeRowReference * gtk_tree_row_reference_new (GtkTreeModel *model,GtkTreePath *path);
Создаёт ссылку на строку, базируясь на path .
Эта ссылка будет продолжать указывать на узел, на который указывает path, пока он существует. Любые изменения, произошедшие в model, будут переданы, а путь будет обновлён соответствующим образом. Если path не является допустимым путём в model, то возвращается NULL.
Параметры
model | ||
path | допустимый GtkTreePath для отслеживания |
Возвращаемое значение
новый выделенный GtkTreeRowReference, или NULL
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 для отслеживания |
Возвращаемое значение
новый выделенный GtkTreeRowReference, или NULL
gtk_tree_row_reference_get_model ()
GtkTreeModel *
gtk_tree_row_reference_get_model (GtkTreeRowReference *reference); Возвращает модель, которую отслеживает ссылка на строку.
Параметры
reference |
Возвращаемое значение
модель.
[transfer none]
Since: 2.8
gtk_tree_row_reference_get_path ()
GtkTreePath *
gtk_tree_row_reference_get_path (GtkTreeRowReference *reference); Возвращает текущий путь, на который указывает ссылка на строку, или NULL, если путь, на который она указывает, больше не действителен.
Параметры
reference |
gtk_tree_row_reference_valid ()
gboolean
gtk_tree_row_reference_valid (GtkTreeRowReference *reference); Возвращает TRUE, если reference не NULL и указывает на текущий действительный путь.
Параметры
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
Since: 2.2
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 | объект GObject | |
path | позиция пути, который был удалён |
gtk_tree_row_reference_reordered ()
void gtk_tree_row_reference_reordered (GObject *proxy,GtkTreePath *path,GtkTreeIter *iter,gint *new_order);
Сообщает набору ссылок на строки, созданных с помощью gtk_tree_row_reference_new_proxy(), что модель выпустила сигнал “rows-reordered”.
[skip]
Параметры
proxy | объект GObject | |
path | родительский путь упорядоченных строк | |
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 | объект GtkTreeIter |
Возвращает
новую динамическую копию 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 | объект GtkTreeModel |
Возвращает
поддерживаемые флаги
gtk_tree_model_get_n_columns ()
gint
gtk_tree_model_get_n_columns (GtkTreeModel *tree_model); Возвращает количество столбцов, поддерживаемых tree_model .
Параметры
tree_model | объект GtkTreeModel |
Возвращает
количество столбцов
gtk_tree_model_get_column_type ()
GType gtk_tree_model_get_column_type (GtkTreeModel *tree_model,gint index_);
Возвращает тип столбца.
Параметры
tree_model | объект GtkTreeModel | |
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 | объект GtkTreeModel | |
iter | неинициализированный GtkTreeIter | [out] |
path |
Возвращает
TRUE, если iter был установлен
gtk_tree_model_get_iter_from_string ()
gboolean gtk_tree_model_get_iter_from_string (GtkTreeModel *tree_model,GtkTreeIter *iter,const gchar *path_string);
Устанавливает iter на допустимый итератор, указывающий на path_string , если он существует. В противном случае iter остаётся недопустимым, и возвращается FALSE.
Параметры
tree_model | объект GtkTreeModel | |
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,gint 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 был изменён на предыдущий узел
Since: 3.0
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 для установки дочернего узла. | [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 ()
gint 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,gint n);
Устанавливает iter в качестве потомка parent, используя указанный индекс.
Первый индекс — 0. Если n слишком большой или parent не имеет потомков, iter устанавливается в недопустимый итератор, и возвращается FALSE. parent останется допустимым узлом после вызова функции. В качестве специального случая, если parent равно NULL, устанавливается n-й корневой узел.
Параметры
tree_model | ||
iter | the GtkTreeIter для установки n-ого потомка. | [out] |
parent | the GtkTreeIter для получения потомка, или | [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 новый GtkTreeIter для установки в родительский. | [out] |
child | the GtkTreeIter |
Возвращаемое значение
TRUE, если iter установлен в качестве родителя child
gtk_tree_model_get_string_from_iter ()
gchar * gtk_tree_model_get_string_from_iter (GtkTreeModel *tree_model,GtkTreeIter *iter);
Генерирует строковое представление итератора.
Эта строка представляет собой список чисел, разделенных двоеточием. Например, «4:10:0:3» — это допустимое значение для этой строки.
Параметры
tree_model | ||
iter |
Возвращаемое значение
нововыделенная строка. Должна быть освобождена с помощью g_free().
С: 2.2
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 | данные пользователя, передаваемые в |
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,gint *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,gint *new_order,gint 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 | длина массива |
Since: 3.10
Типы и значения
GtkTreeModel
typedef struct _GtkTreeModel GtkTreeModel;
Структура GtkTreeIter
struct GtkTreeIter {
gint stamp;
gpointer user_data;
gpointer user_data2;
gpointer user_data3;
};
Структура GtkTreeIter — основная для доступа к GtkTreeModel. Модели ожидают уникальное целое число в члене stamp и данные, специфичные для модели, в трёх членах user_data.
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,
gint *new_order);
/* Virtual Table */
GtkTreeModelFlags (* get_flags) (GtkTreeModel *tree_model);
gint (* get_n_columns) (GtkTreeModel *tree_model);
GType (* get_column_type) (GtkTreeModel *tree_model,
gint 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,
gint 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);
gint (* iter_n_children) (GtkTreeModel *tree_model,
GtkTreeIter *iter);
gboolean (* iter_nth_child) (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreeIter *parent,
gint 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 | пользовательские данные, заданные при подключении обработчика сигнала. |
Флаги: Запуск последним
Сигнал “row-deleted”
void user_function (GtkTreeModel *tree_model, GtkTreePath *path, gpointer user_data)
Этот сигнал генерируется, когда строка была удалена.
Обратите внимание, что итератор не передаётся обработчику сигнала, так как строка уже удалена.
Этот сигнал должен вызываться моделями после удаления строки. Место, на которое указывает path, должно быть тем, где находилась строка ранее. Оно может быть больше недоступно.
Параметры
tree_model | модель GtkTreeModel, в которой произошел сигнал | |
path | GtkTreePath, идентифицирующая строку | |
user_data | пользовательские данные, заданные при подключении обработчика сигнала. |
Флаги: Запуск первым
Сигнал “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 | пользовательские данные, заданные при подключении обработчика сигнала. |
Флаги: Запуск последним
Сигнал “row-inserted”
void user_function (GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data)
Этот сигнал генерируется, когда новая строка была вставлена в модель.
Обратите внимание, что строка может быть пустой на данном этапе, так как распространённым шаблоном является вставка пустой строки, а затем заполнение её требуемыми значениями.
Параметры
tree_model | модель GtkTreeModel, в которой произошел сигнал | |
path | GtkTreePath, идентифицирующая новую строку | |
iter | корректная GtkTreeIter, указывающая на новую строку | |
user_data | пользовательские данные, заданные при подключении обработчика сигнала. |
Флаги: Запуск первым
Сигнал “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 | пользовательские данные, заданные при подключении обработчика сигнала. |
Флаги: Запуск первым
© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer.gnome.org/gtk3/3.22/GtkTreeModel.html