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>
Описание
A GtkTreeModelFilter — это модель дерева, которая оборачивает другую модель дерева и может выполнять следующие действия:
Фильтрация определённых строк на основе данных из «столбца видимости», столбца, хранящего булевы значения, указывающие, следует ли фильтровать строку, или на основе значения функции «видимости», которая получает модель, итератор и user_data и возвращает булево значение, указывающее, следует ли фильтровать строку.
Изменение «внешнего вида» модели с помощью функции модификации. Это очень мощно и позволяет просто изменять некоторые значения, а также создавать совершенно другую модель на основе заданной дочерней модели.
Установка другого узла корня, также известного как «виртуальный корень». Можно передать 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,int column,gpointer data);
Функция, рассчитывающая значения отображения из исходных значений в модели. Она должна заполнить value значением отображения для столбца column в строке, указанной параметром iter.
Поскольку эта функция вызывается для каждого доступа к данным, это не особенно эффективный процесс.
Параметры
model | ||
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 | A GtkTreeModel. | |
root | A GtkTreePath или | [allow-none] |
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”
char *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 | ||
func | GtkTreeModelFilterVisibleFunc, функция видимости | |
data | Пользовательские данные, передаваемые функции видимости, или | [allow-none] |
destroy | Указатель на функцию уничтожения для | [allow-none] |
gtk_tree_model_filter_set_modify_func ()
void gtk_tree_model_filter_set_modify_func (GtkTreeModelFilter *filter,int n_columns,GType *types,GtkTreeModelFilterModifyFunc func,gpointer data,GDestroyNotify destroy);
С помощью параметров n_columns и types вы задаете массив типов столбцов для этой модели (которые будут доступны родительской модели/представлению). Параметры func, data и destroy задают функцию модификации. Функция модификации будет вызываться при каждом доступе к данным, ее цель — возвращать данные, которые должны отображаться в указанном месте с использованием параметров функции модификации.
Обратите внимание, что gtk_tree_model_filter_set_modify_func() может быть вызвана только один раз для данной модели фильтра.
Параметры
filter | ||
n_columns | Количество столбцов в модели фильтра. | |
types | Типы столбцов GTypes. | [array length=n_columns] |
func | ||
data | Пользовательские данные, передаваемые функции модификации, или | [allow-none] |
destroy | Указатель на функцию уничтожения для | [allow-none] |
gtk_tree_model_filter_set_visible_column ()
void gtk_tree_model_filter_set_visible_column (GtkTreeModelFilter *filter,int 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 int, который является столбцом, содержащим информацию о видимости |
gtk_tree_model_filter_get_model ()
GtkTreeModel *
gtk_tree_model_filter_get_model (GtkTreeModelFilter *filter); Возвращает указатель на дочернюю модель filter.
Параметры
filter |
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 является допустимым итератором, указывающим на видимую строку в дочерней модели.
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, указывающий на строку в |
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 для преобразования. |
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 для преобразования. |
gtk_tree_model_filter_refilter ()
void
gtk_tree_model_filter_refilter (GtkTreeModelFilter *filter); Вызывает ::row_changed для каждой строки в дочерней модели, что заставляет фильтр повторно оценивать, видима ли та или иная строка.
Параметры
filter |
gtk_tree_model_filter_clear_cache ()
void
gtk_tree_model_filter_clear_cache (GtkTreeModelFilter *filter); Функцию почти никогда не следует вызывать. Она очищает filter любых кэшированных итераторов, которые не были переназначены с помощью gtk_tree_model_ref_node(). Это может быть полезно, если дочерняя модель, которая фильтруется, является статической (и не часто изменяется), и было много непереназначенных обращений к узлам. Побочным эффектом этой функции является то, что все непереназначенные итераторы станут недействительными.
Параметры
filter |
Типы и значения
struct GtkTreeModelFilter
struct GtkTreeModelFilter;
Подробности свойств
Свойство “child-model”
“child-model” GtkTreeModel *
Модель для фильтрации модели фильтра.
Владелец: GtkTreeModelFilter
Флаги: Чтение / Запись / Только для построения
Свойство “virtual-root”
“virtual-root” GtkTreePath *
Виртуальный корень (относительно дочерней модели) для этой модели фильтра.
Владелец: GtkTreeModelFilter
Флаги: Чтение / Запись / Только для построения
См. также
© 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/GtkTreeModelFilter.html