diff --git a/frameworks/core/components/picker/picker_theme.h b/frameworks/core/components/picker/picker_theme.h index d96338d6314a34685a3df2076a314e125e29e83e..1bda71efb6f9cb4ba12b75d7b4a99e8d4db4df15 100644 --- a/frameworks/core/components/picker/picker_theme.h +++ b/frameworks/core/components/picker/picker_theme.h @@ -110,7 +110,8 @@ public: theme->titleStyle_.SetFontSize(pattern->GetAttr("picker_title_font_size", 0.0_fp)); theme->titleStyle_.SetTextColor(pattern->GetAttr("picker_title_text_color", Color())); } - theme->titleStyle_.SetFontWeight(FontWeight::W500); + theme->titleStyle_.SetFontWeight( + FontWeight(pattern->GetAttr("picker_title_font_weight", static_cast(FontWeight::W500)))); theme->titleStyle_.SetMaxLines(1); theme->titleStyle_.SetTextOverflow(TextOverflow::ELLIPSIS); } @@ -188,6 +189,16 @@ public: pattern->GetAttr("picker_selector_item_focus_bg_color", Color::TRANSPARENT); theme->selectorItemNormalBgColor_ = pattern->GetAttr("picker_selector_item_normal_bg_color", Color::TRANSPARENT); + theme->checkboxSize_ = pattern->GetAttr("picker_checkbox_size", 24.0_vp); + theme->lunarSwitchHeight_ = pattern->GetAttr("picker_lunar_switch_height", 48.0_vp); + theme->checkboxPaddingLeft_ = pattern->GetAttr("picker_checkbox_padding_left", 24.0_vp); + theme->checkboxPaddingRight_ = pattern->GetAttr("picker_checkbox_padding_right", 8.0_vp); + theme->timePickerSelectorItemRadius_ = + pattern->GetAttr("time_picker_selector_item_radius", 8.0_vp); + theme->pickerPadding_ = pattern->GetAttr("picker_padding", 6.0_vp); + theme->titlePaddingHorizontal_ = pattern->GetAttr("picker_title_padding_horizontal", 16.0_vp); + theme->titleMarginVertical_ = pattern->GetAttr("picker_title_margin_vertical", 8.0_vp); + theme->buttonColor_ = pattern->GetAttr("picker_button_color", Color::TRANSPARENT); if (FOCUS_AREA_TYPE_IMPL == theme->focusImplType_) { theme->focusOptionStyle_.SetFontSize(pattern->GetAttr( @@ -285,6 +296,15 @@ public: theme->selectorItemFocusBgColor_ = selectorItemFocusBgColor_; theme->selectorItemNormalBgColor_ = selectorItemNormalBgColor_; theme->focusPadding_ = focusPadding_; + theme->checkboxSize_ = checkboxSize_; + theme->lunarSwitchHeight_ = lunarSwitchHeight_; + theme->checkboxPaddingLeft_ = checkboxPaddingLeft_; + theme->checkboxPaddingRight_ = checkboxPaddingRight_; + theme->timePickerSelectorItemRadius_ = timePickerSelectorItemRadius_; + theme->pickerPadding_ = pickerPadding_; + theme->titlePaddingHorizontal_ = titlePaddingHorizontal_; + theme->titleMarginVertical_ = titleMarginVertical_; + theme->buttonColor_ = buttonColor_; } void cloneSelectedBackgroundStyle(RefPtr theme) const @@ -642,6 +662,51 @@ public: return focusPadding_; } + const Dimension& GetCheckboxSize() const + { + return checkboxSize_; + } + + const Dimension& GetLunarSwitchHeight() const + { + return lunarSwitchHeight_; + } + + const Dimension& GetCheckboxPaddingLeft() const + { + return checkboxPaddingLeft_; + } + + const Dimension& GetCheckboxPaddingRight() const + { + return checkboxPaddingRight_; + } + + const Dimension& GetTimePickerSelectorItemRadius() const + { + return timePickerSelectorItemRadius_; + } + + const Dimension& GetPickerPadding() const + { + return pickerPadding_; + } + + const Dimension& GetTitlePaddingHorizontal() const + { + return titlePaddingHorizontal_; + } + + const Dimension& GetTitleMarginVertical() const + { + return titleMarginVertical_; + } + + const Color& GetButtonColor() const + { + return buttonColor_; + } + const Color& GetSelectorItemBorderColor() const { return selectorItemBorderColor_; @@ -792,6 +857,15 @@ private: Dimension selectorItemBorderWidth_; Dimension selectorItemFocusBorderWidth_; Dimension focusPadding_; + Dimension checkboxSize_; + Dimension lunarSwitchHeight_; + Dimension checkboxPaddingLeft_; + Dimension checkboxPaddingRight_; + Dimension timePickerSelectorItemRadius_; + Dimension pickerPadding_; + Dimension titlePaddingHorizontal_; + Dimension titleMarginVertical_; + Color buttonColor_; Color selectorItemBorderColor_; Color selectorItemFocusBorderColor_; Color selectorItemFocusBgColor_; diff --git a/frameworks/core/components_ng/pattern/picker/datepicker_column_pattern.cpp b/frameworks/core/components_ng/pattern/picker/datepicker_column_pattern.cpp index 227d7263ab01dc8851a8d6ca114cafe3a9fd4ed0..a6b03b5aee7aa49624e3a4a8400ea0b059fd5873 100644 --- a/frameworks/core/components_ng/pattern/picker/datepicker_column_pattern.cpp +++ b/frameworks/core/components_ng/pattern/picker/datepicker_column_pattern.cpp @@ -223,9 +223,9 @@ void DatePickerColumnPattern::UpdateTextAreaPadding( const RefPtr& pickerTheme, const RefPtr& textLayoutProperty) { if (useButtonFocusArea_) { - auto padding = pickerTheme->GetSelectorItemSpace(); + auto padding = 16.0_vp; PaddingProperty defaultPadding = { CalcLength(padding), CalcLength(padding), CalcLength(0.0_vp), - CalcLength(0.0_vp), CalcLength(0.0_vp), CalcLength(0.0_vp) }; + CalcLength(0.0_vp) }; textLayoutProperty->UpdatePadding(defaultPadding); } } diff --git a/frameworks/core/components_ng/pattern/picker/datepicker_dialog_view.cpp b/frameworks/core/components_ng/pattern/picker/datepicker_dialog_view.cpp index af52230ce9e3257ff30d47309b632313282ad033..20d9a4f493373dbebd6ccb33c115bcc3f46cd00d 100644 --- a/frameworks/core/components_ng/pattern/picker/datepicker_dialog_view.cpp +++ b/frameworks/core/components_ng/pattern/picker/datepicker_dialog_view.cpp @@ -47,10 +47,8 @@ constexpr double TIME_WIDTH_PERCENT_ONE = 0.5714; constexpr double MONTHDAYS_WIDTH_PERCENT_TWO = 0.3636; constexpr double TIME_WIDTH_PERCENT_TWO = 0.6363; constexpr Dimension BUTTON_BOTTOM_TOP_MARGIN = 10.0_vp; -constexpr Dimension LUNARSWITCH_HEIGHT = 48.0_vp; constexpr Dimension LUNAR_SWITCH_MIN_FONT_SIZE = 1.0_vp; constexpr uint32_t LUNAR_SWITCH_MAX_LINES = 1; -constexpr Dimension CHECKBOX_SIZE = 24.0_vp; constexpr Dimension TITLE_HEIGHT = 40.0_vp; constexpr Dimension TITLE_BUTTON_HEIGHT = 32.0_vp; constexpr Dimension TITLE_PADDING_HORIZONTAL = 16.0_vp; @@ -76,10 +74,18 @@ bool DatePickerDialogView::switchDatePickerFlag_ = false; bool DatePickerDialogView::isShowTime_ = false; bool DatePickerDialogView::isUserSetFont_ = false; bool DatePickerDialogView::isEnableHapticFeedback_ = true; +bool DatePickerDialogView::useButtonFocusArea_ = false; DatePickerMode DatePickerDialogView::datePickerMode_ = DatePickerMode::DATE; Dimension DatePickerDialogView::selectedTextStyleFont_ = 40.0_fp; Dimension DatePickerDialogView::normalTextStyleFont_ = 32.0_fp; Dimension DatePickerDialogView::disappearTextStyleFont_ = 28.0_fp; +Dimension DatePickerDialogView::checkboxSize_ = 24.0_vp; +Dimension DatePickerDialogView::lunarSwitchHeight_ = 48.0_vp; +Dimension DatePickerDialogView::checkboxPaddingLeft_ = 24.0_vp; +Dimension DatePickerDialogView::checkboxPaddingRight_ = 8.0_vp; +Dimension DatePickerDialogView::titlePaddingHorizontal_ = 16.0_vp; +Dimension DatePickerDialogView::titleMarginVertical_ = 8.0_vp; +Color DatePickerDialogView::buttonColor_ = Color::TRANSPARENT; RefPtr DatePickerDialogView::Show(const DialogProperties& dialogProperties, const DatePickerSettingData& settingData, const std::vector& buttonInfos, @@ -198,6 +204,12 @@ RefPtr DatePickerDialogView::CreateLunarSwitchTextNode() textLayoutProperty->UpdateLayoutWeight(RATIO_ONE); textLayoutProperty->UpdateFontSize(ConvertFontScaleValue(pickerTheme->GetLunarSwitchTextSize())); textLayoutProperty->UpdateTextColor(pickerTheme->GetLunarSwitchTextColor()); + if (useButtonFocusArea_) { + MarginProperty margin; + margin.left = CalcLength(5.0_vp); + margin.right = CalcLength(24.0_vp); + textLayoutProperty->UpdateMargin(margin); + } textNode->MarkModifyDone(); return textNode; } @@ -803,7 +815,7 @@ RefPtr DatePickerDialogView::CreateConfirmNode(const RefPtrGetRenderContext(); - buttonConfirmRenderContext->UpdateBackgroundColor(Color::TRANSPARENT); + buttonConfirmRenderContext->UpdateBackgroundColor(buttonColor_); UpdateButtonStyles(buttonInfos, ACCEPT_BUTTON_INDEX, buttonConfirmLayoutProperty, buttonConfirmRenderContext); UpdateButtonDefaultFocus(buttonInfos, buttonConfirmNode, true); textConfirmNode->MountToParent(buttonConfirmNode); @@ -830,7 +842,11 @@ void DatePickerDialogView::UpdateConfirmButtonTextLayoutProperty( { CHECK_NULL_VOID(textLayoutProperty); textLayoutProperty->UpdateContent(GetDialogNormalButtonText(true)); - textLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor()); + if (useButtonFocusArea_) { + textLayoutProperty->UpdateTextColor(pickerTheme->GetTitleStyle().GetTextColor()); + } else { + textLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor()); + } if (!NeedAdaptForAging()) { textLayoutProperty->UpdateMaxFontScale(pickerTheme->GetNormalFontScale()); } @@ -844,7 +860,11 @@ void DatePickerDialogView::UpdateCancelButtonTextLayoutProperty( { CHECK_NULL_VOID(textCancelLayoutProperty); textCancelLayoutProperty->UpdateContent(GetDialogNormalButtonText(false)); - textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor()); + if (useButtonFocusArea_) { + textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetTitleStyle().GetTextColor()); + } else { + textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor()); + } if (!NeedAdaptForAging()) { textCancelLayoutProperty->UpdateMaxFontScale(pickerTheme->GetNormalFontScale()); } @@ -1265,7 +1285,7 @@ RefPtr DatePickerDialogView::CreateCancelNode(NG::DialogGestureEvent& } auto buttonCancelRenderContext = buttonCancelNode->GetRenderContext(); - buttonCancelRenderContext->UpdateBackgroundColor(Color::TRANSPARENT); + buttonCancelRenderContext->UpdateBackgroundColor(buttonColor_); UpdateButtonStyles(buttonInfos, CANCEL_BUTTON_INDEX, buttonCancelLayoutProperty, buttonCancelRenderContext); UpdateButtonDefaultFocus(buttonInfos, buttonCancelNode, false); buttonCancelNode->MarkModifyDone(); @@ -1306,8 +1326,12 @@ void DatePickerDialogView::CreateLunarswitchNode(const RefPtr& conten layoutProps->UpdateMargin(margin); } layoutProps->UpdateUserDefinedIdealSize( - CalcSize(CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), CalcLength(LUNARSWITCH_HEIGHT))); - + CalcSize(CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), CalcLength(lunarSwitchHeight_))); + if (useButtonFocusArea_) { + MarginProperty margin; + margin.top = CalcLength(PICKER_MARGIN_FROM_CHECK_BOX); + layoutProps->UpdateMargin(margin); + } auto checkbox = FrameNode::CreateFrameNode( V2::CHECK_BOX_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr()); CHECK_NULL_VOID(checkbox); @@ -1323,12 +1347,10 @@ void DatePickerDialogView::CreateLunarswitchNode(const RefPtr& conten CHECK_NULL_VOID(checkboxLayoutProps); MarginProperty marginCheckbox; bool isRtl = AceApplicationInfo::GetInstance().IsRightToLeft(); - marginCheckbox.left = isRtl ? CalcLength(PICKER_MARGIN_FROM_TITLE_AND_BUTTON) - : CalcLength(PICKER_DIALOG_MARGIN_FORM_EDGE); - marginCheckbox.right = isRtl ? CalcLength(PICKER_DIALOG_MARGIN_FORM_EDGE) - : CalcLength(PICKER_MARGIN_FROM_TITLE_AND_BUTTON); + marginCheckbox.left = isRtl ? CalcLength(checkboxPaddingRight_) : CalcLength(checkboxPaddingLeft_); + marginCheckbox.right = isRtl ? CalcLength(checkboxPaddingLeft_) : CalcLength(checkboxPaddingRight_); checkboxLayoutProps->UpdateMargin(marginCheckbox); - checkboxLayoutProps->UpdateUserDefinedIdealSize(CalcSize(CalcLength(CHECKBOX_SIZE), CalcLength(CHECKBOX_SIZE))); + checkboxLayoutProps->UpdateUserDefinedIdealSize(CalcSize(CalcLength(checkboxSize_), CalcLength(checkboxSize_))); checkboxLayoutProps->UpdateLayoutWeight(RATIO_ZERO); checkbox->MarkModifyDone(); checkbox->MountToParent(contentRow); @@ -1611,12 +1633,12 @@ RefPtr DatePickerDialogView::CreateAndMountButtonTitleNode( auto layoutProps = buttonTitleNode->GetLayoutProperty(); CHECK_NULL_RETURN(layoutProps, nullptr); PaddingProperty padding; - padding.left = CalcLength(TITLE_PADDING_HORIZONTAL); - padding.right = CalcLength(TITLE_PADDING_HORIZONTAL); + padding.left = CalcLength(titlePaddingHorizontal_); + padding.right = CalcLength(titlePaddingHorizontal_); layoutProps->UpdatePadding(padding); MarginProperty margin; - margin.top = CalcLength(PICKER_MARGIN_FROM_TITLE_AND_BUTTON); - margin.bottom = CalcLength(PICKER_MARGIN_FROM_TITLE_AND_BUTTON); + margin.top = CalcLength(titleMarginVertical_); + margin.bottom = CalcLength(titleMarginVertical_); layoutProps->UpdateMargin(margin); layoutProps->UpdateUserDefinedIdealSize( CalcSize(CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), CalcLength(TITLE_HEIGHT))); @@ -2288,6 +2310,14 @@ void DatePickerDialogView::GetUserSettingLimit() selectedTextStyleFont_ = pickerTheme->GetUseSetSelectedTextStyle(); normalTextStyleFont_ = pickerTheme->GetUserSetNormalTextStyle(); disappearTextStyleFont_ = pickerTheme->GetUserSetDisappearTextStyle(); + checkboxSize_ = pickerTheme->GetCheckboxSize(); + lunarSwitchHeight_ = pickerTheme->GetLunarSwitchHeight(); + checkboxPaddingLeft_ = pickerTheme->GetCheckboxPaddingLeft(); + checkboxPaddingRight_ = pickerTheme->GetCheckboxPaddingRight(); + titlePaddingHorizontal_ = pickerTheme->GetTitlePaddingHorizontal(); + titleMarginVertical_ = pickerTheme->GetTitleMarginVertical(); + buttonColor_ = pickerTheme->GetButtonColor(); + useButtonFocusArea_ = pickerTheme->NeedButtonFocusAreaType(); } DialogEvent DatePickerDialogView::GetDateChangeEvent(const RefPtr& frameNode, diff --git a/frameworks/core/components_ng/pattern/picker/datepicker_dialog_view.h b/frameworks/core/components_ng/pattern/picker/datepicker_dialog_view.h index 197457ab831e546df0879418ebad61b383fb5f9f..a66d4bf2ab0d5cb59b1531abe5c228349768b7c2 100644 --- a/frameworks/core/components_ng/pattern/picker/datepicker_dialog_view.h +++ b/frameworks/core/components_ng/pattern/picker/datepicker_dialog_view.h @@ -190,6 +190,15 @@ private: static Dimension selectedTextStyleFont_; static Dimension normalTextStyleFont_; static Dimension disappearTextStyleFont_; + static Dimension titlePaddingHorizontal_; + static Dimension titleMarginVertical_; + static Color buttonColor_; + static bool useButtonFocusArea_; + + static Dimension checkboxSize_; + static Dimension lunarSwitchHeight_; + static Dimension checkboxPaddingLeft_; + static Dimension checkboxPaddingRight_; static DatePickerMode datePickerMode_; }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/picker/datepicker_pattern.cpp b/frameworks/core/components_ng/pattern/picker/datepicker_pattern.cpp index 0f40d52c308c5c173cf8b00a2a8e6a9c24263c1a..0844cbe1c76edca8227b098ca3bd04c30909748d 100644 --- a/frameworks/core/components_ng/pattern/picker/datepicker_pattern.cpp +++ b/frameworks/core/components_ng/pattern/picker/datepicker_pattern.cpp @@ -45,6 +45,7 @@ constexpr uint32_t MIN_MONTH = 1; constexpr uint32_t MAX_MONTH = 12; constexpr uint32_t MIN_DAY = 1; const Dimension PRESS_INTERVAL = 4.0_vp; +const Dimension FOCUS_RADIUS = 3.0_vp; const Dimension FOCUS_INTERVAL = 2.0_vp; const Dimension LINE_WIDTH = 1.5_vp; const Dimension PRESS_RADIUS = 8.0_vp; @@ -113,18 +114,17 @@ bool DatePickerPattern::OnDirtyLayoutWrapperSwap(const RefPtr& di auto buttonNode = DynamicCast(child->GetFirstChild()); CHECK_NULL_RETURN(buttonNode, false); auto buttonConfirmLayoutProperty = buttonNode->GetLayoutProperty(); - buttonConfirmLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS); - buttonConfirmLayoutProperty->UpdateType(ButtonType::NORMAL); - buttonConfirmLayoutProperty->UpdateBorderRadius(BorderRadiusProperty(selectorItemRadius_)); + UpdateButtonConfirmLayoutProperty(buttonConfirmLayoutProperty); auto standardButtonHeight = static_cast((height - PRESS_INTERVAL).ConvertToPx()); auto maxButtonHeight = static_cast(datePickerColumnNode->GetGeometryNode()->GetFrameSize().Height()); - auto buttonHeight = Dimension(std::min(standardButtonHeight, maxButtonHeight), DimensionUnit::PX); - buttonConfirmLayoutProperty->UpdateUserDefinedIdealSize( - CalcSize(CalcLength(width - buttonSpace.ConvertToPx()), CalcLength(buttonHeight))); auto buttonConfirmRenderContext = buttonNode->GetRenderContext(); if (!useButtonFocusArea_) { + auto buttonHeight = Dimension(std::min(standardButtonHeight, maxButtonHeight), DimensionUnit::PX); + buttonConfirmLayoutProperty->UpdateUserDefinedIdealSize( + CalcSize(CalcLength(width - buttonSpace.ConvertToPx()), CalcLength(buttonHeight))); buttonConfirmRenderContext->UpdateBackgroundColor(Color::TRANSPARENT); } else { + UpdateFocusStyles(pickerTheme, buttonConfirmLayoutProperty, height, maxButtonHeight, width); auto isFocusButton = haveFocus_ && (currentFocusButtonNode == buttonNode); UpdateColumnButtonStyles(columnNode, isFocusButton, false); } @@ -140,6 +140,28 @@ bool DatePickerPattern::OnDirtyLayoutWrapperSwap(const RefPtr& di return true; } +void DatePickerPattern::UpdateFocusStyles(const RefPtr& pickerTheme, + const RefPtr& buttonConfirmLayoutProperty, const Dimension& height, float maxButtonHeight, + float width) +{ + CHECK_NULL_VOID(pickerTheme); + CHECK_NULL_VOID(buttonConfirmLayoutProperty); + auto pickerPadding = pickerTheme->GetPickerPadding(); + auto standardButtonHeight = static_cast((height - pickerPadding * RATE).ConvertToPx()); + auto buttonHeight = Dimension(std::min(standardButtonHeight, maxButtonHeight), DimensionUnit::PX); + buttonConfirmLayoutProperty->UpdateUserDefinedIdealSize( + CalcSize(CalcLength(width - pickerPadding.ConvertToPx() * RATE), CalcLength(buttonHeight))); +} + +void DatePickerPattern::UpdateButtonConfirmLayoutProperty( + const RefPtr& buttonConfirmLayoutProperty) +{ + CHECK_NULL_VOID(buttonConfirmLayoutProperty); + buttonConfirmLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS); + buttonConfirmLayoutProperty->UpdateType(ButtonType::NORMAL); + buttonConfirmLayoutProperty->UpdateBorderRadius(BorderRadiusProperty(selectorItemRadius_)); +} + void DatePickerPattern::InitSelectorProps() { auto host = GetHost(); @@ -287,18 +309,38 @@ void DatePickerPattern::GetInnerFocusButtonPaintRect(RoundRect& paintRect, float focusButtonRect += OffsetF(focusButtonXOffset, 0); paintRect.SetRect(focusButtonRect); - paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_LEFT_POS, - static_cast(selectorItemRadius_.ConvertToPx()), - static_cast(selectorItemRadius_.ConvertToPx())); - paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_RIGHT_POS, - static_cast(selectorItemRadius_.ConvertToPx()), - static_cast(selectorItemRadius_.ConvertToPx())); - paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_LEFT_POS, - static_cast(selectorItemRadius_.ConvertToPx()), - static_cast(selectorItemRadius_.ConvertToPx())); - paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_RIGHT_POS, - static_cast(selectorItemRadius_.ConvertToPx()), - static_cast(selectorItemRadius_.ConvertToPx())); + UpdateFocusButtonCornerRadius(paintRect); +} + +void DatePickerPattern::UpdateFocusButtonCornerRadius(RoundRect& paintRect) +{ + if (!useButtonFocusArea_) { + paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_LEFT_POS, + static_cast(selectorItemRadius_.ConvertToPx()), + static_cast(selectorItemRadius_.ConvertToPx())); + paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_RIGHT_POS, + static_cast(selectorItemRadius_.ConvertToPx()), + static_cast(selectorItemRadius_.ConvertToPx())); + paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_LEFT_POS, + static_cast(selectorItemRadius_.ConvertToPx()), + static_cast(selectorItemRadius_.ConvertToPx())); + paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_RIGHT_POS, + static_cast(selectorItemRadius_.ConvertToPx()), + static_cast(selectorItemRadius_.ConvertToPx())); + } else { + paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_LEFT_POS, + static_cast((selectorItemRadius_ + FOCUS_RADIUS).ConvertToPx()), + static_cast((selectorItemRadius_ + FOCUS_RADIUS).ConvertToPx())); + paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_RIGHT_POS, + static_cast((selectorItemRadius_ + FOCUS_RADIUS).ConvertToPx()), + static_cast((selectorItemRadius_ + FOCUS_RADIUS).ConvertToPx())); + paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_LEFT_POS, + static_cast((selectorItemRadius_ + FOCUS_RADIUS).ConvertToPx()), + static_cast((selectorItemRadius_ + FOCUS_RADIUS).ConvertToPx())); + paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_RIGHT_POS, + static_cast((selectorItemRadius_ + FOCUS_RADIUS).ConvertToPx()), + static_cast((selectorItemRadius_ + FOCUS_RADIUS).ConvertToPx())); + } } void DatePickerPattern::ColumnPatternInitHapticController() diff --git a/frameworks/core/components_ng/pattern/picker/datepicker_pattern.h b/frameworks/core/components_ng/pattern/picker/datepicker_pattern.h index 980b8dfc7b876a69b032578e291866f0971de2c6..9d5f672040df34ca1a89c95f940f0c4de249f355 100644 --- a/frameworks/core/components_ng/pattern/picker/datepicker_pattern.h +++ b/frameworks/core/components_ng/pattern/picker/datepicker_pattern.h @@ -41,6 +41,7 @@ namespace { const Dimension FOCUS_PAINT_WIDTH = 2.0_vp; constexpr Dimension PICKER_DIALOG_MARGIN_FORM_EDGE = 24.0_vp; constexpr Dimension PICKER_MARGIN_FROM_TITLE_AND_BUTTON = 8.0_vp; +constexpr Dimension PICKER_MARGIN_FROM_CHECK_BOX = 9.0_vp; } class DatePickerPattern : public LinearLayoutPattern { @@ -831,6 +832,11 @@ private: void UpdateFocusButtonState(); void SetHaveFocus(bool haveFocus); void UpdateColumnButtonStyles(const RefPtr& columnNode, bool haveFocus, bool needMarkDirty); + void UpdateFocusStyles(const RefPtr& pickerTheme, + const RefPtr& buttonConfirmLayoutProperty, const Dimension& height, float maxButtonHeight, + float width); + void UpdateButtonConfirmLayoutProperty(const RefPtr& buttonConfirmLayoutProperty); + void UpdateFocusButtonCornerRadius(RoundRect& paintRect); PickerDate GetCurrentDateByMonthDaysColumn() const; PickerDate GetCurrentDateByYearMonthDayColumn() const; void OrderCurrentDateByYearMonthDayColumn( diff --git a/frameworks/core/components_ng/pattern/text_picker/textpicker_column_pattern.cpp b/frameworks/core/components_ng/pattern/text_picker/textpicker_column_pattern.cpp index a55221b516a41084c8b32190de812b251fcf1dec..ccb1bb139ba3d0f3476eb97591decc44d4e780d2 100644 --- a/frameworks/core/components_ng/pattern/text_picker/textpicker_column_pattern.cpp +++ b/frameworks/core/components_ng/pattern/text_picker/textpicker_column_pattern.cpp @@ -327,7 +327,7 @@ void TextPickerColumnPattern::UpdateTextAreaPadding(const RefPtr& p const RefPtr& textLayoutProperty) { if (useButtonFocusArea_) { - auto padding = pickerTheme->GetSelectorItemSpace(); + auto padding = 16.0_vp; PaddingProperty defaultPadding = { CalcLength(padding), CalcLength(padding), CalcLength(0.0_vp), CalcLength(0.0_vp) }; textLayoutProperty->UpdatePadding(defaultPadding); diff --git a/frameworks/core/components_ng/pattern/text_picker/textpicker_dialog_view.cpp b/frameworks/core/components_ng/pattern/text_picker/textpicker_dialog_view.cpp index 53616168ea05863ff9a15eb0bfd54db97500ce54..a5b05dfcc1694ca7a9161eb41b6f563b3f692e79 100644 --- a/frameworks/core/components_ng/pattern/text_picker/textpicker_dialog_view.cpp +++ b/frameworks/core/components_ng/pattern/text_picker/textpicker_dialog_view.cpp @@ -49,9 +49,11 @@ constexpr size_t FORWAED_BUTTON_INDEX = 3; WeakPtr TextPickerDialogView::dialogNode_ = nullptr; uint32_t dialogNodePage = 0; uint32_t totalPageNum_ = 0; +bool TextPickerDialogView::useButtonFocusArea_ = false; Dimension TextPickerDialogView::selectedTextStyleFont_ = 40.0_fp; Dimension TextPickerDialogView::normalTextStyleFont_ = 32.0_fp; Dimension TextPickerDialogView::disappearTextStyleFont_ = 28.0_fp; +Color TextPickerDialogView::buttonColor_ = Color::TRANSPARENT; RefPtr TextPickerDialogView::Show(const DialogProperties& dialogProperties, const TextPickerSettingData& settingData, const std::vector& buttonInfos, @@ -558,7 +560,7 @@ RefPtr TextPickerDialogView::CreateConfirmNode(const RefPtrSetStateEffect(true); UpdateButtonConfirmLayoutProperty(buttonConfirmNode, pickerTheme); auto buttonConfirmRenderContext = buttonConfirmNode->GetRenderContext(); - buttonConfirmRenderContext->UpdateBackgroundColor(Color::TRANSPARENT); + buttonConfirmRenderContext->UpdateBackgroundColor(buttonColor_); auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty(); CHECK_NULL_RETURN(buttonConfirmLayoutProperty, nullptr); UpdateButtonStyles(buttonInfos, ACCEPT_BUTTON_INDEX, buttonConfirmLayoutProperty, buttonConfirmRenderContext); @@ -595,7 +597,11 @@ void TextPickerDialogView::UpdateConfirmButtonTextLayoutProperty( auto textLayoutProperty = textConfirmNode->GetLayoutProperty(); CHECK_NULL_VOID(textLayoutProperty); textLayoutProperty->UpdateContent(GetDialogNormalButtonText(true)); - textLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor()); + if (useButtonFocusArea_) { + textLayoutProperty->UpdateTextColor(pickerTheme->GetTitleStyle().GetTextColor()); + } else { + textLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor()); + } if (!NeedAdaptForAging()) { textLayoutProperty->UpdateMaxFontScale(pickerTheme->GetNormalFontScale()); } @@ -610,7 +616,11 @@ void TextPickerDialogView::UpdateCancelButtonTextLayoutProperty( auto textCancelLayoutProperty = textCancelNode->GetLayoutProperty(); CHECK_NULL_VOID(textCancelLayoutProperty); textCancelLayoutProperty->UpdateContent(GetDialogNormalButtonText(false)); - textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor()); + if (useButtonFocusArea_) { + textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetTitleStyle().GetTextColor()); + } else { + textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor()); + } if (!NeedAdaptForAging()) { textCancelLayoutProperty->UpdateMaxFontScale(pickerTheme->GetNormalFontScale()); } @@ -849,7 +859,7 @@ RefPtr TextPickerDialogView::CreateCancelNode(NG::DialogGestureEvent& UpdateButtonCancelLayoutProperty(buttonCancelNode, pipeline); auto buttonCancelRenderContext = buttonCancelNode->GetRenderContext(); - buttonCancelRenderContext->UpdateBackgroundColor(Color::TRANSPARENT); + buttonCancelRenderContext->UpdateBackgroundColor(buttonColor_); auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty(); UpdateButtonStyles(buttonInfos, CANCEL_BUTTON_INDEX, buttonCancelLayoutProperty, buttonCancelRenderContext); UpdateButtonDefaultFocus(buttonInfos, buttonCancelNode, false); @@ -1716,6 +1726,8 @@ void TextPickerDialogView::GetUserSettingLimit() selectedTextStyleFont_ = pickerTheme->GetUseSetSelectedTextStyle(); normalTextStyleFont_ = pickerTheme->GetUserSetNormalTextStyle(); disappearTextStyleFont_ = pickerTheme->GetUserSetDisappearTextStyle(); + buttonColor_ = pickerTheme->GetButtonColor(); + useButtonFocusArea_ = pickerTheme->NeedButtonFocusAreaType(); } std::string TextPickerDialogView::GetDialogAgingButtonText(bool isNext) diff --git a/frameworks/core/components_ng/pattern/text_picker/textpicker_dialog_view.h b/frameworks/core/components_ng/pattern/text_picker/textpicker_dialog_view.h index f2fdc73c12db89319239bb4f4f6510f1f0314acf..01dd31b6abef3a7c3efc066613aeaf2740844d2d 100644 --- a/frameworks/core/components_ng/pattern/text_picker/textpicker_dialog_view.h +++ b/frameworks/core/components_ng/pattern/text_picker/textpicker_dialog_view.h @@ -162,6 +162,8 @@ private: static Dimension selectedTextStyleFont_; static Dimension normalTextStyleFont_; static Dimension disappearTextStyleFont_; + static Color buttonColor_; + static bool useButtonFocusArea_; }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/text_picker/textpicker_pattern.cpp b/frameworks/core/components_ng/pattern/text_picker/textpicker_pattern.cpp index 29d4375e1f559b821019c47ca88e9607f1e032a8..ee68c5c544fd89dfd80086f0454ffcee056d8dd6 100644 --- a/frameworks/core/components_ng/pattern/text_picker/textpicker_pattern.cpp +++ b/frameworks/core/components_ng/pattern/text_picker/textpicker_pattern.cpp @@ -54,6 +54,7 @@ const int32_t INVISIBLE_OPTIONS_COUNT = 2; constexpr float PICKER_MAXFONTSCALE = 1.0f; constexpr uint32_t PRECISION_TWO = 2; constexpr float DEFAULT_SIZE_ZERO = 0.0f; +const Dimension PICKER_BUTTON_PADDING = 6.0_vp; } // namespace void TextPickerPattern::OnAttachToFrameNode() @@ -268,11 +269,26 @@ void TextPickerPattern::CalculateButtonMetrics(RefPtr child, RefPtrGetSelectorItemSpace() : PRESS_INTERVAL * RATE; - if (children.size() == 1 && useButtonFocusArea_) { - buttonSpace = PRESS_INTERVAL * RATE; + if (useButtonFocusArea_) { + auto columnNode = DynamicCast(child->GetChildAtIndex(1)); + CHECK_NULL_VOID(columnNode); + auto columnChildNode = DynamicCast(columnNode->GetChildAtIndex(0)); + CHECK_NULL_VOID(columnChildNode); + auto selectedTextNode = DynamicCast(columnChildNode->GetChildAtIndex(2)); + CHECK_NULL_VOID(selectedTextNode); + width = selectedTextNode->GetGeometryNode()->GetFrameSize().Width(); + buttonSpace = PICKER_BUTTON_PADDING * RATE; + buttonLayoutProperty->UpdateUserDefinedIdealSize(CalcSize( + CalcLength(width - buttonSpace.ConvertToPx()), CalcLength(CalculateHeight() - buttonSpace.ConvertToPx()))); + if (GetIsShowInDialog()) { + MarginProperty margin; + margin.top = CalcLength(26.0_vp); + layoutProperty->UpdateMargin(margin); + } + } else { + buttonLayoutProperty->UpdateUserDefinedIdealSize( + CalcSize(CalcLength(width - buttonSpace.ConvertToPx()), CalcLength(buttonHeight))); } - buttonLayoutProperty->UpdateUserDefinedIdealSize( - CalcSize(CalcLength(width - buttonSpace.ConvertToPx()), CalcLength(buttonHeight))); } void TextPickerPattern::InitSelectorProps() diff --git a/frameworks/core/components_ng/pattern/time_picker/timepicker_column_pattern.cpp b/frameworks/core/components_ng/pattern/time_picker/timepicker_column_pattern.cpp index 8ebff0e570b59189f0e68fe9a8d49972ef97ab15..2bd9148adabd553efcf830473604f37d2a3a3e4b 100644 --- a/frameworks/core/components_ng/pattern/time_picker/timepicker_column_pattern.cpp +++ b/frameworks/core/components_ng/pattern/time_picker/timepicker_column_pattern.cpp @@ -63,46 +63,53 @@ void TimePickerColumnPattern::OnModifyDone() CHECK_NULL_VOID(theme); pressColor_ = theme->GetPressColor(); hoverColor_ = theme->GetHoverColor(); + useButtonFocusArea_ = theme->NeedButtonFocusAreaType(); + InitSelectorButtonProperties(theme); auto showCount = GetShowCount(); InitOnKeyEvent(focusHub); InitMouseAndPressEvent(); SetAccessibilityAction(); if (optionProperties_.empty()) { - auto midIndex = showCount / 2; auto host = GetHost(); CHECK_NULL_VOID(host); dividerSpacing_ = pipeline->NormalizeToPx(theme->GetDividerSpacing()); gradientHeight_ = static_cast(pipeline->NormalizeToPx(theme->GetGradientHeight())); - MeasureContext measureContext; - measureContext.textContent = MEASURE_SIZE_STRING; - uint32_t childIndex = 0; - PickerOptionProperty prop; - while (childIndex < showCount) { - if (childIndex == midIndex) { // selected - auto selectedOptionSize = theme->GetOptionStyle(true, false).GetFontSize(); - measureContext.fontSize = selectedOptionSize; - } else if ((childIndex == (midIndex + 1)) || (childIndex == (midIndex - 1))) { - auto focusOptionSize = theme->GetOptionStyle(false, false).GetFontSize() + FONT_SIZE; - measureContext.fontSize = focusOptionSize; - } else { - auto normalOptionSize = theme->GetOptionStyle(false, false).GetFontSize(); - measureContext.fontSize = normalOptionSize; - } - if (childIndex == midIndex) { - prop.height = dividerSpacing_; - } else { - prop.height = gradientHeight_; - } - Size size = MeasureUtil::MeasureTextSize(measureContext); - prop.fontheight = size.Height(); - optionProperties_.emplace_back(prop); - childIndex++; - } + UpdateOptionProperties(showCount, theme); SetOptionShiftDistance(); } InitHapticController(host); } +void TimePickerColumnPattern::UpdateOptionProperties(uint32_t showCount, const RefPtr& theme) +{ + auto midIndex = showCount / 2; + MeasureContext measureContext; + measureContext.textContent = MEASURE_SIZE_STRING; + uint32_t childIndex = 0; + PickerOptionProperty prop; + while (childIndex < showCount) { + if (childIndex == midIndex) { // selected + auto selectedOptionSize = theme->GetOptionStyle(true, false).GetFontSize(); + measureContext.fontSize = selectedOptionSize; + } else if ((childIndex == (midIndex + 1)) || (childIndex == (midIndex - 1))) { + auto focusOptionSize = theme->GetOptionStyle(false, false).GetFontSize() + FONT_SIZE; + measureContext.fontSize = focusOptionSize; + } else { + auto normalOptionSize = theme->GetOptionStyle(false, false).GetFontSize(); + measureContext.fontSize = normalOptionSize; + } + if (childIndex == midIndex) { + prop.height = dividerSpacing_; + } else { + prop.height = gradientHeight_; + } + Size size = MeasureUtil::MeasureTextSize(measureContext); + prop.fontheight = size.Height(); + optionProperties_.emplace_back(prop); + childIndex++; + } +} + void TimePickerColumnPattern::InitHapticController(const RefPtr& host) { CHECK_NULL_VOID(host); @@ -674,4 +681,114 @@ std::string TimePickerColumnPattern::GetCurrentOption() const } return ""; } + +void TimePickerColumnPattern::InitSelectorButtonProperties(const RefPtr& pickerTheme) +{ + CHECK_NULL_VOID(pickerTheme); + if (useButtonFocusArea_) { + buttonDefaultBgColor_ = pickerTheme->GetSelectorItemNormalBgColor(); + buttonFocusBgColor_ = pickerTheme->GetSelectorItemFocusBgColor(); + buttonDefaultBorderColor_ = pickerTheme->GetSelectorItemBorderColor(); + buttonFocusBorderColor_ = pickerTheme->GetSelectorItemFocusBorderColor(); + selectorTextFocusColor_ = pickerTheme->GetOptionStyle(true, true).GetTextColor(); + pressColor_ = buttonDefaultBgColor_.BlendColor(pickerTheme->GetPressColor()); + hoverColor_ = buttonDefaultBgColor_.BlendColor(pickerTheme->GetHoverColor()); + buttonFocusBorderWidth_ = pickerTheme->GetSelectorItemFocusBorderWidth(); + buttonDefaultBorderWidth_ = pickerTheme->GetSelectorItemBorderWidth(); + } +} + +const Color& TimePickerColumnPattern::GetButtonHoverColor() const +{ + return useButtonFocusArea_ && isFocusColumn_ ? buttonFocusBgColor_ : hoverColor_; +} + +void TimePickerColumnPattern::UpdateColumnButtonFocusState(bool haveFocus, bool needMarkDirty) +{ + auto isInitUpdate = isFirstTimeUpdateButtonProps_ && !haveFocus; + auto isFocusChanged = isFocusColumn_ != haveFocus; + + if (isFocusChanged || isInitUpdate) { + isFocusColumn_ = haveFocus; + UpdateSelectorButtonProps(isFocusColumn_, needMarkDirty); + } + if (isFocusChanged) { + FlushCurrentOptions(); + } + if (isInitUpdate) { + isFirstTimeUpdateButtonProps_ = false; + } +} + +void TimePickerColumnPattern::UpdateSelectorButtonProps(bool haveFocus, bool needMarkDirty) +{ + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto blend = host->GetParent(); + CHECK_NULL_VOID(blend); + auto stack = blend->GetParent(); + CHECK_NULL_VOID(stack); + auto buttonNode = DynamicCast(stack->GetFirstChild()); + CHECK_NULL_VOID(buttonNode); + auto buttonLayoutProperty = buttonNode->GetLayoutProperty(); + CHECK_NULL_VOID(buttonLayoutProperty); + auto renderContext = buttonNode->GetRenderContext(); + CHECK_NULL_VOID(renderContext); + + BorderWidthProperty borderWidth; + BorderColorProperty borderColor; + + if (haveFocus) { + buttonBgColor_ = buttonFocusBgColor_; + borderWidth.SetBorderWidth(buttonFocusBorderWidth_); + borderColor.SetColor(buttonFocusBorderColor_); + } else { + buttonBgColor_ = buttonDefaultBgColor_; + borderWidth.SetBorderWidth(buttonDefaultBorderWidth_); + borderColor.SetColor(buttonDefaultBorderColor_); + } + buttonLayoutProperty->UpdateBorderWidth(borderWidth); + renderContext->UpdateBorderColor(borderColor); + renderContext->UpdateBackgroundColor(buttonBgColor_); + + if (needMarkDirty) { + buttonNode->MarkModifyDone(); + buttonNode->MarkDirtyNode(); + } +} + +void TimePickerColumnPattern::UpdateDisappearTextProperties(const RefPtr& pickerTheme, + const RefPtr& textLayoutProperty, + const RefPtr& pickerLayoutProperty) +{ + UpdateTextAreaPadding(pickerTheme, textLayoutProperty); + PickerColumnPattern::UpdateDisappearTextProperties(pickerTheme, textLayoutProperty, pickerLayoutProperty); +} + +void TimePickerColumnPattern::UpdateCandidateTextProperties(const RefPtr& pickerTheme, + const RefPtr& textLayoutProperty, + const RefPtr& pickerLayoutProperty) +{ + UpdateTextAreaPadding(pickerTheme, textLayoutProperty); + PickerColumnPattern::UpdateCandidateTextProperties(pickerTheme, textLayoutProperty, pickerLayoutProperty); +} + +void TimePickerColumnPattern::UpdateSelectedTextProperties(const RefPtr& pickerTheme, + const RefPtr& textLayoutProperty, + const RefPtr& pickerLayoutProperty) +{ + UpdateTextAreaPadding(pickerTheme, textLayoutProperty); + PickerColumnPattern::UpdateSelectedTextProperties(pickerTheme, textLayoutProperty, pickerLayoutProperty); +} + +void TimePickerColumnPattern::UpdateTextAreaPadding( + const RefPtr& pickerTheme, const RefPtr& textLayoutProperty) +{ + if (useButtonFocusArea_) { + auto padding = 22.0_vp; + PaddingProperty defaultPadding = { CalcLength(padding), CalcLength(padding), CalcLength(0.0_vp), + CalcLength(0.0_vp) }; + textLayoutProperty->UpdatePadding(defaultPadding); + } +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/time_picker/timepicker_column_pattern.h b/frameworks/core/components_ng/pattern/time_picker/timepicker_column_pattern.h index f69a24b3cc06cbe53512ad71f6292f5d526d0439..a6dffeec59015f04f91e44fed74ba8ba8a762f68 100644 --- a/frameworks/core/components_ng/pattern/time_picker/timepicker_column_pattern.h +++ b/frameworks/core/components_ng/pattern/time_picker/timepicker_column_pattern.h @@ -137,10 +137,7 @@ public: enterSelectedAreaEventCallback_ = value; } - const Color& GetButtonHoverColor() const override - { - return hoverColor_; - } + const Color& GetButtonHoverColor() const override; const Color& GetButtonBgColor() const override { @@ -153,6 +150,8 @@ public: } std::string GetCurrentOption() const override; + + void UpdateColumnButtonFocusState(bool haveFocus, bool needMarkDirty); bool GetCanLoopFromLayoutProperty() const override; @@ -166,6 +165,8 @@ private: const RefPtr& timePickerLayoutProperty); void InitOnKeyEvent(const RefPtr& focusHub); + void InitSelectorButtonProperties(const RefPtr& pickerTheme); + void UpdateSelectorButtonProps(bool haveFocus, bool needMarkDirty); bool OnKeyEvent(const KeyEvent& event); bool HandleDirectionKey(KeyCode code); void UpdateSelectedTextColor(const RefPtr& pickerTheme) override; @@ -178,10 +179,23 @@ private: uint32_t showCount, bool isDown, double scale) override; void InitTextFontFamily() override; void HandleEnterSelectedArea(double scrollDelta, float shiftDistance, PickerScrollDirection dir) override; + void UpdateDisappearTextProperties(const RefPtr& pickerTheme, + const RefPtr& textLayoutProperty, + const RefPtr& pickerLayoutProperty) override; + void UpdateCandidateTextProperties(const RefPtr& pickerTheme, + const RefPtr& textLayoutProperty, + const RefPtr& pickerLayoutProperty) override; + void UpdateSelectedTextProperties(const RefPtr& pickerTheme, + const RefPtr& textLayoutProperty, + const RefPtr& pickerLayoutProperty) override; + void UpdateTextAreaPadding( + const RefPtr& pickerTheme, const RefPtr& textLayoutProperty); + void UpdateOptionProperties(uint32_t showCount, const RefPtr& theme); Color pressColor_; Color hoverColor_; Color buttonBgColor_ = Color::TRANSPARENT; + Color buttonFocusBgColor_ = Color::TRANSPARENT; bool hour24_ = SystemProperties::Is24HourClock(); // column options number std::map, uint32_t> optionsTotalCount_; @@ -198,6 +212,15 @@ private: bool hasUserDefinedNormalFontFamily_ = false; bool hasUserDefinedSelectedFontFamily_ = false; bool isTossReadyToStop_ = false; + Color buttonDefaultBgColor_ = Color::TRANSPARENT; + Color buttonDefaultBorderColor_ = Color::TRANSPARENT; + Color buttonFocusBorderColor_ = Color::TRANSPARENT; + Color selectorTextFocusColor_ = Color::WHITE; + Dimension buttonDefaultBorderWidth_ = 0.0_vp; + Dimension buttonFocusBorderWidth_ = 0.0_vp; + bool isFirstTimeUpdateButtonProps_ = true; + bool useButtonFocusArea_ = false; + bool isFocusColumn_ = false; ACE_DISALLOW_COPY_AND_MOVE(TimePickerColumnPattern); friend class PickerColumnPatternCircleUtils; }; diff --git a/frameworks/core/components_ng/pattern/time_picker/timepicker_dialog_view.cpp b/frameworks/core/components_ng/pattern/time_picker/timepicker_dialog_view.cpp index a77f6b91bb0921bef92e420df0a553b8d06cccee..7dd362717beef5bfda2c55763dda4b6b51fd15f9 100644 --- a/frameworks/core/components_ng/pattern/time_picker/timepicker_dialog_view.cpp +++ b/frameworks/core/components_ng/pattern/time_picker/timepicker_dialog_view.cpp @@ -38,9 +38,11 @@ constexpr size_t ACCEPT_BUTTON_INDEX = 0; constexpr size_t CANCEL_BUTTON_INDEX = 1; } // namespace thread_local bool TimePickerDialogView::switchFlag_ = false; +thread_local bool TimePickerDialogView::useButtonFocusArea_ = false; thread_local Dimension TimePickerDialogView::selectedTextStyleFont_ = 40.0_fp; thread_local Dimension TimePickerDialogView::normalTextStyleFont_ = 32.0_fp; thread_local Dimension TimePickerDialogView::disappearTextStyleFont_ = 28.0_fp; +thread_local Color TimePickerDialogView::buttonColor_ = Color::TRANSPARENT; RefPtr TimePickerDialogView::Show(const DialogProperties& dialogProperties, const TimePickerSettingData& settingData, const std::vector& buttonInfos, @@ -677,7 +679,7 @@ RefPtr TimePickerDialogView::CreateConfirmNode(const RefPtrGetRenderContext(); - buttonConfirmRenderContext->UpdateBackgroundColor(Color::TRANSPARENT); + buttonConfirmRenderContext->UpdateBackgroundColor(buttonColor_); UpdateButtonStyles(buttonInfos, ACCEPT_BUTTON_INDEX, buttonConfirmLayoutProperty, buttonConfirmRenderContext); UpdateButtonDefaultFocus(buttonInfos, buttonConfirmNode, true); @@ -746,7 +748,11 @@ void TimePickerDialogView::UpdateConfirmButtonTextLayoutProperty( { CHECK_NULL_VOID(textLayoutProperty); textLayoutProperty->UpdateContent(GetDialogNormalButtonText(true)); - textLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor()); + if (useButtonFocusArea_) { + textLayoutProperty->UpdateTextColor(pickerTheme->GetTitleStyle().GetTextColor()); + } else { + textLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor()); + } if (!NeedAdaptForAging()) { textLayoutProperty->UpdateMaxFontScale(pickerTheme->GetNormalFontScale()); } @@ -816,7 +822,7 @@ RefPtr TimePickerDialogView::CreateCancelNode(NG::DialogGestureEvent& } auto buttonCancelRenderContext = buttonCancelNode->GetRenderContext(); - buttonCancelRenderContext->UpdateBackgroundColor(Color::TRANSPARENT); + buttonCancelRenderContext->UpdateBackgroundColor(buttonColor_); UpdateButtonStyles(buttonInfos, CANCEL_BUTTON_INDEX, buttonCancelLayoutProperty, buttonCancelRenderContext); UpdateButtonDefaultFocus(buttonInfos, buttonCancelNode, false); buttonCancelNode->MarkModifyDone(); @@ -828,7 +834,11 @@ void TimePickerDialogView::UpdateCancelButtonTextLayoutProperty( { CHECK_NULL_VOID(textCancelLayoutProperty); textCancelLayoutProperty->UpdateContent(GetDialogNormalButtonText(false)); - textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor()); + if (useButtonFocusArea_) { + textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetTitleStyle().GetTextColor()); + } else { + textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor()); + } if (!NeedAdaptForAging()) { textCancelLayoutProperty->UpdateMaxFontScale(pickerTheme->GetNormalFontScale()); } @@ -1211,6 +1221,8 @@ void TimePickerDialogView::GetUserSettingLimit() selectedTextStyleFont_ = pickerTheme->GetUseSetSelectedTextStyle(); normalTextStyleFont_ = pickerTheme->GetUserSetNormalTextStyle(); disappearTextStyleFont_ = pickerTheme->GetUserSetDisappearTextStyle(); + buttonColor_ = pickerTheme->GetButtonColor(); + useButtonFocusArea_ = pickerTheme->NeedButtonFocusAreaType(); } void TimePickerDialogView::SetEnableCascade( diff --git a/frameworks/core/components_ng/pattern/time_picker/timepicker_dialog_view.h b/frameworks/core/components_ng/pattern/time_picker/timepicker_dialog_view.h index 360a6109d3c648e3d109fb5065db6fac8faa5cce..b155703416bba7b405813cfbc632f9fef6e23db6 100644 --- a/frameworks/core/components_ng/pattern/time_picker/timepicker_dialog_view.h +++ b/frameworks/core/components_ng/pattern/time_picker/timepicker_dialog_view.h @@ -115,6 +115,8 @@ private: static thread_local Dimension selectedTextStyleFont_; static thread_local Dimension normalTextStyleFont_; static thread_local Dimension disappearTextStyleFont_; + static thread_local Color buttonColor_; + static thread_local bool useButtonFocusArea_; }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/time_picker/timepicker_row_pattern.cpp b/frameworks/core/components_ng/pattern/time_picker/timepicker_row_pattern.cpp index ce143aba72819a035b4c08276618e306600461b8..6a460377b34a9ba5b0089aca3e6e82a70b451e11 100644 --- a/frameworks/core/components_ng/pattern/time_picker/timepicker_row_pattern.cpp +++ b/frameworks/core/components_ng/pattern/time_picker/timepicker_row_pattern.cpp @@ -46,6 +46,7 @@ const int32_t CHILD_INDEX_SECOND = 1; const int32_t CHILD_INDEX_THIRD = 2; const int32_t CHILD_INDEX_FOURTH = 3; constexpr float DISABLE_ALPHA = 0.6f; +const Dimension FOCUS_RADIUS = 3.0_vp; const Dimension FOCUS_INTERVAL = 2.0_vp; const Dimension LINE_WIDTH = 1.5_vp; const int32_t RATE = 2; @@ -96,6 +97,10 @@ void TimePickerRowPattern::SetButtonIdeaSize() CHECK_NULL_VOID(pickerTheme); auto children = host->GetChildren(); auto height = pickerTheme->GetDividerSpacing(); + auto currentFocusStackChild = DynamicCast(host->GetChildAtIndex(focusKeyID_)); + CHECK_NULL_VOID(currentFocusStackChild); + auto currentFocusButtonNode = DynamicCast(currentFocusStackChild->GetFirstChild()); + CHECK_NULL_VOID(currentFocusButtonNode); for (const auto& child : children) { auto childNode = DynamicCast(child); CHECK_NULL_VOID(childNode); @@ -109,16 +114,19 @@ void TimePickerRowPattern::SetButtonIdeaSize() auto columnNodeHeight = timePickerColumnNode->GetGeometryNode()->GetFrameSize().Height(); auto buttonNode = DynamicCast(child->GetFirstChild()); auto buttonLayoutProperty = buttonNode->GetLayoutProperty(); - buttonLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS); - buttonLayoutProperty->UpdateType(ButtonType::NORMAL); - buttonLayoutProperty->UpdateBorderRadius(BorderRadiusProperty(PRESS_RADIUS)); + UpdateButtonConfirmLayoutProperty(buttonLayoutProperty); auto standardButtonHeight = static_cast((height - PRESS_INTERVAL).ConvertToPx()); auto maxButtonHeight = static_cast(columnNodeHeight); auto buttonHeight = Dimension(std::min(standardButtonHeight, maxButtonHeight), DimensionUnit::PX); - buttonLayoutProperty->UpdateUserDefinedIdealSize( - CalcSize(CalcLength(width - PRESS_INTERVAL.ConvertToPx()), CalcLength(buttonHeight))); auto buttonConfirmRenderContext = buttonNode->GetRenderContext(); - buttonConfirmRenderContext->UpdateBackgroundColor(Color::TRANSPARENT); + if (!useButtonFocusArea_) { + buttonLayoutProperty->UpdateUserDefinedIdealSize( + CalcSize(CalcLength(width - PRESS_INTERVAL.ConvertToPx()), CalcLength(buttonHeight))); + buttonConfirmRenderContext->UpdateBackgroundColor(Color::TRANSPARENT); + } else { + auto isFocusButton = haveFocus_ && (currentFocusButtonNode == buttonNode); + UpdateFocusStyles(buttonLayoutProperty, timePickerColumnNode, height, isFocusButton); + } buttonNode->MarkModifyDone(); buttonNode->MarkDirtyNode(); if (GetIsShowInDialog() && GreatNotEqual(standardButtonHeight, maxButtonHeight) && @@ -130,6 +138,115 @@ void TimePickerRowPattern::SetButtonIdeaSize() } } +void TimePickerRowPattern::UpdateFocusStyles(const RefPtr& buttonLayoutProperty, + const RefPtr& timePickerColumnNode, const Dimension& height, bool isFocusButton) +{ + auto columnNode = DynamicCast(timePickerColumnNode->GetLastChild()); + CHECK_NULL_VOID(columnNode); + auto width = columnNode->GetGeometryNode()->GetFrameSize().Width(); + auto maxButtonHeight = static_cast(timePickerColumnNode->GetGeometryNode()->GetFrameSize().Height()); + auto standardButtonHeight = static_cast((height - pickerPadding_ * RATE).ConvertToPx()); + auto buttonHeight = Dimension(std::min(standardButtonHeight, maxButtonHeight), DimensionUnit::PX); + buttonLayoutProperty->UpdateUserDefinedIdealSize( + CalcSize(CalcLength(width - (pickerPadding_ * RATE).ConvertToPx()), CalcLength(buttonHeight))); + UpdateColumnButtonStyles(columnNode, isFocusButton, false); +} + +void TimePickerRowPattern::UpdateButtonConfirmLayoutProperty(const RefPtr& buttonLayoutProperty) +{ + CHECK_NULL_VOID(buttonLayoutProperty); + buttonLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS); + buttonLayoutProperty->UpdateType(ButtonType::NORMAL); + buttonLayoutProperty->UpdateBorderRadius(BorderRadiusProperty(timePickerSelectorItemRadius_)); +} + +void TimePickerRowPattern::InitSelectorProps() +{ + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto context = host->GetContextRefPtr(); + CHECK_NULL_VOID(context); + auto pickerTheme = context->GetTheme(); + CHECK_NULL_VOID(pickerTheme); + useButtonFocusArea_ = pickerTheme->NeedButtonFocusAreaType(); +} + +void TimePickerRowPattern::AddIsFocusActiveUpdateEvent() +{ + if (!isFocusActiveUpdateEvent_) { + isFocusActiveUpdateEvent_ = [weak = WeakClaim(this)](bool isFocusActive) { + auto pickerPattern = weak.Upgrade(); + CHECK_NULL_VOID(pickerPattern); + pickerPattern->SetHaveFocus(isFocusActive); + pickerPattern->UpdateFocusButtonState(); + }; + } + + auto context = GetContext(); + CHECK_NULL_VOID(context); + context->AddIsFocusActiveUpdateEvent(GetHost(), isFocusActiveUpdateEvent_); +} + +void TimePickerRowPattern::RemoveIsFocusActiveUpdateEvent() +{ + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto pipeline = host->GetContext(); + CHECK_NULL_VOID(pipeline); + pipeline->RemoveIsFocusActiveUpdateEvent(host); +} + +void TimePickerRowPattern::SetHaveFocus(bool haveFocus) +{ + haveFocus_ = haveFocus; +} + +void TimePickerRowPattern::HandleFocusEvent() +{ + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto context = host->GetContextRefPtr(); + CHECK_NULL_VOID(context); + + AddIsFocusActiveUpdateEvent(); + if (context->GetIsFocusActive()) { + SetHaveFocus(true); + UpdateFocusButtonState(); + } +} + +void TimePickerRowPattern::HandleBlurEvent() +{ + SetHaveFocus(false); + RemoveIsFocusActiveUpdateEvent(); + UpdateFocusButtonState(); +} + +void TimePickerRowPattern::UpdateFocusButtonState() +{ + auto host = GetHost(); + CHECK_NULL_VOID(host); + if (useButtonFocusArea_) { + auto currentFocusStackNode = DynamicCast(host->GetChildAtIndex(focusKeyID_)); + CHECK_NULL_VOID(currentFocusStackNode); + auto blendColumnNode = currentFocusStackNode->GetLastChild(); + CHECK_NULL_VOID(blendColumnNode); + auto currentFocusColumnNode = DynamicCast(blendColumnNode->GetLastChild()); + CHECK_NULL_VOID(currentFocusColumnNode); + + UpdateColumnButtonStyles(currentFocusColumnNode, haveFocus_, true); + } +} + +void TimePickerRowPattern::UpdateColumnButtonStyles( + const RefPtr& columnNode, bool haveFocus, bool needMarkDirty) +{ + CHECK_NULL_VOID(columnNode); + auto datePickerColumnPattern = columnNode->GetPattern(); + CHECK_NULL_VOID(datePickerColumnPattern); + datePickerColumnPattern->UpdateColumnButtonFocusState(haveFocus, needMarkDirty); +} + void TimePickerRowPattern::ColumnPatternInitHapticController() { if (!isHapticChanged_) { @@ -296,12 +413,33 @@ void TimePickerRowPattern::InitFocusEvent() auto host = GetHost(); CHECK_NULL_VOID(host); auto focusHub = host->GetFocusHub(); + CHECK_NULL_VOID(focusHub); if (focusHub) { InitOnKeyEvent(focusHub); #ifdef SUPPORT_DIGITAL_CROWN InitOnCrownEvent(focusHub); #endif } + CHECK_NULL_VOID(!focusEventInitialized_); + auto context = host->GetContextRefPtr(); + CHECK_NULL_VOID(context); + auto pickerTheme = context->GetTheme(); + CHECK_NULL_VOID(pickerTheme); + auto focusTask = [weak = WeakClaim(this)](FocusReason reason) { + auto pattern = weak.Upgrade(); + CHECK_NULL_VOID(pattern); + pattern->HandleFocusEvent(); + }; + focusHub->SetOnFocusInternal(focusTask); + + auto blurTask = [weak = WeakClaim(this)]() { + auto pattern = weak.Upgrade(); + CHECK_NULL_VOID(pattern); + pattern->HandleBlurEvent(); + }; + focusHub->SetOnBlurInternal(blurTask); + + focusEventInitialized_ = true; } void TimePickerRowPattern::UpdateTitleNodeContent() @@ -367,6 +505,7 @@ void TimePickerRowPattern::OnModifyDone() FlushColumn(); InitDisabled(); SetCallBack(); + InitSelect(); InitFocusEvent(); UpdateTitleNodeContent(); host->MarkDirtyNode(PROPERTY_UPDATE_MEASURE); @@ -374,6 +513,20 @@ void TimePickerRowPattern::OnModifyDone() UpdateUserSetSelectColor(); } SetDefaultFocus(); + InitSelectorProps(); +} + +void TimePickerRowPattern::InitSelect() +{ + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto context = host->GetContextRefPtr(); + CHECK_NULL_VOID(context); + auto pickerTheme = context->GetTheme(); + CHECK_NULL_VOID(pickerTheme); + + timePickerSelectorItemRadius_ = pickerTheme->GetTimePickerSelectorItemRadius(); + pickerPadding_ = pickerTheme->GetPickerPadding(); } void TimePickerRowPattern::LimitSelectedTimeInRange() @@ -1851,6 +2004,7 @@ void TimePickerRowPattern::PaintFocusState() CHECK_NULL_VOID(focusHub); focusHub->PaintInnerFocusState(focusRect); + UpdateFocusButtonState(); host->MarkDirtyNode(PROPERTY_UPDATE_RENDER); } @@ -1897,22 +2051,67 @@ void TimePickerRowPattern::GetInnerFocusPaintRect(RoundRect& paintRect) auto pickerTheme = pipeline->GetTheme(); CHECK_NULL_VOID(pickerTheme); auto dividerSpacing = pipeline->NormalizeToPx(pickerTheme->GetDividerSpacing()); - - float paintRectWidth = columnWidth - FOCUS_INTERVAL.ConvertToPx() * RATE - LINE_WIDTH.ConvertToPx() * RATE; - float paintRectHeight = dividerSpacing - FOCUS_INTERVAL.ConvertToPx() * RATE - LINE_WIDTH.ConvertToPx() * RATE; - auto centerX = leftTotalColumnWidth + FOCUS_INTERVAL.ConvertToPx() + LINE_WIDTH.ConvertToPx(); - auto centerY = (host->GetGeometryNode()->GetFrameSize().Height() - dividerSpacing) / RATE + - FOCUS_INTERVAL.ConvertToPx() + LINE_WIDTH.ConvertToPx(); - AdjustFocusBoxOffset(centerX); - paintRect.SetRect(RectF(centerX, centerY, paintRectWidth, paintRectHeight)); - paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_LEFT_POS, static_cast(PRESS_RADIUS.ConvertToPx()), - static_cast(PRESS_RADIUS.ConvertToPx())); - paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_RIGHT_POS, static_cast(PRESS_RADIUS.ConvertToPx()), - static_cast(PRESS_RADIUS.ConvertToPx())); - paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_LEFT_POS, static_cast(PRESS_RADIUS.ConvertToPx()), - static_cast(PRESS_RADIUS.ConvertToPx())); - paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_RIGHT_POS, static_cast(PRESS_RADIUS.ConvertToPx()), - static_cast(PRESS_RADIUS.ConvertToPx())); + if (!useButtonFocusArea_) { + float paintRectWidth = columnWidth - FOCUS_INTERVAL.ConvertToPx() * RATE - LINE_WIDTH.ConvertToPx() * RATE; + float paintRectHeight = dividerSpacing - FOCUS_INTERVAL.ConvertToPx() * RATE - LINE_WIDTH.ConvertToPx() * RATE; + auto centerX = leftTotalColumnWidth + FOCUS_INTERVAL.ConvertToPx() + LINE_WIDTH.ConvertToPx(); + auto centerY = (host->GetGeometryNode()->GetFrameSize().Height() - dividerSpacing) / RATE + + FOCUS_INTERVAL.ConvertToPx() + LINE_WIDTH.ConvertToPx(); + AdjustFocusBoxOffset(centerX); + paintRect.SetRect(RectF(centerX, centerY, paintRectWidth, paintRectHeight)); + PaintRectWithoutButtonFocusArea(paintRect); + } else { + auto geometryNode = host->GetGeometryNode(); + CHECK_NULL_VOID(geometryNode); + auto buttonNode = DynamicCast(stackChild->GetFirstChild()); + CHECK_NULL_VOID(buttonNode); + auto focusButtonRect = buttonNode->GetGeometryNode()->GetFrameRect(); + auto focusSpace = pickerTheme->GetFocusPadding().ConvertToPx(); + auto stackRenderContext = stackChild->GetRenderContext(); + CHECK_NULL_VOID(stackRenderContext); + auto leftPadding = 0.0f; + if (geometryNode->GetPadding()) { + leftPadding = geometryNode->GetPadding()->left.value_or(0.0f); + } + focusButtonRect -= + OffsetF(focusSpace - leftPadding, focusSpace - stackRenderContext->GetPaintRectWithoutTransform().GetY()); + focusButtonRect += SizeF(focusSpace + focusSpace, focusSpace + focusSpace); + focusButtonRect += OffsetF(leftTotalColumnWidth, 0); + paintRect.SetRect(focusButtonRect); + PaintRectWithButtonFocusArea(paintRect); + } +} + +void TimePickerRowPattern::PaintRectWithoutButtonFocusArea(RoundRect& paintRect) +{ + paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_LEFT_POS, + static_cast(timePickerSelectorItemRadius_.ConvertToPx()), + static_cast(timePickerSelectorItemRadius_.ConvertToPx())); + paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_RIGHT_POS, + static_cast(timePickerSelectorItemRadius_.ConvertToPx()), + static_cast(timePickerSelectorItemRadius_.ConvertToPx())); + paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_LEFT_POS, + static_cast(timePickerSelectorItemRadius_.ConvertToPx()), + static_cast(timePickerSelectorItemRadius_.ConvertToPx())); + paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_RIGHT_POS, + static_cast(timePickerSelectorItemRadius_.ConvertToPx()), + static_cast(timePickerSelectorItemRadius_.ConvertToPx())); +} + +void TimePickerRowPattern::PaintRectWithButtonFocusArea(RoundRect& paintRect) +{ + paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_LEFT_POS, + static_cast((timePickerSelectorItemRadius_ + FOCUS_RADIUS).ConvertToPx()), + static_cast((timePickerSelectorItemRadius_ + FOCUS_RADIUS).ConvertToPx())); + paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_RIGHT_POS, + static_cast((timePickerSelectorItemRadius_ + FOCUS_RADIUS).ConvertToPx()), + static_cast((timePickerSelectorItemRadius_ + FOCUS_RADIUS).ConvertToPx())); + paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_LEFT_POS, + static_cast((timePickerSelectorItemRadius_ + FOCUS_RADIUS).ConvertToPx()), + static_cast((timePickerSelectorItemRadius_ + FOCUS_RADIUS).ConvertToPx())); + paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_RIGHT_POS, + static_cast((timePickerSelectorItemRadius_ + FOCUS_RADIUS).ConvertToPx()), + static_cast((timePickerSelectorItemRadius_ + FOCUS_RADIUS).ConvertToPx())); } void TimePickerRowPattern::AdjustFocusBoxOffset(double& centerX) diff --git a/frameworks/core/components_ng/pattern/time_picker/timepicker_row_pattern.h b/frameworks/core/components_ng/pattern/time_picker/timepicker_row_pattern.h index 806a330479887a02181f7d6c72798766f51fed0e..a545bb78291e4da83cb73e1ba4211348ae9f77e5 100644 --- a/frameworks/core/components_ng/pattern/time_picker/timepicker_row_pattern.h +++ b/frameworks/core/components_ng/pattern/time_picker/timepicker_row_pattern.h @@ -499,7 +499,6 @@ public: auto focusColor = pickerTheme->GetFocusColor(); FocusPaintParam focusPaintParams; focusPaintParams.SetPaintColor(focusColor); - focusPaintParams.SetPaintWidth(TIME_FOCUS_PAINT_WIDTH); return { FocusType::NODE, true, FocusStyleType::CUSTOM_REGION, focusPaintParams }; } @@ -760,10 +759,26 @@ private: void MinOrSecColumnBuilding( const RefPtr& columnFrameNode, bool isMinute, uint32_t selectedTime); void InitFocusEvent(); + void InitSelect(); void SetCallBack(); void UpdateDialogAgingButton(const RefPtr& buttonNode, bool isNext); Dimension ConvertFontScaleValue(const Dimension& fontSizeValue); + void InitSelectorProps(); + void HandleFocusEvent(); + void HandleBlurEvent(); + void AddIsFocusActiveUpdateEvent(); + void RemoveIsFocusActiveUpdateEvent(); + void GetInnerFocusButtonPaintRect(RoundRect& paintRect, float focusButtonXOffset); + void UpdateFocusButtonState(); + void SetHaveFocus(bool haveFocus); + void UpdateColumnButtonStyles(const RefPtr& columnNode, bool haveFocus, bool needMarkDirty); + void UpdateFocusStyles(const RefPtr& buttonLayoutProperty, + const RefPtr& timePickerColumnNode, const Dimension& height, bool isFocusButton); + void UpdateButtonConfirmLayoutProperty(const RefPtr& buttonConfirmLayoutProperty); + void PaintRectWithoutButtonFocusArea(RoundRect& paintRect); + void PaintRectWithButtonFocusArea(RoundRect& paintRect); + void UpdateTextStyleCommon( const PickerTextStyle& textStyle, const TextStyle& defaultTextStyle, @@ -834,6 +849,8 @@ private: bool isUserSetGradientFont_ = false; Dimension gradientHeight_; Dimension dividerSpacing_; + Dimension timePickerSelectorItemRadius_ = 8.0_vp; + Dimension pickerPadding_ = 6.0_vp; float paintDividerSpacing_ = 1.0f; PickerTextProperties textProperties_; bool isShowInDatePickerDialog_ = false; @@ -848,6 +865,11 @@ private: bool isUserSetSelectColor_ = false; bool isClearFocus_ = true; bool isDirectionSetByAr = false; + + bool focusEventInitialized_ = false; + bool haveFocus_ = false; + bool useButtonFocusArea_ = false; + std::function isFocusActiveUpdateEvent_; }; } // namespace OHOS::Ace::NG diff --git a/test/unittest/core/pattern/picker/date_picker_test_one.cpp b/test/unittest/core/pattern/picker/date_picker_test_one.cpp index 5cf9d05d9e92762553ade1302e7985fe4f610f3e..c868a25687bbec9a878b62fb459aa8e21717beca 100644 --- a/test/unittest/core/pattern/picker/date_picker_test_one.cpp +++ b/test/unittest/core/pattern/picker/date_picker_test_one.cpp @@ -1375,6 +1375,36 @@ HWTEST_F(DatePickerTestOne, OnDirtyLayoutWrapperSwap005, TestSize.Level1) EXPECT_TRUE(ret); } +/** + * @tc.name: OnDirtyLayoutWrapperSwap006 + * @tc.desc: Test DatePickerColumnPattern OnDirtyLayoutWrapperSwap + * @tc.type: FUNC + */ +HWTEST_F(DatePickerTestOne, OnDirtyLayoutWrapperSwap006, TestSize.Level1) +{ + CreateDatePickerColumnNode(); + ASSERT_NE(columnPattern_, nullptr); + ASSERT_NE(columnNode_, nullptr); + + auto firstChild = AccessibilityManager::DynamicCast(columnNode_->GetChildAtIndex(0)); + RefPtr firstGeometryNode = AceType::MakeRefPtr(); + firstGeometryNode->Reset(); + firstGeometryNode->SetFrameOffset(OffsetF(10.0, 10.0)); + firstGeometryNode->SetFrameSize(SizeF(20.0, 20.0)); + auto firstLayoutWrapper = + AceType::MakeRefPtr(firstChild, firstGeometryNode, firstChild->GetLayoutProperty()); + auto dirty = AceType::MakeRefPtr(firstChild, firstGeometryNode, firstChild->GetLayoutProperty()); + dirty->AppendChild(firstLayoutWrapper); + struct DirtySwapConfig config; + config.contentSizeChange = true; + + columnPattern_->offset_ = { 10.0, 10.0 }; + columnPattern_->size_ = { 20.0, 20.0 }; + columnPattern_->useButtonFocusArea_ = true; + bool ret = columnPattern_->OnDirtyLayoutWrapperSwap(dirty, config); + EXPECT_TRUE(ret); +} + /** * @tc.name: CreateLunarChangeEvent001 * @tc.desc: Test DatePickerDialogView CreateLunarChangeEvent. @@ -1780,4 +1810,26 @@ HWTEST_F(DatePickerTestOne, DatePickerPatternGetSelectedObject005, TestSize.Leve expectValue = R"({"year":0,"month":0,"day":0,"status":0})"; EXPECT_EQ(result, expectValue); } + +/** + * @tc.name: DatePickerPatternUpdateTextAreaPadding001 + * @tc.desc: Test UpdateTextAreaPadding function. + * @tc.type: FUNC + */ +HWTEST_F(DatePickerTestOne, DatePickerPatternUpdateTextAreaPadding001, TestSize.Level1) +{ + CreateDatePickerColumnNode(); + ASSERT_NE(columnPattern_, nullptr); + auto theme = MockPipelineContext::GetCurrent()->GetTheme(); + ASSERT_NE(theme, nullptr); + auto textCancelNode = FrameNode::CreateFrameNode( + V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr()); + ASSERT_NE(textCancelNode, nullptr); + auto property = textCancelNode->GetLayoutProperty(); + ASSERT_NE(property, nullptr); + columnPattern_->useButtonFocusArea_ = true; + columnPattern_->UpdateTextAreaPadding(theme, property); + auto ret = property->GetPaddingProperty()->left->GetDimension(); + EXPECT_EQ(ret, 22.0_vp); +} } // namespace OHOS::Ace::NG diff --git a/test/unittest/core/pattern/text_picker/text_picker_column_test_ng.cpp b/test/unittest/core/pattern/text_picker/text_picker_column_test_ng.cpp index 45b3cce6b0dae721f5cb483214a35b2d6b588fde..320e34f656145a72f8b08765a84bc41424da4bd7 100644 --- a/test/unittest/core/pattern/text_picker/text_picker_column_test_ng.cpp +++ b/test/unittest/core/pattern/text_picker/text_picker_column_test_ng.cpp @@ -2023,6 +2023,25 @@ HWTEST_F(TextPickerColumnTestNg, TextPickerColumnPatternSetCanLoop001, TestSize. EXPECT_EQ(textPickerColumnPattern_->overscroller_.loopTossOffset_, 0.0); } +/** + * @tc.name: TextPickerColumnUpdateTextAreaPadding001 + * @tc.desc: Test UpdateTextAreaPadding function. + * @tc.type: FUNC + */ +HWTEST_F(TextPickerColumnTestNg, TextPickerColumnUpdateTextAreaPadding001, TestSize.Level1) +{ + InitTextPickerColumnTestNg(); + auto textPickerColumnPattern = columnNode_->GetPattern(); + ASSERT_NE(textPickerColumnPattern, nullptr); + auto pipeline = MockPipelineContext::GetCurrent(); + auto theme = pipeline->GetTheme(); + auto property = AceType::MakeRefPtr(); + textPickerColumnPattern->useButtonFocusArea_ = true; + textPickerColumnPattern->UpdateTextAreaPadding(theme, property); + auto ret = property->GetPaddingProperty()->left->GetDimension(); + EXPECT_EQ(ret, 22.0_vp); +} + #ifdef ARKUI_WEARABLE /** * @tc.name: TextPickerColumnPatternTest014 diff --git a/test/unittest/core/pattern/text_picker/text_picker_pattern_test_ng.cpp b/test/unittest/core/pattern/text_picker/text_picker_pattern_test_ng.cpp index fad4766f25c612311719df88597f900c655ae38b..c6b65dcb8b9ae12668bf11237b071c0644e6ecce 100644 --- a/test/unittest/core/pattern/text_picker/text_picker_pattern_test_ng.cpp +++ b/test/unittest/core/pattern/text_picker/text_picker_pattern_test_ng.cpp @@ -2300,4 +2300,46 @@ HWTEST_F(TextPickerPatternTestNg, TextPickerPatternTest021, TestSize.Level1) columnWidthsStr = textPickerPattern_->GetColumnWidthsStr(); EXPECT_STREQ(columnWidthsStr.c_str(), ""); } + +/** + * @tc.name: TextPickerPatternTest022 + * @tc.desc: Test TextPickerPattern SetButtonIdeaSize. + * @tc.type: FUNC + */ +HWTEST_F(TextPickerPatternTestNg, TextPickerPatternTest022, TestSize.Level1) +{ + auto frameNode = FrameNode::GetOrCreateFrameNode(V2::TEXT_PICKER_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr(); }); + ASSERT_NE(frameNode, nullptr); + auto textPickerPattern = frameNode->GetPattern(); + ASSERT_NE(textPickerPattern, nullptr); + + /** + * @tc.cases: case. cover branch resizeFlag_ == true. + */ + textPickerPattern->SetResizeFlag(true); + auto buttonNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr(); }); + auto columnNode = + FrameNode::GetOrCreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), + []() { return AceType::MakeRefPtr(); }); + auto blendNode = + FrameNode::GetOrCreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), + []() { return AceType::MakeRefPtr(true); }); + auto layoutProperty = buttonNode->GetLayoutProperty(); + ASSERT_NE(layoutProperty, nullptr); + auto stackNode = FrameNode::GetOrCreateFrameNode(V2::STACK_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), + []() { return AceType::MakeRefPtr(); }); + auto geometryNode = stackNode->GetGeometryNode(); + ASSERT_NE(geometryNode, nullptr); + buttonNode->MountToParent(stackNode); + columnNode->MountToParent(blendNode); + blendNode->MountToParent(stackNode); + stackNode->MountToParent(frameNode); + SizeF frameSize(FONT_SIZE_20, FONT_SIZE_20); + geometryNode->SetFrameSize(frameSize); + textPickerPattern->useButtonFocusArea_ = true; + textPickerPattern->SetButtonIdeaSize(); + EXPECT_EQ(layoutProperty->calcLayoutConstraint_->selfIdealSize->width_.value(), CalcLength(8.0)); +} } // namespace OHOS::Ace::NG diff --git a/test/unittest/core/pattern/time_picker/time_picker_test_ng.cpp b/test/unittest/core/pattern/time_picker/time_picker_test_ng.cpp index a3959f484a8efda384b392b34058309ccfc8899e..022faa8162aafaab1f84c24bf6f07762ed057d9e 100644 --- a/test/unittest/core/pattern/time_picker/time_picker_test_ng.cpp +++ b/test/unittest/core/pattern/time_picker/time_picker_test_ng.cpp @@ -7406,4 +7406,93 @@ HWTEST_F(TimePickerPatternTestNg, IsNeedToRebuildColumn002, TestSize.Level0) EXPECT_FALSE(timePickerRowPattern->IsNeedToRebuildColumn(true, false, 0, 1, 0)); EXPECT_FALSE(timePickerRowPattern->IsNeedToRebuildColumn(false, true, 0, 0, 0)); } + +/** + * @tc.name: TimePickerInitSelectorButtonProperties001 + * @tc.desc: Test TimePickerColumnPattern InitSelectorButtonProperties + * @tc.type: FUNC + */ +HWTEST_F(TimePickerPatternTestNg, TimePickerInitSelectorButtonProperties001, TestSize.Level1) +{ + auto theme = MockPipelineContext::GetCurrent()->GetTheme(); + TimePickerModelNG::GetInstance()->CreateTimePicker(theme); + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + ASSERT_NE(frameNode, nullptr); + frameNode->MarkModifyDone(); + auto timePickerRowPattern = frameNode->GetPattern(); + ASSERT_NE(timePickerRowPattern, nullptr); + timePickerRowPattern->UpdateAllChildNode(); + auto allChildNode = timePickerRowPattern->GetAllChildNode(); + auto minuteColumnNode = allChildNode["minute"].Upgrade(); + ASSERT_NE(minuteColumnNode, nullptr); + auto minuteColumnPattern = minuteColumnNode->GetPattern(); + ASSERT_NE(minuteColumnPattern, nullptr); + + minuteColumnPattern->InitSelectorButtonProperties(theme); + EXPECT_EQ(minuteColumnPattern->buttonDefaultBgColor_, Color::TRANSPARENT); +} + +/** + * @tc.name: TimePickerInitFocusEvent001 + * @tc.desc: Test TimePickerColumnPattern InitFocusEvent + * @tc.type: FUNC + */ +HWTEST_F(TimePickerPatternTestNg, TimePickerInitFocusEvent001, TestSize.Level1) +{ + auto theme = MockPipelineContext::GetCurrent()->GetTheme(); + ASSERT_NE(theme, nullptr); + TimePickerModelNG::GetInstance()->CreateTimePicker(theme); + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + ASSERT_TRUE(frameNode); + frameNode->MarkModifyDone(); + auto timePickerRowPattern = frameNode->GetPattern(); + ASSERT_TRUE(timePickerRowPattern); + timePickerRowPattern->UpdateAllChildNode(); + auto allChildNode = timePickerRowPattern->GetAllChildNode(); + auto minuteColumnNode = allChildNode["minute"].Upgrade(); + ASSERT_NE(minuteColumnNode, nullptr); + auto minuteColumnPattern = minuteColumnNode->GetPattern(); + ASSERT_NE(minuteColumnPattern, nullptr); + + RefPtr focusHub_ ; + focusHub_= frameNode->GetFocusHub(); + ASSERT_TRUE(focusHub_); + frameNode ->focusHub_ = NULL; + focusHub_->RequestFocusImmediately(); + timePickerRowPattern->useButtonFocusArea_ = true; + timePickerRowPattern->InitFocusEvent(); + EXPECT_EQ(minuteColumnPattern->buttonBgColor_, Color::TRANSPARENT); +} + +/** + * @tc.name: TimePickerInitFocusEvent002 + * @tc.desc: Test TimePickerColumnPattern InitFocusEvent + * @tc.type: FUNC + */ +HWTEST_F(TimePickerPatternTestNg, TimePickerInitFocusEvent002, TestSize.Level1) +{ + auto theme = MockPipelineContext::GetCurrent()->GetTheme(); + ASSERT_NE(theme, nullptr); + TimePickerModelNG::GetInstance()->CreateTimePicker(theme); + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + ASSERT_TRUE(frameNode); + frameNode->MarkModifyDone(); + auto timePickerRowPattern = frameNode->GetPattern(); + ASSERT_TRUE(timePickerRowPattern); + timePickerRowPattern->UpdateAllChildNode(); + auto allChildNode = timePickerRowPattern->GetAllChildNode(); + auto minuteColumnNode = allChildNode["minute"].Upgrade(); + ASSERT_NE(minuteColumnNode, nullptr); + auto minuteColumnPattern = minuteColumnNode->GetPattern(); + ASSERT_NE(minuteColumnPattern, nullptr); + + RefPtr focusHub_ ; + focusHub_= frameNode->GetFocusHub(); + ASSERT_TRUE(focusHub_); + frameNode ->focusHub_ = NULL; + focusHub_->LostFocus(); + timePickerRowPattern->useButtonFocusArea_ = true; + timePickerRowPattern->InitFocusEvent(); + EXPECT_EQ(minuteColumnPattern->buttonBgColor_, Color::TRANSPARENT); +} } // namespace OHOS::Ace::NG