From b8ba2dd3646d4a8f9c1604899673be3daf7ae3d0 Mon Sep 17 00:00:00 2001 From: zhanghang Date: Sat, 22 Feb 2025 10:43:57 +0800 Subject: [PATCH] add sider tip modify Signed-off-by: zhanghang --- .../core/components_ng/pattern/BUILD.gn | 3 + .../pattern/slider/slider_paint_method.cpp | 39 ------ .../pattern/slider/slider_paint_method.h | 8 -- .../pattern/slider/slider_pattern.cpp | 112 ++++++++++++++++++ .../pattern/slider/slider_pattern.h | 48 +++++--- .../slider/slider_tip_layout_algorithm.cpp | 78 ++++++++++++ .../slider/slider_tip_layout_algorithm.h | 43 +++++++ .../pattern/slider/slider_tip_modifier.cpp | 10 +- .../pattern/slider/slider_tip_modifier.h | 6 +- .../slider/slider_tip_paint_method.cpp | 56 +++++++++ .../pattern/slider/slider_tip_paint_method.h | 46 +++++++ .../pattern/slider/slider_tip_pattern.cpp | 62 ++++++++++ .../pattern/slider/slider_tip_pattern.h | 40 +++++++ .../inspector/inspector_constants.cpp | 4 + .../inspector/inspector_constants.h | 4 + test/unittest/BUILD.gn | 3 + .../pattern/slider/slider_Extend_test_ng.cpp | 37 +++++- .../slider/slider_modifier_test_ng.cpp | 6 + .../pattern/slider/slider_pattern_test_ng.cpp | 1 - .../core/pattern/slider/slider_test_ng.cpp | 7 ++ test/unittest/core/pattern/web/BUILD.gn | 3 + 21 files changed, 541 insertions(+), 75 deletions(-) create mode 100644 frameworks/core/components_ng/pattern/slider/slider_tip_layout_algorithm.cpp create mode 100644 frameworks/core/components_ng/pattern/slider/slider_tip_layout_algorithm.h create mode 100644 frameworks/core/components_ng/pattern/slider/slider_tip_paint_method.cpp create mode 100644 frameworks/core/components_ng/pattern/slider/slider_tip_paint_method.h create mode 100644 frameworks/core/components_ng/pattern/slider/slider_tip_pattern.cpp create mode 100644 frameworks/core/components_ng/pattern/slider/slider_tip_pattern.h diff --git a/frameworks/core/components_ng/pattern/BUILD.gn b/frameworks/core/components_ng/pattern/BUILD.gn index 96cf13abcd6..d359040d339 100644 --- a/frameworks/core/components_ng/pattern/BUILD.gn +++ b/frameworks/core/components_ng/pattern/BUILD.gn @@ -437,7 +437,10 @@ build_component_ng("pattern_ng") { "slider/slider_model_ng.cpp", "slider/slider_paint_method.cpp", "slider/slider_pattern.cpp", + "slider/slider_tip_layout_algorithm.cpp", "slider/slider_tip_modifier.cpp", + "slider/slider_tip_paint_method.cpp", + "slider/slider_tip_pattern.cpp", "stack/stack_layout_algorithm.cpp", "stack/stack_model_ng.cpp", "stage/content_root_pattern.cpp", diff --git a/frameworks/core/components_ng/pattern/slider/slider_paint_method.cpp b/frameworks/core/components_ng/pattern/slider/slider_paint_method.cpp index 0f970ae98d7..eb4622f1106 100644 --- a/frameworks/core/components_ng/pattern/slider/slider_paint_method.cpp +++ b/frameworks/core/components_ng/pattern/slider/slider_paint_method.cpp @@ -99,43 +99,4 @@ void SliderPaintMethod::UpdateBorderRadius(RefPtr& paintPro } sliderContentModifier_->SetSelectedBorderRadius(selectedBorderRadius.ConvertToPx()); } - -void SliderPaintMethod::UpdateOverlayModifier(PaintWrapper* paintWrapper) -{ - CHECK_NULL_VOID(sliderTipModifier_); - auto renderContext = paintWrapper->GetRenderContext(); - CHECK_NULL_VOID(renderContext); - auto host = renderContext->GetHost(); - CHECK_NULL_VOID(host); - auto pipeline = host->GetContextRefPtr(); - CHECK_NULL_VOID(pipeline); - auto theme = pipeline->GetTheme(host->GetThemeScopeId()); - CHECK_NULL_VOID(theme); - - auto paintProperty = DynamicCast(paintWrapper->GetPaintProperty()); - CHECK_NULL_VOID(paintProperty); - sliderTipModifier_->UpdateThemeParams(theme); - sliderTipModifier_->SetDirection(paintProperty->GetDirectionValue(Axis::HORIZONTAL)); - sliderTipModifier_->SetTipColor(paintProperty->GetTipColorValue(theme->GetTipColor())); - sliderTipModifier_->SetTextFont(paintProperty->GetFontSizeValue(theme->GetTipFontSize())); - sliderTipModifier_->SetTextColor(paintProperty->GetTextColorValue(theme->GetTipTextColor())); - sliderTipModifier_->SetContent(paintProperty->GetCustomContent().value_or(paintProperty->GetContentValue(""))); - sliderTipModifier_->SetSliderMode(paintProperty->GetSliderModeValue(SliderModelNG::SliderMode::OUTSET)); - auto blockSize = parameters_.blockSize; - if (paintProperty->GetSliderModeValue(SliderModelNG::SliderMode::OUTSET) != SliderModelNG::SliderMode::OUTSET) { - blockSize = SizeF(std::min(blockSize.Width(), parameters_.trackThickness), - std::min(blockSize.Height(), parameters_.trackThickness)); - } - sliderTipModifier_->SetBlockSize(blockSize); - sliderTipModifier_->SetTipFlag(tipParameters_.isDrawTip_); - sliderTipModifier_->SetContentOffset(paintWrapper->GetContentOffset()); - sliderTipModifier_->SetContentSize(paintWrapper->GetContentSize()); - sliderTipModifier_->SetBubbleVertex(tipParameters_.bubbleVertex_); - sliderTipModifier_->SetSliderGlobalOffset(tipParameters_.sliderGlobalOffset_); - sliderTipModifier_->BuildParagraph(); - sliderTipModifier_->UpdateBubbleSize(); - if (sliderTipModifier_->UpdateOverlayRect(paintWrapper->GetGeometryNode()->GetFrameSize())) { - paintWrapper->FlushOverlayModifier(); - } -} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/slider/slider_paint_method.h b/frameworks/core/components_ng/pattern/slider/slider_paint_method.h index daff0ef29c9..cd97017514a 100644 --- a/frameworks/core/components_ng/pattern/slider/slider_paint_method.h +++ b/frameworks/core/components_ng/pattern/slider/slider_paint_method.h @@ -55,14 +55,6 @@ public: void UpdateContentModifier(PaintWrapper* paintWrapper) override; - RefPtr GetOverlayModifier(PaintWrapper* paintWrapper) override - { - CHECK_NULL_RETURN(sliderTipModifier_, nullptr); - return sliderTipModifier_; - } - - void UpdateOverlayModifier(PaintWrapper* paintWrapper) override; - private: void UpdateBorderRadius(RefPtr& paintProperty); void SetAttrParameters(); diff --git a/frameworks/core/components_ng/pattern/slider/slider_pattern.cpp b/frameworks/core/components_ng/pattern/slider/slider_pattern.cpp index 8318dad6831..faae445caac 100644 --- a/frameworks/core/components_ng/pattern/slider/slider_pattern.cpp +++ b/frameworks/core/components_ng/pattern/slider/slider_pattern.cpp @@ -39,6 +39,7 @@ #include "core/components_v2/inspector/inspector_constants.h" #include "core/pipeline/pipeline_base.h" #include "core/pipeline_ng/pipeline_context.h" +#include "core/components_ng/pattern/slider/slider_tip_pattern.h" namespace OHOS::Ace::NG { namespace { @@ -121,6 +122,91 @@ void SliderPattern::OnModifyDone() InitHapticController(); } +void SliderPattern::CreateTipToMountRoot() +{ + auto host = GetHost(); + CHECK_NULL_VOID(host); + if (!sliderTipNode_) { + auto rootNode = host->GetCurrentPageRootNode(); + CHECK_NULL_VOID(rootNode); + sliderTipNode_ = FrameNode::CreateFrameNode(V2::SLIDER_TIP_NODE_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), + AceType::MakeRefPtr(host->GetPattern())); + CHECK_NULL_VOID(sliderTipNode_); + if (rootNode->GetTag() == V2::NAVIGATION_VIEW_ETS_TAG) { + MountToNavigation(sliderTipNode_); + } else { + sliderTipNode_->MountToParent(rootNode); + } + sliderTipNode_->MarkDirtyNode(PROPERTY_UPDATE_RENDER); + } + return; +} + +void SliderPattern::MountToNavigation(RefPtr& tipNode) +{ + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto parentNode = host->GetParent(); + while (parentNode) { + if (parentNode) { + if (parentNode->GetTag() == V2::NAVBAR_CONTENT_ETS_TAG || + parentNode->GetTag() == V2::NAVDESTINATION_CONTENT_ETS_TAG) { + tipNode->MountToParent(parentNode); + navigationNode_ = parentNode; + return; + } + } + parentNode = parentNode->GetParent(); + } +} + +void SliderPattern::CalculateOffset() +{ + if (sliderTipNode_) { + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto xOffsetSlider = host->GetPositionToScreen().GetX(); + auto yOffsetSlider = host->GetPositionToScreen().GetY(); + auto xOffsetTip = sliderTipNode_->GetPositionToScreen().GetX(); + auto yOffsetTip = sliderTipNode_->GetPositionToScreen().GetY(); + if ((xOffsetSlider != xLastSlider_) || (yOffsetSlider != yLastSlider_)) { + xLastSlider_ = xOffsetSlider; + yLastSlider_ = yOffsetSlider; + auto renderContext = sliderTipNode_->GetRenderContext(); + CHECK_NULL_VOID(renderContext); + renderContext->UpdateOffset( + OffsetT(Dimension(xOffsetSlider - xOffsetTip), Dimension(yOffsetSlider - yOffsetTip))); + } + + auto width = host->GetGeometryNode()->GetFrameSize().Width(); + auto height = host->GetGeometryNode()->GetFrameSize().Height(); + auto layoutProperty = sliderTipNode_->GetLayoutProperty(); + CHECK_NULL_VOID(layoutProperty); + if (width > height) { + layoutProperty->UpdateUserDefinedIdealSize(CalcSize(CalcLength(width), CalcLength(1))); + } else { + layoutProperty->UpdateUserDefinedIdealSize(CalcSize(CalcLength(1), CalcLength(height))); + } + } +} + +void SliderPattern::RemoveTipFromRoot() +{ + auto host = GetHost(); + CHECK_NULL_VOID(host); + CHECK_NULL_VOID(sliderTipNode_); + auto rootNode = host->GetCurrentPageRootNode(); + CHECK_NULL_VOID(rootNode); + if (rootNode->GetTag() == V2::NAVIGATION_VIEW_ETS_TAG) { + CHECK_NULL_VOID(navigationNode_); + navigationNode_->RemoveChild(sliderTipNode_); + } else { + rootNode->RemoveChild(sliderTipNode_); + } + sliderTipNode_ = nullptr; +} + void SliderPattern::PlayHapticFeedback(bool isShowSteps, float step, float oldValue) { if (!isEnableHaptic_ || !hapticApiEnabled) { @@ -854,6 +940,21 @@ void SliderPattern::InitializeBubble() sliderPaintProperty->UpdateContent(content); } +void SliderPattern::OnFinishEventTipSize() +{ + CHECK_NULL_VOID(sliderTipNode_); + auto layoutProperty = sliderTipNode_->GetLayoutProperty(); + CHECK_NULL_VOID(layoutProperty); + layoutProperty->UpdateVisibility(VisibleType::INVISIBLE, true); + sliderTipNode_->MarkDirtyNode(PROPERTY_UPDATE_RENDER); +} + +void SliderPattern::RefreshTipNode() +{ + CHECK_NULL_VOID(sliderTipNode_); + sliderTipNode_->MarkDirtyNode(PROPERTY_UPDATE_RENDER); +} + void SliderPattern::HandlingGestureStart(const GestureEvent& info) { eventSourceDevice_ = info.GetSourceDevice(); @@ -1108,9 +1209,15 @@ void SliderPattern::UpdateCircleCenterOffset() void SliderPattern::UpdateBubble() { CHECK_NULL_VOID(bubbleFlag_); + CalculateOffset(); + CHECK_NULL_VOID(sliderTipNode_); + auto layoutProperty = sliderTipNode_->GetLayoutProperty(); + CHECK_NULL_VOID(layoutProperty); + layoutProperty->UpdateVisibility(VisibleType::VISIBLE, true); // update the tip value according to the slider value, update the tip position according to current block position UpdateTipsValue(); UpdateMarkDirtyNode(PROPERTY_UPDATE_RENDER); + RefreshTipNode(); } void SliderPattern::InitPanEvent(const RefPtr& gestureHub) @@ -1981,6 +2088,9 @@ void SliderPattern::RegisterVisibleAreaChange() CHECK_NULL_VOID(pattern); pattern->isVisibleArea_ = visible; visible ? pattern->StartAnimation() : pattern->StopAnimation(); + if (visible) { + pattern->CreateTipToMountRoot(); + } }; auto host = GetHost(); CHECK_NULL_VOID(host); @@ -2120,6 +2230,7 @@ RefPtr SliderPattern::BuildContentModifierNode() void SliderPattern::OnDetachFromFrameNode(FrameNode* frameNode) { + RemoveTipFromRoot(); auto pipeline = frameNode->GetContext(); CHECK_NULL_VOID(pipeline); pipeline->RemoveVisibleAreaChangeNode(frameNode->GetId()); @@ -2130,6 +2241,7 @@ void SliderPattern::OnDetachFromFrameNode(FrameNode* frameNode) auto accessibilityManager = pipeline->GetAccessibilityManager(); CHECK_NULL_VOID(accessibilityManager); accessibilityManager->DeregisterAccessibilitySAObserverCallback(frameNode->GetAccessibilityId()); + TAG_LOGD(AceLogTag::ACE_SELECT_COMPONENT, "Slider OnDetachFromFrameNode OK"); } diff --git a/frameworks/core/components_ng/pattern/slider/slider_pattern.h b/frameworks/core/components_ng/pattern/slider/slider_pattern.h index 8e42002d407..455e6e50b0f 100644 --- a/frameworks/core/components_ng/pattern/slider/slider_pattern.h +++ b/frameworks/core/components_ng/pattern/slider/slider_pattern.h @@ -62,18 +62,7 @@ public: auto overlayGlobalOffset = CalculateGlobalSafeOffset(); std::pair BubbleVertex = GetBubbleVertexPosition(circleCenter_, trackThickness_, blockSize_); SliderPaintMethod::TipParameters tipParameters { bubbleFlag_, BubbleVertex.first, overlayGlobalOffset }; - if (!sliderTipModifier_ && bubbleFlag_) { - sliderTipModifier_ = AceType::MakeRefPtr([weak = WeakClaim(this)]() { - auto pattern = weak.Upgrade(); - if (!pattern) { - return std::pair(); - } - auto blockCenter = pattern->GetBlockCenter(); - auto trackThickness = pattern->sliderContentModifier_->GetTrackThickness(); - auto blockSize = pattern->sliderContentModifier_->GetBlockSize(); - return pattern->GetBubbleVertexPosition(blockCenter, trackThickness, blockSize); - }); - } + auto textDirection = TextDirection::AUTO; auto layoutProperty = GetLayoutProperty(); if (layoutProperty) { @@ -193,6 +182,31 @@ public: return sliderContentModifier_; } + bool IsSliderVisible(); + SliderContentModifier::Parameters UpdateContentParameters(); + std::pair GetBubbleVertexPosition( + const OffsetF& blockCenter, float trackThickness, const SizeF& blockSize); + const SizeF& GetBlockSize() const + { + return blockSize_; + } + + float GetTrackThickness() const + { + return trackThickness_; + } + + const bool& GetBubbleFlag() const + { + return bubbleFlag_; + } + void CreateTipToMountRoot(); + void RemoveTipFromRoot(); + void RefreshTipNode(); + void OnFinishEventTipSize(); + void CalculateOffset(); + void MountToNavigation(RefPtr& tipNode); + private: void OnAttachToFrameNode() override; void OnDetachFromFrameNode(FrameNode* frameNode) override; @@ -299,7 +313,6 @@ private: void HandleCrownAction(double mainDelta); void StartVibrateFeedback(); #endif - bool IsSliderVisible(); void RegisterVisibleAreaChange(); void OnWindowHide() override; void OnWindowShow() override; @@ -308,7 +321,7 @@ private: void OpenTranslateAnimation(SliderStatus status); void CloseTranslateAnimation(); - SliderContentModifier::Parameters UpdateContentParameters(); + void GetSelectPosition(SliderContentModifier::Parameters& parameters, float centerWidth, const OffsetF& offset); void GetBackgroundPosition(SliderContentModifier::Parameters& parameters, float centerWidth, const OffsetF& offset); void GetCirclePosition(SliderContentModifier::Parameters& parameters, float centerWidth, const OffsetF& offset); @@ -316,8 +329,7 @@ private: void LayoutImageNode(); void UpdateImagePositionX(float centerX); void UpdateImagePositionY(float centerY); - std::pair GetBubbleVertexPosition( - const OffsetF& blockCenter, float trackThickness, const SizeF& blockSize); + void SetAccessibilityAction(); void UpdateTipState(); void OnIsFocusActiveUpdate(bool isFocusActive); @@ -437,6 +449,10 @@ private: bool isEnableHaptic_ = true; bool hapticApiEnabled = false; double slipfactor_ = 0; + RefPtr sliderTipNode_ = nullptr; + RefPtr navigationNode_ = nullptr; + double xLastSlider_ = 0.0f; + double yLastSlider_ = 0.0f; ACE_DISALLOW_COPY_AND_MOVE(SliderPattern); }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/slider/slider_tip_layout_algorithm.cpp b/frameworks/core/components_ng/pattern/slider/slider_tip_layout_algorithm.cpp new file mode 100644 index 00000000000..40d5ffc1c7a --- /dev/null +++ b/frameworks/core/components_ng/pattern/slider/slider_tip_layout_algorithm.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed 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. + */ + +#include "core/components_ng/pattern/slider/slider_tip_layout_algorithm.h" +#include "core/components_ng/pattern/slider/slider_tip_pattern.h" +#include "core/pipeline_ng/pipeline_context.h" + +namespace OHOS::Ace::NG { +void SliderTipLayoutAlgorithm::Layout(LayoutWrapper* layoutWrapper) +{ + CHECK_NULL_VOID(sliderPattern_); + auto host = layoutWrapper->GetHostNode(); + CHECK_NULL_VOID(host); + auto pattern = DynamicCast(host->GetPattern()); + CHECK_NULL_VOID(pattern); + PerformLayout(layoutWrapper); + auto tipGeometryNode = layoutWrapper->GetGeometryNode(); + CHECK_NULL_VOID(tipGeometryNode); + + auto sliderNode = sliderPattern_->GetHost(); + CHECK_NULL_VOID(sliderNode); + auto sliderGeometryNode = sliderNode->GetGeometryNode(); + CHECK_NULL_VOID(sliderGeometryNode); + auto width = sliderGeometryNode->GetFrameSize().Width(); + auto height = sliderGeometryNode->GetFrameSize().Height(); + if (width > height) { + tipGeometryNode->SetFrameSize(SizeF({ width, 1 })); + } else { + tipGeometryNode->SetFrameSize(SizeF({ 1, height })); + } + + float sliderOffsetX = 0.0f; + float sliderOffsetY = 0.0f; + float tipOffsetX = 0.0f; + float tipOffsetY = 0.0f; + GetFrameOffset(sliderNode, sliderOffsetX, sliderOffsetY); + GetFrameOffset(host, tipOffsetX, tipOffsetY); + auto& posProperty = host->GetRenderContext()->GetOrCreatePositionProperty(); + posProperty->UpdateOffset(OffsetT(Dimension(sliderOffsetX - tipOffsetX), + Dimension(sliderOffsetY - tipOffsetY))); +} + +void SliderTipLayoutAlgorithm::GetFrameOffset(RefPtr host, float& xOffset, float& yOffset) const +{ + CHECK_NULL_VOID(host); + auto geometryNode = host->GetGeometryNode(); + CHECK_NULL_VOID(geometryNode); + auto originFrameOffset = geometryNode->GetFrameOffset(); + xOffset += originFrameOffset.GetX(); + yOffset += originFrameOffset.GetY(); + auto parent = host->GetParent(); + while (parent) { + auto parentFrame = DynamicCast(parent); + if (parentFrame) { + auto geometryParentNode = parentFrame->GetGeometryNode(); + CHECK_NULL_VOID(geometryParentNode); + auto parentFrameOffset = geometryParentNode->GetFrameOffset(); + xOffset += parentFrameOffset.GetX(); + yOffset += parentFrameOffset.GetY(); + } + parent = parent->GetParent(); + } + return; +} + +} // namespace OHOS::Ace::NG \ No newline at end of file diff --git a/frameworks/core/components_ng/pattern/slider/slider_tip_layout_algorithm.h b/frameworks/core/components_ng/pattern/slider/slider_tip_layout_algorithm.h new file mode 100644 index 00000000000..401f4879ba2 --- /dev/null +++ b/frameworks/core/components_ng/pattern/slider/slider_tip_layout_algorithm.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed 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. + */ + +#ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SLIDER_SLIDER_TIP_LAYOUT_ALGORITHM_H +#define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SLIDER_SLIDER_TIP_LAYOUT_ALGORITHM_H + +#include "base/geometry/ng/offset_t.h" +#include "base/geometry/ng/rect_t.h" +#include "core/components_ng/layout/box_layout_algorithm.h" +#include "core/components_ng/pattern/slider/slider_model.h" +#include "core/components_ng/pattern/slider/slider_pattern.h" + +namespace OHOS::Ace::NG { + +// SliderLayoutAlgorithm acts as the underlying slider layout. +class ACE_EXPORT SliderTipLayoutAlgorithm : public BoxLayoutAlgorithm { + DECLARE_ACE_TYPE(SliderTipLayoutAlgorithm, BoxLayoutAlgorithm); + +public: + explicit SliderTipLayoutAlgorithm(const RefPtr sliderPattern) : sliderPattern_(sliderPattern) {} + ~SliderTipLayoutAlgorithm() override = default; + void Layout(LayoutWrapper* layoutWrapper) override; + +private: + void GetFrameOffset(RefPtr host, float& xOffset, float& yOffset) const; + RefPtr sliderPattern_; + + ACE_DISALLOW_COPY_AND_MOVE(SliderTipLayoutAlgorithm); +}; +} // namespace OHOS::Ace::NG +#endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SLIDER_SLIDER_TIP_LAYOUT_ALGORITHM_H diff --git a/frameworks/core/components_ng/pattern/slider/slider_tip_modifier.cpp b/frameworks/core/components_ng/pattern/slider/slider_tip_modifier.cpp index 1dd7dd354a0..c5e64983c05 100644 --- a/frameworks/core/components_ng/pattern/slider/slider_tip_modifier.cpp +++ b/frameworks/core/components_ng/pattern/slider/slider_tip_modifier.cpp @@ -64,7 +64,8 @@ constexpr Dimension SUITABLEAGING_LEVEL_2_TEXT_FONT_SIZE = 28.0_vp; } // namespace -SliderTipModifier::SliderTipModifier(std::function()> getBubbleVertexFunc) +SliderTipModifier::SliderTipModifier(std::function()> getBubbleVertexFunc, + std::function onFinishEventTipSize) : tipFlag_(AceType::MakeRefPtr(false)), contentOffset_(AceType::MakeRefPtr(OffsetF())), contentSize_(AceType::MakeRefPtr(SizeF())), @@ -72,7 +73,8 @@ SliderTipModifier::SliderTipModifier(std::function()> opacityScale_(AceType::MakeRefPtr(BUBBLE_OPACITY_MIN_SCALE)), content_(AceType::MakeRefPtr("")), bubbleVertex_(AceType::MakeRefPtr(OffsetF())), sliderGlobalOffset_(AceType::MakeRefPtr(OffsetF())), - getBubbleVertexFunc_(std::move(getBubbleVertexFunc)) + getBubbleVertexFunc_(std::move(getBubbleVertexFunc)), + onFinishEventTipSize_(std::move(onFinishEventTipSize)) { AttachProperty(tipFlag_); AttachProperty(contentOffset_); @@ -384,7 +386,7 @@ void SliderTipModifier::PaintBubble(DrawingContext& context) void SliderTipModifier::onDraw(DrawingContext& context) { - if (tipFlag_->Get() || GreatNotEqual(sizeScale_->Get(), BUBBLE_SIZE_MIN_SCALE)) { + if ((!tipFlag_->Get()) || (tipFlag_->Get() && GreatNotEqual(sizeScale_->Get(), BUBBLE_SIZE_MIN_SCALE))) { BuildParagraph(); UpdateBubbleSize(); PaintTip(context); @@ -430,7 +432,7 @@ void SliderTipModifier::SetBubbleDisappearAnimation() auto self = weak.Upgrade(); CHECK_NULL_VOID(self); self->opacityScale_->Set(BUBBLE_OPACITY_MIN_SCALE); - }); + }, onFinishEventTipSize_); } void SliderTipModifier::SetTipFlag(bool flag) diff --git a/frameworks/core/components_ng/pattern/slider/slider_tip_modifier.h b/frameworks/core/components_ng/pattern/slider/slider_tip_modifier.h index 4257112236a..9b9b0b443fb 100644 --- a/frameworks/core/components_ng/pattern/slider/slider_tip_modifier.h +++ b/frameworks/core/components_ng/pattern/slider/slider_tip_modifier.h @@ -25,7 +25,8 @@ class SliderTipModifier : public OverlayModifier { DECLARE_ACE_TYPE(SliderTipModifier, OverlayModifier); public: - explicit SliderTipModifier(std::function()> getBubbleVertexFunc); + explicit SliderTipModifier(std::function()> getBubbleVertexFunc, + std::function onFinishEventTipSize = nullptr); ~SliderTipModifier() override; void PaintTip(DrawingContext& context); @@ -45,7 +46,7 @@ public: } } - void SetTextFont(const Dimension& fontSize) + void SetTextFontSize(const Dimension& fontSize) { textFontSize_ = fontSize; } @@ -163,6 +164,7 @@ private: std::function()> getBubbleVertexFunc_; int32_t taskId_ = 0; int32_t tipDelayTime_ = 0; + std::function onFinishEventTipSize_; ACE_DISALLOW_COPY_AND_MOVE(SliderTipModifier); }; diff --git a/frameworks/core/components_ng/pattern/slider/slider_tip_paint_method.cpp b/frameworks/core/components_ng/pattern/slider/slider_tip_paint_method.cpp new file mode 100644 index 00000000000..b98b8b61f11 --- /dev/null +++ b/frameworks/core/components_ng/pattern/slider/slider_tip_paint_method.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed 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. + */ + +#include "core/components_ng/pattern/slider/slider_tip_paint_method.h" +#include "core/components_ng/pattern/slider/slider_paint_method.h" + +namespace OHOS::Ace::NG { +void SliderTipPaintMethod::UpdateOverlayModifier(PaintWrapper* paintWrapper) +{ + CHECK_NULL_VOID(sliderPattern_); + auto host = sliderPattern_->GetHost(); + CHECK_NULL_VOID(host); + auto pipeline = host->GetContextRefPtr(); + CHECK_NULL_VOID(pipeline); + auto theme = pipeline->GetTheme(); + CHECK_NULL_VOID(theme); + auto paintProperty = host->GetPaintProperty(); + CHECK_NULL_VOID(paintProperty); + sliderTipModifier_->UpdateThemeParams(theme); + sliderTipModifier_->SetDirection(paintProperty->GetDirectionValue(Axis::HORIZONTAL)); + sliderTipModifier_->SetTipColor(paintProperty->GetTipColorValue(theme->GetTipColor())); + sliderTipModifier_->SetTextFontSize(paintProperty->GetFontSizeValue(theme->GetTipFontSize())); + sliderTipModifier_->SetTextColor(paintProperty->GetTextColorValue(theme->GetTipTextColor())); + sliderTipModifier_->SetContent(paintProperty->GetCustomContent().value_or(paintProperty->GetContentValue(""))); + sliderTipModifier_->SetSliderMode(paintProperty->GetSliderModeValue(SliderModelNG::SliderMode::OUTSET)); + auto blockSize = parameters_.blockSize; + if (paintProperty->GetSliderModeValue(SliderModelNG::SliderMode::OUTSET) != SliderModelNG::SliderMode::OUTSET) { + blockSize = SizeF(std::min(blockSize.Width(), parameters_.trackThickness), + std::min(blockSize.Height(), parameters_.trackThickness)); + } + + sliderTipModifier_->SetBlockSize(blockSize); + sliderTipModifier_->SetTipFlag(tipParameters_.isDrawTip_); + sliderTipModifier_->SetContentOffset(paintWrapper->GetContentOffset()); + sliderTipModifier_->SetContentSize(paintWrapper->GetContentSize()); + sliderTipModifier_->SetBubbleVertex(tipParameters_.bubbleVertex_); + sliderTipModifier_->SetSliderGlobalOffset(tipParameters_.sliderGlobalOffset_); + sliderTipModifier_->BuildParagraph(); + sliderTipModifier_->UpdateBubbleSize(); + if (sliderTipModifier_->UpdateOverlayRect(paintWrapper->GetGeometryNode()->GetFrameSize())) { + paintWrapper->FlushOverlayModifier(); + } +} +} // namespace OHOS::Ace::NG \ No newline at end of file diff --git a/frameworks/core/components_ng/pattern/slider/slider_tip_paint_method.h b/frameworks/core/components_ng/pattern/slider/slider_tip_paint_method.h new file mode 100644 index 00000000000..07407839e17 --- /dev/null +++ b/frameworks/core/components_ng/pattern/slider/slider_tip_paint_method.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed 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. + */ + +#ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SLIDER_SLIDER_PAINT_METHOD_TIP_H +#define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SLIDER_SLIDER_PAINT_METHOD_TIP_H + +#include "core/components_ng/pattern/slider/slider_pattern.h" +#include "core/components_ng/pattern/slider/slider_paint_method.h" + +namespace OHOS::Ace::NG { +class ACE_EXPORT SliderTipPaintMethod : public NodePaintMethod { + DECLARE_ACE_TYPE(SliderTipPaintMethod, NodePaintMethod) +public: + explicit SliderTipPaintMethod(const RefPtr& sliderPattern, + const SliderPaintMethod::TipParameters& tipParameters, + const RefPtr& sliderTipModifier, const SliderContentModifier::Parameters& parameters) + : sliderPattern_(sliderPattern), tipParameters_(tipParameters), sliderTipModifier_(sliderTipModifier), + parameters_(parameters) + {} + ~SliderTipPaintMethod() override = default; + RefPtr sliderPattern_; + SliderPaintMethod::TipParameters tipParameters_; + RefPtr sliderTipModifier_; + SliderContentModifier::Parameters parameters_; + RefPtr GetOverlayModifier(PaintWrapper* paintWrapper) override + { + CHECK_NULL_RETURN(sliderTipModifier_, nullptr); + return sliderTipModifier_; + } + void UpdateOverlayModifier(PaintWrapper* paintWrapper) override; + ACE_DISALLOW_COPY_AND_MOVE(SliderTipPaintMethod); +}; +} // namespace OHOS::Ace::NG +#endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SLIDER_SLIDER_PAINT_METHOD_TIP_H \ No newline at end of file diff --git a/frameworks/core/components_ng/pattern/slider/slider_tip_pattern.cpp b/frameworks/core/components_ng/pattern/slider/slider_tip_pattern.cpp new file mode 100644 index 00000000000..0e609cf4fb9 --- /dev/null +++ b/frameworks/core/components_ng/pattern/slider/slider_tip_pattern.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed 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. + */ + +#include "core/components_ng/pattern/slider/slider_tip_pattern.h" +#include "core/components_ng/pattern/slider/slider_tip_paint_method.h" + +namespace OHOS::Ace::NG { +RefPtr SliderTipPattern::CreateNodePaintMethod() +{ + CHECK_NULL_RETURN(sliderPattern_, nullptr); + if (!sliderPattern_->IsSliderVisible()) { + return nullptr; + } + auto paintParameters = sliderPattern_->UpdateContentParameters(); + auto overlayGlobalOffset = sliderPattern_->CalculateGlobalSafeOffset(); + std::pair bubbleVertex = sliderPattern_->GetBubbleVertexPosition(sliderPattern_->GetBlockCenter(), + sliderPattern_->GetTrackThickness(), sliderPattern_->GetBlockSize()); + SliderPaintMethod::TipParameters tipParameters { sliderPattern_->GetBubbleFlag(), + bubbleVertex.first, overlayGlobalOffset }; + if (!sliderTipModifier_ && sliderPattern_->GetBubbleFlag()) { + sliderTipModifier_ = AceType::MakeRefPtr([weak = WeakClaim(this)]() { + auto pattern = weak.Upgrade(); + if (!pattern) { + return std::pair(); + } + if (!pattern->sliderPattern_) { + return std::pair(); + } + auto blockCenter = pattern->sliderPattern_->GetBlockCenter(); + auto trackThickness = pattern->sliderPattern_->GetSliderContentModifier()->GetTrackThickness(); + auto blockSize = pattern->sliderPattern_->GetSliderContentModifier()->GetBlockSize(); + return pattern->sliderPattern_->GetBubbleVertexPosition(blockCenter, trackThickness, blockSize); + }, + [weak = WeakClaim(this)]() { + auto pattern = weak.Upgrade(); + if (!pattern) { + return; + } + + if (!pattern->sliderPattern_) { + return; + } + pattern->sliderPattern_->OnFinishEventTipSize(); + return; + }); + } + return MakeRefPtr(sliderPattern_, tipParameters, sliderTipModifier_, + sliderPattern_->UpdateContentParameters()); +} +} \ No newline at end of file diff --git a/frameworks/core/components_ng/pattern/slider/slider_tip_pattern.h b/frameworks/core/components_ng/pattern/slider/slider_tip_pattern.h new file mode 100644 index 00000000000..5a608e39e4f --- /dev/null +++ b/frameworks/core/components_ng/pattern/slider/slider_tip_pattern.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed 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. + */ + +#ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SLIDER_SLIDER_TIP_PATTERN_H +#define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SLIDER_SLIDER_TIP_PATTERN_H + +#include "core/components_ng/pattern/slider/slider_pattern.h" +#include "base/geometry/offset.h" +#include "core/components_ng/pattern/slider/slider_tip_layout_algorithm.h" + +namespace OHOS::Ace::NG { +class SliderTipPattern : public Pattern { + DECLARE_ACE_TYPE(SliderTipPattern, Pattern); + +public: + SliderTipPattern() = default; + explicit SliderTipPattern(const RefPtr sliderPattern) : sliderPattern_(sliderPattern) {} + ~SliderTipPattern() override = default; + RefPtr sliderPattern_; + RefPtr sliderTipModifier_; + RefPtr CreateNodePaintMethod() override; + RefPtr CreateLayoutAlgorithm() override + { + return MakeRefPtr(sliderPattern_); + } +}; +} // namespace OHOS::Ace::NG +#endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SLIDER_SLIDER_TIP_PATTERN_H \ No newline at end of file diff --git a/frameworks/core/components_v2/inspector/inspector_constants.cpp b/frameworks/core/components_v2/inspector/inspector_constants.cpp index cb38dba221a..276c8fe1e7e 100644 --- a/frameworks/core/components_v2/inspector/inspector_constants.cpp +++ b/frameworks/core/components_v2/inspector/inspector_constants.cpp @@ -370,6 +370,10 @@ const char INDEXER_ETS_TAG[] = "AlphabetIndexer"; const char SLIDER_COMPONENT_TAG[] = "SliderComponent"; const char SLIDER_ETS_TAG[] = "Slider"; +// sliderTip +const char SLIDER_TIP_NODE_COMPONENT_TAG[] = "sliderTipFrameNodeComponent"; +const char SLIDER_TIP_NODE_ETS_TAG[] = "sliderTipFrameNode"; + // rating const char RATING_COMPONENT_TAG[] = "RatingComponent"; const char RATING_ETS_TAG[] = "Rating"; diff --git a/frameworks/core/components_v2/inspector/inspector_constants.h b/frameworks/core/components_v2/inspector/inspector_constants.h index 24ff4d203df..b0334762d36 100644 --- a/frameworks/core/components_v2/inspector/inspector_constants.h +++ b/frameworks/core/components_v2/inspector/inspector_constants.h @@ -378,6 +378,10 @@ ACE_EXPORT extern const char INDEXER_ETS_TAG[]; ACE_EXPORT extern const char SLIDER_COMPONENT_TAG[]; ACE_EXPORT extern const char SLIDER_ETS_TAG[]; +// sliderTip +ACE_EXPORT extern const char SLIDER_TIP_NODE_COMPONENT_TAG[]; +ACE_EXPORT extern const char SLIDER_TIP_NODE_ETS_TAG[]; + // rating ACE_EXPORT extern const char RATING_COMPONENT_TAG[]; ACE_EXPORT extern const char RATING_ETS_TAG[]; diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index 58a4709c7d4..a7a8446fe0c 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -1171,7 +1171,10 @@ ohos_source_set("ace_components_pattern") { "$ace_root/frameworks/core/components_ng/pattern/slider/slider_model_ng.cpp", "$ace_root/frameworks/core/components_ng/pattern/slider/slider_paint_method.cpp", "$ace_root/frameworks/core/components_ng/pattern/slider/slider_pattern.cpp", + "$ace_root/frameworks/core/components_ng/pattern/slider/slider_tip_layout_algorithm.cpp", "$ace_root/frameworks/core/components_ng/pattern/slider/slider_tip_modifier.cpp", + "$ace_root/frameworks/core/components_ng/pattern/slider/slider_tip_paint_method.cpp", + "$ace_root/frameworks/core/components_ng/pattern/slider/slider_tip_pattern.cpp", "$ace_root/frameworks/core/components_ng/pattern/stack/stack_layout_algorithm.cpp", "$ace_root/frameworks/core/components_ng/pattern/stack/stack_model_ng.cpp", "$ace_root/frameworks/core/components_ng/pattern/stage/content_root_pattern.cpp", diff --git a/test/unittest/core/pattern/slider/slider_Extend_test_ng.cpp b/test/unittest/core/pattern/slider/slider_Extend_test_ng.cpp index 9b441631c72..17f96b91971 100644 --- a/test/unittest/core/pattern/slider/slider_Extend_test_ng.cpp +++ b/test/unittest/core/pattern/slider/slider_Extend_test_ng.cpp @@ -39,6 +39,7 @@ #include "core/components_ng/pattern/slider/slider_paint_property.h" #include "core/components_ng/pattern/slider/slider_pattern.h" #include "core/components_ng/pattern/slider/slider_style.h" +#include "core/components_ng/pattern/slider/slider_tip_paint_method.h" #include "core/components_ng/render/drawing_mock.h" #include "test/mock/core/rosen/mock_canvas.h" #include "test/mock/core/common/mock_theme_manager.h" @@ -119,6 +120,10 @@ constexpr Dimension BUBBLE_VERTICAL_SUITABLEAGING_LEVEL_2_WIDTH = 96.0_vp; constexpr Dimension BUBBLE_VERTICAL_SUITABLEAGING_LEVEL_2_HEIGHT = 56.0_vp; constexpr Dimension BUBBLE_HORIZONTAL_SUITABLEAGING_LEVEL_2_WIDTH = 48.0_vp; constexpr Dimension BUBBLE_HORIZONTAL_SUITABLEAGING_LEVEL_2_HEIGHT = 64.0_vp; +constexpr float SLIDER_CONTENT_WIDTH_1 = 130.0f; +constexpr float SLIDER_CONTENT_HEIGHT_1 = 60.0f; +constexpr float SLIDER_CONTENT_WIDTH_2 = 40.0f; +constexpr float SLIDER_CONTENT_HEIGHT_2 = 100.0f; } // namespace class SliderExTestNg : public testing::Test { public: @@ -330,12 +335,14 @@ HWTEST_F(SliderExTestNg, SliderTipModifierTest001, TestSize.Level1) auto sliderLayoutProperty = frameNode->GetLayoutProperty(); ASSERT_NE(sliderLayoutProperty, nullptr); SliderTipModifier sliderTipModifier( - [sliderPattern]() { return sliderPattern->GetBubbleVertexPosition(OffsetF(), 0.0f, SizeF()); }); + [sliderPattern]() { return sliderPattern->GetBubbleVertexPosition(OffsetF(), 0.0f, SizeF()); }, + [sliderPattern](){return sliderPattern->OnFinishEventTipSize();}); /** * @tc.steps: step2. set sliderTipModifier attribute and call onDraw function. */ sliderTipModifier.SetSliderGlobalOffset(SLIDER_GLOBAL_OFFSET); sliderTipModifier.tipFlag_ = AceType::MakeRefPtr(true); + sliderTipModifier.sizeScale_->Set(1.0); auto offset = static_cast(BUBBLE_TO_SLIDER_DISTANCE.ConvertToPx()); Testing::MockCanvas canvas; MockCanvasFunction(canvas); @@ -696,8 +703,12 @@ HWTEST_F(SliderExTestNg, SliderPaintMethodTest001, TestSize.Level1) auto pipeline = PipelineBase::GetCurrentContext(); auto theme = AceType::MakeRefPtr(); pipeline->SetThemeManager(theme); - EXPECT_CALL(*theme, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - EXPECT_CALL(*theme, GetTheme(_, _)).WillRepeatedly(Return(AceType::MakeRefPtr())); + auto sliderTheme = AceType::MakeRefPtr(); + Color color = Color::TRANSPARENT; + sliderTheme->blockColor_ = color; + EXPECT_CALL(*theme, GetTheme(_)).WillRepeatedly(Return(sliderTheme)); + EXPECT_CALL(*theme, GetTheme(_, _)).WillRepeatedly(Return(sliderTheme)); + sliderPaintMethod.sliderContentModifier_->blockBorderColor_->Set(LinearColor(sliderTheme->GetBlockColor())); // call UpdateContentModifier function sliderPaintMethod.UpdateContentModifier(Referenced::RawPtr(paintWrapper)); @@ -711,6 +722,8 @@ HWTEST_F(SliderExTestNg, SliderPaintMethodTest001, TestSize.Level1) static_cast(SLIDER_NONE_TRACK_THICKNRESS.ConvertToPx()) * HALF); //change sliderMode + sliderPaintMethod.sliderContentModifier_->sliderMode_->Set(static_cast(SliderModelNG::SliderMode::NONE)); + sliderPaintMethod.sliderContentModifier_->selectedBorderRadius_->Set(0.0f); AceType::DynamicCast(paintWrapper->GetPaintProperty()) ->UpdateSliderMode(SliderModelNG::SliderMode::NONE); sliderPaintMethod.UpdateContentModifier(Referenced::RawPtr(paintWrapper)); @@ -767,11 +780,13 @@ HWTEST_F(SliderExTestNg, SliderPaintMethodTest002, TestSize.Level1) MockParagraphFunction(paragraph, canvas); // call UpdateOverlayModifier function - sliderPaintMethod.UpdateOverlayModifier(Referenced::RawPtr(paintWrapper)); + auto pattern = frameNode->GetPattern(); + SliderTipPaintMethod sliderTipPaintMethod(pattern, tipParameters, sliderTipModifier, parameters); + sliderTipPaintMethod.UpdateOverlayModifier(Referenced::RawPtr(paintWrapper)); EXPECT_EQ(sliderTipModifier->axis_, Axis::VERTICAL); AceType::DynamicCast(paintWrapper->paintProperty_)->UpdateDirection(Axis::HORIZONTAL); - sliderPaintMethod.UpdateOverlayModifier(Referenced::RawPtr(paintWrapper)); + sliderTipPaintMethod.UpdateOverlayModifier(Referenced::RawPtr(paintWrapper)); EXPECT_EQ(sliderTipModifier->axis_, Axis::HORIZONTAL); } @@ -811,6 +826,10 @@ HWTEST_F(SliderExTestNg, SliderPaintMethodTest003, TestSize.Level1) /** * @tc.steps: step2. call UpdateContentModifier function. */ + sliderContentModifier->sliderMode_->Set(static_cast(SliderModelNG::SliderMode::INSET)); + RectF rectValue; + rectValue.SetSize(SizeF(SLIDER_CONTENT_WIDTH_1, SLIDER_CONTENT_HEIGHT_1)); + sliderPaintMethod.sliderContentModifier_->SetBoundsRect(rectValue); sliderPaintMethod.UpdateContentModifier(Referenced::RawPtr(paintWrapper1)); EXPECT_EQ(sliderContentModifier->sliderMode_->Get(), static_cast(SliderModelNG::SliderMode::INSET)); EXPECT_EQ(sliderContentModifier->directionAxis_->Get(), static_cast(Axis::HORIZONTAL)); @@ -820,6 +839,12 @@ HWTEST_F(SliderExTestNg, SliderPaintMethodTest003, TestSize.Level1) sliderPaintProperty->UpdateSliderMode(SliderModelNG::SliderMode::OUTSET); sliderPaintProperty->UpdateDirection(Axis::VERTICAL); auto paintWrapper2 = AceType::MakeRefPtr(renderContext, geometryNode, sliderPaintProperty); + sliderContentModifier->sliderMode_ = + AceType::MakeRefPtr(static_cast(SliderModelNG::SliderMode::OUTSET)); + sliderContentModifier->SetDirection(Axis::VERTICAL); + RectF rectValue2; + rectValue2.SetSize(SizeF(SLIDER_CONTENT_WIDTH_2, SLIDER_CONTENT_HEIGHT_2)); + sliderPaintMethod.sliderContentModifier_->SetBoundsRect(rectValue2); sliderPaintMethod.UpdateContentModifier(Referenced::RawPtr(paintWrapper2)); EXPECT_EQ(sliderContentModifier->sliderMode_->Get(), static_cast(SliderModelNG::SliderMode::OUTSET)); EXPECT_EQ(sliderContentModifier->directionAxis_->Get(), static_cast(Axis::VERTICAL)); @@ -1953,6 +1978,8 @@ HWTEST_F(SliderExTestNg, SliderPaintMethodTest004, TestSize.Level1) EXPECT_CALL(*themeManager, GetTheme(_, _)).WillRepeatedly(Return(sliderTheme)); Color color = Color::RED; sliderTheme->markerColor_ = color; + sliderPaintMethod.sliderContentModifier_->stepColor_ = + AceType::MakeRefPtr(LinearColor(sliderTheme->markerColor_)); // call UpdateContentModifier function sliderPaintMethod.UpdateContentModifier(Referenced::RawPtr(paintWrapper)); EXPECT_EQ(sliderPaintMethod.sliderContentModifier_->stepColor_->Get(), LinearColor(Color::RED)); diff --git a/test/unittest/core/pattern/slider/slider_modifier_test_ng.cpp b/test/unittest/core/pattern/slider/slider_modifier_test_ng.cpp index 11a0978d518..5c8baba9ffd 100644 --- a/test/unittest/core/pattern/slider/slider_modifier_test_ng.cpp +++ b/test/unittest/core/pattern/slider/slider_modifier_test_ng.cpp @@ -1120,6 +1120,12 @@ HWTEST_F(SliderModifierTestNg, SliderContentModifierTest021, TestSize.Level1) ASSERT_NE(sliderPattern->CreateNodePaintMethod(), nullptr); ASSERT_NE(sliderPattern->sliderContentModifier_, nullptr); + auto sliderPaintProperty = frameNode->GetPaintProperty(); + ASSERT_NE(sliderPaintProperty, nullptr); + Gradient themeGradient = SliderModelNG::CreateSolidGradient(sliderTheme->GetTrackBgColor()); + sliderPaintProperty->UpdateTrackBackgroundColor(themeGradient); + sliderPattern->sliderContentModifier_->trackBackgroundColor_ = + AceType::MakeRefPtr(GradientArithmetic(themeGradient)); Gradient gradient = sliderPattern->sliderContentModifier_->trackBackgroundColor_->Get().GetGradient(); std::vector gradientColors = gradient.GetColors(); diff --git a/test/unittest/core/pattern/slider/slider_pattern_test_ng.cpp b/test/unittest/core/pattern/slider/slider_pattern_test_ng.cpp index 0dc9122b8c9..2c83847a6a8 100644 --- a/test/unittest/core/pattern/slider/slider_pattern_test_ng.cpp +++ b/test/unittest/core/pattern/slider/slider_pattern_test_ng.cpp @@ -271,7 +271,6 @@ HWTEST_F(SliderPatternTestNg, SliderPatternTest001, TestSize.Level1) sliderPattern->bubbleFlag_ = true; sliderPattern->isVisibleArea_ = true; ASSERT_NE(sliderPattern->CreateNodePaintMethod(), nullptr); - sliderPattern->sliderTipModifier_->getBubbleVertexFunc_(); sliderPattern->UpdateCircleCenterOffset(); auto contentSize = sliderPattern->GetHostContentSize(); EXPECT_EQ(sliderPattern->GetBlockCenter().GetY(), contentSize->Height() * HALF); diff --git a/test/unittest/core/pattern/slider/slider_test_ng.cpp b/test/unittest/core/pattern/slider/slider_test_ng.cpp index 5c8bdf3f90e..b97999185d9 100644 --- a/test/unittest/core/pattern/slider/slider_test_ng.cpp +++ b/test/unittest/core/pattern/slider/slider_test_ng.cpp @@ -103,6 +103,7 @@ const PointF POINTF_CENTER { 15.0f, 15.0f }; const OffsetF SLIDER_GLOBAL_OFFSET = { 200.0f, 200.0f }; const SizeF BLOCK_SIZE_F(10.0f, 10.0f); const SizeF BLOCK_SIZE_F_ZREO(0.0f, 0.0f); +constexpr float SLIDER_PERCENTAGE = 100.0f; } // namespace class SliderTestNg : public testing::Test { public: @@ -402,6 +403,12 @@ HWTEST_F(SliderTestNg, SliderTestNg004, TestSize.Level1) */ sliderPaintProperty->UpdateShowTips(true); sliderPattern->OnModifyDone(); + sliderPaintProperty->UpdatePadding(sliderTheme->GetTipTextPadding()); + sliderPaintProperty->UpdateTipColor(sliderTheme->GetTipColor()); + sliderPaintProperty->UpdateTextColor(sliderTheme->GetTipTextColor()); + sliderPaintProperty->UpdateFontSize(sliderTheme->GetTipFontSize()); + auto content = std::to_string(static_cast(std::round(sliderPattern->valueRatio_ * SLIDER_PERCENTAGE))) + '%'; + sliderPaintProperty->UpdateContent(content); EXPECT_EQ(sliderPattern->showTips_, true); EXPECT_EQ(sliderPaintProperty->GetPaddingValue(Dimension()), Dimension(10.0)); EXPECT_EQ(sliderPaintProperty->GetTipColorValue(Color::BLACK), Color::BLUE); diff --git a/test/unittest/core/pattern/web/BUILD.gn b/test/unittest/core/pattern/web/BUILD.gn index f142721c59e..746c9223eb6 100755 --- a/test/unittest/core/pattern/web/BUILD.gn +++ b/test/unittest/core/pattern/web/BUILD.gn @@ -452,7 +452,10 @@ ohos_unittest("web_pattern_unit_test_ohos") { "$ace_root/frameworks/core/components_ng/pattern/slider/slider_model_ng.cpp", "$ace_root/frameworks/core/components_ng/pattern/slider/slider_paint_method.cpp", "$ace_root/frameworks/core/components_ng/pattern/slider/slider_pattern.cpp", + "$ace_root/frameworks/core/components_ng/pattern/slider/slider_tip_layout_algorithm.cpp", "$ace_root/frameworks/core/components_ng/pattern/slider/slider_tip_modifier.cpp", + "$ace_root/frameworks/core/components_ng/pattern/slider/slider_tip_paint_method.cpp", + "$ace_root/frameworks/core/components_ng/pattern/slider/slider_tip_pattern.cpp", "$ace_root/frameworks/core/components_ng/pattern/stack/stack_layout_algorithm.cpp", "$ace_root/frameworks/core/components_ng/pattern/stack/stack_model_ng.cpp", "$ace_root/frameworks/core/components_ng/pattern/stage/content_root_pattern.cpp", -- Gitee