bool GUITabbedTitleBar::_mouseEvent(const GUIMouseEvent& event) { if(event.getType() == GUIMouseEventType::MouseDragAndDropDragged) { if(DragAndDropManager::instance().getDragTypeId() != (UINT32)DragAndDropType::EditorWidget) return false; EditorWidgetBase* draggedWidget = reinterpret_cast<EditorWidgetBase*>(DragAndDropManager::instance().getDragData()); const Vector2I& widgetRelPos = event.getPosition(); if(mTempDraggedWidget == nullptr) { UINT32 numTabButtons = (UINT32)mTabButtons.size(); for(UINT32 i = 0; i < numTabButtons; i++) { UINT32 width = mTabButtons[i]->_getLayoutData().area.width; INT32 centerX = mTabButtons[i]->_getLayoutData().area.x + width / 2; if((i + 1) == numTabButtons) { if(i == 0 && widgetRelPos.x <= centerX) { insertTab(0, draggedWidget->getDisplayName()); mTempDraggedTabIdx = mTabButtons[0]->getIndex(); break; } else if(widgetRelPos.x > centerX) { addTab(draggedWidget->getDisplayName()); mTempDraggedTabIdx = mTabButtons[i + 1]->getIndex(); break; } } else { if(i == 0 && widgetRelPos.x <= centerX) { insertTab(0, draggedWidget->getDisplayName()); mTempDraggedTabIdx = mTabButtons[0]->getIndex(); break; } else { UINT32 nextWidth = mTabButtons[i + 1]->_getLayoutData().area.width; INT32 nextCenterX = mTabButtons[i + 1]->_getLayoutData().area.x + nextWidth / 2; if(widgetRelPos.x > centerX && widgetRelPos.x < nextCenterX) { insertTab(i + 1, draggedWidget->getDisplayName()); mTempDraggedTabIdx = mTabButtons[i + 1]->getIndex(); break; } } } } mTempDraggedWidget = draggedWidget; startDrag(uniqueIdxToSeqIdx(mTempDraggedTabIdx), Vector2I()); mInitialDragOffset = Math::roundToInt(mDraggedBtn->_getOptimalSize().x * 0.5f); } if(mTempDraggedWidget != nullptr) tabDragged(mTempDraggedTabIdx, widgetRelPos); return true; } else if(event.getType() == GUIMouseEventType::MouseDragAndDropDropped) { if(DragAndDropManager::instance().getDragTypeId() != (UINT32)DragAndDropType::EditorWidget) return false; if(mTempDraggedWidget != nullptr) { UINT32 seqIdx = uniqueIdxToSeqIdx(mTempDraggedTabIdx); removeTab(mTempDraggedTabIdx); endDrag(); if(!onTabDraggedOn.empty()) onTabDraggedOn(seqIdx); } return true; } else if(event.getType() == GUIMouseEventType::MouseDragAndDropLeft) { if(mTempDraggedWidget != nullptr) { removeTab(mTempDraggedTabIdx); endDrag(); } } return false; }