111 if (!child->isExplicitlyVisible() || !child->getRect().isValid() || child->getOpacity() < Fw::MIN_ALPHA)
115 if (!childVisibleRect.
isValid())
122 if (child->getOpacity() < oldOpacity)
125 child->draw(childVisibleRect, drawPane);
141 g_logger.traceWarning(
"attempt to add a null child into a UIWidget");
146 g_logger.traceWarning(
"attemp to add a destroyed child into a UIWidget");
151 g_logger.traceWarning(
"attempt to add a child again into a UIWidget");
158 child->
setParent(static_self_cast<UIWidget>());
168 child->updateStates();
182 g_logger.traceWarning(
"attempt to insert a null child into a UIWidget");
187 g_logger.traceWarning(
"attempt to insert a child again into a UIWidget");
191 index = index <= 0 ? (
m_children.size() + index) : index - 1;
193 if (!(index >= 0 &&
static_cast<uint>(index) <=
m_children.size())) {
195 index = stdext::clamp<int>(index, 0,
static_cast<int>(
m_children.size()));
201 child->
setParent(static_self_cast<UIWidget>());
211 child->updateStates();
212 updateChildrenIndexStates();
222 bool focusAnother =
false;
235 assert(child->
getParent() == static_self_cast<UIWidget>());
241 child->updateStates();
242 updateChildrenIndexStates();
250 g_logger.traceError(
"attempt to remove an unknown child from a UIWidget");
263 g_logger.
error(
"attempt to focus an unknown child in a UIWidget");
300 auto focusedIt = std::find(rotatedChildren.begin(), rotatedChildren.end(),
m_focusedChild);
301 if (focusedIt != rotatedChildren.end()) {
302 std::rotate(rotatedChildren.begin(), focusedIt, rotatedChildren.end());
303 rotatedChildren.pop_front();
309 if (child->isFocusable() && child->isExplicitlyEnabled() && child->isVisible()) {
341 std::reverse(rotatedChildren.begin(), rotatedChildren.end());
344 auto focusedIt = std::find(rotatedChildren.begin(), rotatedChildren.end(),
m_focusedChild);
345 if (focusedIt != rotatedChildren.end()) {
346 std::rotate(rotatedChildren.begin(), focusedIt, rotatedChildren.end());
347 rotatedChildren.pop_front();
353 if (child->isFocusable() && child->isExplicitlyEnabled() && child->isVisible()) {
388 g_logger.traceError(
"cannot find child");
394 updateChildrenIndexStates();
408 g_logger.traceError(
"cannot find child");
413 updateChildrenIndexStates();
432 g_logger.traceError(
"cannot find child");
437 updateChildrenIndexStates();
450 g_logger.traceError(
"cannot find child");
460 if (otherChild == child)
463 otherChild->setEnabled(
false);
482 g_logger.traceError(
"cannot find child");
502 if (otherChild == lockedChild)
505 otherChild->setEnabled(
false);
509 otherChild->setEnabled(
true);
534 if (styleNode->
size() == 0)
537 m_loadingStyle =
true;
541 if (node->tag()[0] ==
'!') {
542 std::string tag = node->tag().substr(1);
544 std::string origin =
"@" + node->source() +
": [" + node->tag() +
"]";
549 node->setValue(value);
556 if (m_firstOnStyle) {
565 m_firstOnStyle =
false;
570 m_loadingStyle =
false;
579 anchorLayout->addAnchor(static_self_cast<UIWidget>(), anchoredEdge, hookedWidgetId, hookedEdge);
623 anchorLayout->removeAnchors(static_self_cast<UIWidget>());
632 parent->updateLayout();
647 if (
UILayoutPtr parentLayout = parent->getLayout())
648 parentLayout->updateLater();
657 parent->lockChild(static_self_cast<UIWidget>());
666 parent->unlockChild(static_self_cast<UIWidget>());
688 parent->focusChild(static_self_cast<UIWidget>(), reason);
689 parent->recursiveFocus(reason);
700 parent->
lowerChild(static_self_cast<UIWidget>());
710 parent->
raiseChild(static_self_cast<UIWidget>());
750 boundRect.
bind(parentRect);
756 void UIWidget::internalDestroy()
770 child->internalDestroy();
791 parent->removeChild(
self);
829 if (oldParent == parent)
833 if (oldParent && oldParent->
hasChild(
self))
857 layout->
setParent(static_self_cast<UIWidget>());
895 if (!m_updateEventScheduled) {
898 self->m_updateEventScheduled =
false;
899 if (oldRect != self->getRect())
900 self->onGeometryChange(oldRect, self->getRect());
902 m_updateEventScheduled =
true;
919 styleNode = styleNode->
clone();
988 else if (focusable && !parent->getFocusedChild() && parent->getAutoFocusPolicy() !=
Fw::AutoFocusNone) {
1032 return anchorLayout->hasAnchors(static_self_cast<UIWidget>());
1079 if (!child->isExplicitlyVisible() || !child->getRect().isValid())
1081 Rect marginRect = child->getMarginRect();
1083 childrenRect = marginRect;
1085 childrenRect = childrenRect.
united(marginRect);
1090 childrenRect = myClippingRect;
1092 if (childrenRect.
width() < myClippingRect.
width())
1097 return childrenRect;
1117 return static_self_cast<UIWidget>();
1139 if (child->getId() == childId)
1161 index = index <= 0 ? (
m_children.size() + index) : index - 1;
1191 else if (wantsPhantom || !child->
isPhantom())
1202 UIWidgetList subChildren = child->recursiveGetChildren();
1203 if (!subChildren.empty())
1204 children.insert(children.end(), subChildren.begin(), subChildren.end());
1205 children.push_back(child);
1220 if (!subChildren.empty())
1221 children.insert(children.end(), subChildren.begin(), subChildren.end());
1222 children.push_back(child);
1238 if (!subChildren.empty())
1239 children.insert(children.end(), subChildren.begin(), subChildren.end());
1240 children.push_back(child);
1261 int oldStates = m_states;
1267 if (oldStates != m_states) {
1278 return (m_states & state);
1286 bool newStatus =
true;
1288 bool updateChildren =
false;
1293 UIWidgetPtr widget = static_self_cast<UIWidget>();
1296 parent = widget->getParent();
1297 if (!widget->isExplicitlyEnabled() ||
1298 ((parent && parent->getFocusedChild() != widget))) {
1302 }
while ((widget = parent));
1304 updateChildren = newStatus != oldStatus;
1329 bool enabled =
true;
1330 UIWidgetPtr widget = static_self_cast<UIWidget>();
1332 if (!widget->isExplicitlyEnabled()) {
1336 }
while ((widget = widget->getParent()));
1337 newStatus = !enabled;
1338 updateChildren = newStatus != oldStatus;
1363 bool visible =
true;
1364 UIWidgetPtr widget = static_self_cast<UIWidget>();
1366 if (!widget->isExplicitlyVisible()) {
1370 }
while ((widget = widget->getParent()));
1371 newStatus = !visible;
1372 updateChildren = newStatus != oldStatus;
1379 if (updateChildren) {
1383 child->updateState(state);
1397 void UIWidget::updateStates()
1406 void UIWidget::updateChildrenIndexStates()
1419 void UIWidget::updateStyle()
1424 if (m_loadingStyle && !m_updateStyleScheduled) {
1427 self->m_updateStyleScheduled =
false;
1428 self->updateStyle();
1430 m_updateStyleScheduled =
true;
1443 newStateStyle->
addChild(otherNode->clone());
1450 std::string statesStr = style->tag().substr(1);
1451 std::vector<std::string> statesSplit =
stdext::split(statesStr,
" ");
1454 for (std::string stateStr : statesSplit) {
1455 if (stateStr.length() == 0)
1458 bool notstate = (stateStr[0] ==
'!');
1460 stateStr = stateStr.substr(1);
1463 if ((!notstate && !stateOn) || (notstate && stateOn))
1469 newStateStyle->
merge(style);
1477 m_stateStyle = newStateStyle;
1487 setId(node->value());
1489 parseBaseStyle(styleNode);
1490 parseImageStyle(styleNode);
1491 parseTextStyle(styleNode);
1503 if (!child->isAnchored() && child->isVisible())
1504 child->bindRectToParent();
1524 callLuaField(
"onChildFocusChange", focusedChild, unfocusedChild, reason);
1541 return callLuaField<bool>(
"onDragEnter", mousePos);
1546 return callLuaField<bool>(
"onDragLeave", droppedWidget, mousePos);
1551 return callLuaField<bool>(
"onDragMove", mousePos, mouseMoved);
1556 return callLuaField<bool>(
"onDrop", draggedWidget, mousePos);
1561 return callLuaField<bool>(
"onKeyText", keyText);
1566 return callLuaField<bool>(
"onKeyDown", keyCode, keyboardModifiers);
1571 return callLuaField<bool>(
"onKeyPress", keyCode, keyboardModifiers, autoRepeatTicks);
1576 return callLuaField<bool>(
"onKeyUp", keyCode, keyboardModifiers);
1592 return callLuaField<bool>(
"onMousePress", mousePos, button);
1597 return callLuaField<bool>(
"onMouseRelease", mousePos, button);
1602 return callLuaField<bool>(
"onMouseMove", mousePos, mouseMoved);
1607 return callLuaField<bool>(
"onMouseWheel", mousePos, direction);
1612 return callLuaField<bool>(
"onClick", mousePos);
1617 return callLuaField<bool>(
"onDoubleClick", mousePos);
1626 if (!child->isExplicitlyEnabled() || !child->isExplicitlyVisible())
1630 if (child->isFocused())
1631 children.push_back(child);
1635 if (child->propagateOnKeyText(keyText))
1648 if (!child->isExplicitlyEnabled() || !child->isExplicitlyVisible())
1652 if (child->isFocused())
1653 children.push_back(child);
1657 if (child->propagateOnKeyDown(keyCode, keyboardModifiers))
1661 return onKeyDown(keyCode, keyboardModifiers);
1670 if (!child->isExplicitlyEnabled() || !child->isExplicitlyVisible())
1674 if (child->isFocused())
1675 children.push_back(child);
1679 if (child->propagateOnKeyPress(keyCode, keyboardModifiers, autoRepeatTicks))
1684 return onKeyPress(keyCode, keyboardModifiers, autoRepeatTicks);
1695 if (!child->isExplicitlyEnabled() || !child->isExplicitlyVisible())
1699 if (child->isFocused())
1700 children.push_back(child);
1704 if (child->propagateOnKeyUp(keyCode, keyboardModifiers))
1708 return onKeyUp(keyCode, keyboardModifiers);
1726 widgetList.push_back(static_self_cast<UIWidget>());
1737 if (child->isExplicitlyVisible() && child->isExplicitlyEnabled() && child->containsPoint(mousePos))
1738 child->propagateOnMouseMove(mousePos, mouseMoved, widgetList);
1740 widgetList.push_back(static_self_cast<UIWidget>());