blob: d39d61ac79f166c9b7da384a58f461fb13a7f6f1 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
#ifdef __cplusplus
#ifndef WEEXCORE_FLEXLAYOUT_WXCOREFLEXENUMS_H
#define WEEXCORE_FLEXLAYOUT_WXCOREFLEXENUMS_H
#include "flex_enum.h"
#include <math.h>
#include <cmath>
namespace WeexCore {
/**
* Margin: margin-left、margin-right、margin-top、margin-bottom
*/
class WXCoreMargin {
private:
float mMarginTop;
float mMarginBottom;
float mMarginLeft;
float mMarginRight;
public:
WXCoreMargin() : mMarginTop(0),
mMarginBottom(0),
mMarginLeft(0),
mMarginRight(0) {}
~WXCoreMargin() {
mMarginTop = 0;
mMarginBottom = 0;
mMarginLeft = 0;
mMarginRight = 0;
}
bool setMargin(const WXCoreMarginEdge &edge, float margin);
float getMargin(const WXCoreMarginEdge &edge)const;
};
/**
* Padding:padding-left、padding-right、padding-top、padding-bottom
*/
class WXCorePadding {
private:
float mPaddingTop;
float mPaddingBottom;
float mPaddingLeft;
float mPaddingRight;
public:
WXCorePadding() : mPaddingTop(0),
mPaddingBottom(0),
mPaddingLeft(0),
mPaddingRight(0) {}
~WXCorePadding() {
mPaddingTop = 0;
mPaddingBottom = 0;
mPaddingLeft = 0;
mPaddingRight = 0;
}
bool setPadding(const WXCorePaddingEdge &edge, float padding);
float getPadding(const WXCorePaddingEdge &edge)const;
};
/**
* BorderWidth:borderwidth-left、borderwidth-right、borderwidth-top、borderwidth-bottom
*/
class WXCoreBorderWidth {
private:
float mBorderWidthTop;
float mBorderWidthBottom;
float mBorderWidthLeft;
float mBorderWidthRight;
public:
WXCoreBorderWidth() : mBorderWidthTop(0),
mBorderWidthBottom(0),
mBorderWidthLeft(0),
mBorderWidthRight(0) {}
~WXCoreBorderWidth() {
mBorderWidthTop = 0;
mBorderWidthBottom = 0;
mBorderWidthLeft = 0;
mBorderWidthRight = 0;
}
bool setBorderWidth(const WXCoreBorderWidthEdge &edge, float borderWidth);
float getBorderWidth(const WXCoreBorderWidthEdge &edge)const;
};
/**
* position:left、right、top、bottom
*/
class WXCorePosition {
private:
float mTop;
float mBottom;
float mLeft;
float mRight;
public:
WXCorePosition() : mTop(NAN),
mBottom(NAN),
mLeft(NAN),
mRight(NAN) {}
~WXCorePosition() {
reset();
}
inline bool isNAN() {
return isnan(mTop) || isnan(mBottom) || isnan(mLeft) || isnan(mRight);
}
inline void reset() {
mTop = 0;
mBottom = 0;
mLeft = 0;
mRight = 0;
}
bool setPosition(const WXCorePositionEdge &edge, float position);
float getPosition(const WXCorePositionEdge &edge);
};
enum DimensionLevel{
CSS_STYLE = 1,
INSTANCE_STYLE = 2,
FALLBACK_STYLE = 3
};
/**
* css-style
*/
class WXCoreCSSStyle {
public:
/**
* The direction children items are placed inside the Flexbox layout, it determines the
* direction of the main axis (and the cross axis, perpendicular to the main axis).
* The default value is {@link WXCoreFlexDirection #WXCore_Flex_Direction_Row}.
*/
WXCoreFlexDirection mFlexDirection;
/**
* This attribute controls whether the flex container is single-line or multi-line, and the
* direction of the cross axis.
* <ul>
* <li>{@link WXCoreFlexWrap}: The flex container is single-line.</li>
* <li>{@link WXCoreFlexWrap}: The flex container is multi-line.</li>
* <li>{@link WXCoreFlexWrap}: The flex container is multi-line. The direction of the
* cross axis is opposed to the direction as the {@link WXCoreFlexWrap}</li>
* </ul>
* The default value is {@link WXCoreFlexWrap #WXCore_Wrap_NoWrap}.
*/
WXCoreFlexWrap mFlexWrap;
/**
* This attribute controls the alignment along the main axis.
* The default value is {@link WXCoreJustifyContent #WXCore_Justify_Flex_Start}.
*/
WXCoreJustifyContent mJustifyContent;
/**
* This attribute controls the alignment along the cross axis.
* The default value is {@link WXCoreAlignItems #WXCore_AlignItems_Stretch}.
*/
WXCoreAlignItems mAlignItems;
/**
* This attribute controls the alignment along the cross axis.
* The default value is {@link WXCoreAlignSelf #WXCore_AlignSelf_Auto}.
*/
WXCoreAlignSelf mAlignSelf;
WXCorePositionType mPositionType;
float mFlexGrow;
float mMinWidth;
float mMinHeight;
float mMaxWidth;
float mMaxHeight;
float mStyleWidth;
float mStyleHeight;
DimensionLevel mStyleWidthLevel;
DimensionLevel mStyleHeightLevel;
WXCoreMargin mMargin;
WXCorePadding mPadding;
WXCoreBorderWidth mBorderWidth;
WXCorePosition mStylePosition;
WXCoreDirection mDirection;
constexpr static float kFlexGrowDefault = 0;
constexpr static WXCoreDirection kDirectionDefault = kDirectionLTR;
constexpr static WXCoreFlexDirection kFlexDirectionDefault= kFlexDirectionColumn;
constexpr static WXCoreFlexWrap kFlexWrapDefault = kNoWrap;
constexpr static WXCoreJustifyContent kFlexJustifyContentDefault = kJustifyFlexStart;
constexpr static WXCoreAlignItems kFlexAlignItemsDefault = kAlignItemsStretch;
constexpr static WXCoreAlignSelf kFlexAlignSelfDefault = kAlignSelfAuto;
constexpr static WXCorePositionType kWXCorePositionTypeDefault = kRelative;
WXCoreCSSStyle() :
mFlexDirection(kFlexDirectionDefault),
mFlexWrap(kFlexWrapDefault),
mJustifyContent(kFlexJustifyContentDefault),
mAlignItems(kFlexAlignItemsDefault),
mAlignSelf(kFlexAlignSelfDefault),
mFlexGrow(kFlexGrowDefault),
mPositionType(kWXCorePositionTypeDefault),
mStyleWidth(NAN), mStyleHeight(NAN),
mStyleHeightLevel(FALLBACK_STYLE), mStyleWidthLevel(FALLBACK_STYLE),
mMaxWidth(NAN), mMaxHeight(NAN),
mMinWidth(NAN), mMinHeight(NAN),
mDirection(kDirectionInherit) {
}
~WXCoreCSSStyle() {
mFlexDirection = kFlexDirectionDefault;
mFlexWrap = kFlexWrapDefault;
mJustifyContent = kFlexJustifyContentDefault;
mAlignItems = kFlexAlignItemsDefault;
mAlignSelf = kFlexAlignSelfDefault;
mFlexGrow = kFlexGrowDefault;
mStyleWidth = NAN;
mStyleHeight = NAN;
mStyleWidthLevel = FALLBACK_STYLE;
mStyleHeightLevel = FALLBACK_STYLE;
mMaxWidth = NAN;
mMaxHeight = NAN;
mMinWidth = NAN;
mMinHeight = NAN;
mDirection = kDirectionInherit;
}
inline float sumPaddingBorderOfEdge(const WXCoreEdge edge){
switch (edge) {
case kTop:
return mPadding.getPadding(kPaddingTop)
+ mBorderWidth.getBorderWidth(kBorderWidthTop);
case kRight:
return mPadding.getPadding(kPaddingRight)
+ mBorderWidth.getBorderWidth(kBorderWidthRight);
case kBottom:
return mPadding.getPadding(kPaddingBottom)
+ mBorderWidth.getBorderWidth(kBorderWidthBottom);
case kLeft:
return mPadding.getPadding(kPaddingLeft)
+ mBorderWidth.getBorderWidth(kBorderWidthLeft);
}
}
float sumMarginOfDirection(bool horizontal){
if(horizontal){
return mMargin.getMargin(kMarginLeft) + mMargin.getMargin(kMarginRight);
}
else{
return mMargin.getMargin(kMarginTop) + mMargin.getMargin(kMarginBottom);
}
}
};
}
#endif //WEEXCORE_FLEXLAYOUT_WXCOREFLEXENUMS_H
#endif