Добрый день!
Задача у меня стоит такая. Есть 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;
Здравствуйте, DemonS77, Вы писали:
DS>Добрый день!
DS>Задача у меня стоит такая. Есть select, при перетаскивании в него options, value этого option нужно записать в std::set.
DS>ПРоблема в том, что событие (DROP | SINKING) приходит и отлавливается, а событие DROP не приходит. А судя по описанию здесь именно его мне и надо ловить.
DS>Что я делаю не так? Может, по-другому нужно?
DROP | SINKING (до моей обработки) или
DROP | HANDLED (после моей обработки)
Здравствуйте, 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? Или это и есть правильный вариант?
Здравствуйте, 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-й пункт отменяется, там приходит то, что описано...
Остальные по-прежнему актуальны.