void Ui::_updateHovered( const Point& mousePos )
{
  WidgetPtr lastHovered = _d->hovered.current;
  WidgetPtr lastHoveredNoSubelement = _d->hovered.noSubelement;
  _d->hovered.lastMousePos = mousePos;

  // Get the real Hovered
  _d->hovered.current = rootWidget()->getElementFromPoint( mousePos );

  if( _d->tooltip.element.isValid() && _d->hovered.current == _d->tooltip.element )
  {
    // When the mouse is over the ToolTip we remove that so it will be re-created at a new position.
    // Note that ToolTip.EnterTime does not get changed here, so it will be re-created at once.
    _d->tooltip.element->deleteLater();
    _d->tooltip.element->hide();
    _d->tooltip.element = WidgetPtr();
    _d->hovered.current = rootWidget()->getElementFromPoint( mousePos );
  }

  // for tooltips we want the element itself and not some of it's subelements
  if( _d->hovered.current != rootWidget() )
  {
    _d->hovered.noSubelement = _d->hovered.current;
    while ( _d->hovered.noSubelement.isValid() && _d->hovered.noSubelement->isSubElement() )
    {
      _d->hovered.noSubelement = _d->hovered.noSubelement->parent();
    }
  }
  else
  {
    _d->hovered.noSubelement = 0;
  }

  if( _d->hovered.current != lastHovered )
  {
    if( lastHovered.isValid() )
    {
      lastHovered->onEvent( NEvent::Gui( lastHovered.object(), 0, guiElementLeft ) );
    }

    if( _d->hovered.current.isValid() )
    {
      _d->hovered.current->onEvent( NEvent::Gui( _d->hovered.current.object(), _d->hovered.current.object(), guiElementHovered ) );
    }
  }

  if ( lastHoveredNoSubelement != _d->hovered.noSubelement )
  {
    if( _d->tooltip.element.isValid() )
    {
      _d->tooltip.element->deleteLater();
      _d->tooltip.element = WidgetPtr();
    }

    if( _d->hovered.noSubelement.isValid() )
    {
      _d->tooltip.enterTime = DateTime::elapsedTime();
    }
  }
}
void Ui::deleteLater( Widget* ptrElement )
{
  try
  {
    if( !ptrElement || !isMyChild( ptrElement ) )
    {
      return;
    }

    if( ptrElement == getFocus() || ptrElement->isMyChild( getFocus() ) )
    {
      _d->focusedElement = WidgetPtr();
    }

    if( _d->hovered.current.object() == ptrElement || ptrElement->isMyChild( _d->hovered.current.object() ) )
    {
      _d->hovered.current = WidgetPtr();
      _d->hovered.noSubelement = WidgetPtr();
    }

    for( auto widget : _d->deletionQueue )
    {
      if( widget == ptrElement )
      {
        return;
      }
    }

    _d->deletionQueue.push_back( ptrElement );
  }
  catch(...)
  {}
}
Exemple #3
0
 Gui::~Gui()
 {
     if (Widget::widgetExists(mTop))
     {
         SetTop(WidgetPtr());
     }
 }
Exemple #4
0
	gcn::WidgetPtr BasicContainer::FindWidgetById( const std::string& id )
	{
        WidgetListIterator iter;
        for (iter = mWidgets.begin(); iter != mWidgets.end(); iter++)
        {
            if ((*iter)->getId() == id)
            {
                return (*iter);
            }
            
            BasicContainerPtr basicContainer = boost::shared_dynamic_cast<BasicContainer>(*iter);
            
            if (basicContainer)
            {
                WidgetPtr widget = basicContainer->FindWidgetById(id);
                
                if (widget)
                {
                    return widget;
                }
            }
        }

        return WidgetPtr();
    }
Exemple #5
0
    void Gui::handleMouseReleased(const MouseInput& mouseInput)
    {
        WidgetPtr sourceWidget = GetMouseEventSource(mouseInput.getX(), mouseInput.getY());

        if (mFocusHandler->GetDraggedWidget())
        {
            if (sourceWidget != mFocusHandler->GetLastWidgetPressed())
            {
                mFocusHandler->SetLastWidgetPressed(WidgetPtr());
            }
            
            sourceWidget = mFocusHandler->GetDraggedWidget();
        }

        int sourceWidgetX, sourceWidgetY;
        sourceWidget->getAbsolutePosition(sourceWidgetX, sourceWidgetY);
        
        distributeMouseEvent(sourceWidget,
                             MouseEvent::RELEASED,
                             mouseInput.getButton(),
                             mouseInput.getX(),
                             mouseInput.getY());

        if (mouseInput.getButton() == mLastMousePressButton            
            && mFocusHandler->GetLastWidgetPressed() == sourceWidget)
        {
            distributeMouseEvent(sourceWidget,
                                 MouseEvent::CLICKED,
                                 mouseInput.getButton(),
                                 mouseInput.getX(),
                                 mouseInput.getY());
            
            mFocusHandler->SetLastWidgetPressed(WidgetPtr());
        }
        else
        {
            mLastMousePressButton = 0;
            mClickCount = 0;
        }

        if (mFocusHandler->GetDraggedWidget())
        {
            mFocusHandler->SetDraggedWidget(WidgetPtr());
        }
    }
bool Ui::setFocus( Widget* element )
{
  if( _d->focusedElement == element )
  {
    return false;
  }

  // guard element from being deleted
  // not delete this line
  WidgetPtr saveElement = element;

  // focus may change or be removed in this call
  WidgetPtr currentFocus;
  if( _d->focusedElement.isValid() )
  {
    currentFocus = _d->focusedElement;

    if( _d->focusedElement->onEvent( NEvent::Gui( _d->focusedElement.object(), element, guiElementFocusLost ) ) )
    {
      return false;
    }

    currentFocus = WidgetPtr();
  }

  if( element )
  {
    currentFocus = _d->focusedElement;

    // send focused event
    if( element->onEvent( NEvent::Gui( element, _d->focusedElement.object(), guiElementFocused ) ))
    {
      currentFocus = WidgetPtr();

      return false;
    }
  }

  // element is the new focus so it doesn't have to be dropped
  _d->focusedElement = element;

  return true;
}
Exemple #7
0
    void BasicContainer::Clear()
    {
        WidgetListIterator iter;

        for (iter = mWidgets.begin(); iter != mWidgets.end(); iter++)
        {
            (*iter)->_setFocusHandler(FocusHandlerPtr());
            (*iter)->_setParent(WidgetPtr());
            (*iter)->removeDeathListener(this);
        }

        mWidgets.clear();
    }
Exemple #8
0
	gcn::WidgetPtr BasicContainer::GetWidgetAt( int x, int y )
	{
        Rectangle r = getChildrenArea();

        if (!r.isPointInRect(x, y))
        {
            return WidgetPtr();
        }

        x -= r.x;
        y -= r.y;

        WidgetListReverseIterator it;
        for (it = mWidgets.rbegin(); it != mWidgets.rend(); it++)
        {
            if ((*it)->IsVisible() && (*it)->GetDimension().isPointInRect(x, y))
            {
                return (*it);
            }
        }

        return WidgetPtr();
    }
Exemple #9
0
    void BasicContainer::Remove(WidgetPtr widget)
    {
        WidgetListIterator iter;
        for (iter = mWidgets.begin(); iter != mWidgets.end(); iter++)
        {
            if (*iter == widget)
            {
                mWidgets.erase(iter);
                widget->_setFocusHandler(FocusHandlerPtr());
                widget->_setParent(WidgetPtr());
                widget->removeDeathListener(this);
                return;
            }
        }

        throw GCN_EXCEPTION("There is no such widget in this container.");
    }
Exemple #10
0
bool Ui::removeFocus( Widget* element)
{
  if( _d->focusedElement.isValid() && _d->focusedElement == element )
  {
    if( _d->focusedElement->onEvent( NEvent::Gui( _d->focusedElement.object(),  0, guiElementFocusLost )) )
    {
      return false;
    }
  }

  if( _d->focusedElement.isValid() )
  {
    _d->focusedElement = WidgetPtr();
  }

  return true;
}
Exemple #11
0
void UiTooltipWorker::update( unsigned int time, Widget& rootWidget, bool showTooltips,
                              WidgetPtr hovered, Point cursor )
{
  // launch tooltip
  if( element.isNull()
      && hovered.isValid() && hovered.object() != &rootWidget
      && (time - enterTime >= launchTime
      || (time - lastTime >= relaunchTime && time - lastTime < launchTime))
      && hovered->tooltipText().size()
    )
  {
    if( hovered.isValid() )
    {
      NEvent e;
      hovered->onEvent( e );
    }

    element = standart( rootWidget, hovered.object(), cursor );
    element->addProperty( "tooltip", 1 );
    element->setGeometry( element->relativeRect() + Point( 1, 1 ) );
    if( element->screenBottom() > (int)rootWidget.height() ||
        element->screenLeft() < (int)0 )
    {
      Rect geom = element->absoluteRect();
      geom.constrainTo( rootWidget.absoluteRect() );
      element->setGeometry( geom );
      element->setVisible( showTooltips );
    }
  }

  if( element.isValid() && element->visible() )	// (isVisible() check only because we might use visibility for ToolTip one day)
  {
    lastTime = time;

    // got invisible or removed in the meantime?
    if( hovered.isNull()
        || !hovered->visible()
        || !hovered->parent() )
    {
      element->deleteLater();
      element = WidgetPtr();
    }
  }
}
Exemple #12
0
  void Gui::handleModalFocus()
 {
     // Check if modal focus has been gained by a widget.
     if ((mFocusHandler->GetLastWidgetWithModalFocus() 
             != mFocusHandler->GetModalFocused())
          && (!mFocusHandler->GetLastWidgetWithModalFocus()))
     {
         handleModalFocusGained();
         mFocusHandler->setLastWidgetWithModalFocus(mFocusHandler->GetModalFocused());
     }
     // Check if modal focus has been released.
     else if ((mFocusHandler->GetLastWidgetWithModalFocus()
                 != mFocusHandler->GetModalFocused())
                 && (mFocusHandler->GetLastWidgetWithModalFocus()))
     {
         handleModalFocusReleased();
         mFocusHandler->setLastWidgetWithModalFocus(WidgetPtr());
     }
 }
Exemple #13
0
    void Gui::handleKeyInput()
    {
        while (!mInput->isKeyQueueEmpty())
        {
            KeyInput keyInput = mInput->dequeueKeyInput();

            // Save modifiers state
            mShiftPressed = keyInput.isShiftPressed();
            mMetaPressed = keyInput.isMetaPressed();
            mControlPressed = keyInput.isControlPressed();
            mAltPressed = keyInput.isAltPressed();

            KeyEvent keyEventToGlobalKeyListeners(WidgetPtr(),
                                                  mShiftPressed,
                                                  mControlPressed,
                                                  mAltPressed,
                                                  mMetaPressed,
                                                  keyInput.getType(),
                                                  keyInput.isNumericPad(),
                                                  keyInput.getKey());

            distributeKeyEventToGlobalKeyListeners(keyEventToGlobalKeyListeners);

            // If a global key listener consumes the event it will not be
            // sent further to the source of the event.
            if (keyEventToGlobalKeyListeners.isConsumed())
            {
                continue;
            }

            bool keyEventConsumed = false;
            
            // Send key inputs to the focused widgets
            if (mFocusHandler->GetFocused() != NULL)
            {
                KeyEvent keyEvent(GetKeyEventSource(),
                                  mShiftPressed,
                                  mControlPressed,
                                  mAltPressed,
                                  mMetaPressed,
                                  keyInput.getType(),
                                  keyInput.isNumericPad(),
                                  keyInput.getKey());
                

                if (!mFocusHandler->GetFocused()->IsFocusable())
                {
                    mFocusHandler->FocusNone();
                }
                else
                {                    
                    distributeKeyEvent(keyEvent);                    
                }

                keyEventConsumed = keyEvent.isConsumed();
            }

            // If the key event hasn't been consumed and
            // tabbing is enable check for tab press and
            // change focus.
            if (!keyEventConsumed
                && mTabbing
                && keyInput.getKey().getValue() == Key::TAB
                && keyInput.getType() == KeyInput::PRESSED)
            {
                if (keyInput.isShiftPressed())
                {
                    mFocusHandler->TabPrevious();
                }
                else
                {
                    mFocusHandler->TabNext();
                }
            }                           
                
        } // end while
    }
Exemple #14
0
void UIManager::addWidget(Widget *widget) {
    widgets.push_back(WidgetPtr(widget));
}
Exemple #15
0
void Widget::releaseMouse()
{
	getSystemWindow()->setMouseCaptureWidget(WidgetPtr());
}