dda56b40创建于 2022年9月23日历史提交
/*
 * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "layout/grid_layout.h"

namespace OHOS {
void GridLayout::LayoutChildren(bool needInvalidate)
{
    if (childrenHead_ == nullptr) {
        return;
    }
    UIView* child = childrenHead_;
    if ((rows_ == 0) || (cols_ == 0)) {
        RemoveAll();
        return;
    }
    int16_t childrenNum = 0;
    while (child != nullptr) {
        childrenNum++;
        child = child->GetNextSibling();
    }
    if (rows_ * cols_ < childrenNum) {
        RemoveAll();
        return;
    }

    if (direction_ == LAYOUT_HOR) {
        LayoutHorizontal();
    } else {
        LayoutVertical();
    }
    if (needInvalidate) {
        Invalidate();
    }
}

void GridLayout::LayoutHorizontal()
{
    UIView* child = childrenHead_;
    int16_t left;
    int16_t right;
    int16_t top;
    int16_t bottom;
    int16_t layoutWidth = GetWidth() / cols_;
    int16_t layoutHeight = GetHeight() / rows_;
    int16_t posX;
    for (int16_t i = 0; i < rows_; i++) {
        int16_t posY = i * layoutHeight;
        for (int16_t j = 0; j < cols_; j++) {
            if (child == nullptr) {
                return;
            }
            posX = j * layoutWidth;
            child->ReMeasure();
            left = child->GetStyle(STYLE_MARGIN_LEFT);
            right = child->GetStyle(STYLE_MARGIN_RIGHT);
            top = child->GetStyle(STYLE_MARGIN_TOP);
            bottom = child->GetStyle(STYLE_MARGIN_BOTTOM);
            // 2: half
            int16_t actPosX = posX + (layoutWidth - child->GetRelativeRect().GetWidth() - left - right) / 2 + left;
            // 2: half
            int16_t actPosY = posY + (layoutHeight - child->GetRelativeRect().GetHeight() - top - bottom) / 2 + top;
            child->SetPosition(actPosX, actPosY);
            child->LayoutChildren();
            child->ResizeVisibleArea(posX, posY, layoutWidth, layoutHeight);
            child = child->GetNextSibling();
        }
    }
}

void GridLayout::LayoutVertical()
{
    UIView* child = childrenHead_;
    int16_t left;
    int16_t right;
    int16_t top;
    int16_t bottom;
    int16_t layoutWidth = GetWidth() / cols_;
    int16_t layoutHeight = GetHeight() / rows_;
    int16_t posY;
    for (int16_t i = 0; i < cols_; i++) {
        int16_t posX = i * layoutWidth;
        for (int16_t j = 0; j < rows_; j++) {
            if (child == nullptr) {
                return;
            }
            posY = j * layoutHeight;
            child->ReMeasure();
            left = child->GetStyle(STYLE_MARGIN_LEFT);
            right = child->GetStyle(STYLE_MARGIN_RIGHT);
            top = child->GetStyle(STYLE_MARGIN_TOP);
            bottom = child->GetStyle(STYLE_MARGIN_BOTTOM);
            // 2: half
            int16_t actPosX = posX + (layoutWidth - child->GetRelativeRect().GetWidth() - left - right) / 2 + left;
            // 2: half
            int16_t actPosY = posY + (layoutHeight - child->GetRelativeRect().GetHeight() - top - bottom) / 2 + top;
            child->SetPosition(actPosX, actPosY);
            child->LayoutChildren();
            child->ResizeVisibleArea(posX, posY, layoutWidth, layoutHeight);
            child = child->GetNextSibling();
        }
    }
}
} // namespace OHOS