DnD: не приходит DROP event
От: DemonS77  
Дата: 23.11.10 15:49
Оценка:
Добрый день!
Задача у меня стоит такая. Есть select, при перетаскивании в него options, value этого option нужно записать в std::set.
ПРоблема в том, что событие (DROP | SINKING) приходит и отлавливается, а событие DROP не приходит. А судя по описанию здесь именно его мне и надо ловить.
Что я делаю не так? Может, по-другому нужно?
Вот html:

<html>
<head>
<style>
select.source,
select.source2 
{
     width:*; height:10em;
}

select.source > option 
{
  draggable:only-copy;
} 

select.source2 > option 
{
  draggable:only-move;
} 

select > option:moving 
{
  opacity:.5;
  background:orange;
}

select > option:copying 
{
  opacity:.5;
  background:lime;
}

select.drop
{
  accept-drop: selector(select.source > option);
  outline-color: orange;
  border-color :orange;
}

select.drop.insert
{
  drop:insert;
}

 .trash
{
  accept-drop: selector(select.source2 > option); /* accept drop of items only from carts */ 
  drop: recycle; /* delete element on drop */
}

.drop:drag-over,
.trash:drag-over /* dragging operation is in effect and this element is the active target and dragged element is over this one */  
{
    border:solid 1px blue;
}
</style>
</head>
<body>
            <table border="0" cellspacing="0" cellpadding="0" width="100%">
                <tr>
                    <td><b>Общий список:</b></td><td><b>Выбранные опции:</b></td><td>Удалять здесь:</td>
                </tr>
                <tr>
                    <td>
                        <select id="IL_select" size=10 .source >
                            <option>Item 1</option>
                            <option>Item 2</option>
                        </select>
                       </td>
                    <td>
                        <select id="IL_nicks" size=10 .source2 .drop .insert >
                        </select>
                    </td>
                    <td width="50px" valign="top">
                        <img id="IL_trash" .trash src="recycle.png" />
                       </td>
                </tr>
            </table>
</body>
</html>


Реализация event_handler:
    struct IgnorListT : public htmlayout::event_handler
    {
        IgnorListT() : htmlayout::event_handler(HANDLE_MOUSE) 
        {
            htmlayout::dom::element     root = htmlayout::dom::root_element(hMainWnd);
            if (!root.is_valid())
                return;
            htmlayout::dom::element     nicks = root.get_element_by_id(L"IL_nicks");
            htmlayout::dom::element     trash = root.get_element_by_id(L"IL_trash");
            if (!nicks.is_valid() || !trash.is_valid())
                return;
            nicks.attach(this);
            trash.attach(this);
        };
        virtual int handle_mouse(HELEMENT he, MOUSE_PARAMS& params )
        {
            while (params.cmd == DROP)
            {
                htmlayout::dom::element     mHtmlRoot = htmlayout::dom::root_element(hMainWnd);
                htmlayout::dom::element     nicks = mHtmlRoot.get_element_by_id(L"IL_nicks");
                htmlayout::dom::element     trash = mHtmlRoot.get_element_by_id(L"IL_trash");
                htmlayout::dom::element    dropped = params.dragging;
                if (!nicks.is_valid() || !trash.is_valid() || !dropped.is_valid())
                    break;
                // получим имя элемента
                json::value        val = dropped.get_value();
                SexyString nick = aux::w2a(val.to_string().c_str()).operator const char*(); 
                htmlayout::dom::element    target = params.target;
                // если дропнуто в nicks - добавим имя в список
                if (target == nicks)
                {
                    mILNiks.insert(nick);
                }
                else
                    if (target == trash)
                    { // если дропнуто в корзину - удалим из списка
                        StringSetT::iterator it;
                        it = mILNiks.find(nick); // поищем значение
                        if (it != mILNiks.end())
                            mILNiks.erase(it); // найдено - удаляем
                    }
                    break;
            }
            return FALSE;
        }
        StringSetT    mILNiks; // тут список ников для игнора
    } IgnorList;
drag drop обработать
Re: DnD: не приходит DROP event
От: c-smile Канада http://terrainformatica.com
Дата: 24.11.10 00:17
Оценка:
Здравствуйте, DemonS77, Вы писали:

DS>Добрый день!

DS>Задача у меня стоит такая. Есть select, при перетаскивании в него options, value этого option нужно записать в std::set.
DS>ПРоблема в том, что событие (DROP | SINKING) приходит и отлавливается, а событие DROP не приходит. А судя по описанию здесь именно его мне и надо ловить.
DS>Что я делаю не так? Может, по-другому нужно?

DROP | SINKING (до моей обработки) или
DROP | HANDLED (после моей обработки)
Re[2]: DnD: не приходит DROP event
От: DemonS77  
Дата: 24.11.10 08:33
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, DemonS77, Вы писали:


DS>>Добрый день!

DS>>Задача у меня стоит такая. Есть select, при перетаскивании в него options, value этого option нужно записать в std::set.
DS>>ПРоблема в том, что событие (DROP | SINKING) приходит и отлавливается, а событие DROP не приходит. А судя по описанию именно его мне и надо ловить.
DS>>Что я делаю не так? Может, по-другому нужно?

CS>DROP | SINKING (до моей обработки) или

CS>DROP | HANDLED (после моей обработки)

Спасибо за ответ. Похоже, есть еще проблемы.
1. В MOUSE_PARAMS.target приходит непонятно что, а не drop-target element. Drop-target element приходит в he (handle_mouse( HELEMENT he, MOUSE_PARAMS& params )). Либо баг, либо описание здесь неверное.
Либо я не так понял его.
2. Я прицепляю обработчик на 2 объекта, а event приходит только "#IL_nicks". Причем в обоих случаях и когда я кидаю в него елемент и когда я перетаскиваю элемент из него в "мусорку". С отличием в том, что при выкидывании в мусорку params.target и params.dragging совпадают.
3. Можно ли как-то обеспечить уникальность элементов в "#IL_nicks"? Возврат TRUE при (DROP | SINKING) не отменяет добавление этого злемента.
4. Как мне определить что элемент удаляется из "#IL_nicks", кроме того как сравнивать params.target и params.dragging? Или это и есть правильный вариант?
Re[3]: DnD: не приходит DROP event
От: DemonS77  
Дата: 25.11.10 06:59
Оценка:
Здравствуйте, DemonS77, Вы писали:

DS>Спасибо за ответ. Похоже, есть еще проблемы.

DS>1. В MOUSE_PARAMS.target приходит непонятно что, а не drop-target element. Drop-target element приходит в he (handle_mouse( HELEMENT he, MOUSE_PARAMS& params )). Либо баг, либо описание здесь неверное.
DS>Либо я не так понял его.
DS>2. Я прицепляю обработчик на 2 объекта, а event приходит только "#IL_nicks". Причем в обоих случаях и когда я кидаю в него елемент и когда я перетаскиваю элемент из него в "мусорку". С отличием в том, что при выкидывании в мусорку params.target и params.dragging совпадают.
DS>3. Можно ли как-то обеспечить уникальность элементов в "#IL_nicks"? Возврат TRUE при (DROP | SINKING) не отменяет добавление этого злемента.
DS>4. Как мне определить что элемент удаляется из "#IL_nicks", кроме того как сравнивать params.target и params.dragging? Или это и есть правильный вариант?

Скачал последнюю версию htmlayout с сайта. 1-й пункт отменяется, там приходит то, что описано...
Остальные по-прежнему актуальны.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.