logo
Литература_1 / photon_old

Виджет-адресат

Подтипами события "тащи и бросай", представляющими интерес для адресата операции, являются:

Ph_EV_DND_ENTER

Кто-то перетащил некие данные в область виджета, но ещё не сбросил их. Этот подтип события (reason_subtype) является первоначальной причиной вызова ответной реакции операции "тащи и бросай". В этот момент приложение принимает решение, примет ли оно сброшенные данные. Оно должно построить некий массив структур типа PtDndFetch_t и передать его функции PtDndSelect(). Это массив описывает допустимые типы, описания и транспортные методы для данных, участвующих в операциях "тащи и бросай", доступные для виджета. Функция PtDndSelect() возвращает число выбранных элементов из массива. Если событие содержит данные или ссылки на данные, в допустимом формате, выбираются и эти фрагменты событий. Если никакие данные не допустимы, этот виджет никакими другими событиями текущей операции "тащи и бросай" не модифицируется.

Ph_EV_DND_MOTION

Указатель перемещается внутри зоны выиджета. Этот тип событий генерируется только в случае, когда для фрагмента выбранных данных в члене select_flags структуры PtDndFetch_t установлен бит Pt_DND_SELECT_MOTION.

Ph_EV_DND_DROP

Пользователь сбросил данные. Для этого подтипа события ответная реакция получает из события выбранные данные. Это может включать в себя какую-то автоматическую, неблокируемую связь с источником данных – чтобы не допустить какую-либо связь с источником, задайте Ph_TRANSPORT_INLINE в качестве единственно допустимого транспортного протокола.

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

Ph_EV_DND_LEAVE

Указатель вышел за пределы зоны виджета, но пользователь не сбросил данные.

Вот пример, работающий с ответной реакцией, приведённой выше для виджета PtLabel. Эта ответная реакция допускает в качестве данных операции "тащи и бросай" следующие типы:

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

/* Стандартные хеадеры */

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

/* Инструментальные хеадеры */

#include <Ph.h>

#include <Pt.h>

#include <Ap.h>

/* Локальные хеадеры */

#include "abimport.h"

#include "proto.h"

static PtDndFetch_t stuff_i_want[] = {

{"text", "plain", Ph_TRANSPORT_INLINE, },

{"image", NULL, Ph_TRANSPORT_INLINE, },

{"text", "image description", Ph_TRANSPORT_INLINE, Pt_DND_SELECT_DUP_DATA, },

};

enum {

PLAIN_TEXT = 0,

IMAGE,

IMAGE_TEXT,

};

int dnd_callback( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) {

PtDndCallbackInfo_t *dndcb = cbinfo->cbdata;

int deep_free = 1, num_matches;

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

widget = widget, apinfo = apinfo;

cbinfo = cbinfo;

switch (cbinfo->reason_subtype) {

case Ph_EV_DND_ENTER:

num_matches = PtDndSelect (widget, stuff_i_want, ARRAY_SIZE( stuff_i_want ),

NULL, NULL, cbinfo );

break;

case Ph_EV_DND_DROP:

switch (dndcb->fetch_index) {

case PLAIN_TEXT:

PtSetResource (widget, Pt_ARG_TEXT_STRING, dndcb->data, strlen(dndcb->data));

break;

case IMAGE:

PtSetResource (widget, Pt_ARG_LABEL_IMAGE, dndcb->data, 0);

free (dndcb->data);

deep_free = 0;

break;

case IMAGE_TEXT:

printf ("Образ отсутствует; альтернативный текст: %s\n", (char *)dndcb->data);

break;

}

if (deep_free) {

PhFreeTransportType (dndcb->data, dndcb->trans_hdr->packing_type);

}

break;

} // switch по подтипу вызвавшего события

return( Pt_CONTINUE );

}

Yandex.RTB R-A-252273-3
Yandex.RTB R-A-252273-4