bool UIManager::updateDraggingWidget(const UIWidgetPtr& draggingWidget, const Point& clickedPos) { bool accepted = false; UIWidgetPtr oldDraggingWidget = m_draggingWidget; m_draggingWidget = nullptr; if(oldDraggingWidget) { UIWidgetPtr droppedWidget; if(!clickedPos.isNull()) { auto clickedChildren = m_rootWidget->recursiveGetChildrenByPos(clickedPos); for(const UIWidgetPtr& child : clickedChildren) { if(child->onDrop(oldDraggingWidget, clickedPos)) { droppedWidget = child; break; } } } accepted = oldDraggingWidget->onDragLeave(droppedWidget, clickedPos); oldDraggingWidget->updateState(Fw::DraggingState); } if(draggingWidget) { if(draggingWidget->onDragEnter(clickedPos)) { m_draggingWidget = draggingWidget; draggingWidget->updateState(Fw::DraggingState); accepted = true; } } return accepted; }
bool UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button) { if(isPressed() && getRect().contains(mousePos)) callLuaField("onClick"); UIWidgetPtr draggedWidget = g_ui.getDraggingWidget(); if(draggedWidget && button == Fw::MouseLeftButton && (containsPoint(mousePos) || asUIWidget() == g_ui.getRootWidget())) { onDrop(draggedWidget, mousePos); draggedWidget->onDragLeave(asUIWidget(), mousePos); draggedWidget->setDragging(false); } return callLuaField<bool>("onMouseRelease", mousePos, button); }