1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BOX_BOX_BASE_COMPONENT_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BOX_BOX_BASE_COMPONENT_H 18 19 #include <string> 20 21 #include "base/geometry/animatable_dimension.h" 22 #include "base/image/pixel_map.h" 23 #include "core/components/box/mask.h" 24 #include "core/components/common/layout/align_declaration.h" 25 #include "core/components/common/layout/grid_column_info.h" 26 #include "core/components/common/layout/grid_layout_info.h" 27 #include "core/components/common/properties/alignment.h" 28 #include "core/components/common/properties/clip_path.h" 29 #include "core/components/common/properties/edge.h" 30 #include "core/pipeline/base/component.h" 31 #include "core/pipeline/base/component_group.h" 32 #include "core/pipeline/base/measurable.h" 33 #include "core/pipeline/base/sole_child_component.h" 34 35 namespace OHOS::Ace { 36 37 constexpr uint32_t PERCENT_FLAG_USE_VIEW_PORT = 1; 38 39 // A component can box other components. 40 class BoxBaseComponent : public SoleChildComponent, public Measurable { 41 DECLARE_ACE_TYPE(BoxBaseComponent, SoleChildComponent, Measurable); 42 43 public: GetAlignment()44 const Alignment& GetAlignment() const 45 { 46 return align_; 47 } 48 GetConstraints()49 const LayoutParam& GetConstraints() const 50 { 51 return constraints_; 52 } 53 GetPadding()54 const Edge& GetPadding() const 55 { 56 return padding_; 57 } 58 GetMargin()59 const Edge& GetMargin() const 60 { 61 return margin_; 62 } 63 GetAdditionalPadding()64 const Edge& GetAdditionalPadding() const 65 { 66 return additionalPadding_; 67 } 68 GetWidthDimension()69 const AnimatableDimension& GetWidthDimension() const 70 { 71 return GetWidth(); 72 } 73 GetHeightDimension()74 const AnimatableDimension& GetHeightDimension() const 75 { 76 return GetHeight(); 77 } 78 GetFlex()79 BoxFlex GetFlex() const 80 { 81 return flex_; 82 } 83 GetDeliverMinToChild()84 bool GetDeliverMinToChild() const 85 { 86 return deliverMinToChild_; 87 } 88 GetScrollPage()89 bool GetScrollPage() const 90 { 91 return scrollPage_; 92 } 93 GetPercentFlag()94 uint32_t GetPercentFlag() const 95 { 96 return percentFlag_; 97 } 98 GetLayoutInBoxFlag()99 bool GetLayoutInBoxFlag() const 100 { 101 return layoutInBox_; 102 } 103 SetAlignment(const Alignment & alignment)104 void SetAlignment(const Alignment& alignment) 105 { 106 align_ = alignment; 107 } 108 SetConstraints(const LayoutParam & constraints)109 void SetConstraints(const LayoutParam& constraints) 110 { 111 if (!constraints.IsWidthValid() || !constraints.IsHeightValid()) { 112 return; 113 } 114 constraints_ = constraints; 115 } 116 SetMargin(const Edge & margin)117 void SetMargin(const Edge& margin) 118 { 119 // Margin need to support negative number. 120 margin_ = margin; 121 } 122 123 void SetPadding(const Edge& padding, const Edge& additionalPadding = Edge()) 124 { 125 if (padding.IsValid()) { 126 // Padding not support negative number. 127 padding_ = padding; 128 } 129 if (additionalPadding.IsValid()) { 130 additionalPadding_ = additionalPadding; 131 } 132 } 133 SetFlex(BoxFlex flex)134 void SetFlex(BoxFlex flex) 135 { 136 flex_ = flex; 137 } 138 SetDeliverMinToChild(bool deliverMinToChild)139 void SetDeliverMinToChild(bool deliverMinToChild) 140 { 141 deliverMinToChild_ = deliverMinToChild; 142 } 143 SetScrollPage(bool scrollPage)144 void SetScrollPage(bool scrollPage) 145 { 146 scrollPage_ = scrollPage; 147 } 148 SetPercentFlag(uint32_t flag)149 void SetPercentFlag(uint32_t flag) 150 { 151 percentFlag_ = flag; 152 } 153 SetLayoutInBoxFlag(bool layoutInBox)154 void SetLayoutInBoxFlag(bool layoutInBox) 155 { 156 layoutInBox_ = layoutInBox; 157 } 158 SetAspectRatio(double aspectRatio)159 void SetAspectRatio(double aspectRatio) 160 { 161 aspectRatio_ = AnimatableDimension(aspectRatio); 162 } 163 SetAspectRatio(double aspectRatio,AnimationOption option)164 void SetAspectRatio(double aspectRatio, AnimationOption option) 165 { 166 aspectRatio_ = AnimatableDimension(aspectRatio, DimensionUnit::PX, option); 167 } 168 GetAspectRatio()169 AnimatableDimension GetAspectRatio() const 170 { 171 return aspectRatio_; 172 } 173 SetMinWidth(const CalcDimension & minWidth)174 void SetMinWidth(const CalcDimension& minWidth) 175 { 176 minWidth_ = minWidth; 177 } 178 GetMinWidth()179 const CalcDimension& GetMinWidth() const 180 { 181 return minWidth_; 182 } 183 SetMinHeight(const CalcDimension & minHeight)184 void SetMinHeight(const CalcDimension& minHeight) 185 { 186 minHeight_ = minHeight; 187 } 188 GetMinHeight()189 const CalcDimension& GetMinHeight() const 190 { 191 return minHeight_; 192 } 193 SetMaxWidth(const CalcDimension & maxWidth)194 void SetMaxWidth(const CalcDimension& maxWidth) 195 { 196 maxWidth_ = maxWidth; 197 } 198 GetMaxWidth()199 const CalcDimension& GetMaxWidth() const 200 { 201 return maxWidth_; 202 } 203 SetMaxHeight(const CalcDimension & maxHeight)204 void SetMaxHeight(const CalcDimension& maxHeight) 205 { 206 maxHeight_ = maxHeight; 207 } 208 GetMaxHeight()209 const CalcDimension& GetMaxHeight() const 210 { 211 return maxHeight_; 212 } 213 GetGridLayoutInfo()214 const RefPtr<GridLayoutInfo>& GetGridLayoutInfo() const 215 { 216 return gridLayoutInfo_; 217 } 218 SetGridLayoutInfo(const RefPtr<GridLayoutInfo> & gridLayoutInfo)219 void SetGridLayoutInfo(const RefPtr<GridLayoutInfo>& gridLayoutInfo) 220 { 221 gridLayoutInfo_ = gridLayoutInfo; 222 } 223 GetGridColumnInfoBuilder()224 RefPtr<GridColumnInfo::Builder> GetGridColumnInfoBuilder() 225 { 226 if (!gridColumnInfoBuilder_) { 227 gridColumnInfoBuilder_ = AceType::MakeRefPtr<GridColumnInfo::Builder>(); 228 } 229 return gridColumnInfoBuilder_; 230 } 231 OnWrap()232 void OnWrap() override 233 { 234 if (gridColumnInfoBuilder_) { 235 SetGridLayoutInfo(gridColumnInfoBuilder_->Build()); 236 gridColumnInfoBuilder_ = nullptr; 237 } 238 } 239 SetUseLiteStyle(bool flag)240 void SetUseLiteStyle(bool flag) 241 { 242 useLiteStyle_ = flag; 243 } 244 UseLiteStyle()245 bool UseLiteStyle() const 246 { 247 return useLiteStyle_; 248 } 249 SetOverflow(Overflow overflow)250 void SetOverflow(Overflow overflow) 251 { 252 overflow_ = overflow; 253 } 254 GetOverflow()255 Overflow GetOverflow() const 256 { 257 return overflow_; 258 } 259 GetClipPath()260 const RefPtr<ClipPath>& GetClipPath() const 261 { 262 return clipPath_; 263 } 264 SetClipPath(const RefPtr<ClipPath> & clipPath)265 void SetClipPath(const RefPtr<ClipPath>& clipPath) 266 { 267 clipPath_ = clipPath; 268 } GetMask()269 const RefPtr<Mask>& GetMask() const 270 { 271 return mask_; 272 } 273 SetMask(const std::string & image,const BackgroundImageSize & size,const BackgroundImagePosition & position)274 void SetMask(const std::string& image, const BackgroundImageSize& size, const BackgroundImagePosition& position) 275 { 276 if (!image.empty()) { 277 if (!mask_) { 278 mask_ = Mask::Create(); 279 } 280 if (mask_) { 281 mask_->SetMaskImage(image); 282 mask_->SetMaskSize(size); 283 mask_->SetMaskPosition(position); 284 } 285 } 286 } 287 SetMask(const RefPtr<MaskPath> & maskPath)288 void SetMask(const RefPtr<MaskPath>& maskPath) 289 { 290 if (!mask_) { 291 mask_ = Mask::Create(); 292 } 293 if (mask_) { 294 mask_->SetMask(maskPath); 295 } 296 } 297 GetBoxSizing()298 BoxSizing GetBoxSizing() const 299 { 300 return boxSizing_; 301 } 302 SetBoxSizing(BoxSizing boxSizing)303 void SetBoxSizing(BoxSizing boxSizing) 304 { 305 boxSizing_ = boxSizing; 306 } 307 SetAlignDeclarationPtr(AlignDeclarationPtr alignPtr)308 void SetAlignDeclarationPtr(AlignDeclarationPtr alignPtr) 309 { 310 alignPtr_ = alignPtr; 311 } 312 GetAlignDeclarationPtr()313 AlignDeclarationPtr GetAlignDeclarationPtr() const 314 { 315 return alignPtr_; 316 } 317 SetUseAlignSide(AlignDeclaration::Edge side)318 void SetUseAlignSide(AlignDeclaration::Edge side) 319 { 320 alignSide_ = side; 321 } 322 GetUseAlignSide()323 AlignDeclaration::Edge GetUseAlignSide() const 324 { 325 return alignSide_; 326 } 327 SetUseAlignOffset(const Dimension & offset)328 void SetUseAlignOffset(const Dimension& offset) 329 { 330 alignOffset_ = offset; 331 } 332 GetUseAlignOffset()333 const Dimension& GetUseAlignOffset() const 334 { 335 return alignOffset_; 336 } 337 IsUseAlign()338 bool IsUseAlign() const 339 { 340 return alignPtr_ != nullptr && alignSide_ != AlignDeclaration::Edge::AUTO; 341 } 342 SetBoxClipFlag(bool boxClipFlag)343 void SetBoxClipFlag(bool boxClipFlag) 344 { 345 boxClipFlag_ = boxClipFlag; 346 } 347 GetBoxClipFlag()348 bool GetBoxClipFlag() const 349 { 350 return boxClipFlag_; 351 } 352 SetPixelMap(const RefPtr<PixelMap> & pixelMap)353 void SetPixelMap(const RefPtr<PixelMap>& pixelMap) 354 { 355 pixelMap_ = pixelMap; 356 } 357 GetPixelMap()358 const RefPtr<PixelMap>& GetPixelMap() const 359 { 360 return pixelMap_; 361 } 362 GetDisplayType()363 DisplayType GetDisplayType() const 364 { 365 return displayType_; 366 } 367 SetDisplayType(DisplayType displayType)368 void SetDisplayType(DisplayType displayType) 369 { 370 displayType_ = displayType; 371 } 372 private: 373 Alignment align_; 374 LayoutParam constraints_ = LayoutParam(Size(), Size()); // no constraints when init 375 Edge padding_; 376 Edge margin_; 377 Edge additionalPadding_; 378 BoxFlex flex_ { BoxFlex::FLEX_NO }; 379 bool deliverMinToChild_ = true; 380 bool scrollPage_ = false; 381 uint32_t percentFlag_ = 1; 382 bool layoutInBox_ = false; 383 AnimatableDimension aspectRatio_ = AnimatableDimension(); 384 CalcDimension minWidth_ = Dimension(); 385 CalcDimension minHeight_ = Dimension(); 386 CalcDimension maxWidth_ = Dimension(); 387 CalcDimension maxHeight_ = Dimension(); 388 RefPtr<GridLayoutInfo> gridLayoutInfo_; 389 RefPtr<GridColumnInfo::Builder> gridColumnInfoBuilder_; 390 bool useLiteStyle_ = false; 391 Overflow overflow_ = Overflow::OBSERVABLE; 392 RefPtr<ClipPath> clipPath_; 393 RefPtr<Mask> mask_; 394 BoxSizing boxSizing_ = BoxSizing::BORDER_BOX; 395 bool boxClipFlag_ = false; 396 RefPtr<PixelMap> pixelMap_ = nullptr; 397 398 AlignDeclarationPtr alignPtr_ = nullptr; 399 AlignDeclaration::Edge alignSide_ { AlignDeclaration::Edge::AUTO }; 400 Dimension alignOffset_; 401 DisplayType displayType_ = DisplayType::NO_SETTING; 402 }; 403 404 } // namespace OHOS::Ace 405 406 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BOX_BOX_BASE_COMPONENT_H 407