mirror of https://github.com/axmolengine/axmol.git
issue #5183, refactor UILayoutExecutant doLayout method
This commit is contained in:
parent
84fa60e171
commit
723e01f5df
|
@ -150,12 +150,10 @@ void LinearHorizontalLayoutExecutant::doLayout(LayoutProtocol* layout)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RelativeLayoutExecutant::doLayout(LayoutProtocol *layout)
|
Vector<Widget*> RelativeLayoutExecutant::getAllWidgets(cocos2d::ui::LayoutProtocol *layout)
|
||||||
{
|
{
|
||||||
Size layoutSize = layout->getLayoutContentSize();
|
|
||||||
Vector<Node*> container = layout->getLayoutElements();
|
Vector<Node*> container = layout->getLayoutElements();
|
||||||
ssize_t unlayoutChildCount = 0;
|
|
||||||
Vector<Widget*> widgetChildren;
|
Vector<Widget*> widgetChildren;
|
||||||
for (auto& subWidget : container)
|
for (auto& subWidget : container)
|
||||||
{
|
{
|
||||||
|
@ -164,16 +162,370 @@ void RelativeLayoutExecutant::doLayout(LayoutProtocol *layout)
|
||||||
{
|
{
|
||||||
RelativeLayoutParameter* layoutParameter = dynamic_cast<RelativeLayoutParameter*>(child->getLayoutParameter());
|
RelativeLayoutParameter* layoutParameter = dynamic_cast<RelativeLayoutParameter*>(child->getLayoutParameter());
|
||||||
layoutParameter->_put = false;
|
layoutParameter->_put = false;
|
||||||
unlayoutChildCount++;
|
_unlayoutChildCount++;
|
||||||
widgetChildren.pushBack(child);
|
widgetChildren.pushBack(child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (unlayoutChildCount > 0)
|
return widgetChildren;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget* RelativeLayoutExecutant::getRelativeWidget(Widget* widget)
|
||||||
|
{
|
||||||
|
Widget* relativeWidget = nullptr;
|
||||||
|
RelativeLayoutParameter* layoutParameter = dynamic_cast<RelativeLayoutParameter*>(widget->getLayoutParameter());
|
||||||
|
const std::string relativeName = layoutParameter->getRelativeToWidgetName();
|
||||||
|
|
||||||
|
if (!relativeName.empty())
|
||||||
{
|
{
|
||||||
for (auto& subWidget : widgetChildren)
|
for (auto& sWidget : _widgetChildren)
|
||||||
{
|
{
|
||||||
Widget* child = static_cast<Widget*>(subWidget);
|
if (sWidget)
|
||||||
RelativeLayoutParameter* layoutParameter = dynamic_cast<RelativeLayoutParameter*>(child->getLayoutParameter());
|
{
|
||||||
|
RelativeLayoutParameter* rlayoutParameter = dynamic_cast<RelativeLayoutParameter*>(sWidget->getLayoutParameter());
|
||||||
|
if (rlayoutParameter && rlayoutParameter->getRelativeName() == relativeName)
|
||||||
|
{
|
||||||
|
relativeWidget = sWidget;
|
||||||
|
_relativeWidgetLP = rlayoutParameter;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return relativeWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RelativeLayoutExecutant::caculateFinalPositionWithRelativeWidget(LayoutProtocol *layout)
|
||||||
|
{
|
||||||
|
Vec2 ap = _widget->getAnchorPoint();
|
||||||
|
Size cs = _widget->getSize();
|
||||||
|
|
||||||
|
_finalPositionX = 0.0f;
|
||||||
|
_finalPositionY = 0.0f;
|
||||||
|
|
||||||
|
Widget* relativeWidget = this->getRelativeWidget(_widget);
|
||||||
|
|
||||||
|
RelativeLayoutParameter* layoutParameter = dynamic_cast<RelativeLayoutParameter*>(_widget->getLayoutParameter());
|
||||||
|
|
||||||
|
RelativeLayoutParameter::RelativeAlign align = layoutParameter->getAlign();
|
||||||
|
|
||||||
|
Size layoutSize = layout->getLayoutContentSize();
|
||||||
|
|
||||||
|
|
||||||
|
switch (align)
|
||||||
|
{
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::NONE:
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_TOP_LEFT:
|
||||||
|
_finalPositionX = ap.x * cs.width;
|
||||||
|
_finalPositionY = layoutSize.height - ((1.0f - ap.y) * cs.height);
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_TOP_CENTER_HORIZONTAL:
|
||||||
|
_finalPositionX = layoutSize.width * 0.5f - cs.width * (0.5f - ap.x);
|
||||||
|
_finalPositionY = layoutSize.height - ((1.0f - ap.y) * cs.height);
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_TOP_RIGHT:
|
||||||
|
_finalPositionX = layoutSize.width - ((1.0f - ap.x) * cs.width);
|
||||||
|
_finalPositionY = layoutSize.height - ((1.0f - ap.y) * cs.height);
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL:
|
||||||
|
_finalPositionX = ap.x * cs.width;
|
||||||
|
_finalPositionY = layoutSize.height * 0.5f - cs.height * (0.5f - ap.y);
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT:
|
||||||
|
_finalPositionX = layoutSize.width * 0.5f - cs.width * (0.5f - ap.x);
|
||||||
|
_finalPositionY = layoutSize.height * 0.5f - cs.height * (0.5f - ap.y);
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL:
|
||||||
|
_finalPositionX = layoutSize.width - ((1.0f - ap.x) * cs.width);
|
||||||
|
_finalPositionY = layoutSize.height * 0.5f - cs.height * (0.5f - ap.y);
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_BOTTOM:
|
||||||
|
_finalPositionX = ap.x * cs.width;
|
||||||
|
_finalPositionY = ap.y * cs.height;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_BOTTOM_CENTER_HORIZONTAL:
|
||||||
|
_finalPositionX = layoutSize.width * 0.5f - cs.width * (0.5f - ap.x);
|
||||||
|
_finalPositionY = ap.y * cs.height;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_BOTTOM:
|
||||||
|
_finalPositionX = layoutSize.width - ((1.0f - ap.x) * cs.width);
|
||||||
|
_finalPositionY = ap.y * cs.height;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_ABOVE_LEFTALIGN:
|
||||||
|
if (relativeWidget)
|
||||||
|
{
|
||||||
|
if (_relativeWidgetLP && !_relativeWidgetLP->_put)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
float locationTop = relativeWidget->getTopBoundary();
|
||||||
|
float locationLeft = relativeWidget->getLeftBoundary();
|
||||||
|
_finalPositionY = locationTop + ap.y * cs.height;
|
||||||
|
_finalPositionX = locationLeft + ap.x * cs.width;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_ABOVE_CENTER:
|
||||||
|
if (relativeWidget)
|
||||||
|
{
|
||||||
|
if (_relativeWidgetLP && !_relativeWidgetLP->_put)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Size rbs = relativeWidget->getSize();
|
||||||
|
float locationTop = relativeWidget->getTopBoundary();
|
||||||
|
|
||||||
|
_finalPositionY = locationTop + ap.y * cs.height;
|
||||||
|
_finalPositionX = relativeWidget->getLeftBoundary() + rbs.width * 0.5f + ap.x * cs.width - cs.width * 0.5f;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_ABOVE_RIGHTALIGN:
|
||||||
|
if (relativeWidget)
|
||||||
|
{
|
||||||
|
if (_relativeWidgetLP && !_relativeWidgetLP->_put)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
float locationTop = relativeWidget->getTopBoundary();
|
||||||
|
float locationRight = relativeWidget->getRightBoundary();
|
||||||
|
_finalPositionY = locationTop + ap.y * cs.height;
|
||||||
|
_finalPositionX = locationRight - (1.0f - ap.x) * cs.width;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_TOPALIGN:
|
||||||
|
if (relativeWidget)
|
||||||
|
{
|
||||||
|
if (_relativeWidgetLP && !_relativeWidgetLP->_put)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
float locationTop = relativeWidget->getTopBoundary();
|
||||||
|
float locationLeft = relativeWidget->getLeftBoundary();
|
||||||
|
_finalPositionY = locationTop - (1.0f - ap.y) * cs.height;
|
||||||
|
_finalPositionX = locationLeft - (1.0f - ap.x) * cs.width;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_CENTER:
|
||||||
|
if (relativeWidget)
|
||||||
|
{
|
||||||
|
if (_relativeWidgetLP && !_relativeWidgetLP->_put)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Size rbs = relativeWidget->getSize();
|
||||||
|
float locationLeft = relativeWidget->getLeftBoundary();
|
||||||
|
_finalPositionX = locationLeft - (1.0f - ap.x) * cs.width;
|
||||||
|
|
||||||
|
_finalPositionY = relativeWidget->getBottomBoundary() + rbs.height * 0.5f + ap.y * cs.height - cs.height * 0.5f;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_BOTTOMALIGN:
|
||||||
|
if (relativeWidget)
|
||||||
|
{
|
||||||
|
if (_relativeWidgetLP && !_relativeWidgetLP->_put)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
float locationBottom = relativeWidget->getBottomBoundary();
|
||||||
|
float locationLeft = relativeWidget->getLeftBoundary();
|
||||||
|
_finalPositionY = locationBottom + ap.y * cs.height;
|
||||||
|
_finalPositionX = locationLeft - (1.0f - ap.x) * cs.width;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_TOPALIGN:
|
||||||
|
if (relativeWidget)
|
||||||
|
{
|
||||||
|
if (_relativeWidgetLP && !_relativeWidgetLP->_put)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
float locationTop = relativeWidget->getTopBoundary();
|
||||||
|
float locationRight = relativeWidget->getRightBoundary();
|
||||||
|
_finalPositionY = locationTop - (1.0f - ap.y) * cs.height;
|
||||||
|
_finalPositionX = locationRight + ap.x * cs.width;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_CENTER:
|
||||||
|
if (relativeWidget)
|
||||||
|
{
|
||||||
|
if (_relativeWidgetLP && !_relativeWidgetLP->_put)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Size rbs = relativeWidget->getSize();
|
||||||
|
float locationRight = relativeWidget->getRightBoundary();
|
||||||
|
_finalPositionX = locationRight + ap.x * cs.width;
|
||||||
|
|
||||||
|
_finalPositionY = relativeWidget->getBottomBoundary() + rbs.height * 0.5f + ap.y * cs.height - cs.height * 0.5f;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_BOTTOMALIGN:
|
||||||
|
if (relativeWidget)
|
||||||
|
{
|
||||||
|
if (_relativeWidgetLP && !_relativeWidgetLP->_put)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
float locationBottom = relativeWidget->getBottomBoundary();
|
||||||
|
float locationRight = relativeWidget->getRightBoundary();
|
||||||
|
_finalPositionY = locationBottom + ap.y * cs.height;
|
||||||
|
_finalPositionX = locationRight + ap.x * cs.width;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_BELOW_LEFTALIGN:
|
||||||
|
if (relativeWidget)
|
||||||
|
{
|
||||||
|
if (_relativeWidgetLP && !_relativeWidgetLP->_put)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
float locationBottom = relativeWidget->getBottomBoundary();
|
||||||
|
float locationLeft = relativeWidget->getLeftBoundary();
|
||||||
|
_finalPositionY = locationBottom - (1.0f - ap.y) * cs.height;
|
||||||
|
_finalPositionX = locationLeft + ap.x * cs.width;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_BELOW_CENTER:
|
||||||
|
if (relativeWidget)
|
||||||
|
{
|
||||||
|
if (_relativeWidgetLP && !_relativeWidgetLP->_put)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Size rbs = relativeWidget->getSize();
|
||||||
|
float locationBottom = relativeWidget->getBottomBoundary();
|
||||||
|
|
||||||
|
_finalPositionY = locationBottom - (1.0f - ap.y) * cs.height;
|
||||||
|
_finalPositionX = relativeWidget->getLeftBoundary() + rbs.width * 0.5f + ap.x * cs.width - cs.width * 0.5f;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_BELOW_RIGHTALIGN:
|
||||||
|
if (relativeWidget)
|
||||||
|
{
|
||||||
|
if (_relativeWidgetLP && !_relativeWidgetLP->_put)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
float locationBottom = relativeWidget->getBottomBoundary();
|
||||||
|
float locationRight = relativeWidget->getRightBoundary();
|
||||||
|
_finalPositionY = locationBottom - (1.0f - ap.y) * cs.height;
|
||||||
|
_finalPositionX = locationRight - (1.0f - ap.x) * cs.width;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RelativeLayoutExecutant::caculateFinalPositionWithRelativeAlign()
|
||||||
|
{
|
||||||
|
RelativeLayoutParameter* layoutParameter = dynamic_cast<RelativeLayoutParameter*>(_widget->getLayoutParameter());
|
||||||
|
|
||||||
|
Margin mg = layoutParameter->getMargin();
|
||||||
|
|
||||||
|
|
||||||
|
RelativeLayoutParameter::RelativeAlign align = layoutParameter->getAlign();
|
||||||
|
|
||||||
|
//handle margin
|
||||||
|
switch (align)
|
||||||
|
{
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::NONE:
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_TOP_LEFT:
|
||||||
|
_finalPositionX += mg.left;
|
||||||
|
_finalPositionY -= mg.top;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_TOP_CENTER_HORIZONTAL:
|
||||||
|
_finalPositionY -= mg.top;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_TOP_RIGHT:
|
||||||
|
_finalPositionX -= mg.right;
|
||||||
|
_finalPositionY -= mg.top;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL:
|
||||||
|
_finalPositionX += mg.left;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT:
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL:
|
||||||
|
_finalPositionX -= mg.right;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_BOTTOM:
|
||||||
|
_finalPositionX += mg.left;
|
||||||
|
_finalPositionY += mg.bottom;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_BOTTOM_CENTER_HORIZONTAL:
|
||||||
|
_finalPositionY += mg.bottom;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_BOTTOM:
|
||||||
|
_finalPositionX -= mg.right;
|
||||||
|
_finalPositionY += mg.bottom;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_ABOVE_LEFTALIGN:
|
||||||
|
_finalPositionY += mg.bottom;
|
||||||
|
_finalPositionX += mg.left;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_ABOVE_RIGHTALIGN:
|
||||||
|
_finalPositionY += mg.bottom;
|
||||||
|
_finalPositionX -= mg.right;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_ABOVE_CENTER:
|
||||||
|
_finalPositionY += mg.bottom;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_TOPALIGN:
|
||||||
|
_finalPositionX -= mg.right;
|
||||||
|
_finalPositionY -= mg.top;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_BOTTOMALIGN:
|
||||||
|
_finalPositionX -= mg.right;
|
||||||
|
_finalPositionY += mg.bottom;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_CENTER:
|
||||||
|
_finalPositionX -= mg.right;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_TOPALIGN:
|
||||||
|
_finalPositionX += mg.left;
|
||||||
|
_finalPositionY -= mg.top;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_BOTTOMALIGN:
|
||||||
|
_finalPositionX += mg.left;
|
||||||
|
_finalPositionY += mg.bottom;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_CENTER:
|
||||||
|
_finalPositionX += mg.left;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_BELOW_LEFTALIGN:
|
||||||
|
_finalPositionY -= mg.top;
|
||||||
|
_finalPositionX += mg.left;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_BELOW_RIGHTALIGN:
|
||||||
|
_finalPositionY -= mg.top;
|
||||||
|
_finalPositionX -= mg.right;
|
||||||
|
break;
|
||||||
|
case RelativeLayoutParameter::RelativeAlign::LOCATION_BELOW_CENTER:
|
||||||
|
_finalPositionY -= mg.top;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RelativeLayoutExecutant::doLayout(LayoutProtocol *layout)
|
||||||
|
{
|
||||||
|
|
||||||
|
_widgetChildren = this->getAllWidgets(layout);
|
||||||
|
|
||||||
|
while (_unlayoutChildCount > 0)
|
||||||
|
{
|
||||||
|
for (auto& subWidget : _widgetChildren)
|
||||||
|
{
|
||||||
|
_widget = static_cast<Widget*>(subWidget);
|
||||||
|
|
||||||
|
RelativeLayoutParameter* layoutParameter = dynamic_cast<RelativeLayoutParameter*>(_widget->getLayoutParameter());
|
||||||
|
|
||||||
if (layoutParameter)
|
if (layoutParameter)
|
||||||
{
|
{
|
||||||
|
@ -181,331 +533,25 @@ void RelativeLayoutExecutant::doLayout(LayoutProtocol *layout)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Vec2 ap = child->getAnchorPoint();
|
|
||||||
Size cs = child->getSize();
|
|
||||||
RelativeLayoutParameter::RelativeAlign align = layoutParameter->getAlign();
|
bool ret = this->caculateFinalPositionWithRelativeWidget(layout);
|
||||||
const std::string relativeName = layoutParameter->getRelativeToWidgetName();
|
if (!ret) {
|
||||||
Widget* relativeWidget = nullptr;
|
continue;
|
||||||
RelativeLayoutParameter* relativeWidgetLP = nullptr;
|
|
||||||
float finalPosX = 0.0f;
|
|
||||||
float finalPosY = 0.0f;
|
|
||||||
if (!relativeName.empty())
|
|
||||||
{
|
|
||||||
for (auto& sWidget : widgetChildren)
|
|
||||||
{
|
|
||||||
if (sWidget)
|
|
||||||
{
|
|
||||||
RelativeLayoutParameter* rlayoutParameter = dynamic_cast<RelativeLayoutParameter*>(sWidget->getLayoutParameter());
|
|
||||||
if (rlayoutParameter && rlayoutParameter->getRelativeName() == relativeName)
|
|
||||||
{
|
|
||||||
relativeWidget = sWidget;
|
|
||||||
relativeWidgetLP = rlayoutParameter;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
switch (align)
|
|
||||||
{
|
this->caculateFinalPositionWithRelativeAlign();
|
||||||
case RelativeLayoutParameter::RelativeAlign::NONE:
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_TOP_LEFT:
|
|
||||||
finalPosX = ap.x * cs.width;
|
_widget->setPosition(Vec2(_finalPositionX, _finalPositionY));
|
||||||
finalPosY = layoutSize.height - ((1.0f - ap.y) * cs.height);
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_TOP_CENTER_HORIZONTAL:
|
|
||||||
finalPosX = layoutSize.width * 0.5f - cs.width * (0.5f - ap.x);
|
|
||||||
finalPosY = layoutSize.height - ((1.0f - ap.y) * cs.height);
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_TOP_RIGHT:
|
|
||||||
finalPosX = layoutSize.width - ((1.0f - ap.x) * cs.width);
|
|
||||||
finalPosY = layoutSize.height - ((1.0f - ap.y) * cs.height);
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL:
|
|
||||||
finalPosX = ap.x * cs.width;
|
|
||||||
finalPosY = layoutSize.height * 0.5f - cs.height * (0.5f - ap.y);
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT:
|
|
||||||
finalPosX = layoutSize.width * 0.5f - cs.width * (0.5f - ap.x);
|
|
||||||
finalPosY = layoutSize.height * 0.5f - cs.height * (0.5f - ap.y);
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL:
|
|
||||||
finalPosX = layoutSize.width - ((1.0f - ap.x) * cs.width);
|
|
||||||
finalPosY = layoutSize.height * 0.5f - cs.height * (0.5f - ap.y);
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_BOTTOM:
|
|
||||||
finalPosX = ap.x * cs.width;
|
|
||||||
finalPosY = ap.y * cs.height;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_BOTTOM_CENTER_HORIZONTAL:
|
|
||||||
finalPosX = layoutSize.width * 0.5f - cs.width * (0.5f - ap.x);
|
|
||||||
finalPosY = ap.y * cs.height;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_BOTTOM:
|
|
||||||
finalPosX = layoutSize.width - ((1.0f - ap.x) * cs.width);
|
|
||||||
finalPosY = ap.y * cs.height;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_ABOVE_LEFTALIGN:
|
|
||||||
if (relativeWidget)
|
|
||||||
{
|
|
||||||
if (relativeWidgetLP && !relativeWidgetLP->_put)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
float locationTop = relativeWidget->getTopBoundary();
|
|
||||||
float locationLeft = relativeWidget->getLeftBoundary();
|
|
||||||
finalPosY = locationTop + ap.y * cs.height;
|
|
||||||
finalPosX = locationLeft + ap.x * cs.width;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_ABOVE_CENTER:
|
|
||||||
if (relativeWidget)
|
|
||||||
{
|
|
||||||
if (relativeWidgetLP && !relativeWidgetLP->_put)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Size rbs = relativeWidget->getSize();
|
|
||||||
float locationTop = relativeWidget->getTopBoundary();
|
|
||||||
|
|
||||||
finalPosY = locationTop + ap.y * cs.height;
|
|
||||||
finalPosX = relativeWidget->getLeftBoundary() + rbs.width * 0.5f + ap.x * cs.width - cs.width * 0.5f;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_ABOVE_RIGHTALIGN:
|
|
||||||
if (relativeWidget)
|
|
||||||
{
|
|
||||||
if (relativeWidgetLP && !relativeWidgetLP->_put)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
float locationTop = relativeWidget->getTopBoundary();
|
|
||||||
float locationRight = relativeWidget->getRightBoundary();
|
|
||||||
finalPosY = locationTop + ap.y * cs.height;
|
|
||||||
finalPosX = locationRight - (1.0f - ap.x) * cs.width;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_TOPALIGN:
|
|
||||||
if (relativeWidget)
|
|
||||||
{
|
|
||||||
if (relativeWidgetLP && !relativeWidgetLP->_put)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
float locationTop = relativeWidget->getTopBoundary();
|
|
||||||
float locationLeft = relativeWidget->getLeftBoundary();
|
|
||||||
finalPosY = locationTop - (1.0f - ap.y) * cs.height;
|
|
||||||
finalPosX = locationLeft - (1.0f - ap.x) * cs.width;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_CENTER:
|
|
||||||
if (relativeWidget)
|
|
||||||
{
|
|
||||||
if (relativeWidgetLP && !relativeWidgetLP->_put)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Size rbs = relativeWidget->getSize();
|
|
||||||
float locationLeft = relativeWidget->getLeftBoundary();
|
|
||||||
finalPosX = locationLeft - (1.0f - ap.x) * cs.width;
|
|
||||||
|
|
||||||
finalPosY = relativeWidget->getBottomBoundary() + rbs.height * 0.5f + ap.y * cs.height - cs.height * 0.5f;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_BOTTOMALIGN:
|
|
||||||
if (relativeWidget)
|
|
||||||
{
|
|
||||||
if (relativeWidgetLP && !relativeWidgetLP->_put)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
float locationBottom = relativeWidget->getBottomBoundary();
|
|
||||||
float locationLeft = relativeWidget->getLeftBoundary();
|
|
||||||
finalPosY = locationBottom + ap.y * cs.height;
|
|
||||||
finalPosX = locationLeft - (1.0f - ap.x) * cs.width;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_TOPALIGN:
|
|
||||||
if (relativeWidget)
|
|
||||||
{
|
|
||||||
if (relativeWidgetLP && !relativeWidgetLP->_put)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
float locationTop = relativeWidget->getTopBoundary();
|
|
||||||
float locationRight = relativeWidget->getRightBoundary();
|
|
||||||
finalPosY = locationTop - (1.0f - ap.y) * cs.height;
|
|
||||||
finalPosX = locationRight + ap.x * cs.width;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_CENTER:
|
|
||||||
if (relativeWidget)
|
|
||||||
{
|
|
||||||
if (relativeWidgetLP && !relativeWidgetLP->_put)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Size rbs = relativeWidget->getSize();
|
|
||||||
float locationRight = relativeWidget->getRightBoundary();
|
|
||||||
finalPosX = locationRight + ap.x * cs.width;
|
|
||||||
|
|
||||||
finalPosY = relativeWidget->getBottomBoundary() + rbs.height * 0.5f + ap.y * cs.height - cs.height * 0.5f;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_BOTTOMALIGN:
|
|
||||||
if (relativeWidget)
|
|
||||||
{
|
|
||||||
if (relativeWidgetLP && !relativeWidgetLP->_put)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
float locationBottom = relativeWidget->getBottomBoundary();
|
|
||||||
float locationRight = relativeWidget->getRightBoundary();
|
|
||||||
finalPosY = locationBottom + ap.y * cs.height;
|
|
||||||
finalPosX = locationRight + ap.x * cs.width;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_BELOW_LEFTALIGN:
|
|
||||||
if (relativeWidget)
|
|
||||||
{
|
|
||||||
if (relativeWidgetLP && !relativeWidgetLP->_put)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
float locationBottom = relativeWidget->getBottomBoundary();
|
|
||||||
float locationLeft = relativeWidget->getLeftBoundary();
|
|
||||||
finalPosY = locationBottom - (1.0f - ap.y) * cs.height;
|
|
||||||
finalPosX = locationLeft + ap.x * cs.width;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_BELOW_CENTER:
|
|
||||||
if (relativeWidget)
|
|
||||||
{
|
|
||||||
if (relativeWidgetLP && !relativeWidgetLP->_put)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Size rbs = relativeWidget->getSize();
|
|
||||||
float locationBottom = relativeWidget->getBottomBoundary();
|
|
||||||
|
|
||||||
finalPosY = locationBottom - (1.0f - ap.y) * cs.height;
|
|
||||||
finalPosX = relativeWidget->getLeftBoundary() + rbs.width * 0.5f + ap.x * cs.width - cs.width * 0.5f;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_BELOW_RIGHTALIGN:
|
|
||||||
if (relativeWidget)
|
|
||||||
{
|
|
||||||
if (relativeWidgetLP && !relativeWidgetLP->_put)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
float locationBottom = relativeWidget->getBottomBoundary();
|
|
||||||
float locationRight = relativeWidget->getRightBoundary();
|
|
||||||
finalPosY = locationBottom - (1.0f - ap.y) * cs.height;
|
|
||||||
finalPosX = locationRight - (1.0f - ap.x) * cs.width;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Margin relativeWidgetMargin;
|
|
||||||
Margin mg = layoutParameter->getMargin();
|
|
||||||
if (relativeWidgetLP)
|
|
||||||
{
|
|
||||||
relativeWidgetMargin = relativeWidgetLP->getMargin();
|
|
||||||
}
|
|
||||||
//handle margin
|
|
||||||
switch (align)
|
|
||||||
{
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::NONE:
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_TOP_LEFT:
|
|
||||||
finalPosX += mg.left;
|
|
||||||
finalPosY -= mg.top;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_TOP_CENTER_HORIZONTAL:
|
|
||||||
finalPosY -= mg.top;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_TOP_RIGHT:
|
|
||||||
finalPosX -= mg.right;
|
|
||||||
finalPosY -= mg.top;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL:
|
|
||||||
finalPosX += mg.left;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT:
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL:
|
|
||||||
finalPosX -= mg.right;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_BOTTOM:
|
|
||||||
finalPosX += mg.left;
|
|
||||||
finalPosY += mg.bottom;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_BOTTOM_CENTER_HORIZONTAL:
|
|
||||||
finalPosY += mg.bottom;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_BOTTOM:
|
|
||||||
finalPosX -= mg.right;
|
|
||||||
finalPosY += mg.bottom;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_ABOVE_LEFTALIGN:
|
|
||||||
finalPosY += mg.bottom;
|
|
||||||
finalPosX += mg.left;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_ABOVE_RIGHTALIGN:
|
|
||||||
finalPosY += mg.bottom;
|
|
||||||
finalPosX -= mg.right;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_ABOVE_CENTER:
|
|
||||||
finalPosY += mg.bottom;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_TOPALIGN:
|
|
||||||
finalPosX -= mg.right;
|
|
||||||
finalPosY -= mg.top;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_BOTTOMALIGN:
|
|
||||||
finalPosX -= mg.right;
|
|
||||||
finalPosY += mg.bottom;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_CENTER:
|
|
||||||
finalPosX -= mg.right;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_TOPALIGN:
|
|
||||||
finalPosX += mg.left;
|
|
||||||
finalPosY -= mg.top;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_BOTTOMALIGN:
|
|
||||||
finalPosX += mg.left;
|
|
||||||
finalPosY += mg.bottom;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_CENTER:
|
|
||||||
finalPosX += mg.left;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_BELOW_LEFTALIGN:
|
|
||||||
finalPosY -= mg.top;
|
|
||||||
finalPosX += mg.left;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_BELOW_RIGHTALIGN:
|
|
||||||
finalPosY -= mg.top;
|
|
||||||
finalPosX -= mg.right;
|
|
||||||
break;
|
|
||||||
case RelativeLayoutParameter::RelativeAlign::LOCATION_BELOW_CENTER:
|
|
||||||
finalPosY -= mg.top;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
child->setPosition(Vec2(finalPosX, finalPosY));
|
|
||||||
layoutParameter->_put = true;
|
layoutParameter->_put = true;
|
||||||
unlayoutChildCount--;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_unlayoutChildCount--;
|
||||||
|
|
||||||
}
|
}
|
||||||
widgetChildren.clear();
|
_widgetChildren.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,12 +26,15 @@
|
||||||
#define __cocos2d_libs__CCLayoutExecutant__
|
#define __cocos2d_libs__CCLayoutExecutant__
|
||||||
|
|
||||||
#include "base/CCRef.h"
|
#include "base/CCRef.h"
|
||||||
|
#include "base/CCVector.h"
|
||||||
|
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
namespace ui {
|
namespace ui {
|
||||||
|
|
||||||
class LayoutProtocol;
|
class LayoutProtocol;
|
||||||
|
class Widget;
|
||||||
|
class RelativeLayoutParameter;
|
||||||
|
|
||||||
class LayoutExecutant : public Ref
|
class LayoutExecutant : public Ref
|
||||||
{
|
{
|
||||||
|
@ -67,6 +70,20 @@ public:
|
||||||
virtual ~RelativeLayoutExecutant(){};
|
virtual ~RelativeLayoutExecutant(){};
|
||||||
static RelativeLayoutExecutant* create();
|
static RelativeLayoutExecutant* create();
|
||||||
virtual void doLayout(LayoutProtocol *layout) override;
|
virtual void doLayout(LayoutProtocol *layout) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Vector<Widget*> getAllWidgets(LayoutProtocol *layout);
|
||||||
|
Widget* getRelativeWidget(Widget* widget);
|
||||||
|
bool caculateFinalPositionWithRelativeWidget(LayoutProtocol *layout);
|
||||||
|
void caculateFinalPositionWithRelativeAlign();
|
||||||
|
|
||||||
|
ssize_t _unlayoutChildCount = 0;
|
||||||
|
Vector<Widget*> _widgetChildren;
|
||||||
|
Widget* _widget = nullptr;
|
||||||
|
float _finalPositionX = 0.0;
|
||||||
|
float _finalPositionY = 0.0;
|
||||||
|
|
||||||
|
RelativeLayoutParameter* _relativeWidgetLP = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue