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; }
void ControlsAdjustSizeCommand::UndoAdjustedSize(const ControlsPositionData& sizeData) { for (Map<UIControl*, Rect>::const_iterator iter = sizeData.GetControlPositions().begin(); iter != sizeData.GetControlPositions().end(); iter ++) { UIControl* control = iter->first; Rect rect = iter->second; if (control) { control->SetRect(rect); } } }
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; }