void wxsItemEditorContent::OnMouseDraggingItem(wxMouseEvent& event) { if ( event.RightIsDown() || event.MiddleIsDown() ) { // Cancelling change for ( size_t i=0; i<m_DragPoints.Count(); i++ ) { m_DragPoints[i]->PosX = m_DragPoints[i]->DragInitPosX; m_DragPoints[i]->PosY = m_DragPoints[i]->DragInitPosY; } m_MouseState = msIdle; m_AssistParent = 0; m_AssistTarget = 0; m_AssistAddAfter = false; m_Assist->NewDragging(); return; } if ( !event.LeftIsDown() ) { if ( !m_CurDragPoint ) { // TODO: Enable this anti-crash check after tests // return; } // Finalizing change m_Data->BeginChange(); if ( m_CurDragPoint->PosX != m_CurDragPoint->DragInitPosX || m_CurDragPoint->PosY != m_CurDragPoint->DragInitPosY ) { wxsParent* NewParent = 0; wxsItem* AtCursor = 0; bool AddAfter = true; if ( FindDraggingItemTarget(event.GetX(),event.GetY(),m_CurDragItem,NewParent,AtCursor,AddAfter) ) { if ( (m_CurDragItem->GetParent() == NewParent) || (NewParent->CanAddChild(m_CurDragItem,false) && m_CurDragItem->CanAddToParent(NewParent,false)) ) { wxsParent* CurParent = m_CurDragItem->GetParent(); if ( CurParent != NewParent || NewParent->GetType() == wxsTSizer ) { if ( AtCursor != m_CurDragItem ) { // Storing extra data int CurIndex = CurParent->GetChildIndex(m_CurDragItem); TiXmlElement ExtraData("extra"); CurParent->StoreExtraData(CurIndex,&ExtraData); // Unbinding from old parent m_CurDragItem->GetParent()->UnbindChild(m_CurDragItem); // Adding to new one int NewIndex = -1; if ( AtCursor ) { NewIndex = NewParent->GetChildIndex(AtCursor); if ( AddAfter ) NewIndex++; } NewParent->AddChild(m_CurDragItem,NewIndex); // Restoring extra data NewIndex = NewParent->GetChildIndex(m_CurDragItem); NewParent->RestoreExtraData(NewIndex,&ExtraData); } } wxsBaseProperties* Props = m_CurDragItem->GetBaseProps(); if ( Props ) { if ( NewParent->GetType() == wxsTSizer ) { Props->m_Position.SetPosition(wxDefaultPosition,0); } else { // Calculating new position int ParentPosX = 0, ParentPosY = 0, ParentSizeX = 0, ParentSizeY = 0; if ( FindAbsoluteRect(NewParent,ParentPosX,ParentPosY,ParentSizeX,ParentSizeY) ) { int NewPosX = m_CurDragPoint->ItemPoints[LeftTop]->PosX - ParentPosX; int NewPosY = m_CurDragPoint->ItemPoints[LeftTop]->PosY - ParentPosY; wxWindow* PreviewParent = GetPreviewWindow(NewParent); GridFixup(PreviewParent,NewPosX,NewPosY); if ( PreviewParent ) { Props->m_Position.SetPosition(wxPoint(NewPosX,NewPosY),PreviewParent); } } } } } } } m_MouseState = msIdle; m_AssistTarget = 0; m_AssistParent = 0; m_AssistAddAfter = false; m_Assist->NewDragging(); m_Data->EndChange(); return; } int DeltaX = event.GetX() - m_DragInitPosX; int DeltaY = event.GetY() - m_DragInitPosY; if ( !FindDraggingItemTarget(event.GetX(),event.GetY(),m_CurDragItem,m_AssistParent,m_AssistTarget,m_AssistAddAfter) ) { m_AssistTarget = 0; m_AssistParent = 0; m_AssistAddAfter = false; } else { // Applying grid stuff int ParentPosX = 0, ParentPosY = 0, ParentSizeX = 0, ParentSizeY = 0; if ( FindAbsoluteRect(m_AssistParent,ParentPosX,ParentPosY,ParentSizeX,ParentSizeY) ) { int NewPosX = m_CurDragPoint->ItemPoints[LeftTop]->DragInitPosX - ParentPosX + DeltaX; int NewPosY = m_CurDragPoint->ItemPoints[LeftTop]->DragInitPosY - ParentPosY + DeltaY; int PosXStore = NewPosX; int PosYStore = NewPosY; wxWindow* PreviewParent = GetPreviewWindow(m_AssistParent); GridFixup(PreviewParent,NewPosX,NewPosY); if ( PreviewParent ) { DeltaX += NewPosX - PosXStore; DeltaY += NewPosY - PosYStore; } } } for ( size_t i=0; i<m_DragPoints.Count(); i++ ) { m_DragPoints[i]->PosX = m_DragPoints[i]->DragInitPosX + DeltaX; m_DragPoints[i]->PosY = m_DragPoints[i]->DragInitPosY + DeltaY; } FastRepaint(); }
ExtraData TextureFile::extraData() const { return ExtraData(); }