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(...) {} }
Gui::~Gui() { if (Widget::widgetExists(mTop)) { SetTop(WidgetPtr()); } }
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(); }
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; }
void BasicContainer::Clear() { WidgetListIterator iter; for (iter = mWidgets.begin(); iter != mWidgets.end(); iter++) { (*iter)->_setFocusHandler(FocusHandlerPtr()); (*iter)->_setParent(WidgetPtr()); (*iter)->removeDeathListener(this); } mWidgets.clear(); }
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(); }
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."); }
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; }
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(); } } }
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()); } }
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 }
void UIManager::addWidget(Widget *widget) { widgets.push_back(WidgetPtr(widget)); }
void Widget::releaseMouse() { getSystemWindow()->setMouseCaptureWidget(WidgetPtr()); }