Глава 22. Drag-and-drop (D&D)

Содержание

22.1. Обзор D&D
22.2. Свойства D&D
22.3. Методы D&D
22.3.1. Настройка исходного виджета
22.3.2. Сигналы на исходном виджете
22.3.3. Настройка конечного виджета
22.3.4. Сигналы на конечном виджете

PyGTK имеет высокоуровневый набор функций для межпроцессного взаимодействия через систему drag and drop. PyGTK может выполнять D&D через протоколы Xdnd и Motif.

22.1. Обзор D&D

Приложение, способное к D&D сначала определяет и настраивает виджеты для drag and drop. Любой виджет может быть источником или приёмником для D&D. Заметьте, что эти виджеты должны быть связаны с X Window.

Исходные виджеты могут отправлять перетаскиваемые данные, позволяя пользователю перетаскивать вещи из них тогда, когда конечные виджеты могут принимать перетаскиваемые данные. Приёмники D&D могут ограничивать перетаскиваемые на них данные, например только из такого-же приложения, или из любого приложения (включая себя).

Отправка и приём перетаскиваемых данных происходит с помощью сигналов. Скидывание элемента на конечный виджет требует запрос данных (для исходного виджета) и обработчик приёма данных (для конечного виджета). Дополнительные обработчики сигнала могут быть подключены в случаях, если вам нужно знать, когда начинается перетаскивание, когда произошло скидывание и когда вся процедура D&D была закончена (удачно или нет).

Ваше приложение должно предоставлять данные для исходных виджетов по запросу, что приводит к созданию обработчика сигнала запроса перетаскиваемых данных. Для конечных виджетов нужен обработчик сигнала получения перетаскиваемых данных.

Так, обычный цикл D&D выглядит так:

  • Перетаскивание начинается. Источник может получить сигнал "drag-begin". Может настроить перетаскиваемую иконку и.т.д.
  • Перетаскивание на область скидывания. Приёмник может получить сигнал "drag-motion".

  • Происходит скидывание. Приёмник может получить сигнал "drag-drop". Приёмник должен запросить данные источника.

  • Запрос перетаскиваемых данных (если скидывание произошло). Источник может получить сигнал "drag-data-get".

  • Перетаскиваемые данные получены (может этим-же или другим приложением). Приёмник может получить сигнал "drag-data-recieved".

  • Перетаскиваемые данные удаляются. Источник может получить сигнал "drag-data-delete".

  • Процедура D&D закончена. Источник может получить сигнал "drag-end".

Также есть несколько небольших шагов между этими пунктами, но подробнее мы рассмотрим их позже.