Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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());
   }    
}
Пример #6
0
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();
}