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 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();
    }
  }
}