Prev

Up

Home

GTK+ Reference Manual

Next

Top  |  Description  |  Object Hierarchy  |  Known Implementations

GtkTreeView drag-and-drop

GtkTreeView drag-and-drop Интерфейс для поддержки drag-and-drop в GtkTreeView

Краткое описание

#include <gtk/gtk.h> GtkTreeDragSource; GtkTreeDragSourceIface; gboolean gtk_tree_drag_source_drag_data_delete (GtkTreeDragSource *drag_source, GtkTreePath *path); gboolean gtk_tree_drag_source_drag_data_get (GtkTreeDragSource *drag_source, GtkTreePath *path, GtkSelectionData *selection_data); gboolean gtk_tree_drag_source_row_draggable (GtkTreeDragSource *drag_source, GtkTreePath *path); GtkTreeDragDest; GtkTreeDragDestIface; gboolean gtk_tree_drag_dest_drag_data_received (GtkTreeDragDest *drag_dest, GtkTreePath *dest, GtkSelectionData *selection_data); gboolean gtk_tree_drag_dest_row_drop_possible (GtkTreeDragDest *drag_dest, GtkTreePath *dest_path, GtkSelectionData *selection_data); gboolean gtk_tree_set_row_drag_data (GtkSelectionData *selection_data, GtkTreeModel *tree_model, GtkTreePath *path); gboolean gtk_tree_get_row_drag_data (GtkSelectionData *selection_data, GtkTreeModel **tree_model, GtkTreePath **path);

Иерархия объектов

GInterface +----GtkTreeDragSource GInterface +----GtkTreeDragDest

Известные реализации

GtkTreeDragSource реализован GtkTreeModelSort, GtkTreeStore, GtkListStore и GtkTreeModelFilter.

GtkTreeDragDest реализован GtkTreeStore и GtkListStore.

Описание

GTK+ поддерживает Drag-and-Drop в деревьях просмотра с помощью низкоуровневых и высокоуровневых API.

API низкого уровня содержит GTK+ DND API, расширенный некоторыми сервисными функциями treeview: gtk_tree_view_set_drag_dest_row(), gtk_tree_view_get_drag_dest_row(), gtk_tree_view_get_dest_row_at_pos(), gtk_tree_view_create_row_drag_icon(), gtk_tree_set_row_drag_data() и gtk_tree_get_row_drag_data(). Этот API представляет большую гибкость, но ничего не выполняет автоматически, а осуществление расширенных особенностей, таких как открытие строк при наведении (hover-to-open-rows) или автоматическое прокручивание выше уровня работы этого API.

С другой стороны, если вы создаёте высокоуровневый API, то весь обсчет строк выполняется за вас, так же как открытие при наведении (hover-to-open) и автоматическое прокручивание (auto-scroll), но ваши модели должны реализовывать интерфейсы GtkTreeDragSource и GtkTreeDragDest.

Детали

GtkTreeDragSource

typedef struct _GtkTreeDragSource GtkTreeDragSource;

GtkTreeDragSourceIface

typedef struct { GTypeInterface g_iface; /* VTable - not signals */ gboolean (* row_draggable) (GtkTreeDragSource *drag_source, GtkTreePath *path); gboolean (* drag_data_get) (GtkTreeDragSource *drag_source, GtkTreePath *path, GtkSelectionData *selection_data); gboolean (* drag_data_delete) (GtkTreeDragSource *drag_source, GtkTreePath *path); } GtkTreeDragSourceIface;

gtk_tree_drag_source_drag_data_delete ()

gboolean gtk_tree_drag_source_drag_data_delete (GtkTreeDragSource *drag_source, GtkTreePath *path);

Запрашивает GtkTreeDragSource для удаления строки из path, потому что она была перемещена куда либо посредством операции drag-and-drop. Возвращает FALSE если удаление не удалось потому что path больше не существует, или по некоторым специфичным причинам модели. Должна надёжно обрабатывать path не находящийся больше в модели!

drag_source :

GtkTreeDragSource

path :

Строка которую перетащили

Возвращает :

TRUE если строка была полностью удалена


gtk_tree_drag_source_drag_data_get ()

gboolean gtk_tree_drag_source_drag_data_get (GtkTreeDragSource *drag_source, GtkTreePath *path, GtkSelectionData *selection_data);

Запрашивает GtkTreeDragSource для заполнения в selection_data с представлением строки в path. selection_data->target выдаёт необходимый тип данных. Должна надёжно обрабатывать path не находящийся больше в модели!

drag_source :

GtkTreeDragSource

path :

Строка которую перетащили

selection_data :

GtkSelectionData для заполнения данными из перетаскиваемой строки

Возвращает :

TRUE если данные необходимого типа были обеспечены


gtk_tree_drag_source_row_draggable ()

gboolean gtk_tree_drag_source_row_draggable (GtkTreeDragSource *drag_source, GtkTreePath *path);

Запрашивает GtkTreeDragSource может ли определенная строка быть источником DND операции. Если источник не реализует этот интерфейс, строка это предполагаемый объект перемещения.

drag_source :

GtkTreeDragSource

path :

Строка на которой пользователь начал перетаскивание

Возвращает :

TRUE если строка может быть перемещена


GtkTreeDragDest

typedef struct _GtkTreeDragDest GtkTreeDragDest;

GtkTreeDragDestIface

typedef struct { GTypeInterface g_iface; /* VTable - not signals */ gboolean (* drag_data_received) (GtkTreeDragDest *drag_dest, GtkTreePath *dest, GtkSelectionData *selection_data); gboolean (* row_drop_possible) (GtkTreeDragDest *drag_dest, GtkTreePath *dest_path, GtkSelectionData *selection_data); } GtkTreeDragDestIface;

gtk_tree_drag_dest_drag_data_received ()

gboolean gtk_tree_drag_dest_drag_data_received (GtkTreeDragDest *drag_dest, GtkTreePath *dest, GtkSelectionData *selection_data);

Запрашивает GtkTreeDragDest для вставки строки перед dest, получая содержимое строки из selection_data. Если dest вне дерева, так что вставка перед ним невозможна, возвращается FALSE. Кроме того, FALSE может быть возвращено если новая строка не создана по специфичным для модели причинам. Должна надёжно обрабатывать dest не находящийся больше в модели!

drag_dest :

GtkTreeDragDest

dest :

Строка для перетаскивания вперед

selection_data :

Данные для перетаскивания

Возвращает :

Была ли новая строка создана перед позицией dest


gtk_tree_drag_dest_row_drop_possible ()

gboolean gtk_tree_drag_dest_row_drop_possible (GtkTreeDragDest *drag_dest, GtkTreePath *dest_path, GtkSelectionData *selection_data);

Определяет возможность перетаскивания перед данным dest_path, в той же самой глубине как dest_path. То есть, можем мы перетащить данные в selection_data в то же положение. dest_path не должен существовать; однако, возвращаемое значение почти наверняка будет FALSE если родитель dest_path не будет существовать.

drag_dest :

GtkTreeDragDest

dest_path :

Строка назначения

selection_data :

Перетаскиваемые данные

Возвращает :

TRUE если перетаскивание возможно перед dest_path


gtk_tree_set_row_drag_data ()

gboolean gtk_tree_set_row_drag_data (GtkSelectionData *selection_data, GtkTreeModel *tree_model, GtkTreePath *path);

Устанавливает выделение данных целевого типа GTK_TREE_MODEL_ROW. Обычно используется в обработчике drag_data_get.

selection_data :

некоторый GtkSelectionData

tree_model :

GtkTreeModel

path :

Строка в tree_model

Возвращает :

TRUE если GtkSelectionData имеет надлежащий целевой тип позволяющий нам устанавливать строку дерева.


gtk_tree_get_row_drag_data ()

gboolean gtk_tree_get_row_drag_data (GtkSelectionData *selection_data, GtkTreeModel **tree_model, GtkTreePath **path);

Определяет tree_model и path из выделенных данных целевого типа GTK_TREE_MODEL_ROW. Обычно вызывается из обработчика drag_data_received. Эта функция должна использоваться только если selection_data происходит из того же процесса который вызвал эту функцию, потому что указатель на дерево модели помещается рядом. Если вы не находитесь в том же самом процессе, то вы получите искажение памяти. В GtkTreeDragDest drag_data_received обработчике, вы можете предположить что выделенные данные типа GTK_TREE_MODEL_ROW находятся в текущемм процессе. Возвращаемый путь должен освобождаться с помощью gtk_tree_path_free().

selection_data :

GtkSelectionData

tree_model :

GtkTreeModel

path :

Строка в tree_model

Возвращает :

TRUE если selection_data имеет целевой тип GTK_TREE_MODEL_ROW или иначе доступны