GtkTreeModelFilter
GtkTreeModelFilter — A GtkTreeModel which hides parts of an underlying tree model
Функции
Свойства
| GtkTreeModel * | child-model | Чтение/Запись/Только для создания |
| GtkTreePath * | virtual-root | Чтение/Запись/Только для создания |
Типы и значения
| struct | GtkTreeModelFilter |
Иерархия объектов
GObject ╰── GtkTreeModelFilter
Реализованные интерфейсы
GtkTreeModelFilter реализует GtkTreeModel и GtkTreeDragSource.
Файлы
#include <gtk/gtk.h>
Описание
Модель GtkTreeModelFilter — это модель дерева, которая оборачивает другую модель дерева и может выполнять следующие действия:
Фильтровать конкретные строки на основе данных из «видимого столбца» — столбца, хранящего булевы значения, указывающие, следует ли фильтровать строку, или на основе значения, возвращаемого «функцией видимости», которая получает модель, итератор и данные пользователя и возвращает булево значение, указывающее, следует ли фильтровать строку.
Изменять «внешний вид» модели с помощью функции модификации. Это чрезвычайно мощный инструмент, позволяющий просто изменять некоторые значения и также создавать совершенно другую модель на основе предоставленной дочерней модели.
Устанавливать другой узел корня, также известный как «виртуальный корень». Вы можете передать GtkTreePath, указывающий корневой узел для фильтра на этапе создания.
Основной API похож на GtkTreeModelSort. Пример использования можно найти в разделе о GtkTreeModelSort.
При использовании GtkTreeModelFilter, важно понимать, что GtkTreeModelFilter поддерживает внутренший кэш всех узлов, которые видны в его клиентах. Кэш, скорее всего, будет поддеревом дерева, экспонируемого дочерней моделью. GtkTreeModelFilter не будет кэшировать всю дочернюю модель, когда это не требуется, чтобы не нарушить механизм кэширования, экспонируемый схемой подсчёта ссылок. Если дочерняя модель реализует подсчёт ссылок, ненужные сигналы могут не быть отправлены из-за правила подсчёта ссылок 3, см. документацию GtkTreeModel. (Обратите внимание, что, например, GtkTreeStore не реализует подсчёт ссылок и всегда будет отправлять все сигналы, даже когда принимающий узел не виден).
Из-за этого применяются ограничения для возможных функций видимости. В общем случае функции видимости должны использовать только данные или свойства узла, для которого необходимо определить состояние видимости, его братьев или родителей. Обычно невозможно зависеть от состояния любого дочернего узла, если не получены явные ссылки на них. При отсутствии таких ссылок сигналы для этих дочерних узлов могут не быть получены (см. правило подсчёта ссылок номер 3 в разделе GtkTreeModel).
Определение состояния видимости данного узла на основе состояния его дочерних узлов — часто встречающийся случай использования. Поэтому GtkTreeModelFilter явным образом поддерживает это. Например, если у узла нет дочерних узлов, вы можете не захотеть, чтобы этот узел был видимым. Как только первая строка добавлена на уровень дочерних узлов узла (или последняя строка удалена), состояние видимости узла должно быть обновлено.
Это вводит зависимость от узла от его дочерних узлов. Для адаптации к этому GtkTreeModelFilter должен гарантировать получение необходимых сигналов от дочерней модели. Это достигается путем построения, для всех узлов, которые отображаются как видимые узлы клиентам GtkTreeModelFilter, уровня дочерних узлов (если таковой имеется) и получения ссылки на первый узел на этом уровне. Кроме того, для каждого сигнала вставки, изменения или удаления строки (в том числе тех, которые не были обработаны, потому что узел не был кэширован), GtkTreeModelFilter проверяет, изменилось ли состояние видимости любого родительского узла.
Однако следует учитывать, что эта явная поддержка ограничена этими двумя случаями. Например, если вы хотите, чтобы узел был видимым только в том случае, если два узла на уровне дочерних узлов дочерних узлов (на 2 уровня ниже) видимы, вам придется решать эту задачу самостоятельно. В этом случае либо полагайтесь на GtkTreeStore для отправки всех сигналов, так как он не реализует подсчёт ссылок, или, в случае моделей, которые реализуют подсчёт ссылок, получайте ссылки на эти уровни дочерних узлов сами.
Функции
GtkTreeModelFilterVisibleFunc ()
gboolean (*GtkTreeModelFilterVisibleFunc) (GtkTreeModel *model,GtkTreeIter *iter,gpointer data);
Функция, определяющая, отображается ли строка, указанная параметром iter.
Параметры
model | дочерняя модель GtkTreeModelFilter | |
iter | GtkTreeIter, указывающая на строку в | |
data | данные пользователя, переданные функции | [closure] |
Возвращаемое значение
Значение, определяющее видимость строки, указанной параметром iter.
GtkTreeModelFilterModifyFunc ()
void (*GtkTreeModelFilterModifyFunc) (GtkTreeModel *model,GtkTreeIter *iter,GValue *value,gint column,gpointer data);
Функция, вычисляющая значения отображения из исходных значений в модели. Она должна заполнить value значением отображения для столбца column в строке, указанной параметром iter.
Поскольку эта функция вызывается для каждого доступа к данным, она не является особенно эффективной операцией.
Параметры
model | модель GtkTreeModelFilter | |
iter | GtkTreeIter, указывающая на строку, для которой определяются значения отображения | |
value | GValue, уже инициализированный с правильным типом для столбца | [out caller-allocates] |
column | столбец, для которого определяется значение отображения | |
data | данные пользователя, переданные функции | [closure] |
gtk_tree_model_filter_new ()
GtkTreeModel * gtk_tree_model_filter_new (GtkTreeModel *child_model,GtkTreePath *root);
Создаёт новую модель GtkTreeModel, используя child_model в качестве child_model и root в качестве виртуального корня.
Параметры
child_model | Модель GtkTreeModel. | |
root | GtkTreePath или | [allow-none] |
С: 2.4
gtk_tree_model_filter_set_visible_func ()
void gtk_tree_model_filter_set_visible_func (GtkTreeModelFilter *filter,GtkTreeModelFilterVisibleFunc func,gpointer data,GDestroyNotify destroy);
Устанавливает функцию видимости для фильтрации filter, которая будет func. Функция должна возвращать TRUE, если заданная строка должна отображаться, и FALSE в противном случае.
Если условие, вычисленное функцией, изменяется со временем (например, если оно зависит от некоторых глобальных параметров), необходимо вызвать gtk_tree_model_filter_refilter(), чтобы информация о видимости модели была обновлена.
Обратите внимание, что func вызывается всякий раз, когда вставляется строка, которая может быть ещё пустой. Поэтому функция видимости должна особенно тщательно обрабатывать пустые строки, как в примере ниже.
static gboolean visible_func (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { // Visible if row is non-empty and first column is “HI” gchar *str; gboolean visible = FALSE; gtk_tree_model_get (model, iter, 0, &str, -1); if (str && strcmp (str, "HI") == 0) visible = TRUE; g_free (str); return visible; }
Обратите внимание, что gtk_tree_model_filter_set_visible_func() или gtk_tree_model_filter_set_visible_column() могут быть вызваны только один раз для заданной модели фильтра.
Параметры
filter | Модель GtkTreeModelFilter | |
func | Функция GtkTreeModelFilterVisibleFunc | |
data | данные пользователя, передаваемые функции видимости, или | [allow-none] |
destroy | обработчик уничтожения | [allow-none] |
С: 2.4
gtk_tree_model_filter_set_modify_func ()
void gtk_tree_model_filter_set_modify_func (GtkTreeModelFilter *filter,gint n_columns,GType *types,GtkTreeModelFilterModifyFunc func,gpointer data,GDestroyNotify destroy);
С параметрами n_columns и types вы задаёте массив типов столбцов для этой модели (которые будут доступны для родительской модели/представления). Параметры func, data и destroy служат для указания функции модификации. Функция модификации будет вызываться для каждого доступа к данным; её цель — вернуть данные, которые должны отображаться в указанном месте с использованием параметров функции модификации.
Обратите внимание, что gtk_tree_model_filter_set_modify_func() может быть вызвана только один раз для данной модели фильтра.
Параметры
С: 2.4
gtk_tree_model_filter_set_visible_column ()
void gtk_tree_model_filter_set_visible_column (GtkTreeModelFilter *filter,gint column);
Устанавливает column дочерней модели в столбец, где filter должен искать информацию о видимости. columns должен быть столбцом типа G_TYPE_BOOLEAN, где TRUE означает, что строка видима, а FALSE — если нет.
Обратите внимание, что gtk_tree_model_filter_set_visible_func() или gtk_tree_model_filter_set_visible_column() может быть вызвана только один раз для данной модели фильтра.
Параметры
filter | ||
column | A gint, представляющий столбец, содержащий информацию о видимости |
С: 2.4
gtk_tree_model_filter_get_model ()
GtkTreeModel *
gtk_tree_model_filter_get_model (GtkTreeModelFilter *filter); Возвращает указатель на дочернюю модель filter .
Параметры
filter |
С: 2.4
gtk_tree_model_filter_convert_child_iter_to_iter ()
gboolean gtk_tree_model_filter_convert_child_iter_to_iter (GtkTreeModelFilter *filter,GtkTreeIter *filter_iter,GtkTreeIter *child_iter);
Устанавливает filter_iter, чтобы он указывал на строку в filter, которая соответствует строке, на которую указывает child_iter . Если filter_iter не задано, возвращается FALSE.
Параметры
filter | ||
filter_iter | Неинициализированный GtkTreeIter. | [out] |
child_iter | Действительный GtkTreeIter, указывающий на строку в дочерней модели. |
Возвращает
TRUE, если filter_iter задано, т. е. если child_iter является допустимым итератором, указывающим на видимую строку в дочерней модели.
С: 2.4
gtk_tree_model_filter_convert_iter_to_child_iter ()
void gtk_tree_model_filter_convert_iter_to_child_iter (GtkTreeModelFilter *filter,GtkTreeIter *child_iter,GtkTreeIter *filter_iter);
Устанавливает child_iter, чтобы он указывал на строку, на которую указывает filter_iter.
Параметры
filter | ||
child_iter | Неинициализированный GtkTreeIter. | [out] |
filter_iter | Действительный GtkTreeIter, указывающий на строку в |
С: 2.4
gtk_tree_model_filter_convert_child_path_to_path ()
GtkTreePath * gtk_tree_model_filter_convert_child_path_to_path (GtkTreeModelFilter *filter,GtkTreePath *child_path);
Преобразует child_path в путь, относительный к filter. То есть, child_path указывает на путь в модель-потомке. Возвращаемый путь будет указывать на ту же строку в отфильтрованной модели. Если child_path не является допустимым путем в модели-потомке или указывает на строку, которая не отображается в filter, то возвращается NULL.
Параметры
filter | ||
child_path | A GtkTreePath для преобразования. |
С версии: 2.4
gtk_tree_model_filter_convert_path_to_child_path ()
GtkTreePath * gtk_tree_model_filter_convert_path_to_child_path (GtkTreeModelFilter *filter,GtkTreePath *filter_path);
Преобразует filter_path в путь в модели-потомке filter. То есть, filter_path указывает на позицию в filter. Возвращаемый путь укажет на ту же позицию в модели, которая не была отфильтрована. Если filter_path не указывает на позицию в модели-потомке, возвращается NULL.
Параметры
filter | ||
filter_path | A GtkTreePath для преобразования. |
С версии: 2.4
gtk_tree_model_filter_refilter ()
void
gtk_tree_model_filter_refilter (GtkTreeModelFilter *filter); Вызывает ::row_changed для каждой строки в модели-потомке, что заставляет фильтр повторно оценивать видимость каждой строки.
Параметры
filter |
С версии: 2.4
gtk_tree_model_filter_clear_cache ()
void
gtk_tree_model_filter_clear_cache (GtkTreeModelFilter *filter); Эту функцию следует вызывать крайне редко. Она очищает кэш filter от кэшированных итераторов, которые не были сохранены с помощью gtk_tree_model_ref_node(). Это может быть полезно, если модель-потомок, которая фильтруется, статична (и не часто изменяется), и было много несохранённых обращений к узлам. В качестве побочного эффекта этой функции все несохранённые итераторы станут недействительными.
Параметры
filter |
С версии: 2.4
Типы и значения
struct GtkTreeModelFilter
struct GtkTreeModelFilter;
Подробности свойств
Свойство “child-model”
“child-model” GtkTreeModel *
Модель для фильтрации фильтрующей моделью.
Флаги: Чтение / Запись / Только для конструирования
Свойство “virtual-root”
“virtual-root” GtkTreePath *
Виртуальный корень (относительно модели-потомка) для этой фильтрующей модели.
Флаги: Чтение / Запись / Только для конструирования
См. также
© 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/GtkTreeModelFilter.html