GtkTreeModelFilter
GtkTreeModelFilter — GtkTreeModel, скрывающий части базовой древовидной модели
Функции
Свойства
| 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 | ||
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 как virtual root.
Параметры
child_model | ||
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 | ||
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() может быть вызвана только один раз для данной модели фильтра.
Параметры
filter | ||
n_columns | Количество столбцов в модели фильтра. | |
types | GTypes столбцов. | [array length=n_columns] |
func | ||
data | Данные пользователя для передачи функции модификации, или | [allow-none] |
destroy | Функция удаления | [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 | ||
column | Значение типа 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 *
Модель, по которой будет фильтроваться filtermodel.
Владелец: GtkTreeModelFilter
Флаги: Чтение / Запись / Только для создания
Свойство “virtual-root”
“virtual-root” GtkTreePath *
Виртуальный корень (относительно модели child) для этой filtermodel.
Владелец: GtkTreeModelFilter
Флаги: Чтение / Запись / Только для создания
См. также
© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer.gnome.org/gtk3/3.24/GtkTreeModelFilter.html