| |
![]() |
GTK+ Reference Manual |
||||
---|---|---|---|---|
Top | Description | Object Hierarchy | Implemented Interfaces | Properties |
GtkTreeModelSortGtkTreeModelSort GtkTreeModel который делает основную модель дерева сортируемой |
#include <gtk/gtk.h>
GtkTreeModelSort;
GtkTreeModel* gtk_tree_model_sort_new_with_model
(GtkTreeModel *child_model);
GtkTreeModel* gtk_tree_model_sort_get_model (GtkTreeModelSort *tree_model);
GtkTreePath* gtk_tree_model_sort_convert_child_path_to_path
(GtkTreeModelSort *tree_model_sort,
GtkTreePath *child_path);
void gtk_tree_model_sort_convert_child_iter_to_iter
(GtkTreeModelSort *tree_model_sort,
GtkTreeIter *sort_iter,
GtkTreeIter *child_iter);
GtkTreePath* gtk_tree_model_sort_convert_path_to_child_path
(GtkTreeModelSort *tree_model_sort,
GtkTreePath *sorted_path);
void gtk_tree_model_sort_convert_iter_to_child_iter
(GtkTreeModelSort *tree_model_sort,
GtkTreeIter *child_iter,
GtkTreeIter *sorted_iter);
void gtk_tree_model_sort_reset_default_sort_func
(GtkTreeModelSort *tree_model_sort);
void gtk_tree_model_sort_clear_cache (GtkTreeModelSort *tree_model_sort);
gboolean gtk_tree_model_sort_iter_is_valid
(GtkTreeModelSort *tree_model_sort,
GtkTreeIter *iter);
GObject +----GtkTreeModelSort
GtkTreeModelSort осуществляет GtkTreeModel, GtkTreeDragSource и GtkTreeSortable.
"model" GtkTreeModel : Read / Write / Construct Only
GtkTreeModelSort это модель которая осуществляет интерфейс GtkTreeSortable. Она не содержит никаких данных непосредственно, а скорее создаёт дочернюю модель и уполномочивает её данные. Она имеет идентичные типы столбцов для этой дочерней модели и изменения в ней. Первичная цель этой модели обеспечить способ сортировки других моделей не изменяя их. Помните что функции сортировки используемые GtkTreeModelSort не гарантируют стабильность.
Использование лучше демонстрируется через пример. В следующем приведённом коде примера мы создаём два виджета GtkTreeView каждый с одними и теме же данными. Так как оболочкой модели здесь является GtkTreeModelSort, оба GtkTreeViews могут сортировать свой вид данных не влияя на другой. В отличии от этого, если бы мы просто поместили некоторую модель в каждый виджет, то при сортировки одного сортировался бы и другой.
Пример 3. Использование GtkTreeModelSort
{
GtkTreeView *tree_view1;
GtkTreeView *tree_view2;
GtkTreeModel *sort_model1;
GtkTreeModel *sort_model2;
GtkTreeModel *child_model;
/* получаем дочернюю модель */
child_model = get_my_model()
;
/* Создаём первое дерево */
sort_model1 = gtk_tree_model_sort_new_with_model (child_model);
tree_view1 = gtk_tree_view_new_with_model (sort_model1);
/* Создаём второе дерево */
sort_model2 = gtk_tree_model_sort_new_with_model (child_model);
tree_view2 = gtk_tree_view_new_with_model (sort_model2);
/* Теперь мы можем сортировать обе модели независимо */
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort_model1),
COLUMN_1, GTK_SORT_ASCENDING);
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort_model2),
COLUMN_1, GTK_SORT_DESCENDING);
}
Для демонстрации доступа к основной дочерней модели из модели сортировки в следующем примере применён обратный вызов для GtkTreeSelection "changed" сигнала. В этом вызове, мы получаем строку из COLUMN_1 модели. Когда мы изменяем строку, находим туже самую выбранную сроку в дочерней модели и изменяем строку в ней.
Пример 4. Доступ к дочерней модели выбором изменения обратного вызова
void selection_changed (GtkTreeSelection *selection, gpointer data) { GtkTreeModel *sort_model = NULL; GtkTreeModel *child_model; GtkTreeIter sort_iter; GtkTreeIter child_iter; char *some_data = NULL; char *modified_data; /* Получаем текущий выбор и модель. */ if (! gtk_tree_selection_get_selected (selection, &sort_model, &sort_iter)) return; /* Находим текущеме значение выбранной строки и получаем новое значение * для изменения. */ gtk_tree_model_get (GTK_TREE_MODEL (sort_model), &sort_iter, COLUMN_1, &some_data, -1); modified_data = change_the_data (some_data); g_free (some_data); /* Получаем итератор дочерней модели, вместо сортируемой модели. */ gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (sort_model), &child_iter, &sort_iter); /* Получаем дочернюю модель и изменяем значение строки. В этом * примере, дочерняя модель это GtkListStore. Однако она может быть * любого другого типа. */ child_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model)); gtk_list_store_set (GTK_LIST_STORE (child_model), &child_iter, COLUMN_1, &modified_data, -1); g_free (modified_data); }
typedef struct _GtkTreeModelSort GtkTreeModelSort;
Структура не имеет непосредственного доступа. Используйте для доступа функции приведённые ниже.
GtkTreeModel* gtk_tree_model_sort_new_with_model (GtkTreeModel *child_model);
Создаёт новый GtkTreeModel,
с child_model
как дочерней моделью.
|
|
Возвращает : |
Новый GtkTreeModel. |
GtkTreeModel* gtk_tree_model_sort_get_model (GtkTreeModelSort *tree_model);
Возвращает модель сортировки GtkTreeModelSort.
|
|
Возвращает : |
отсортированную «дочернюю модель» |
GtkTreePath* gtk_tree_model_sort_convert_child_path_to_path (GtkTreeModelSort *tree_model_sort, GtkTreePath *child_path);
Преобразует child_path
в
относительный путь для tree_model_sort
.
Таким образом, child_path
указывает
путь в дочерней модели. Возвращаемый
путь будет указывать на туже строку в
отсортированной модели. Еслиchild_path
не доступный путь в дочерней модели,
возвращается NULL
.
|
|
|
GtkTreePath для преобразования |
Возвращает : |
Вновь размещенный GtkTreePath,
или |
void gtk_tree_model_sort_convert_child_iter_to_iter (GtkTreeModelSort *tree_model_sort, GtkTreeIter *sort_iter, GtkTreeIter *child_iter);
Устанавливает sort_iter
указывающий строку в tree_model_sort
,
который соответствует строке указанной
в child_iter
.
|
|
|
Неинициализированный GtkTreeIter. |
|
Допустимый GtkTreeIter указывающий строку в дочерней модели |
GtkTreePath* gtk_tree_model_sort_convert_path_to_child_path (GtkTreeModelSort *tree_model_sort, GtkTreePath *sorted_path);
Преобразует sorted_path
в путь
дочерней модели tree_model_sort
.
Таким образом, sorted_path
указывает на размещение в tree_model_sort
.
Возвращаемый путь будет указывать на
тоже расположение в не отсортированной
модели. Если sorted_path
не
указывает на расположение в дочерней
модели, возвращается NULL
.
|
|
|
GtkTreePath для преобразования |
Возвращает : |
Вновь распределённый GtkTreePath,
или |
void gtk_tree_model_sort_convert_iter_to_child_iter (GtkTreeModelSort *tree_model_sort, GtkTreeIter *child_iter, GtkTreeIter *sorted_iter);
Устанавливает child_iter
указывающий строку указанную в
sorted_iter
.
|
|
|
Неинициализированный GtkTreeIter |
|
Допустимый GtkTreeIter
указывающий строку в |
void gtk_tree_model_sort_reset_default_sort_func (GtkTreeModelSort *tree_model_sort);
Сбрасывает функцию сортировки по умолчанию в состояние 'unsorted'. Таким образом, определяется тот же порядок, что и у дочерней модели. Пересортировка модели в тот же порядок что и у дочерней, будет производится, только если модель GtkTreeModelSort в 'unsorted' состоянии.
|
void gtk_tree_model_sort_clear_cache (GtkTreeModelSort *tree_model_sort);
Эта функция почти никогда не вызывается.
Она очищает tree_model_sort
от
любых кэшированных итераторов которые
не были очищены с помощью
gtk_tree_model_ref_node()
.
Это может быть полезно, если дочерняя
модель отсортирована статично (и не
часто изменяется) и был длительный
доступ к неочищенным узлам. Как побочный
эффект этой функции, все неочищенные
итераторы будут недоступны.
|
gboolean gtk_tree_model_sort_iter_is_valid (GtkTreeModelSort *tree_model_sort, GtkTreeIter *iter);
Эта функция бесполезна. Используйте её только в случаях отладки или тестирования.
Проверяет доступен ли полученный итератор в этой GtkTreeModelSort.
|
|
|
|
Возвращает : |
Начиная с версии 2.2
model
""model" GtkTreeModel : Read / Write / Construct Only
Модель для сортировки в TreeModelSort.
GtkTreeModel, GtkListStore, GtkTreeStore, GtkTreeSortable, GtkTreeModelFilter
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |