ControlsPositionData BaseAlignHandler::AlignLeftTop(const List<UIControl*>& controlsList, bool isLeft) { ControlsPositionData resultData; // Find the reference position. All the alignment is to be done in absolute coords. float32 referencePos = FLT_MAX; for (List<UIControl*>::const_iterator iter = controlsList.begin(); iter != controlsList.end(); iter ++) { UIControl* uiControl = *iter; if (!uiControl) { continue; } resultData.AddControl(uiControl); Rect absoluteRect = uiControl->GetRect(true); float32 currentPos = isLeft ? absoluteRect.x : absoluteRect.y; if (currentPos < referencePos) { referencePos = currentPos; } } // Second pass - update. for (List<UIControl*>::const_iterator iter = controlsList.begin(); iter != controlsList.end(); iter ++) { UIControl* uiControl = *iter; if (!uiControl) { continue; } Rect absoluteRect = uiControl->GetRect(true); if (isLeft) { float32 offsetX = absoluteRect.x - referencePos; absoluteRect.x -= offsetX; } else { float32 offsetY = absoluteRect.y - referencePos; absoluteRect.y -= offsetY; } uiControl->SetRect(absoluteRect, true); } return resultData; }
ControlsPositionData BaseAlignHandler::AlignRightBottom(const List<UIControl*>& controlsList, bool isRight) { ControlsPositionData resultData; // Find the bottom/right position. All the alignment is to be done in absolute coords. float32 referencePos = FLT_MIN; for (List<UIControl*>::const_iterator iter = controlsList.begin(); iter != controlsList.end(); iter ++) { UIControl* uiControl = *iter; if (!uiControl) { continue; } resultData.AddControl(uiControl); Rect absoluteRect = uiControl->GetRect(true); float32 controlSize = isRight ? (absoluteRect.x + absoluteRect.dx) : (absoluteRect.y + absoluteRect.dy); if (controlSize > referencePos) { referencePos = controlSize; } } // Second pass - update. for (List<UIControl*>::const_iterator iter = controlsList.begin(); iter != controlsList.end(); iter ++) { UIControl* uiControl = *iter; if (!uiControl) { continue; } Rect absoluteRect = uiControl->GetRect(true); if (isRight) { float32 offsetX = referencePos - (absoluteRect.x + absoluteRect.dx); absoluteRect.x += offsetX; } else { float32 offsetY = referencePos - (absoluteRect.y + absoluteRect.dy); absoluteRect.y += offsetY; } uiControl->SetRect(absoluteRect, true); } return resultData; }
ControlsPositionData BaseAlignHandler::AlignCenter(const List<UIControl*>& controlsList, bool isHorizontal) { ControlsPositionData resultData; for (List<UIControl*>::const_iterator iter = controlsList.begin(); iter != controlsList.end(); iter ++) { UIControl* uiControl = *iter; if (!uiControl) { continue; } resultData.AddControl(uiControl); } // Perform the alignment on the first or last control, depending on the flag. UIControl* referenceControl = GetReferenceControl(controlsList); Vector2 referenceCenter = referenceControl->GetRect(true).GetCenter(); // Second pass - update. for (List<UIControl*>::const_iterator iter = controlsList.begin(); iter != controlsList.end(); iter ++) { UIControl* uiControl = *iter; if (!uiControl) { continue; } Rect absoluteRect = uiControl->GetRect(true); Vector2 currentCenter = absoluteRect.GetCenter(); if (isHorizontal) { absoluteRect.x -= (currentCenter.x - referenceCenter.x); } else { absoluteRect.y -= (currentCenter.y - referenceCenter.y); } uiControl->SetRect(absoluteRect, true); } return resultData; }
ControlsPositionData ControlsAdjustSizeCommand::ApplyAjustedSize(HierarchyTreeController::SELECTEDCONTROLNODES& controls) { ControlsPositionData resultData; for (HierarchyTreeController::SELECTEDCONTROLNODES::iterator iter = controls.begin(); iter != controls.end(); ++iter) { HierarchyTreeControlNode* control = (*iter); UIControl* uiControl = control->GetUIObject(); int32 nodeId = control->GetId(); if (uiControl) { // Get sprite Sprite* sprite = uiControl->GetSprite(); Rect prevRect = uiControl->GetRect(); Rect updatedRect = prevRect; if (sprite) { // Save control size data for undo resultData.AddControl(uiControl); // Set new size of updated rect updatedRect.dx = sprite->GetWidth(); updatedRect.dy = sprite->GetHeight(); BaseMetadata* baseMetadata = GetMetadataForTreeNode(nodeId); // This command is NOT state-aware and contains one and only param. baseMetadata->SetActiveParamID(0); baseMetadata->ApplyResize(prevRect, updatedRect); SAFE_DELETE(baseMetadata); } } } return resultData; }
void HierarchyTreeControlNode::SetParent(HierarchyTreeNode* node, HierarchyTreeNode* insertAfter) { if (this == insertAfter) return; if (parent) parent->RemoveTreeNode(this, false, false); HierarchyTreeControlNode* newParentControl = dynamic_cast<HierarchyTreeControlNode* >(node); HierarchyTreeScreenNode* newParentScreen = dynamic_cast<HierarchyTreeScreenNode* >(node); DVASSERT(newParentControl || newParentScreen); if (!newParentControl && !newParentScreen) return; UIControl* afterControl = NULL; HierarchyTreeControlNode* insertAfterControl = dynamic_cast<HierarchyTreeControlNode* >(insertAfter); if (insertAfterControl) afterControl = insertAfterControl->GetUIObject(); UIControl* newParentUI = NULL; if (newParentControl) newParentUI = newParentControl->GetUIObject(); else if (newParentScreen) newParentUI = newParentScreen->GetScreen(); node->AddTreeNode(this, insertAfter); if (newParentUI && uiObject) { Rect controlAbsoluteRect = uiObject->GetRect(true); Rect parentAbsoluteRect = newParentUI->GetRect(true); if (insertAfter != node) { newParentUI->InsertChildAbove(uiObject, afterControl); } else { UIControl* belowControl = NULL; const List<UIControl*> & controls = newParentUI->GetChildren(); if (controls.size()) { belowControl = *controls.begin(); } newParentUI->InsertChildBelow(uiObject, belowControl); } // Recalculate the relative coords of the moved object to don't change its position. Vector2 newControlOffset = controlAbsoluteRect.GetPosition() - parentAbsoluteRect.GetPosition(); uiObject->SetRect(Rect(newControlOffset, uiObject->GetRect().GetSize())); // Fix // DF-2395 - Recalculate scrollContainer content each time we add controls to it UIScrollViewContainer *container = dynamic_cast<UIScrollViewContainer*>(newParentUI); if (container) { UIScrollView *scroll = dynamic_cast<UIScrollView*>(container->GetParent()); if (scroll) { scroll->RecalculateContentSize(); } } } parent = node; }