////// Private event management: bool nuiContainer::DispatchMouseClick(const nglMouseInfo& rInfo) { CheckValid(); nuiAutoRef; if (!mMouseEventEnabled || mTrashed) return false; bool hasgrab = HasGrab(rInfo.TouchId); if (IsDisabled() && !hasgrab) return false; nglMouseInfo info(rInfo); GlobalToLocal(info.X, info.Y); // Get a chance to preempt the mouse event before the children get it: if (PreMouseClicked(info)) return true; if (IsInsideFromRoot(rInfo.X, rInfo.Y) || hasgrab) { if (!hasgrab) { IteratorPtr pIt; for (pIt = GetLastChild(false); pIt && pIt->IsValid(); GetPreviousChild(pIt)) { nuiWidgetPtr pItem = pIt->GetWidget(); if (pItem) { if (IsEnabled() && !HasGrab(rInfo.TouchId)) { if (pItem->DispatchMouseClick(rInfo)) { delete pIt; return true; } } } } delete pIt; } nglMouseInfo info(rInfo); GlobalToLocal(info.X, info.Y); if (PreClicked(info)) return true; bool ret = MouseClicked(info); ret |= Clicked(info); return ret | (!mClickThru); } return false; }
nuiWidgetPtr nuiContainer::DispatchMultiEventsFinished(const nglMouseInfo& rInfo) { CheckValid(); if (!mMouseEventEnabled || mTrashed) return false; bool hasgrab = HasGrab(rInfo.TouchId); if(hasgrab) MultiEventsFinished(rInfo); return NULL; }
bool nuiContainer::DispatchMouseCanceled(nuiWidgetPtr pThief, const nglMouseInfo& rInfo) { CheckValid(); nuiAutoRef; if (mTrashed) return false; bool hasgrab = HasGrab(rInfo.TouchId); nglMouseInfo info(rInfo); GlobalToLocal(info.X, info.Y); // Get a chance to preempt the mouse event before the children get it: PreClickCanceled(info); IteratorPtr pIt; for (pIt = GetLastChild(false); pIt && pIt->IsValid(); GetPreviousChild(pIt)) { nuiWidgetPtr pItem = pIt->GetWidget(); if (pItem) { pItem->DispatchMouseCanceled(pThief, rInfo); } } delete pIt; if (pThief != this) { GlobalToLocal(info.X, info.Y); PreClickCanceled(info); bool ret = MouseCanceled(info); ret |= ClickCanceled(info); ret = ret | (!mClickThru); return ret; } return false; }
nuiWidgetPtr nuiContainer::DispatchMouseMove(const nglMouseInfo& rInfo) { CheckValid(); nuiAutoRef; if (!mMouseEventEnabled || mTrashed) return false; nuiWidgetPtr pHandled=NULL; bool inside=false,res=false; bool hasgrab = HasGrab(rInfo.TouchId); if (IsDisabled() && !hasgrab) return NULL; nglMouseInfo info(rInfo); GlobalToLocal(info.X, info.Y); // Get a chance to preempt the mouse event before the children get it: if (PreMouseMoved(info)) return this; if (IsInsideFromRoot(rInfo.X, rInfo.Y) || hasgrab) { inside = true; // If the object has the grab we should not try to notify its children of mouse events! if (!hasgrab) { IteratorPtr pIt; for (pIt = GetLastChild(false); pIt && pIt->IsValid(); GetPreviousChild(pIt)) { nuiWidgetPtr pItem = pIt->GetWidget(); if (pItem) { if (pItem->IsVisible()) { pHandled = pItem->DispatchMouseMove(rInfo); } } if (pHandled) { // stop as soon as someone caught the event delete pIt; return pHandled; } } delete pIt; } res = MouseMoved(info); res |= MovedMouse(info); } else { if (GetHover()) { res = MouseMoved(info); res |= MovedMouse(info); } } if (!pHandled && (res | (!mClickThru)) && inside) { nuiTopLevelPtr pRoot = GetTopLevel(); if (pRoot) return this; } if (pHandled) return pHandled; return (res && inside) ? this : NULL; }