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;Структура не имеет непосредственного доступа. Используйте для доступа функции приведённые ниже.
gtk_tree_model_sort_new_with_model ()
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