bool EventManager::selectNeighbourFromChildren(Widget* target, Direction direction) { if (target == NULL) return false; Widget* targetChild; if (direction == Left || direction == Up) for (Widget::WidgetListReverseIterator it = target->_children.rbegin(), end = target->_children.rend(); it != end; ++it) { targetChild = (Widget*) *it; // check children of child recursively... if (targetChild->_children.size()) if (selectNeighbourFromChildren(targetChild, direction)) return true; // now see if child can receive focus. if (setFocusedWidget(targetChild)) return true; } else for (Widget::WidgetListIterator it = target->_children.begin(), end = target->_children.end(); it != end; ++it) { targetChild = (Widget*) *it; // check children of child recursively... if (targetChild->_children.size()) if (selectNeighbourFromChildren(targetChild, direction)) return true; // now see if child can receive focus. if (setFocusedWidget(targetChild)) return true; } return false; }
bool EventManager::selectNext(Widget* target, Widget* startFrom, int iter) { ILOG_TRACE_F(ILX_EVENTMANAGER); ILOG_DEBUG(ILX_EVENTMANAGER, " -> target: %p\n", target); ILOG_DEBUG(ILX_EVENTMANAGER, " -> startFrom: %p\n", startFrom); ILOG_DEBUG(ILX_EVENTMANAGER, " -> iter: %d\n", iter); if (iter) return true; if (target == NULL && startFrom == _creator) ++iter; if (startFrom && target == _creator) { startFrom = NULL; iter++; } else if (!target) { if (_focusedWidget) target = _focusedWidget; else target = _creator; } if (setFocusedWidget(target)) return true; if (target->_children.size()) { Widget* targetChild; for (Widget::WidgetListIterator it = target->_children.begin(), end = target->_children.end(); it != end; ++it) { targetChild = (Widget*) *it; if (startFrom) { if (startFrom == targetChild) startFrom = NULL; } else { if (targetChild->_children.size()) { if (selectNext(targetChild, NULL, iter)) return true; } else if (setFocusedWidget(targetChild)) return true; } } return selectNext(target->_parent, target, iter); } else if (target != _creator) return selectNext(target->_parent, target, iter); return false; }
bool EventManager::selectNeighbour(Direction direction) { if (!_focusedWidget) return false; Widget* target = _focusedWidget->getNeighbour(direction); bool found = false; int step = 0; while (!found) { if (target == _creator || target == NULL) { if (selectNeighbourFromChildren(_creator, direction)) return true; } if (!target->acceptsKeyInput() && target->_children.size() == 0) target = target->getNeighbour(direction); // Should terminate if we can not find anything. if (step || target == NULL) return false; if (target != _creator) // Target is not a window. { // See if direct neighbour can get focus... if (setFocusedWidget(target)) return true; } // See if there is a preselected child widget... if (target->_preSelectedWidget) { if (setFocusedWidget(target->_preSelectedWidget)) return true; } // See if children can receive focus... else if (target->_children.size()) { if (selectNeighbourFromChildren(target, direction)) return true; } // there are no focusable children so check neighbour in current direction... else target = target->getNeighbour(direction); ++step; } return false; }
bool EventManager::selectPrevious(Widget* target, Widget* startFrom, int iter) { if (iter) return true; if (startFrom && target == _creator) { startFrom = NULL; iter++; } else if (!target) { if (_focusedWidget) target = _focusedWidget; else target = _creator; } if (setFocusedWidget(target)) return true; if (target->_children.size()) { Widget* targetChild; for (Widget::WidgetListReverseIterator it = target->_children.rbegin(), end = target->_children.rend(); it != end; ++it) { targetChild = (Widget*) *it; if (startFrom) { if (startFrom == targetChild) startFrom = NULL; } else { if (targetChild->_children.size()) { if (selectPrevious(targetChild, NULL, iter)) return true; } else if (setFocusedWidget(targetChild)) return true; } } return selectPrevious(target->_parent, target, iter); } else if (target != _creator) return selectPrevious(target->_parent, target, iter); return false; }
void WidgetManager::defocusWidget(const Widget::Ref& m) { if (m_locked) { m_delayedEvent.append(DelayedEvent(DelayedEvent::SET_DEFOCUS, m)); } else if (focusedWidget().get() == m.get()) { setFocusedWidget(Widget::Ref()); } }
void WidgetManager::endLock() { debugAssert(m_locked); m_locked = false; for (int e = 0; e < m_delayedEvent.size(); ++e) { DelayedEvent& event = m_delayedEvent[e]; switch (event.type) { case DelayedEvent::REMOVE_ALL: clear(); break; case DelayedEvent::REMOVE: remove(event.module); break; case DelayedEvent::ADD: add(event.module); break; case DelayedEvent::SET_FOCUS_AND_MOVE_TO_FRONT: setFocusedWidget(event.module, true); break; case DelayedEvent::SET_FOCUS: setFocusedWidget(event.module, false); break; case DelayedEvent::SET_DEFOCUS: defocusWidget(event.module); break; case DelayedEvent::MOVE_TO_BACK: moveWidgetToBack(event.module); break; } } m_delayedEvent.fastClear(); }