Перетаскивание элементов в GtkTreeView
Перетаскивание элементов в GtkTreeView — Интерфейсы для поддержки перетаскивания в GtkTreeView
Функции
| gboolean | gtk_tree_drag_source_drag_data_delete () |
| gboolean | gtk_tree_drag_source_drag_data_get () |
| gboolean | gtk_tree_drag_source_row_draggable () |
| gboolean | gtk_tree_drag_dest_drag_data_received () |
| gboolean | gtk_tree_drag_dest_row_drop_possible () |
| gboolean | gtk_tree_set_row_drag_data () |
| gboolean | gtk_tree_get_row_drag_data () |
Типы и значения
Иерархия объектов
GInterface ├── GtkTreeDragDest ╰── GtkTreeDragSource
Известные реализации
GtkTreeDragSource реализуется с помощью GtkListStore, GtkTreeModelFilter, GtkTreeModelSort и GtkTreeStore.
GtkTreeDragDest реализуется с помощью GtkListStore и GtkTreeStore.
Файлы заголовков
#include <gtk/gtk.h>
Описание
GTK+ поддерживает перетаскивание в древовидных представлениях с помощью API высокого и низкого уровня.
API низкого уровня состоит из API перетаскивания GTK+, дополненного некоторыми вспомогательными функциями для древовидных представлений: 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 предоставляет большую гибкость, но ничего не происходит автоматически, и реализация таких расширенных функций, как открытие строк при наведении курсора или автоматическое прокручивание на основе этого API, требует значительных усилий.
С другой стороны, если вы работаете с API высокого уровня, то вся работа с записями выполняется за вас, а также такие функции, как наведение курсора для открытия и автоматическая прокрутка, но ваши модели должны реализовывать интерфейсы GtkTreeDragSource и GtkTreeDragDest.
Функции
gtk_tree_drag_source_drag_data_delete ()
gboolean gtk_tree_drag_source_drag_data_delete (GtkTreeDragSource *drag_source,GtkTreePath *path);
Просит GtkTreeDragSource удалить строку по адресу path, так как она была перемещена в другое место с помощью перетаскивания. Возвращает FALSE , если удаление завершилось неудачно, потому что path больше не существует или по какой-то причине, связанной с моделью. Должен надёжно обрабатывать ситуацию, когда path больше не найден в модели!
Параметры
drag_source | ||
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 | ||
path | строка, которая перетаскивалась | |
selection_data | a GtkSelectionData для заполнения данными из перетаскиваемой строки |
Возвращаемое значение
TRUE если данные требуемого типа были предоставлены
gtk_tree_drag_source_row_draggable ()
gboolean gtk_tree_drag_source_row_draggable (GtkTreeDragSource *drag_source,GtkTreePath *path);
Просит GtkTreeDragSource проверить, может ли конкретная строка быть источником операции перетаскивания. Если источник не реализует этот интерфейс, строка предполагается перетаскиваемой.
Параметры
drag_source | ||
path | строка, с которой пользователь начинает перетаскивание |
Возвращаемое значение
TRUE если строка может быть перетащена
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 больше не найден в модели!
Параметры
Возвращаемое значение
было ли создано новая строка перед позицией 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 не существует.
Параметры
Возвращаемое значение
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.
Параметры
Возвращаемое значение
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 происходит из того же процесса, который вызывает эту функцию, потому что указатель на модель дерева передаётся. Если вы не в том же процессе, то получите повреждение памяти. В обработчике drag_data_received GtkTreeDragDest вы можете предположить, что данные выделения типа GTK_TREE_MODEL_ROW поступают из текущего процесса. Возвращаемый путь нужно освободить с помощью gtk_tree_path_free().
Параметры
Возвращаемое значение
TRUE если selection_data имел целевой тип GTK_TREE_MODEL_ROW и в остальном является корректным
Типы и значения
GtkTreeDragSource
typedef struct _GtkTreeDragSource GtkTreeDragSource;
struct GtkTreeDragSourceIface
struct GtkTreeDragSourceIface {
/* 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);
};
Члены
| Запрашивает у GtkTreeDragSource, может ли конкретная строка использоваться в качестве источника операции перетаскивания. | |
| Запрашивает у GtkTreeDragSource заполнить selection_data представлением строки по пути path. | |
| Запрашивает у GtkTreeDragSource удалить строку по пути path, так как она была перемещена в другое место с помощью перетаскивания. |
GtkTreeDragDest
typedef struct _GtkTreeDragDest GtkTreeDragDest;
struct GtkTreeDragDestIface
struct GtkTreeDragDestIface {
/* 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);
};
Члены
| Запрашивает у GtkTreeDragDest вставить строку перед путем dest, взяв содержимое из selection_data. | |
| Определяет, возможно ли выполнение выгрузки перед заданным dest_path на той же глубине, что и dest_path. |
© 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/gtk3-GtkTreeView-drag-and-drop.html