Change the management of the enter and leave element for the mouce event 0

This commit is contained in:
Edouard Dupin 2012-07-10 10:17:04 +02:00
parent 2c8cc56816
commit ed50654058
2 changed files with 46 additions and 22 deletions

View File

@ -73,7 +73,7 @@ static void CleanElement(InputPoperty_ts *eventTable, int32_t idInput)
eventTable[idInput].downStart.x = 0;
eventTable[idInput].downStart.y = 0;
eventTable[idInput].isDown = false;
eventTable[idInput].isInside = true;
eventTable[idInput].isInside = false;
eventTable[idInput].nbClickEvent = 0;
}
@ -206,21 +206,44 @@ void ewol::eventInput::Motion(ewol::inputType_te type, int pointerID, Vector2D<f
// not manage input
return;
}
// specific for the mouse system ...
if (type == ewol::INPUT_TYPE_MOUSE) {
if(pointerID == 0) {
ewol::Widget* destWidget = NULL;
if(NULL != gui_uniqueWindows) {
destWidget = gui_uniqueWindows->GetWidgetAtPos(pos);
}
if (NULL != destWidget) {
destWidget->OnEventInput(type, 0, ewol::EVENT_INPUT_TYPE_MOVE, pos);
}
return;
// special case for the mouse event 0 that represent the hover event of the system :
if (type == ewol::INPUT_TYPE_MOUSE && pointerID == 0) {
// this event is all time on the good widget ... and manage the enter and leave ...
// NOTE : the "layer widget" force us to get the widget at the specific position all the time :
ewol::Widget* tmpWidget = gui_uniqueWindows->GetWidgetAtPos(pos);
if( tmpWidget != eventTable[pointerID].curentWidgetEvent
|| ( true == eventTable[pointerID].isInside
&& ( eventTable[pointerID].origin.x > pos.x
|| eventTable[pointerID].origin.y > pos.y
|| (eventTable[pointerID].origin.x + eventTable[pointerID].size.x) < pos.x
|| (eventTable[pointerID].origin.y + eventTable[pointerID].size.y) < pos.y) ) ) {
eventTable[pointerID].isInside = false;
EWOL_VERBOSE("GUI : Input ID=" << pointerID << "==>" << eventTable[pointerID].destinationInputId << " [LEAVE] " << pos);
localEventInput(type, eventTable[pointerID].curentWidgetEvent, eventTable[pointerID].destinationInputId, ewol::EVENT_INPUT_TYPE_LEAVE, pos);
}
}
if (true == eventTable[pointerID].isUsed) {
if (false == eventTable[pointerID].isInside) {
// Set the element inside ...
eventTable[pointerID].isInside = true;
// get destination widget :
if(NULL != gui_uniqueWindows) {
eventTable[pointerID].curentWidgetEvent = gui_uniqueWindows->GetWidgetAtPos(pos);
} else {
eventTable[pointerID].curentWidgetEvent = NULL;
}
if (NULL == eventTable[pointerID].curentWidgetEvent) {
eventTable[pointerID].isInside = false;
}
if (NULL != eventTable[pointerID].curentWidgetEvent) {
eventTable[pointerID].origin = eventTable[pointerID].curentWidgetEvent->GetOrigin();
eventTable[pointerID].size = eventTable[pointerID].curentWidgetEvent->GetSize();
}
eventTable[pointerID].destinationInputId = 0;
EWOL_VERBOSE("GUI : Input ID=" << pointerID << "==>" << eventTable[pointerID].destinationInputId << " [ENTER] " << pos);
localEventInput(type, eventTable[pointerID].curentWidgetEvent, eventTable[pointerID].destinationInputId, ewol::EVENT_INPUT_TYPE_ENTER, pos);
}
EWOL_VERBOSE("GUI : Input ID=" << pointerID << "==>" << eventTable[pointerID].destinationInputId << " [MOVE] " << pos);
localEventInput(type, eventTable[pointerID].curentWidgetEvent, eventTable[pointerID].destinationInputId, ewol::EVENT_INPUT_TYPE_MOVE, pos);
} else if (true == eventTable[pointerID].isUsed) {
if (true == eventTable[pointerID].isInside) {
if( eventTable[pointerID].origin.x > pos.x
|| eventTable[pointerID].origin.y > pos.y
@ -311,7 +334,7 @@ void ewol::eventInput::State(ewol::inputType_te type, int pointerID, bool isDown
EWOL_VERBOSE("GUI : Input ID=" << pointerID << "==>" << eventTable[pointerID].destinationInputId << " [UP] " << pos);
if(false == eventTable[pointerID].isUsed) {
// bad case ... ???
EWOL_VERBOSE("Up event without previous down ... ");
EWOL_DEBUG("Up event without previous down ... ");
// Mark it un-used :
eventTable[pointerID].isUsed = false;
// revove the widget ...

View File

@ -290,7 +290,8 @@ bool ewol::ButtonImage::OnEventInput(ewol::inputType_te type, int32_t IdInput, e
return true;
}
} else if (0 == IdInput) {
if(ewol::EVENT_INPUT_TYPE_MOVE == typeEvent) {
if( ewol::EVENT_INPUT_TYPE_ENTER == typeEvent
|| ewol::EVENT_INPUT_TYPE_MOVE == typeEvent) {
Vector2D<float> relPos = RelativePosition(pos);
// check if over :
@ -315,11 +316,11 @@ bool ewol::ButtonImage::OnEventInput(ewol::inputType_te type, int32_t IdInput, e
m_over = true;
MarkToReedraw();
}
} else {
if(m_over != false) {
m_over = false;
MarkToReedraw();
}
}
} else if(ewol::EVENT_INPUT_TYPE_LEAVE == typeEvent) {
if(m_over != false) {
m_over = false;
MarkToReedraw();
}
}
}