Добрый день!
Задача у меня стоит такая. Есть 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;