Spec-Zone.ru › GTK 3.20

GtkTreeModelFilter

GtkTreeModelFilter — GtkTreeModel, скрывающий части базовой модели дерева

Функции

gboolean (*GtkTreeModelFilterVisibleFunc) ()
void (*GtkTreeModelFilterModifyFunc) ()
GtkTreeModel * gtk_tree_model_filter_new ()
void gtk_tree_model_filter_set_visible_func ()
void gtk_tree_model_filter_set_modify_func ()
void gtk_tree_model_filter_set_visible_column ()
GtkTreeModel * gtk_tree_model_filter_get_model ()
gboolean gtk_tree_model_filter_convert_child_iter_to_iter ()
void gtk_tree_model_filter_convert_iter_to_child_iter ()
GtkTreePath * gtk_tree_model_filter_convert_child_path_to_path ()
GtkTreePath * gtk_tree_model_filter_convert_path_to_child_path ()
void gtk_tree_model_filter_refilter ()
void gtk_tree_model_filter_clear_cache ()

Свойства

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 указывает на строку в model, видимость которой определяется

data

данные пользователя, переданные функции gtk_tree_model_filter_set_visible_func().

[closure]

Возвращаемое значение

Является ли строка, указанная параметром iter, видимой.

GtkTreeModelFilterModifyFunc ()

void
(*GtkTreeModelFilterModifyFunc) (GtkTreeModel *model,
                                 GtkTreeIter *iter,
                                 GValue *value,
                                 gint column,
                                 gpointer data);

Функция, вычисляющая значения отображения из исходных значений в модели. Она должна заполнить value значением отображения для столбца column в строке, указанной параметром iter .

Так как эта функция вызывается для каждого доступа к данным, она не является особенно эффективной операцией.

Параметры

model

GtkTreeModelFilter

iter

GtkTreeIter указывает на строку, значения отображения которой определяются

value

GValue, предварительно инициализированный для столбца column .

[out caller-allocates]

column

столбец, значение отображения которого определяется

data

данные пользователя, переданные функции gtk_tree_model_filter_set_modify_func().

[closure]

gtk_tree_model_filter_new ()

GtkTreeModel *
gtk_tree_model_filter_new (GtkTreeModel *child_model,
                           GtkTreePath *root);

Создаёт новую GtkTreeModel, используя child_model в качестве модели-источника и root в качестве виртуального корня.

Параметры

child_model

GtkTreeModel.

root

GtkTreePath или NULL.

[allow-none]

Возвращаемое значение

Новая GtkTreeModel.

[transfer full]

С: 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

данные пользователя для передачи функции видимости, или NULL.

[allow-none]

destroy

Обработчик удаления data, или NULL.

[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() может быть вызвана только один раз для заданной модели фильтра.

Параметры

filter

A GtkTreeModelFilter.

n_columns

Количество столбцов в модели фильтра.

types

Типы G столбцов.

[array length=n_columns]

func

GtkTreeModelFilterModifyFunc

data

Данные пользователя, передаваемые функции изменения, или NULL.

[allow-none]

destroy

Уведомление о уничтожении data, или NULL.

[allow-none]

С: 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

A GtkTreeModelFilter

column

gint, который является столбцом, содержащим информацию о видимости.

С: 2.4

gtk_tree_model_filter_get_model ()

GtkTreeModel *
gtk_tree_model_filter_get_model (GtkTreeModelFilter *filter);

Возвращает указатель на дочернюю модель filter.

Параметры

filter

A GtkTreeModelFilter.

Возвращает

Указатель на GtkTreeModel.

[transfer none]

С: 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

A GtkTreeModelFilter.

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

A GtkTreeModelFilter.

child_iter

Неинициализированный GtkTreeIter.

[out]

filter_iter

Действительный GtkTreeIter, указывающий на строку в filter.

С: 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

A GtkTreeModelFilter.

child_path

GtkTreePath для преобразования.

Возвращает

Новый выделенный GtkTreePath или NULL.

[nullable][transfer full]

С: 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

Модель GtkTreeModelFilter.

filter_path

Путь GtkTreePath для преобразования.

Возвращаемое значение

Новый выделенный GtkTreePath или NULL.

[nullable][transfer full]

С: 2.4

gtk_tree_model_filter_refilter ()

void
gtk_tree_model_filter_refilter (GtkTreeModelFilter *filter);

Вызывает ::row_changed для каждой строки в модели дочерних элементов, что заставляет фильтр повторно оценивать, видна ли строка или нет.

Параметры

filter

Модель GtkTreeModelFilter.

С: 2.4

gtk_tree_model_filter_clear_cache ()

void
gtk_tree_model_filter_clear_cache (GtkTreeModelFilter *filter);

Функцию следует вызывать крайне редко. Очищает кэш filter любых кэшированных итераторов, которые не были сохранены с помощью gtk_tree_model_ref_node(). Это может быть полезно, если модель дочерних элементов, подвергающихся фильтрации, статична (и не часто меняется), и был значительный несохраненный доступ к узлам. В качестве побочного эффекта этой функции все несохранённые итераторы станут недействительными.

Параметры

filter

Модель GtkTreeModelFilter.

С: 2.4

Типы и значения

struct GtkTreeModelFilter

struct GtkTreeModelFilter;

Подробности свойств

Свойство “child-model”

  “child-model”              GtkTreeModel *

Модель для фильтрации filtermodel.

Флаги: Чтение / Запись / Только для создания

Свойство “virtual-root”

  “virtual-root”             GtkTreePath *

Виртуальная корневая директория (относительно модели дочерних элементов) для этого filtermodel.

Флаги: Чтение / Запись / Только для создания

См. также

GtkTreeModelSort

© 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/GtkTreeModelFilter.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API