Библиотека сайта rus-linux.net
Программирование с использованием gtkmm 3. Механизм захвата и перемещения данных (Drag and Drop)
Оригинал: Programming with gtkmm 3Авторы: Murray Cumming, Bernhard Rieder, Jonathon Jongsma, Ole Laursen, Marko Anastasov, Daniel Elstner, Chris Vine, David King, Pedro Ferreira, Kjell Ahlstedt
Дата публикации: 15 Октября 2013 г.
Перевод: А.Панин
Дата перевода: 28 марта 2014 г.
18. Механизм захвата и перемещения данных (Drag and Drop)
Класс виджета Gtk::Widget содержит реализации нескольких методов и сигналов с префиксом "drag_". Они используются механизмом захвата и перемещения данных в рамках пользовательского интерфейса.
18.1. Источники данных и направления их перемещения
Данные захватываются из источников и перемещаются по направлениям перемещения. Каждый источник данных и каждое направление перемещения данных содержит информацию о доступных для отправки и приема форматах данных, представленную с помощью объектов форматов данных на основе класса Gtk::TargetEntry. Виджет направления перемещения данных будет принимать перемещаемые данные только в том случае, если он содержит совместимый объект формата данных на основе класса Gtk::TargetEntry. После этого произойдет генерация соответствующих сигналов с передачей в обработчики сигналов информации о том, какой объект формата данных на основе класса Gtk::TargetEntry был использован.
Gtk::TargetEntry содержат следующую информацию:
target(цель): Имя, такое, как"STRING"info(информация): Идентификатор, который будет передан с вашими сигналами для сообщения о том, какой объект формата данных на основе классаGtk::TargetEntryбыл использован.flags(флаги): Используются только для операций захвата и перемещения данных и указывают на то, могут ли данные перемещаться на сторонние виджеты и в сторонние приложения или только в одни и те же.
18.2. Методы
Gtk::Widget:
void drag_source_set(const ArrayHandle_TargetEntry& targets,
GdkModifierType start_button_mask, GdkDragAction actions);
targetsявляется контейнером для экземпляров класса формата данныхGtk::TargetEntry(например,std::list<Gtk::TargetEntry>илиstd::vector<Gtk::TargetEntyry>).start_button_maskявляется комбинацией значений, сформированной с помощью побитовой операции "или" и определяющей, какой модификатор клавиатуры или какую кнопку мыши должен нажать пользователь для начала захвата.actionsявляется комбинацией значений, сформированной с помощью побитовой операции "или" и определяющей, какие операции захвата и перемещения могут быть осуществлены при работе с рассматриваемым источником данных - к примеру, копирование, перемещение или установление ссылки. Пользователь может выбрать действие с помощью модификаторов клавиатуры, таких, как модификатор Shift, который предназначен для переключения с режима копирования (copy) на режим переноса данных (move), причем на переключение режима будет указано с помощью отличающегося изображения курсора.
void drag_dest_set(const ArrayHandle_TargetEntry& targets,
GtkDestDefaults flags, GdkDragAction actions);
flagsявляется комбинацией значений, сформированной с помощью побитовой операции "или" и указывающей на то, как виджет должен визуально реагировать на получение данных посредством механизма захвата и перемещения данных.actionsуказывает на действия в рамках механизма захвата и перемещения данных, которые данный виджет направления перемещения будет выполнять - обратитесь к описанию параметра с аналогичным названием выше.
18.3. Сигналы
После того, как виджет направления перемещения данных принимает перемещаемые данные, будут сгенерированы определенные сигналы в зависимости от того, какое действие было выбрано. Например, пользователь может удерживать клавишу Shift для выполнения операции перемещения (move) вместо копирования (copy). Помните о том, что пользователь может выбрать только те действия, которые вы установили при вызове методов drag_dest_set() и drag_source_set().
18.3.1. Копирование
drag_begin: Передается объект контекста операцииDragContext.drag_motion: Передается объект контекста операцииDragContextи координаты. Вы можете вызывать методdrag_start()объектаDragContextдля указания на то, какое направление перемещения будет использовано.drag_get: Передается целочисленное значениеinfo, указывающее на формат перемещаемых данных, а также структура данныхGtkSelectionData, в которую вы должны поместить запрашиваемые данные.drag_drop: Передается объект контекста операцииDragContextи координаты.drag_end: Передается объект контекста операцииDragContext.
"drag_get" виджетом источника данных:
drag_data_received: Передается целочисленное значениеinfoс информацией о формате переносимых данных и структураGtkSelectionData, которая содержит переносимые данные. Вы должны вызвать методdrag_finish()объекта контекста операцииDragContextдля указания но то, что операция была завершена успешно.
18.3.2. Перемещение
drag_delete: Предоставляет источнику данных возможность удалить оригинальную копию данных в том случае, если это возможно.
18.4. Объект контекста операции DragContext
Сигналы, связанные с операциями захвата и перемещения данных, передают в обработчики объект контекста операции DragContext, который содержит некоторую информацию об операции захвата и перемещения данных и может использоваться для оказания влияния на ход процесса. Например, вы можете установить виджет источника данных или изменить иконку операции захвата и перемещения данных с помощью метода set_icon(). Еще более важным аспектом работы с объектом контекста операции является необходимость вызова метода drag_finish() в рамках вашего обработчика сигналов "drag_data_received" для указания на то, была ли операция перемещения данных успешной.
18.5. Пример
Ниже приведен простой пример, демонстрирующий методику использования механизма захвата и перемещения данных для их копирования.
Рисунок 18-1: Механизм захвата и перемещения данных
Файл: dndwindow.h (Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: dndwindow.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: main.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)
Исходный код более сложного примера находится в директории examples/others/dnd.
Следующий раздел : 19. Буфер обмена.
