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

View File

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