From a5a2c45692ce26852ab1e5f2e538abd84d6c7430 Mon Sep 17 00:00:00 2001 From: jiangdayuan Date: Sat, 26 Mar 2022 17:05:22 +0800 Subject: [PATCH] add window tile unfocus UX design Signed-off-by: jiangdayuan --- adapter/ohos/entrance/ace_container.cpp | 4 - adapter/ohos/entrance/ui_content_impl.cpp | 77 +++++++++--- adapter/ohos/entrance/ui_content_impl.h | 2 - frameworks/base/resource/BUILD.gn | 20 +++ .../container_modal_window_defocus_close.svg | 14 +++ ...ontainer_modal_window_defocus_maximize.svg | 14 +++ ...ontainer_modal_window_defocus_minimize.svg | 13 ++ ...container_modal_window_defocus_recover.svg | 14 +++ ...tainer_modal_window_defocus_split_left.svg | 16 +++ .../base/resource/internal_resource.cpp | 41 +++++++ frameworks/base/resource/internal_resource.h | 5 + .../resource/internal_resource_previewer.cpp | 40 ++++++ .../container_modal_component.cpp | 81 +++++++------ .../container_modal_component.h | 16 +-- .../container_modal_constants.h | 6 +- .../container_modal_element.cpp | 114 ++++++++++++++---- .../container_modal/container_modal_element.h | 10 +- frameworks/core/pipeline/pipeline_context.cpp | 17 ++- frameworks/core/pipeline/pipeline_context.h | 2 + 19 files changed, 402 insertions(+), 104 deletions(-) create mode 100644 frameworks/base/resource/binary/container_modal_window_defocus_close.svg create mode 100644 frameworks/base/resource/binary/container_modal_window_defocus_maximize.svg create mode 100644 frameworks/base/resource/binary/container_modal_window_defocus_minimize.svg create mode 100644 frameworks/base/resource/binary/container_modal_window_defocus_recover.svg create mode 100644 frameworks/base/resource/binary/container_modal_window_defocus_split_left.svg diff --git a/adapter/ohos/entrance/ace_container.cpp b/adapter/ohos/entrance/ace_container.cpp index 7ffa89dd4fd..8a78d7a1878 100644 --- a/adapter/ohos/entrance/ace_container.cpp +++ b/adapter/ohos/entrance/ace_container.cpp @@ -314,10 +314,6 @@ void AceContainer::OnActive(int32_t instanceId) if (front && !container->IsSubContainer()) { front->OnActive(); } - auto context = container->GetPipelineContext(); - if (!context) { - return; - } } void AceContainer::OnInactive(int32_t instanceId) diff --git a/adapter/ohos/entrance/ui_content_impl.cpp b/adapter/ohos/entrance/ui_content_impl.cpp index 7936b7c3fe1..b87bb602ae4 100644 --- a/adapter/ohos/entrance/ui_content_impl.cpp +++ b/adapter/ohos/entrance/ui_content_impl.cpp @@ -434,6 +434,10 @@ void UIContentImpl::CommonInitialize(OHOS::Rosen::Window* window, const std::str abilityContext->StartAbility(want, REQUEST_CODE); } })); + if (!container) { + LOGE("Create container is null."); + return; + } container->SetWindowName(window_->GetWindowName()); // Mark the relationship between windowId and containerId, it is 1:1 @@ -459,7 +463,7 @@ void UIContentImpl::CommonInitialize(OHOS::Rosen::Window* window, const std::str container->SetBundlePath(context->GetBundleCodeDir()); container->SetFilesDataPath(context->GetFilesDir()); - if (window_->IsDecorEnable()) { + if (window_->IsDecorEnable() && SystemProperties::GetDeviceType() == DeviceType::TABLET) { LOGI("Container modal is enabled."); container->SetWindowModal(WindowModal::CONTAINER_MODAL); } @@ -493,7 +497,7 @@ void UIContentImpl::CommonInitialize(OHOS::Rosen::Window* window, const std::str #endif // set view Platform::AceContainer::SetView(flutterAceView, density, 0, 0, window_->GetWindowId(), callback); - Platform::FlutterAceView::SurfaceChanged(flutterAceView, 0, 0, config_.Orientation()); + Platform::FlutterAceView::SurfaceChanged(flutterAceView, 0, 0, deviceHeight >= deviceWidth ? 0 : 1); auto nativeEngine = reinterpret_cast(runtime_); if (!storage) { container->SetLocalStorage(nullptr, context->GetBindingObject()->Get()); @@ -519,14 +523,50 @@ void UIContentImpl::Background() void UIContentImpl::Focus() { - LOGI("Active UIContent"); + LOGI("UIContent window focus"); Platform::AceContainer::OnActive(instanceId_); + auto container = Platform::AceContainer::GetContainer(instanceId_); + if (!container) { + LOGE("Window focus failed: container is null."); + return; + } + auto taskExecutor = container->GetTaskExecutor(); + if (!taskExecutor) { + LOGE("Window focus failed: taskExecutor is null."); + return; + } + taskExecutor->PostTask([container]() { + auto pipelineContext = container->GetPipelineContext(); + if (!pipelineContext) { + LOGE("Window focus failed, pipeline context is null."); + return; + } + pipelineContext->WindowFocus(true); + }, TaskExecutor::TaskType::UI); } void UIContentImpl::UnFocus() { - LOGI("Inactive UIContent"); + LOGI("UIContent window unFocus"); Platform::AceContainer::OnInactive(instanceId_); + auto container = Platform::AceContainer::GetContainer(instanceId_); + if (!container) { + LOGE("Window unFocus failed: container is null."); + return; + } + auto taskExecutor = container->GetTaskExecutor(); + if (!taskExecutor) { + LOGE("Window unFocus failed: taskExecutor is null."); + return; + } + taskExecutor->PostTask([container]() { + auto pipelineContext = container->GetPipelineContext(); + if (!pipelineContext) { + LOGE("Window unFocus failed, pipeline context is null."); + return; + } + pipelineContext->WindowFocus(false); + }, TaskExecutor::TaskType::UI); } void UIContentImpl::Destroy() @@ -627,8 +667,6 @@ void UIContentImpl::UpdateViewportConfig(const ViewportConfig& config, OHOS::Ros static_cast(reason)); }, TaskExecutor::TaskType::PLATFORM); - config_ = config; - updateConfig_ = true; } void UIContentImpl::UpdateWindowMode(OHOS::Rosen::WindowMode mode) @@ -639,18 +677,25 @@ void UIContentImpl::UpdateWindowMode(OHOS::Rosen::WindowMode mode) LOGE("UpdateWindowMode failed, get container(id=%{public}d) failed", instanceId_); return; } - auto pipelineContext = container->GetPipelineContext(); - if (!pipelineContext) { - LOGE("UpdateWindowMode failed, pipeline context is null."); + auto taskExecutor = container->GetTaskExecutor(); + if (!taskExecutor) { + LOGE("UpdateWindowMode failed: taskExecutor is null."); return; } - if (mode == OHOS::Rosen::WindowMode::WINDOW_MODE_FULLSCREEN || - mode == OHOS::Rosen::WindowMode::WINDOW_MODE_SPLIT_PRIMARY || - mode == OHOS::Rosen::WindowMode::WINDOW_MODE_SPLIT_SECONDARY) { - pipelineContext->ShowContainerTitle(false); - } else { - pipelineContext->ShowContainerTitle(true); - } + taskExecutor->PostTask([container, mode]() { + auto pipelineContext = container->GetPipelineContext(); + if (!pipelineContext) { + LOGE("UpdateWindowMode failed, pipeline context is null."); + return; + } + if (mode == OHOS::Rosen::WindowMode::WINDOW_MODE_FULLSCREEN || + mode == OHOS::Rosen::WindowMode::WINDOW_MODE_SPLIT_PRIMARY || + mode == OHOS::Rosen::WindowMode::WINDOW_MODE_SPLIT_SECONDARY) { + pipelineContext->ShowContainerTitle(false); + } else { + pipelineContext->ShowContainerTitle(true); + } + }, TaskExecutor::TaskType::UI); } void UIContentImpl::DumpInfo(const std::vector& params, std::vector& info) diff --git a/adapter/ohos/entrance/ui_content_impl.h b/adapter/ohos/entrance/ui_content_impl.h index a060ae18750..abe0e50ce5d 100644 --- a/adapter/ohos/entrance/ui_content_impl.h +++ b/adapter/ohos/entrance/ui_content_impl.h @@ -70,10 +70,8 @@ private: std::weak_ptr context_; void* runtime_ = nullptr; OHOS::Rosen::Window* window_ = nullptr; - ViewportConfig config_; std::string startUrl_; int32_t instanceId_ = -1; - bool updateConfig_ = false; OHOS::sptr dragWindowListener_ = nullptr; OHOS::sptr occupiedAreaChangeListener_ = nullptr; }; diff --git a/frameworks/base/resource/BUILD.gn b/frameworks/base/resource/BUILD.gn index 846cb395a6f..40ace493947 100644 --- a/frameworks/base/resource/BUILD.gn +++ b/frameworks/base/resource/BUILD.gn @@ -45,6 +45,11 @@ source_set("binary_resource") { sources = [ "$ace_resource_dir/close.o", "$ace_resource_dir/container_modal_window_close.o", + "$ace_resource_dir/container_modal_window_defocus_close.o", + "$ace_resource_dir/container_modal_window_defocus_maximize.o", + "$ace_resource_dir/container_modal_window_defocus_minimize.o", + "$ace_resource_dir/container_modal_window_defocus_recover.o", + "$ace_resource_dir/container_modal_window_defocus_split_left.o", "$ace_resource_dir/container_modal_window_maximize.o", "$ace_resource_dir/container_modal_window_minimize.o", "$ace_resource_dir/container_modal_window_recover.o", @@ -106,6 +111,11 @@ source_set("binary_resource_mac_and_windows") { sources = [ "$ace_resource_dir/close.c", "$ace_resource_dir/container_modal_window_close.c", + "$ace_resource_dir/container_modal_window_defocus_close.c", + "$ace_resource_dir/container_modal_window_defocus_maximize.c", + "$ace_resource_dir/container_modal_window_defocus_minimize.c", + "$ace_resource_dir/container_modal_window_defocus_recover.c", + "$ace_resource_dir/container_modal_window_defocus_split_left.c", "$ace_resource_dir/container_modal_window_maximize.c", "$ace_resource_dir/container_modal_window_minimize.c", "$ace_resource_dir/container_modal_window_recover.c", @@ -165,6 +175,11 @@ action_foreach("objcopy_resource") { sources = [ "binary/close.svg", "binary/container_modal_window_close.svg", + "binary/container_modal_window_defocus_close.svg", + "binary/container_modal_window_defocus_maximize.svg", + "binary/container_modal_window_defocus_minimize.svg", + "binary/container_modal_window_defocus_recover.svg", + "binary/container_modal_window_defocus_split_left.svg", "binary/container_modal_window_maximize.svg", "binary/container_modal_window_minimize.svg", "binary/container_modal_window_recover.svg", @@ -246,6 +261,11 @@ action_foreach("objcopy_resource_mac_and_windows") { sources = [ "binary/close.svg", "binary/container_modal_window_close.svg", + "binary/container_modal_window_defocus_close.svg", + "binary/container_modal_window_defocus_maximize.svg", + "binary/container_modal_window_defocus_minimize.svg", + "binary/container_modal_window_defocus_recover.svg", + "binary/container_modal_window_defocus_split_left.svg", "binary/container_modal_window_maximize.svg", "binary/container_modal_window_minimize.svg", "binary/container_modal_window_recover.svg", diff --git a/frameworks/base/resource/binary/container_modal_window_defocus_close.svg b/frameworks/base/resource/binary/container_modal_window_defocus_close.svg new file mode 100644 index 00000000000..eb525ccfba2 --- /dev/null +++ b/frameworks/base/resource/binary/container_modal_window_defocus_close.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/frameworks/base/resource/binary/container_modal_window_defocus_maximize.svg b/frameworks/base/resource/binary/container_modal_window_defocus_maximize.svg new file mode 100644 index 00000000000..72f6346374f --- /dev/null +++ b/frameworks/base/resource/binary/container_modal_window_defocus_maximize.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/frameworks/base/resource/binary/container_modal_window_defocus_minimize.svg b/frameworks/base/resource/binary/container_modal_window_defocus_minimize.svg new file mode 100644 index 00000000000..be72211a391 --- /dev/null +++ b/frameworks/base/resource/binary/container_modal_window_defocus_minimize.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/frameworks/base/resource/binary/container_modal_window_defocus_recover.svg b/frameworks/base/resource/binary/container_modal_window_defocus_recover.svg new file mode 100644 index 00000000000..59e2d6a2649 --- /dev/null +++ b/frameworks/base/resource/binary/container_modal_window_defocus_recover.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/frameworks/base/resource/binary/container_modal_window_defocus_split_left.svg b/frameworks/base/resource/binary/container_modal_window_defocus_split_left.svg new file mode 100644 index 00000000000..f8ab6891623 --- /dev/null +++ b/frameworks/base/resource/binary/container_modal_window_defocus_split_left.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/frameworks/base/resource/internal_resource.cpp b/frameworks/base/resource/internal_resource.cpp index 92709538e22..771aab76c60 100644 --- a/frameworks/base/resource/internal_resource.cpp +++ b/frameworks/base/resource/internal_resource.cpp @@ -300,6 +300,7 @@ extern uint8_t _binary_fa_black_clock_widget_second_png_end[]; // The following parameters represent the beginning and end of the file. extern uint8_t _binary_ic_public_drawer_svg_start[]; extern uint8_t _binary_ic_public_drawer_svg_end[]; + // binary/container_modal_window_close.svg extern uint8_t _binary_container_modal_window_close_svg_start[]; extern uint8_t _binary_container_modal_window_close_svg_end[]; @@ -320,6 +321,26 @@ extern uint8_t _binary_container_modal_window_recover_svg_end[]; extern uint8_t _binary_container_modal_window_split_left_svg_start[]; extern uint8_t _binary_container_modal_window_split_left_svg_end[]; +// binary/container_modal_window_defocus_close.svg +extern uint8_t _binary_container_modal_window_defocus_close_svg_start[]; +extern uint8_t _binary_container_modal_window_defocus_close_svg_end[]; + +// binary/container_modal_window_defocus_maximize.svg +extern uint8_t _binary_container_modal_window_defocus_maximize_svg_start[]; +extern uint8_t _binary_container_modal_window_defocus_maximize_svg_end[]; + +// binary/container_modal_window_defocus_minimize.svg +extern uint8_t _binary_container_modal_window_defocus_minimize_svg_start[]; +extern uint8_t _binary_container_modal_window_defocus_minimize_svg_end[]; + +// binary/container_modal_window_defocus_recover.svg +extern uint8_t _binary_container_modal_window_defocus_recover_svg_start[]; +extern uint8_t _binary_container_modal_window_defocus_recover_svg_end[]; + +// binary/container_modal_window_defocus_split_left.svg +extern uint8_t _binary_container_modal_window_defocus_split_left_svg_start[]; +extern uint8_t _binary_container_modal_window_defocus_split_left_svg_end[]; + namespace OHOS::Ace { namespace { @@ -512,6 +533,26 @@ const uint8_t* InternalResource::GetResource(const ResourceId id, size_t& size) ResourceData(_binary_container_modal_window_split_left_svg_start, static_cast(_binary_container_modal_window_split_left_svg_end - _binary_container_modal_window_split_left_svg_start)) }, + { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_CLOSE, + ResourceData(_binary_container_modal_window_defocus_close_svg_start, + static_cast(_binary_container_modal_window_defocus_close_svg_end - + _binary_container_modal_window_defocus_close_svg_start)) }, + { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_MAXIMIZE, + ResourceData(_binary_container_modal_window_defocus_maximize_svg_start, + static_cast(_binary_container_modal_window_defocus_maximize_svg_end - + _binary_container_modal_window_defocus_maximize_svg_start)) }, + { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_MINIMIZE, + ResourceData(_binary_container_modal_window_defocus_minimize_svg_start, + static_cast(_binary_container_modal_window_defocus_minimize_svg_end - + _binary_container_modal_window_defocus_minimize_svg_start)) }, + { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_RECOVER, + ResourceData(_binary_container_modal_window_defocus_recover_svg_start, + static_cast(_binary_container_modal_window_defocus_recover_svg_end - + _binary_container_modal_window_defocus_recover_svg_start)) }, + { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_SPLIT_LEFT, + ResourceData(_binary_container_modal_window_defocus_split_left_svg_start, + static_cast(_binary_container_modal_window_defocus_split_left_svg_end - + _binary_container_modal_window_defocus_split_left_svg_start)) }, }; auto iter = RESOURCE_MAP.find(id); if (iter != RESOURCE_MAP.end()) { diff --git a/frameworks/base/resource/internal_resource.h b/frameworks/base/resource/internal_resource.h index 1ac9240bf8e..cf64d993f0d 100644 --- a/frameworks/base/resource/internal_resource.h +++ b/frameworks/base/resource/internal_resource.h @@ -81,6 +81,11 @@ public: CONTAINER_MODAL_WINDOW_MINIMIZE, CONTAINER_MODAL_WINDOW_RECOVER, CONTAINER_MODAL_WINDOW_SPLIT_LEFT, + CONTAINER_MODAL_WINDOW_DEFOCUS_CLOSE, + CONTAINER_MODAL_WINDOW_DEFOCUS_MAXIMIZE, + CONTAINER_MODAL_WINDOW_DEFOCUS_MINIMIZE, + CONTAINER_MODAL_WINDOW_DEFOCUS_RECOVER, + CONTAINER_MODAL_WINDOW_DEFOCUS_SPLIT_LEFT, SVG_END = 20000, // 20001 - 30000 is reserved for i18n resource. diff --git a/frameworks/base/resource/internal_resource_previewer.cpp b/frameworks/base/resource/internal_resource_previewer.cpp index f919dd86e23..afc5c2d262d 100644 --- a/frameworks/base/resource/internal_resource_previewer.cpp +++ b/frameworks/base/resource/internal_resource_previewer.cpp @@ -320,6 +320,26 @@ extern uint8_t* _binary_container_modal_window_recover_svg_end; extern uint8_t _binary_container_modal_window_split_left_svg_start[]; extern uint8_t* _binary_container_modal_window_split_left_svg_end; +// binary/container_modal_window_defocus_close.svg +extern uint8_t _binary_container_modal_window_defocus_close_svg_start[]; +extern uint8_t _binary_container_modal_window_defocus_close_svg_end[]; + +// binary/container_modal_window_defocus_maximize.svg +extern uint8_t _binary_container_modal_window_defocus_maximize_svg_start[]; +extern uint8_t _binary_container_modal_window_defocus_maximize_svg_end[]; + +// binary/container_modal_window_defocus_minimize.svg +extern uint8_t _binary_container_modal_window_defocus_minimize_svg_start[]; +extern uint8_t _binary_container_modal_window_defocus_minimize_svg_end[]; + +// binary/container_modal_window_defocus_recover.svg +extern uint8_t _binary_container_modal_window_defocus_recover_svg_start[]; +extern uint8_t _binary_container_modal_window_defocus_recover_svg_end[]; + +// binary/container_modal_window_defocus_split_left.svg +extern uint8_t _binary_container_modal_window_defocus_split_left_svg_start[]; +extern uint8_t _binary_container_modal_window_defocus_split_left_svg_end[]; + namespace OHOS::Ace { namespace { @@ -512,6 +532,26 @@ const uint8_t* InternalResource::GetResource(const ResourceId id, size_t& size) ResourceData(_binary_container_modal_window_split_left_svg_start, static_cast(_binary_container_modal_window_split_left_svg_end - _binary_container_modal_window_split_left_svg_start)) }, + { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_CLOSE, + ResourceData(_binary_container_modal_window_defocus_close_svg_start, + static_cast(_binary_container_modal_window_defocus_close_svg_end - + _binary_container_modal_window_defocus_close_svg_start)) }, + { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_MAXIMIZE, + ResourceData(_binary_container_modal_window_defocus_maximize_svg_start, + static_cast(_binary_container_modal_window_defocus_maximize_svg_end - + _binary_container_modal_window_defocus_maximize_svg_start)) }, + { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_MINIMIZE, + ResourceData(_binary_container_modal_window_defocus_minimize_svg_start, + static_cast(_binary_container_modal_window_defocus_minimize_svg_end - + _binary_container_modal_window_defocus_minimize_svg_start)) }, + { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_RECOVER, + ResourceData(_binary_container_modal_window_defocus_recover_svg_start, + static_cast(_binary_container_modal_window_defocus_recover_svg_end - + _binary_container_modal_window_defocus_recover_svg_start)) }, + { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_SPLIT_LEFT, + ResourceData(_binary_container_modal_window_defocus_split_left_svg_start, + static_cast(_binary_container_modal_window_defocus_split_left_svg_end - + _binary_container_modal_window_defocus_split_left_svg_start)) }, }; auto iter = RESOURCE_MAP.find(id); if (iter != RESOURCE_MAP.end()) { diff --git a/frameworks/core/components/container_modal/container_modal_component.cpp b/frameworks/core/components/container_modal/container_modal_component.cpp index 848333299c8..36971b4a017 100644 --- a/frameworks/core/components/container_modal/container_modal_component.cpp +++ b/frameworks/core/components/container_modal/container_modal_component.cpp @@ -51,7 +51,7 @@ RefPtr ContainerModalComponent::BuildTitle() // build title box auto titleBox = AceType::MakeRefPtr(); titleBox->SetHeight(CONTAINER_TITLE_HEIGHT); - titleChildrenRow_ = + auto titleChildrenRow = AceType::MakeRefPtr(FlexAlign::FLEX_START, FlexAlign::CENTER, BuildTitleChildren(false)); // handle mouse move @@ -69,7 +69,7 @@ RefPtr ContainerModalComponent::BuildTitle() context->FireWindowStartMoveCallBack(); } }); - titleBox->SetChild(titleChildrenRow_); + titleBox->SetChild(titleChildrenRow); auto display = AceType::MakeRefPtr(titleBox); return display; } @@ -84,9 +84,9 @@ RefPtr ContainerModalComponent::BuildFloatingTitle() titleBox->SetHeight(CONTAINER_TITLE_HEIGHT); titleBox->SetBackDecoration(titleDecoration); - floatingTitleChildrenRow_ = + auto floatingTitleChildrenRow = AceType::MakeRefPtr(FlexAlign::FLEX_START, FlexAlign::CENTER, BuildTitleChildren(true)); - titleBox->SetChild(floatingTitleChildrenRow_); + titleBox->SetChild(floatingTitleChildrenRow); auto tween = AceType::MakeRefPtr("ContainerModal", titleBox); return tween; } @@ -108,7 +108,7 @@ RefPtr ContainerModalComponent::BuildContent() } RefPtr ContainerModalComponent::BuildControlButton( - InternalResource::ResourceId icon, std::function&& clickCallback) + InternalResource::ResourceId icon, std::function&& clickCallback, bool isFocus) { auto image = AceType::MakeRefPtr(icon); image->SetWidth(TITLE_ICON_SIZE); @@ -120,7 +120,7 @@ RefPtr ContainerModalComponent::BuildControlButton( button->SetWidth(TITLE_BUTTON_SIZE); button->SetHeight(TITLE_BUTTON_SIZE); button->SetType(ButtonType::CIRCLE); - button->SetBackgroundColor(TITLE_BUTTON_BACKGROUND_COLOR); + button->SetBackgroundColor(isFocus ? TITLE_BUTTON_BACKGROUND_COLOR : TITLE_BUTTON_BACKGROUND_COLOR_LOST_FOCUS); button->SetClickedColor(TITLE_BUTTON_CLICKED_COLOR); button->SetClickFunction(std::move(clickCallback)); return button; @@ -170,7 +170,7 @@ void ContainerModalComponent::BuildInnerChild() SetChild(containerBox); } -std::list> ContainerModalComponent::BuildTitleChildren(bool isFloating) +std::list> ContainerModalComponent::BuildTitleChildren(bool isFloating, bool isFocus) { // title icon if (!titleIcon_) { @@ -182,57 +182,64 @@ std::list> ContainerModalComponent::BuildTitleChildren(bool is // title text if (!titleLabel_) { titleLabel_ = AceType::MakeRefPtr(""); - TextStyle style; - style.SetFontSize(TITLE_TEXT_FONT_SIZE); - style.SetTextColor(TITLE_TEXT_COLOR); - style.SetFontWeight(FontWeight::W500); - style.SetAllowScale(false); - style.SetTextOverflow(TextOverflow::ELLIPSIS); - titleLabel_->SetTextStyle(style); - titleLabel_->SetFlexWeight(1.0); } + TextStyle style; + style.SetFontSize(TITLE_TEXT_FONT_SIZE); + style.SetTextColor(isFocus ? TITLE_TEXT_COLOR : TITLE_TEXT_COLOR_LOST_FOCUS); + style.SetFontWeight(FontWeight::W500); + style.SetAllowScale(false); + style.SetTextOverflow(TextOverflow::ELLIPSIS); + titleLabel_->SetTextStyle(style); + titleLabel_->SetFlexWeight(1.0); // title control button auto contextWptr = context_; - auto titleLeftSplitButton = - BuildControlButton(InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_SPLIT_LEFT, [contextWptr]() { + auto leftSplitButton = isFocus ? InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_SPLIT_LEFT + : InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_SPLIT_LEFT; + auto titleLeftSplitButton = BuildControlButton(leftSplitButton, [contextWptr]() { LOGI("left split button clicked"); auto context = contextWptr.Upgrade(); if (context) { context->FireWindowSplitCallBack(); } - }); - auto buttonResourceId = isFloating ? InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_RECOVER + }, isFocus); + auto maxRecoverButton = isFloating ? InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_RECOVER : InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_MAXIMIZE; - auto titleMaximizeRecoverButton = BuildControlButton(buttonResourceId, [contextWptr]() { - auto context = contextWptr.Upgrade(); - if (context) { - auto mode = context->FireWindowGetModeCallBack(); - if (mode == WindowMode::WINDOW_MODE_FULLSCREEN) { - LOGI("recover button clicked"); - context->FireWindowRecoverCallBack(); - } else { - LOGI("maximize button clicked"); - context->FireWindowMaximizeCallBack(); + if (!isFocus) { + maxRecoverButton = isFloating ? InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_RECOVER + : InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_MAXIMIZE; + } + auto titleMaximizeRecoverButton = BuildControlButton(maxRecoverButton, [contextWptr]() { + auto context = contextWptr.Upgrade(); + if (context) { + auto mode = context->FireWindowGetModeCallBack(); + if (mode == WindowMode::WINDOW_MODE_FULLSCREEN) { + LOGI("recover button clicked"); + context->FireWindowRecoverCallBack(); + } else { + LOGI("maximize button clicked"); + context->FireWindowMaximizeCallBack(); + } } - } - }); - auto titleMinimizeButton = - BuildControlButton(InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_MINIMIZE, [contextWptr]() { + }, isFocus); + auto minimizeButton = isFocus ? InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_MINIMIZE + : InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_MINIMIZE; + auto titleMinimizeButton = BuildControlButton(minimizeButton, [contextWptr]() { auto context = contextWptr.Upgrade(); if (context) { LOGI("minimize button clicked"); context->FireWindowMinimizeCallBack(); } - }); - auto titleCloseButton = - BuildControlButton(InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_CLOSE, [contextWptr]() { + }, isFocus); + auto closeButton = isFocus ? InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_CLOSE + : InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_CLOSE; + auto titleCloseButton = BuildControlButton(closeButton, [contextWptr]() { auto context = contextWptr.Upgrade(); if (context) { LOGI("close button clicked"); context->FireWindowCloseCallBack(); } - }); + }, isFocus); std::list> titleChildren; titleChildren.emplace_back(SetPadding(titleIcon_, TITLE_PADDING_START, TITLE_ELEMENT_MARGIN_HORIZONTAL)); titleChildren.emplace_back(titleLabel_); diff --git a/frameworks/core/components/container_modal/container_modal_component.h b/frameworks/core/components/container_modal/container_modal_component.h index 996260c28b1..fbb0c6816fe 100644 --- a/frameworks/core/components/container_modal/container_modal_component.h +++ b/frameworks/core/components/container_modal/container_modal_component.h @@ -38,6 +38,7 @@ public: RefPtr CreateElement() override; RefPtr CreateRenderNode() override; void BuildInnerChild(); + std::list> BuildTitleChildren(bool isFloating, bool isFocus = true); RefPtr GetTitleIcon() const { @@ -49,31 +50,18 @@ public: return titleLabel_; } - RefPtr GetTitleChildrenRow() const - { - return titleChildrenRow_; - } - - RefPtr GetFloatingTitleChildrenRow() const - { - return floatingTitleChildrenRow_; - } - private: RefPtr BuildTitle(); RefPtr BuildFloatingTitle(); RefPtr BuildContent(); RefPtr BuildControlButton( - InternalResource::ResourceId icon, std::function&& clickCallback); - std::list> BuildTitleChildren(bool isFloating); + InternalResource::ResourceId icon, std::function&& clickCallback, bool isFocus); static RefPtr SetPadding( const RefPtr& component, const Dimension& leftPadding, const Dimension& rightPadding); WeakPtr context_; RefPtr titleIcon_; RefPtr titleLabel_; - RefPtr titleChildrenRow_; - RefPtr floatingTitleChildrenRow_; }; } // namespace OHOS::Ace diff --git a/frameworks/core/components/container_modal/container_modal_constants.h b/frameworks/core/components/container_modal/container_modal_constants.h index b1cee3d7954..d418ce9f813 100644 --- a/frameworks/core/components/container_modal/container_modal_constants.h +++ b/frameworks/core/components/container_modal/container_modal_constants.h @@ -31,10 +31,14 @@ const Dimension TITLE_BUTTON_SIZE = 24.0_vp; const Dimension TITLE_TEXT_FONT_SIZE = 16.0_fp; const Dimension CONTENT_PADDING = 4.0_vp; const Color CONTAINER_BACKGROUND_COLOR = Color(0xf2e6e7ed); +const Color CONTAINER_BACKGROUND_COLOR_LOST_FOCUS = Color(0xfff2f2f2); const Color CONTAINER_BORDER_COLOR = Color(0x33000000); -const Color TITLE_TEXT_COLOR = Color(0xe5000000); +const Color CONTAINER_BORDER_COLOR_LOST_FOCUS = Color(0x19000000); +const Color TITLE_TEXT_COLOR = Color(0xff000000); +const Color TITLE_TEXT_COLOR_LOST_FOCUS = Color(0x66000000); const Color CONTENT_BACKGROUND_COLOR = Color(0xffffffff); const Color TITLE_BUTTON_BACKGROUND_COLOR = Color(0x19000000); +const Color TITLE_BUTTON_BACKGROUND_COLOR_LOST_FOCUS = Color(0x0a000000); const Color TITLE_BUTTON_CLICKED_COLOR = Color(0x33000000); } // namespace OHOS::Ace diff --git a/frameworks/core/components/container_modal/container_modal_element.cpp b/frameworks/core/components/container_modal/container_modal_element.cpp index 8e12d62da75..b0c923e1bfd 100644 --- a/frameworks/core/components/container_modal/container_modal_element.cpp +++ b/frameworks/core/components/container_modal/container_modal_element.cpp @@ -29,9 +29,9 @@ namespace { constexpr uint32_t COLUMN_CHILD_NUM = 2; constexpr uint32_t SPLIT_BUTTON_POSITION = 2; constexpr uint32_t BLUR_WINDOW_RADIUS = 100; -constexpr uint32_t TITLE_POPUP_TIME = 200; // 200ms -constexpr double MOUSE_MOVE_POPUP_DISTANCE = 5.0; // 5.0px -constexpr double TITLE_POPUP_DISTANCE = 37.0; // 37vp height of title +constexpr uint32_t TITLE_POPUP_TIME = 200; // 200ms +constexpr double MOUSE_MOVE_POPUP_DISTANCE = 5.0; // 5.0px +constexpr double TITLE_POPUP_DISTANCE = 37.0; // 37vp height of title } // namespace @@ -113,6 +113,12 @@ void ContainerModalElement::ShowTitle(bool isShow) LOGE("ContainerModalElement showTitle failed, container box element is null!"); return; } + auto context = context_.Upgrade(); + if (!context) { + LOGE("ContainerModalElement showTitle failed, context is null."); + return; + } + windowMode_ = context->FireWindowGetModeCallBack(); // full screen need to hide border and padding. auto containerRenderBox = AceType::DynamicCast(containerBox->GetRenderNode()); @@ -199,6 +205,17 @@ void ContainerModalElement::PerformBuild() LOGE("ContainerModalElement PerformBuild failed, stack element is null!"); return; } + auto column = AceType::DynamicCast(stackElement->GetFirstChild()); + if (!column || column->GetChildren().size() != COLUMN_CHILD_NUM) { + // column should have 2 children, title and content. + LOGE("ContainerModalElement PerformBuild failed, column element is null or children size error!"); + return; + } + + auto titleDisplay = AceType::DynamicCast(column->GetFirstChild()); + if (titleDisplay) { + titleBox_ = AceType::DynamicCast(titleDisplay->GetFirstChild()); + } auto tween = AceType::DynamicCast(stackElement->GetLastChild()); if (!tween) { @@ -219,9 +236,9 @@ void ContainerModalElement::PerformBuild() } // The first time it starts up, it needs to hide title if mode as follows. - auto mode = context_.Upgrade()->FireWindowGetModeCallBack(); - if (mode == WindowMode::WINDOW_MODE_FULLSCREEN || mode == WindowMode::WINDOW_MODE_SPLIT_PRIMARY || - mode == WindowMode::WINDOW_MODE_SPLIT_SECONDARY) { + windowMode_ = context_.Upgrade()->FireWindowGetModeCallBack(); + if (windowMode_ == WindowMode::WINDOW_MODE_FULLSCREEN || windowMode_ == WindowMode::WINDOW_MODE_SPLIT_PRIMARY || + windowMode_ == WindowMode::WINDOW_MODE_SPLIT_SECONDARY) { ShowTitle(false); } } @@ -230,14 +247,12 @@ void ContainerModalElement::Update() { RenderElement::Update(); - const auto container = AceType::DynamicCast(component_); - if (!container) { + containerModalComponent_ = AceType::DynamicCast(component_); + if (!containerModalComponent_) { LOGE("ContainerModalElement update failed, container modal component is null."); return; } - titleChildrenRow_ = container->GetTitleChildrenRow(); - floatingTitleChildrenRow_ = container->GetFloatingTitleChildrenRow(); - auto containerBox = AceType::DynamicCast(container->GetChild()); + auto containerBox = AceType::DynamicCast(containerModalComponent_->GetChild()); if (!containerBox) { LOGE("ContainerModalElement update failed, container box component is null."); return; @@ -300,14 +315,12 @@ void ContainerModalElement::Update() bool ContainerModalElement::CanShowFloatingTitle() { - auto context = context_.Upgrade(); - if (!context || !floatingTitleDisplay_ || !controller_) { - LOGI("Show floating title failed, context, floatingTitleDisplay or controller is null."); + if (!floatingTitleDisplay_ || !controller_) { + LOGI("Show floating title failed, floatingTitleDisplay or controller is null."); return false; } - auto mode = context->FireWindowGetModeCallBack(); - if (mode != WindowMode::WINDOW_MODE_FULLSCREEN && mode != WindowMode::WINDOW_MODE_SPLIT_PRIMARY && - mode != WindowMode::WINDOW_MODE_SPLIT_SECONDARY) { + if (windowMode_ != WindowMode::WINDOW_MODE_FULLSCREEN && windowMode_ != WindowMode::WINDOW_MODE_SPLIT_PRIMARY && + windowMode_ != WindowMode::WINDOW_MODE_SPLIT_SECONDARY) { LOGI("Window is not full screen or split screen, can not show floating title."); return false; } @@ -331,17 +344,21 @@ bool ContainerModalElement::CanHideFloatingTitle() return true; } -void ContainerModalElement::ChangeFloatingTitleIcon() +void ContainerModalElement::ChangeFloatingTitleIcon(bool isFocus) { - if (!floatingTitleBox_ || !titleChildrenRow_ || !floatingTitleChildrenRow_) { + if (!floatingTitleBox_ || !containerModalComponent_) { LOGE("ChangeFloatingTitleIcon failed."); return; } - auto context = context_.Upgrade(); - if (!context) { - LOGE("ChangeFloatingTitleIcon failed, context is null."); + auto renderFloatingTitleBox = AceType::DynamicCast(floatingTitleBox_->GetRenderNode()); + if (!renderFloatingTitleBox) { + LOGE("ChangeFloatingTitleIcon failed, render floating title box is null."); return; } + auto backDecoration = renderFloatingTitleBox->GetBackDecoration(); + backDecoration->SetBackgroundColor(isFocus ? CONTAINER_BACKGROUND_COLOR : CONTAINER_BACKGROUND_COLOR_LOST_FOCUS); + renderFloatingTitleBox->SetBackDecoration(backDecoration); + auto rowElement = AceType::DynamicCast(floatingTitleBox_->GetFirstChild()); if (!rowElement) { LOGE("ChangeFloatingTitleIcon failed, row element is null."); @@ -356,16 +373,35 @@ void ContainerModalElement::ChangeFloatingTitleIcon() std::advance(iterator, SPLIT_BUTTON_POSITION); auto splitButton = AceType::DynamicCast(*iterator); - auto mode = context->FireWindowGetModeCallBack(); - if (mode == WindowMode::WINDOW_MODE_FULLSCREEN) { - rowElement->SetUpdateComponent(floatingTitleChildrenRow_); + if (windowMode_ == WindowMode::WINDOW_MODE_FULLSCREEN) { + auto floatingTitleChildrenRow = AceType::MakeRefPtr( + FlexAlign::FLEX_START, FlexAlign::CENTER, containerModalComponent_->BuildTitleChildren(true, isFocus)); + rowElement->SetUpdateComponent(floatingTitleChildrenRow); splitButton->SetHidden(false); } else { - rowElement->SetUpdateComponent(titleChildrenRow_); + auto titleChildrenRow = AceType::MakeRefPtr( + FlexAlign::FLEX_START, FlexAlign::CENTER, containerModalComponent_->BuildTitleChildren(false, isFocus)); + rowElement->SetUpdateComponent(titleChildrenRow); splitButton->SetHidden(true); } } +void ContainerModalElement::ChangeTitleIcon(bool isFocus) +{ + if (!titleBox_ || !containerModalComponent_) { + LOGE("ChangeTitleIcon failed."); + return; + } + auto rowElement = AceType::DynamicCast(titleBox_->GetFirstChild()); + if (!rowElement) { + LOGE("ChangeTitleIcon failed, row element is null."); + return; + } + auto titleChildrenRow = AceType::MakeRefPtr( + FlexAlign::FLEX_START, FlexAlign::CENTER, containerModalComponent_->BuildTitleChildren(false, isFocus)); + rowElement->SetUpdateComponent(titleChildrenRow); +} + void ContainerModalElement::BlurWindow(bool isBlur) { auto containerBox = AceType::DynamicCast(GetFirstChild()); @@ -387,4 +423,30 @@ void ContainerModalElement::BlurWindow(bool isBlur) } } +void ContainerModalElement::WindowFocus(bool isFocus) +{ + auto containerBox = AceType::DynamicCast(GetFirstChild()); + if (!containerBox) { + LOGE("ContainerModalElement WindowFocus failed, container box element is null!"); + return; + } + + auto containerRenderBox = AceType::DynamicCast(containerBox->GetRenderNode()); + if (containerRenderBox) { + auto containerDecoration = containerRenderBox->GetBackDecoration(); + containerDecoration->SetBackgroundColor( + isFocus ? CONTAINER_BACKGROUND_COLOR : CONTAINER_BACKGROUND_COLOR_LOST_FOCUS); + auto border = containerDecoration->GetBorder(); + border.SetColor(isFocus ? CONTAINER_BORDER_COLOR : CONTAINER_BORDER_COLOR_LOST_FOCUS); + containerDecoration->SetBorder(border); + containerRenderBox->SetBackDecoration(containerDecoration); + } + if (windowMode_ == WindowMode::WINDOW_MODE_FULLSCREEN || windowMode_ == WindowMode::WINDOW_MODE_SPLIT_PRIMARY || + windowMode_ == WindowMode::WINDOW_MODE_SPLIT_SECONDARY) { + ChangeFloatingTitleIcon(isFocus); + } else { + ChangeTitleIcon(isFocus); + } +} + } // namespace OHOS::Ace \ No newline at end of file diff --git a/frameworks/core/components/container_modal/container_modal_element.h b/frameworks/core/components/container_modal/container_modal_element.h index a791e0dce66..39f752b4b94 100644 --- a/frameworks/core/components/container_modal/container_modal_element.h +++ b/frameworks/core/components/container_modal/container_modal_element.h @@ -16,6 +16,7 @@ #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_CONTAINER_MODAL_CONTAINER_MODAL_ELEMENT_H #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_CONTAINER_MODAL_CONTAINER_MODAL_ELEMENT_H +#include "core/components/container_modal/container_modal_component.h" #include "core/components/flex/flex_component.h" #include "core/components/overlay/overlay_element.h" #include "core/components/stage/stage_element.h" @@ -31,6 +32,7 @@ public: RefPtr GetStageElement() const; void ShowTitle(bool isShow); void BlurWindow(bool isBlur); + void WindowFocus(bool isFocus); void Update() override; void PerformBuild() override; @@ -38,12 +40,14 @@ private: RefPtr GetStackElement() const; bool CanShowFloatingTitle(); bool CanHideFloatingTitle(); - void ChangeFloatingTitleIcon(); + void ChangeFloatingTitleIcon(bool isFocus = true); + void ChangeTitleIcon(bool isFocus = true); + WindowMode windowMode_; RefPtr controller_; RefPtr floatingTitleDisplay_; RefPtr floatingTitleBox_; - RefPtr titleChildrenRow_; - RefPtr floatingTitleChildrenRow_; + RefPtr titleBox_; + RefPtr containerModalComponent_; float density_ = 1.0f; }; diff --git a/frameworks/core/pipeline/pipeline_context.cpp b/frameworks/core/pipeline/pipeline_context.cpp index 4e052b849e0..49a7f3457f8 100644 --- a/frameworks/core/pipeline/pipeline_context.cpp +++ b/frameworks/core/pipeline/pipeline_context.cpp @@ -628,7 +628,6 @@ void PipelineContext::FlushRender() if (FrameReport::GetInstance().GetEnable()) { FrameReport::GetInstance().EndFlushRender(); } - } void PipelineContext::FlushRenderFinish() @@ -2764,6 +2763,22 @@ void PipelineContext::RootLostFocus() const } } +void PipelineContext::WindowFocus(bool isFocus) const +{ + if (windowModal_ != WindowModal::CONTAINER_MODAL) { + LOGW("WindowFocus failed, Window modal is not container."); + return; + } + if (!rootElement_) { + LOGW("WindowFocus failed, rootElement_ is null."); + return; + } + auto containerModal = AceType::DynamicCast(rootElement_->GetFirstChild()); + if (containerModal) { + containerModal->WindowFocus(isFocus); + } +} + void PipelineContext::AddPageUpdateTask(std::function&& task, bool directExecute) { CHECK_RUN_ON(UI); diff --git a/frameworks/core/pipeline/pipeline_context.h b/frameworks/core/pipeline/pipeline_context.h index 977828f4678..c590b036f20 100644 --- a/frameworks/core/pipeline/pipeline_context.h +++ b/frameworks/core/pipeline/pipeline_context.h @@ -588,6 +588,8 @@ public: void FlushFocus(); + void WindowFocus(bool isFocus) const; + void SetIsRightToLeft(bool isRightToLeft) { isRightToLeft_ = isRightToLeft; -- Gitee