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