Files

311 lines
8.6 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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;
};
/**
* Paddingpadding-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;
};
/**
* BorderWidthborderwidth-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;
};
/**
* positionleft、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;
WXCoreDirection mDirection;
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;
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() : mDirection(kDirectionInherit),
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) {
}
~WXCoreCSSStyle() {
mDirection = kDirectionInherit;
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;
}
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