bool UIWidget::propagateOnMouseRelease(const Point& mousePos, Fw::MouseButton button) { // do a backup of children list, because it may change while looping it UIWidgetList children; for(const UIWidgetPtr& child : m_children) { // events on hidden or disabled widgets are discarded if(!child->isExplicitlyEnabled() || !child->isExplicitlyVisible()) continue; // mouse release events go to all children children.push_back(child); } for(const UIWidgetPtr& child : children) { if(child->propagateOnMouseRelease(mousePos, button)) return true; } bool ret = onMouseRelease(mousePos, button); if(isPressed() && button == Fw::MouseLeftButton) setPressed(false); return ret; }
bool UIWidget::propagateOnMouseMove(const Point& mousePos, const Point& mouseMoved, UIWidgetList& widgetList) { for(auto it = m_children.begin(); it != m_children.end(); ++it) { const UIWidgetPtr& child = *it; if(child->isExplicitlyVisible() && child->isExplicitlyEnabled()) child->propagateOnMouseMove(mousePos, mouseMoved, widgetList); } widgetList.push_back(static_self_cast<UIWidget>()); return true; }
UIWidgetList UIWidget::recursiveGetChildren() { UIWidgetList children; for(const UIWidgetPtr& child : m_children) { UIWidgetList subChildren = child->recursiveGetChildren(); if(!subChildren.empty()) children.insert(children.end(), subChildren.begin(), subChildren.end()); children.push_back(child); } return children; }
UIWidgetList UIWidget::recursiveGetChildrenByMarginPos(const Point& childPos) { UIWidgetList children; if(!containsPaddingPoint(childPos)) return children; for(auto it = m_children.rbegin(); it != m_children.rend(); ++it) { const UIWidgetPtr& child = (*it); if(child->isExplicitlyVisible() && child->containsMarginPoint(childPos)) { UIWidgetList subChildren = child->recursiveGetChildrenByMarginPos(childPos); if(!subChildren.empty()) children.insert(children.end(), subChildren.begin(), subChildren.end()); children.push_back(child); } } return children; }
bool UIWidget::propagateOnMouseEvent(const Point& mousePos, UIWidgetList& widgetList) { bool ret = false; if(containsPaddingPoint(mousePos)) { for(auto it = m_children.rbegin(); it != m_children.rend(); ++it) { const UIWidgetPtr& child = *it; if(child->isExplicitlyEnabled() && child->isExplicitlyVisible() && child->containsPoint(mousePos)) { if(child->propagateOnMouseEvent(mousePos, widgetList)) { ret = true; break; } } } } widgetList.push_back(static_self_cast<UIWidget>()); if(!isPhantom()) ret = true; return ret; }
bool UIWidget::propagateOnKeyUp(uchar keyCode, int keyboardModifiers) { // do a backup of children list, because it may change while looping it UIWidgetList children; for(const UIWidgetPtr& child : m_children) { // events on hidden or disabled widgets are discarded if(!child->isExplicitlyEnabled() || !child->isExplicitlyVisible()) continue; // key events go only to focused child if(child->isFocused()) children.push_back(child); } for(const UIWidgetPtr& child : children) { if(child->propagateOnKeyUp(keyCode, keyboardModifiers)) return true; } return onKeyUp(keyCode, keyboardModifiers); }
bool UIWidget::propagateOnKeyText(const std::string& keyText) { // do a backup of children list, because it may change while looping it UIWidgetList children; for(const UIWidgetPtr& child : m_children) { // events on hidden or disabled widgets are discarded if(!child->isExplicitlyEnabled() || !child->isExplicitlyVisible()) continue; // key events go only to containers or focused child if(child->isFocused()) children.push_back(child); } for(const UIWidgetPtr& child : children) { if(child->propagateOnKeyText(keyText)) return true; } return onKeyText(keyText); }
bool UIWidget::propagateOnMouseMove(const Point& mousePos, const Point& mouseMoved) { // do a backup of children list, because it may change while looping it UIWidgetList children; for(const UIWidgetPtr& child : m_children) { // events on hidden or disabled widgets are discarded if(!child->isExplicitlyEnabled() || !child->isExplicitlyVisible()) continue; // mouse move events go to all children children.push_back(child); } for(const UIWidgetPtr& child : children) { if(child->propagateOnMouseMove(mousePos, mouseMoved)) return true; } if(!isPhantom()) return onMouseMove(mousePos, mouseMoved); else return false; }
bool UIWidget::propagateOnKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks) { // do a backup of children list, because it may change while looping it UIWidgetList children; for(const UIWidgetPtr& child : m_children) { // events on hidden or disabled widgets are discarded if(!child->isExplicitlyEnabled() || !child->isExplicitlyVisible()) continue; // key events go only to containers or focused child if(child->isFocused()) children.push_back(child); } for(const UIWidgetPtr& child : children) { if(child->propagateOnKeyPress(keyCode, keyboardModifiers, autoRepeatTicks)) return true; } if(autoRepeatTicks == 0 || autoRepeatTicks >= m_autoRepeatDelay) return onKeyPress(keyCode, keyboardModifiers, autoRepeatTicks); else return false; }
bool UIWidget::propagateOnMouseWheel(const Point& mousePos, Fw::MouseWheelDirection direction) { // do a backup of children list, because it may change while looping it UIWidgetList children; for(const UIWidgetPtr& child : m_children) { // events on hidden or disabled widgets are discarded if(!child->isExplicitlyEnabled() || !child->isExplicitlyVisible()) continue; // mouse wheel events only go to children that contains the mouse position if(child->containsPoint(mousePos) && child == getChildByPos(mousePos)) children.push_back(child); } for(const UIWidgetPtr& child : children) { if(child->propagateOnMouseWheel(mousePos, direction)) return true; } if(!isPhantom()) return onMouseWheel(mousePos, direction); else return false; }