void UIWidget::focusPreviousChild(Fw::FocusReason reason) { if(m_destroyed) return; UIWidgetPtr toFocus; UIWidgetList rotatedChildren(m_children); std::reverse(rotatedChildren.begin(), rotatedChildren.end()); if(m_focusedChild) { auto focusedIt = std::find(rotatedChildren.begin(), rotatedChildren.end(), m_focusedChild); if(focusedIt != rotatedChildren.end()) { std::rotate(rotatedChildren.begin(), focusedIt, rotatedChildren.end()); rotatedChildren.pop_front(); } } // finds next child to focus for(const UIWidgetPtr& child : rotatedChildren) { if(child->isFocusable() && child->isExplicitlyEnabled() && child->isVisible()) { toFocus = child; break; } } if(toFocus) focusChild(toFocus, reason); }
void UIWidget::lockChild(const UIWidgetPtr& child) { if(m_destroyed) return; if(!child) return; if(!hasChild(child)) { g_logger.traceError("cannot find child"); return; } // prevent double locks if(isChildLocked(child)) unlockChild(child); // disable all other children for(const UIWidgetPtr& otherChild : m_children) { if(otherChild == child) child->setEnabled(true); else otherChild->setEnabled(false); } m_lockedChildren.push_front(child); // lock child focus if(child->isFocusable()) focusChild(child, Fw::ActiveFocusReason); }
void UIWidget::removeChild(UIWidgetPtr child) { // remove from children list if(hasChild(child)) { // defocus if needed bool focusAnother = false; if(m_focusedChild == child) { focusChild(nullptr, Fw::ActiveFocusReason); focusAnother = true; } if(isChildLocked(child)) unlockChild(child); auto it = std::find(m_children.begin(), m_children.end(), child); m_children.erase(it); // reset child parent assert(child->getParent() == static_self_cast<UIWidget>()); child->setParent(nullptr); m_layout->removeWidget(child); // update child states child->updateStates(); updateChildrenIndexStates(); if(m_autoFocusPolicy != Fw::AutoFocusNone && focusAnother && !m_focusedChild) focusPreviousChild(Fw::ActiveFocusReason, true); g_ui.onWidgetDisappear(child); } else g_logger.traceError("attempt to remove an unknown child from a UIWidget"); }
void NewProjectWindow::ResetForm() { if(defaultTemplateTree) defaultTemplateTree->setSelected(); focusChild(projectNameInput); projectNameInput->setText(L"Untitled"); projectLocationInput->setText(CoreServices::getInstance()->getCore()->getUserHomeDirectory()+"/Documents/Polycode"); }
void UIWidget::lockChild(const UIWidgetPtr& child) { if(!child) return; assert(hasChild(child)); // prevent double locks if(isChildLocked(child)) unlockChild(child); // disable all other children for(const UIWidgetPtr& otherChild : m_children) { if(otherChild == child) child->setEnabled(true); else otherChild->setEnabled(false); } m_lockedChildren.push_front(child); // lock child focus if(child->isFocusable()) focusChild(child, Fw::ActiveFocusReason); moveChildToTop(child); }
void UIWidget::removeChild(const UIWidgetPtr& child) { // remove from children list if(hasChild(child)) { // defocus if needed bool focusAnother = false; if(m_focusedChild == child) { focusChild(nullptr, Fw::ActiveFocusReason); focusAnother = true; } if(isChildLocked(child)) unlockChild(child); auto it = std::find(m_children.begin(), m_children.end(), child); m_children.erase(it); // reset child parent assert(child->getParent() == asUIWidget()); child->setParent(nullptr); m_layout->removeWidget(child); // update child states child->updateStates(); updateChildrenIndexStates(); if(focusAnother && !m_focusedChild) focusPreviousChild(Fw::ActiveFocusReason); } else logError("Attempt to remove an unknown child from a UIWidget"); }
void VEditTab::handleFocusChanged(QWidget * /* p_old */, QWidget *p_now) { if (p_now == this) { // When VEditTab get focus, it should focus to current widget. focusChild(); emit getFocused(); updateStatus(); } else if (isAncestorOf(p_now)) { emit getFocused(); updateStatus(); } }
void UIWidget::unlockChild(const UIWidgetPtr& child) { if(m_destroyed) return; if(!child) return; if(!hasChild(child)) { g_logger.traceError("cannot find child"); return; } auto it = std::find(m_lockedChildren.begin(), m_lockedChildren.end(), child); if(it == m_lockedChildren.end()) return; m_lockedChildren.erase(it); // find new child to lock UIWidgetPtr lockedChild; if(m_lockedChildren.size() > 0) { lockedChild = m_lockedChildren.front(); assert(hasChild(lockedChild)); } for(const UIWidgetPtr& otherChild : m_children) { // lock new child if(lockedChild) { if(otherChild == lockedChild) lockedChild->setEnabled(true); else otherChild->setEnabled(false); } // else unlock all else otherChild->setEnabled(true); } if(lockedChild) { if(lockedChild->isFocusable()) focusChild(lockedChild, Fw::ActiveFocusReason); } }
void UIWidget::focusNextChild(Fw::FocusReason reason, bool rotate) { if(m_destroyed) return; UIWidgetPtr toFocus; if(rotate) { UIWidgetList rotatedChildren(m_children); if(m_focusedChild) { auto focusedIt = std::find(rotatedChildren.begin(), rotatedChildren.end(), m_focusedChild); if(focusedIt != rotatedChildren.end()) { std::rotate(rotatedChildren.begin(), focusedIt, rotatedChildren.end()); rotatedChildren.pop_front(); } } // finds next child to focus for(const UIWidgetPtr& child : rotatedChildren) { if(child->isFocusable() && child->isExplicitlyEnabled() && child->isVisible()) { toFocus = child; break; } } } else { auto it = m_children.begin(); if(m_focusedChild) it = std::find(m_children.begin(), m_children.end(), m_focusedChild); for(; it != m_children.end(); ++it) { const UIWidgetPtr& child = *it; if(child != m_focusedChild && child->isFocusable() && child->isExplicitlyEnabled() && child->isVisible()) { toFocus = child; break; } } } if(toFocus && toFocus != m_focusedChild) focusChild(toFocus, reason); }
bool UIWidget::propagateOnMousePress(const Point& mousePos, Fw::MouseButton button) { // do a backup of children list, because it may change while looping it UIWidgetPtr clickedChild; for(const UIWidgetPtr& child : m_children) { // events on hidden or disabled widgets are discarded if(!child->isExplicitlyEnabled() || !child->isExplicitlyVisible()) continue; // mouse press events only go to children that contains the mouse position if(child->containsPoint(mousePos) && child == getChildByPos(mousePos)) { clickedChild = child; break; } } if(clickedChild) { // focusable child gains focus when clicked if(clickedChild->isFocusable()) focusChild(clickedChild, Fw::MouseFocusReason); // stop propagating if the child accept the event if(clickedChild->propagateOnMousePress(mousePos, button)) return true; } // only non phatom widgets receives mouse press events if(!isPhantom()) { bool ret = onMousePress(mousePos, button); if(button == Fw::MouseLeftButton && !isPressed()) setPressed(true); return ret; } return false; }
void PolycodeTextEditor::hideFindBar() { findBar->visible = false; focusChild(textInput); Resize(editorSize.x, editorSize.y); }
void VEditTab::focusTab() { focusChild(); emit getFocused(); updateStatus(); }
void TextInputPopup::setValue(String value) { textInput->setText(value); focusChild(textInput); }
void NewFileWindow::resetForm() { defaultTemplateTree->setSelected(); fileNameInput->setText("Untitled"); focusChild(fileNameInput); }