diff --git a/frameworks/bridge/declarative_frontend/jsview/js_checkbox.cpp b/frameworks/bridge/declarative_frontend/jsview/js_checkbox.cpp index 2024faec9d175ec4b1b819ecb8e536b1ab2ee842..ff24d91b2f22646d887fbe329132f4f62646abba 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_checkbox.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_checkbox.cpp @@ -15,6 +15,7 @@ #include "bridge/declarative_frontend/jsview/js_checkbox.h" +#include "base/memory/referenced.h" #include "bridge/declarative_frontend/jsview/js_view_common_def.h" #include "bridge/declarative_frontend/view_stack_processor.h" #include "core/components/checkable/checkable_component.h" @@ -42,6 +43,10 @@ void JSCheckbox::Create(const JSCallbackInfo& info) if (item != checkboxGroupmap->end()) { item->second->AddCheckbox(checkboxComponent); checkboxComponent->SetGroup(item->second); + } else { + auto& ungroupedCheckboxs = CheckboxComponent::GetUngroupedCheckboxs(); + auto retPair = ungroupedCheckboxs.try_emplace(checkboxGroup, std::list>()); + retPair.first->second.push_back(checkboxComponent); } } } diff --git a/frameworks/bridge/declarative_frontend/jsview/js_checkboxgroup.cpp b/frameworks/bridge/declarative_frontend/jsview/js_checkboxgroup.cpp index 4d0f542f1cec3c04c77bcc958d404f5b76ceadef..95e0ed13e6f84ed7322d56400a6408ad7cbf37b6 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_checkboxgroup.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_checkboxgroup.cpp @@ -14,8 +14,8 @@ */ #include "bridge/declarative_frontend/jsview/js_checkboxgroup.h" -#include "bridge/declarative_frontend/jsview/js_interactable_view.h" +#include "bridge/declarative_frontend/jsview/js_interactable_view.h" #include "bridge/declarative_frontend/jsview/js_view_common_def.h" #include "bridge/declarative_frontend/view_stack_processor.h" #include "core/components/checkable/checkable_component.h" @@ -73,11 +73,23 @@ void JSCheckboxGroup::Create(const JSCallbackInfo& info) checkboxComponent->SetGroupName(checkboxGroupName); auto checkboxGroupmap = ViewStackProcessor::GetInstance()->GetCheckboxGroupCompnent(); checkboxGroupmap->emplace(checkboxGroupName, checkboxComponent); + auto& ungroupedCheckboxs = CheckboxComponent::GetUngroupedCheckboxs(); + auto item = ungroupedCheckboxs.find(checkboxGroupName); + if (item != ungroupedCheckboxs.end()) { + for (auto component : item->second) { + auto chkComponent = component.Upgrade(); + if (chkComponent) { + checkboxComponent->AddCheckbox(chkComponent); + chkComponent->SetGroup(checkboxComponent); + } + } + ungroupedCheckboxs.erase(item); + } } } checkboxComponent->SetInspectorTag("CheckboxGroupComponent"); ViewStackProcessor::GetInstance()->Push(checkboxComponent); - + auto box = ViewStackProcessor::GetInstance()->GetBoxComponent(); auto horizontalPadding = checkBoxTheme->GetHotZoneHorizontalPadding(); auto verticalPadding = checkBoxTheme->GetHotZoneVerticalPadding(); @@ -106,8 +118,8 @@ void JSCheckboxGroup::SetOnChange(const JSCallbackInfo& args) auto jsFunc = AceType::MakeRefPtr>( JSRef::Cast(args[0]), CheckboxGroupResultEventToJSValue); auto checkbox = AceType::DynamicCast(ViewStackProcessor::GetInstance()->GetMainComponent()); - checkbox->SetOnGroupChange(EventMarker( - [execCtx = args.GetExecutionContext(), func = std::move(jsFunc)](const BaseEventInfo* info) { + checkbox->SetOnGroupChange( + EventMarker([execCtx = args.GetExecutionContext(), func = std::move(jsFunc)](const BaseEventInfo* info) { JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx); auto eventInfo = TypeInfoHelper::DynamicCast(info); func->Execute(*eventInfo); diff --git a/frameworks/bridge/declarative_frontend/jsview/js_gauge.cpp b/frameworks/bridge/declarative_frontend/jsview/js_gauge.cpp index 03d521621ba52e327761fd03a6014e9b101c7e04..9ee47428616135e48012d9e1e37ebae06a2a7024 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_gauge.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_gauge.cpp @@ -112,8 +112,8 @@ void JSGauge::SetEndAngle(const JSCallbackInfo& info) void JSGauge::SetColors(const JSCallbackInfo& info) { - if (info.Length() < 1) { - LOGE(" JSGauge::SetColors::The info is wrong, it is supposed to have atleast 1 arguments"); + if (info.Length() < 1 || !info[0]->IsArray()) { + LOGE("The number of argument is less than 1, or the argument is not array."); return; } std::vector colors; diff --git a/frameworks/core/components/checkable/checkable_component.cpp b/frameworks/core/components/checkable/checkable_component.cpp index 0ca5d385185b53c9ed15ac52c422903a945f46e6..b3829d27b5cd824109a1e9adc1394b2cd183872b 100644 --- a/frameworks/core/components/checkable/checkable_component.cpp +++ b/frameworks/core/components/checkable/checkable_component.cpp @@ -78,6 +78,8 @@ RefPtr CheckableComponent::CreateElement() return AceType::MakeRefPtr(); } +std::unordered_map>> CheckboxComponent::ungroupedCheckboxs_; + CheckboxComponent::CheckboxComponent(const RefPtr& theme) : CheckableComponent(CheckableType::CHECKBOX, theme), CheckableValue(DEFAULT_CHECKBOX_VALUE) {} diff --git a/frameworks/core/components/checkable/checkable_component.h b/frameworks/core/components/checkable/checkable_component.h index c30760397af9774becccc37ab2596ba0b31240a0..e8beb066e5851c59279a68ab43741d982ad2a3b8 100644 --- a/frameworks/core/components/checkable/checkable_component.h +++ b/frameworks/core/components/checkable/checkable_component.h @@ -482,6 +482,11 @@ public: } } + static std::unordered_map>>& GetUngroupedCheckboxs() + { + return ungroupedCheckboxs_; + } + private: CheckableStatus groupValue_ = CheckableStatus::NONE; std::list> checkboxList_; @@ -492,6 +497,7 @@ private: std::function itemValueUpdateHandler_; std::function groupValueUpdateHandler_; EventMarker OnGroupChange_; + static std::unordered_map>> ungroupedCheckboxs_; }; class ACE_EXPORT SwitchComponent : public CheckableComponent, public CheckableValue { diff --git a/frameworks/core/components/checkable/checkable_element.cpp b/frameworks/core/components/checkable/checkable_element.cpp index 4f9319898e4b6c15e639c6a2f095b5b59a986318..b3620487818596837fb516650e4da24c7505a710 100644 --- a/frameworks/core/components/checkable/checkable_element.cpp +++ b/frameworks/core/components/checkable/checkable_element.cpp @@ -15,6 +15,10 @@ #include "core/components/checkable/checkable_element.h" +#include "base/memory/ace_type.h" +#include "base/utils/utils.h" +#include "bridge/declarative_frontend/view_stack_processor.h" +#include "core/components/checkable/checkable_component.h" #include "core/components/checkable/render_checkable.h" namespace OHOS::Ace { @@ -67,4 +71,42 @@ void CheckableElement::OnBlur() } } +void CheckableElement::SetNewComponent(const RefPtr& newComponent) +{ + Element::SetNewComponent(newComponent); + auto selfComponent = AceType::DynamicCast(customComponent_.Upgrade()); + auto newCheckboxComponent = AceType::DynamicCast(newComponent); + if (!selfComponent || !newCheckboxComponent) { + return; + } + + const static std::string checkboxGroupTag("CheckboxGroupComponent"); + auto& ungroupedCheckboxs = CheckboxComponent::GetUngroupedCheckboxs(); + if (selfComponent->GetInspectorTag() == checkboxGroupTag) { + auto checkboxList = selfComponent->GetCheckboxList(); + if (!checkboxList.empty()) { + auto groupName = selfComponent->GetGroupName(); + auto retPair = ungroupedCheckboxs.try_emplace(groupName, std::list>()); + for (auto item : checkboxList) { + retPair.first->second.push_back(item); + } + } + } + + if (newCheckboxComponent->GetInspectorTag() == checkboxGroupTag) { + auto item = ungroupedCheckboxs.find(newCheckboxComponent->GetGroupName()); + if (item == ungroupedCheckboxs.end()) { + return; + } + for (auto component : item->second) { + auto checkboxComponent = component.Upgrade(); + if (checkboxComponent) { + newCheckboxComponent->AddCheckbox(checkboxComponent); + checkboxComponent->SetGroup(newCheckboxComponent); + } + } + ungroupedCheckboxs.erase(item); + } +} + } // namespace OHOS::Ace diff --git a/frameworks/core/components/checkable/checkable_element.h b/frameworks/core/components/checkable/checkable_element.h index 1519b809382dfc467810e4216c7043a84a12a33d..a0d38214b4c02f59d296da4992f985bd159be83d 100644 --- a/frameworks/core/components/checkable/checkable_element.h +++ b/frameworks/core/components/checkable/checkable_element.h @@ -18,6 +18,9 @@ #include "core/pipeline/base/render_element.h" +#include +#include + namespace OHOS::Ace { class CheckableElement : public RenderElement, public FocusNode { @@ -31,6 +34,7 @@ public: void OnClick() override; void OnFocus() override; void OnBlur() override; + void SetNewComponent(const RefPtr& newComponent) override; bool CanUpdate(const RefPtr& newComponent) override {