GtkTreeModel
GtkTreeModel — Деревовидный интерфейс, используемый GtkTreeView
Функции
Свойства
Типы и значения
| 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 | a 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]
С: 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
С: 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 | объект GtkTreePath |
Возвращает
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 был изменён на предыдущий узел
С: 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 | новый 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 | индекс 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 | индекс 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 | индекс GtkTreeIter для установки в n-ый дочерний элемент. | [out] |
parent | индекс 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 | новый GtkTreeIter для установки в родительский элемент. | [out] |
child | индекс 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 | индекс GtkTreeIter |
Возвращает
новую строку, которую нужно освободить с помощью g_free().
Since: 2.2
gtk_tree_model_ref_node ()
void gtk_tree_model_ref_node (GtkTreeModel *tree_model,GtkTreeIter *iter);
Позволяет дереву сохранить ссылку на узел.
Это необязательный метод для моделей. Модели могут игнорировать этот вызов, так как он существует в первую очередь для повышения производительности.
Эта функция в первую очередь предназначена для того, чтобы представления могли сообщать кеширующим моделям о том, когда узлы отображаются (и, следовательно, о том, нужно ли кэшировать этот узел). Отображение означает, что узел находится в раскрытом разделе, независимо от того, виден ли он сейчас в области просмотра. Например, модель на основе файловой системы не хотела бы хранить в памяти всю файловую иерархию, а только те части, которые в данный момент отображаются каждым текущим представлением.
Модель должна иметь возможность получать итератор независимо от своего состояния сохранения ссылки.
Параметры
tree_model | ||
iter | индекс 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 | a valid 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 | a valid GtkTreeIter указывающий на узел, чьи дочерние элементы были переупорядочены, или | [allow-none] |
new_order | массив целых чисел, сопоставляющий текущую позицию каждого дочернего элемента со старой позицией перед переупорядочением, т.е. | [array length=length] |
length | длина массива |
С: 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 на первый дочерний узел parent. | |
|
| |
| Возвращает количество дочерних элементов у iter. | |
| Устанавливает iter на дочерний узел parent с заданным индексом. | |
| Устанавливает 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 были переупорядочены.
Обратите внимание, что этот сигнал не генерируется при переупорядочении строк с помощью перетаскивания, так как это реализуется удалением и повторной вставкой строки.
[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.20/GtkTreeModel.html