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_DECLARATION_BUTTON_BUTTON_DECLARATION_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DECLARATION_BUTTON_BUTTON_DECLARATION_H 18 19 #include "frameworks/core/components/declaration/button/button_progress_controller.h" 20 #include "frameworks/core/components/declaration/common/declaration.h" 21 #include "frameworks/bridge/common/dom/dom_type.h" 22 23 namespace OHOS::Ace { 24 25 struct ButtonAttribute : Attribute { 26 std::string buttonType; 27 std::string iconSrc; 28 std::string placement; 29 std::string textData; 30 bool isAutoFocus = false; 31 bool isDisabled = false; 32 bool isWaiting = false; 33 }; 34 35 struct ButtonStyle : Style { 36 TextStyle textStyle; 37 BorderEdge borderEdge; 38 Edge padding; 39 Dimension diameter; 40 Dimension minWidth; 41 Dimension width = -1.0_vp; 42 Dimension height = -1.0_vp; 43 Dimension radius; 44 Dimension iconWidth; 45 Dimension iconHeight; 46 Dimension innerLeftPadding; 47 Color focusColor; 48 Color focusBorderColor; 49 Color backgroundColor; 50 Color clickedColor; 51 Color disabledColor; 52 Color disabledTextColor; 53 Color focusAnimationColor; 54 Color hoverColor; 55 Color progressColor; 56 Color progressFocusColor; 57 Color textFocusColor; 58 bool bgColorDefined = false; 59 bool matchTextDirection = false; 60 bool heightDefined = false; 61 bool fontSizeDefined = false; 62 bool textColorDefined = false; 63 bool radiusDefined = false; 64 double blendOpacity = 0.0; 65 }; 66 67 struct ButtonEvent : Event { 68 EventMarker clickEventId; 69 }; 70 71 struct ButtonMethod : Method { SetProgressButtonMethod72 void SetProgress(const RefPtr<ButtonProgressController>& controller, uint32_t progress) const 73 { 74 controller->SetProgress(progress); 75 } 76 }; 77 78 class ButtonDeclaration : public Declaration { 79 DECLARE_ACE_TYPE(ButtonDeclaration, Declaration); 80 81 public: 82 ButtonDeclaration() = default; 83 ~ButtonDeclaration() override = default; 84 85 void InitializeStyle() override; 86 GetType()87 const std::string& GetType() const 88 { 89 auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 90 return attr.buttonType; 91 } 92 GetIconSrc()93 const std::string& GetIconSrc() const 94 { 95 auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 96 return attr.iconSrc; 97 } 98 GetPlacement()99 const std::string& GetPlacement() const 100 { 101 auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 102 return attr.placement; 103 } 104 GetTextData()105 const std::string& GetTextData() const 106 { 107 auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 108 return attr.textData; 109 } 110 GetAutoFocusState()111 bool GetAutoFocusState() const 112 { 113 auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 114 return attr.isAutoFocus; 115 } 116 GetDisabledState()117 bool GetDisabledState() const 118 { 119 auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 120 return attr.isDisabled; 121 } 122 GetWaitingState()123 bool GetWaitingState() const 124 { 125 auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 126 return attr.isWaiting; 127 } 128 GetPadding()129 const Edge& GetPadding() const 130 { 131 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 132 return style.padding; 133 } 134 GetTextStyle()135 const TextStyle& GetTextStyle() const 136 { 137 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 138 return style.textStyle; 139 } 140 GetWidth()141 const Dimension& GetWidth() const 142 { 143 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 144 return style.width; 145 } 146 GetHeight()147 const Dimension& GetHeight() const 148 { 149 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 150 return style.height; 151 } 152 GetMinWidth()153 const Dimension& GetMinWidth() const 154 { 155 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 156 return style.minWidth; 157 } 158 GetRectRadius()159 const Dimension& GetRectRadius() const 160 { 161 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 162 return style.radius; 163 } 164 GetProgressDiameter()165 const Dimension& GetProgressDiameter() const 166 { 167 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 168 return style.diameter; 169 } 170 GetInnerPadding()171 const Dimension& GetInnerPadding() const 172 { 173 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 174 return style.innerLeftPadding; 175 } 176 GetIconHeight()177 const Dimension& GetIconHeight() const 178 { 179 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 180 return style.iconHeight; 181 } 182 GetIconWidth()183 const Dimension& GetIconWidth() const 184 { 185 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 186 return style.iconWidth; 187 } 188 GetBackgroundColor()189 const Color& GetBackgroundColor() const 190 { 191 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 192 return style.backgroundColor; 193 } 194 GetClickedColor()195 const Color& GetClickedColor() const 196 { 197 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 198 return style.clickedColor; 199 } 200 GetDisabledColor()201 const Color& GetDisabledColor() const 202 { 203 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 204 return style.disabledColor; 205 } 206 GetDisabledTextColor()207 const Color& GetDisabledTextColor() const 208 { 209 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 210 return style.disabledTextColor; 211 } 212 GetFocusColor()213 const Color& GetFocusColor() const 214 { 215 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 216 return style.focusColor; 217 } 218 GetFocusBorderColor()219 const Color& GetFocusBorderColor() const 220 { 221 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 222 return style.focusBorderColor; 223 } 224 GetHoverColor()225 const Color& GetHoverColor() const 226 { 227 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 228 return style.hoverColor; 229 } 230 GetProgressColor()231 const Color& GetProgressColor() const 232 { 233 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 234 return style.progressColor; 235 } 236 GetProgressFocusColor()237 const Color& GetProgressFocusColor() const 238 { 239 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 240 return style.progressFocusColor; 241 } 242 GetFocusAnimationColor()243 const Color& GetFocusAnimationColor() const 244 { 245 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 246 return style.focusAnimationColor; 247 } 248 GetFocusTextColor()249 const Color& GetFocusTextColor() const 250 { 251 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 252 return style.textFocusColor; 253 } 254 GetBorderEdge()255 const BorderEdge& GetBorderEdge() const 256 { 257 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 258 return style.borderEdge; 259 } 260 GetMatchTextDirection()261 bool GetMatchTextDirection() const 262 { 263 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 264 return style.matchTextDirection; 265 } 266 GetBgColorState()267 bool GetBgColorState() const 268 { 269 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 270 return style.bgColorDefined; 271 } 272 GetTextColorState()273 bool GetTextColorState() const 274 { 275 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 276 return style.textColorDefined; 277 } 278 GetFontSizeState()279 bool GetFontSizeState() const 280 { 281 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 282 return style.fontSizeDefined; 283 } 284 GetHeightState()285 bool GetHeightState() const 286 { 287 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 288 return style.heightDefined; 289 } 290 GetRadiusState()291 bool GetRadiusState() const 292 { 293 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 294 return style.radiusDefined; 295 } 296 GetBlendOpacity()297 double GetBlendOpacity() const 298 { 299 auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE)); 300 return style.blendOpacity; 301 } 302 GetClickedEventId()303 const EventMarker& GetClickedEventId() const 304 { 305 auto& event = static_cast<ButtonEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT)); 306 return event.clickEventId; 307 } 308 GetRemoteMessageEventId()309 const EventMarker& GetRemoteMessageEventId() const 310 { 311 auto& event = static_cast<ButtonEvent&>(GetEvent(EventTag::SPECIALIZED_REMOTE_MESSAGE_EVENT)); 312 return event.clickEventId; 313 } 314 GetButtonController()315 const RefPtr<ButtonProgressController> GetButtonController() const 316 { 317 return buttonController_; 318 } 319 SetType(const std::string & type)320 void SetType(const std::string& type) 321 { 322 auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR); 323 attribute.buttonType = type; 324 } 325 SetIconSrc(const std::string & src)326 void SetIconSrc(const std::string& src) 327 { 328 auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR); 329 attribute.iconSrc = src; 330 } 331 SetPlacement(const std::string & placement)332 void SetPlacement(const std::string& placement) 333 { 334 auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR); 335 attribute.placement = placement; 336 } 337 SetTextData(const std::string & data)338 void SetTextData(const std::string& data) 339 { 340 auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR); 341 attribute.textData = data; 342 } 343 SetAutoFocusState(bool state)344 void SetAutoFocusState(bool state) 345 { 346 auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR); 347 attribute.isAutoFocus = state; 348 } 349 SetDisabledState(bool state)350 void SetDisabledState(bool state) 351 { 352 auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR); 353 attribute.isDisabled = state; 354 } 355 SetWaitingState(bool state)356 void SetWaitingState(bool state) 357 { 358 auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR); 359 attribute.isWaiting = state; 360 } 361 SetPadding(const Edge & edge)362 void SetPadding(const Edge& edge) 363 { 364 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 365 style.padding = edge; 366 } 367 SetTextStyle(const TextStyle & textStyle)368 void SetTextStyle(const TextStyle& textStyle) 369 { 370 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 371 style.textStyle = textStyle; 372 } 373 SetMinWidth(const Dimension & width)374 void SetMinWidth(const Dimension& width) 375 { 376 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 377 style.minWidth = width; 378 } 379 SetWidth(const Dimension & width)380 void SetWidth(const Dimension& width) 381 { 382 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 383 style.width = width; 384 } 385 SetHeight(const Dimension & height)386 void SetHeight(const Dimension& height) 387 { 388 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 389 style.height = height; 390 } 391 SetRectRadius(const Dimension & radius)392 void SetRectRadius(const Dimension& radius) 393 { 394 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 395 style.radius = radius; 396 } 397 SetProgressDiameter(const Dimension & diameter)398 void SetProgressDiameter(const Dimension& diameter) 399 { 400 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 401 style.diameter = diameter; 402 } 403 SetInnerPadding(const Dimension & padding)404 void SetInnerPadding(const Dimension& padding) 405 { 406 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 407 style.innerLeftPadding = padding; 408 } 409 SetIconHeight(const Dimension & height)410 void SetIconHeight(const Dimension& height) 411 { 412 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 413 style.iconHeight = height; 414 } 415 SetIconWidth(const Dimension & width)416 void SetIconWidth(const Dimension& width) 417 { 418 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 419 style.iconWidth = width; 420 } 421 SetBackgroundColor(const Color & color)422 void SetBackgroundColor(const Color& color) 423 { 424 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 425 style.backgroundColor = color; 426 } 427 SetClickedColor(const Color & color)428 void SetClickedColor(const Color& color) 429 { 430 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 431 style.clickedColor = color; 432 } 433 SetDisabledColor(const Color & color)434 void SetDisabledColor(const Color& color) 435 { 436 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 437 style.disabledColor = color; 438 } 439 SetDisabledTextColor(const Color & color)440 void SetDisabledTextColor(const Color& color) 441 { 442 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 443 style.disabledTextColor = color; 444 } 445 SetFocusColor(const Color & color)446 void SetFocusColor(const Color& color) 447 { 448 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 449 style.focusColor = color; 450 } 451 SetFocusBorderColor(const Color & color)452 void SetFocusBorderColor(const Color& color) 453 { 454 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 455 style.focusBorderColor = color; 456 } 457 SetHoverColor(const Color & color)458 void SetHoverColor(const Color& color) 459 { 460 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 461 style.hoverColor = color; 462 } 463 SetProgressColor(const Color & color)464 void SetProgressColor(const Color& color) 465 { 466 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 467 style.progressColor = color; 468 } 469 SetProgressFocusColor(const Color & color)470 void SetProgressFocusColor(const Color& color) 471 { 472 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 473 style.progressFocusColor = color; 474 } 475 SetFocusAnimationColor(const Color & color)476 void SetFocusAnimationColor(const Color& color) 477 { 478 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 479 style.focusAnimationColor = color; 480 } 481 SetFocusTextColor(const Color & color)482 void SetFocusTextColor(const Color& color) 483 { 484 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 485 style.textFocusColor = color; 486 } 487 SetBorderEdge(const BorderEdge & borderEdge)488 void SetBorderEdge(const BorderEdge& borderEdge) 489 { 490 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 491 style.borderEdge = borderEdge; 492 } 493 SetMatchTextDirection(bool match)494 void SetMatchTextDirection(bool match) 495 { 496 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 497 style.matchTextDirection = match; 498 } 499 SetBgColorState(bool state)500 void SetBgColorState(bool state) 501 { 502 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 503 style.bgColorDefined = state; 504 } 505 SetTextColorState(bool state)506 void SetTextColorState(bool state) 507 { 508 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 509 style.textColorDefined = state; 510 } 511 SetFontSizeState(bool state)512 void SetFontSizeState(bool state) 513 { 514 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 515 style.fontSizeDefined = state; 516 } 517 SetHeightState(bool state)518 void SetHeightState(bool state) 519 { 520 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 521 style.heightDefined = state; 522 } 523 SetRadiusState(bool state)524 void SetRadiusState(bool state) 525 { 526 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 527 style.radiusDefined = state; 528 } 529 SetBlendOpacity(double opacity)530 void SetBlendOpacity(double opacity) 531 { 532 auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE); 533 style.blendOpacity = opacity; 534 } 535 SetClickedEventId(const EventMarker & eventId)536 void SetClickedEventId(const EventMarker& eventId) 537 { 538 auto& event = MaybeResetEvent<ButtonEvent>(EventTag::SPECIALIZED_EVENT); 539 event.clickEventId = eventId; 540 } 541 SetRemoteMessageEventId(const EventMarker & eventId)542 void SetRemoteMessageEventId(const EventMarker& eventId) 543 { 544 auto& event = MaybeResetEvent<ButtonEvent>(EventTag::SPECIALIZED_REMOTE_MESSAGE_EVENT); 545 event.clickEventId = eventId; 546 } 547 SetClickedFunction(std::function<void ()> && callback)548 void SetClickedFunction(std::function<void()>&& callback) 549 { 550 auto& event = MaybeResetEvent<ButtonEvent>(EventTag::SPECIALIZED_EVENT); 551 event.clickEventId.SetPreFunction(std::move(callback)); 552 } 553 SetButtonController(const RefPtr<ButtonProgressController> & controller)554 void SetButtonController(const RefPtr<ButtonProgressController>& controller) 555 { 556 buttonController_ = controller; 557 } 558 559 protected: 560 void InitSpecialized() override; 561 bool SetSpecializedAttr(const std::pair<std::string, std::string>& attr) override; 562 bool SetSpecializedStyle(const std::pair<std::string, std::string>& style) override; 563 bool SetSpecializedEvent(int32_t pageId, const std::string& eventId, const std::string& event) override; 564 void CallSpecializedMethod(const std::string& method, const std::string& args) override; 565 566 private: 567 RefPtr<ButtonProgressController> buttonController_; 568 }; 569 570 } // namespace OHOS::Ace 571 572 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DECLARATION_BUTTON_BUTTON_DECLARATION_H 573