!2036 新增窗口失去焦点时的UX显示

Merge pull request !2036 from jiangdayuan/master
This commit is contained in:
openharmony_ci
2022-03-27 13:06:24 +00:00
committed by Gitee
19 changed files with 402 additions and 104 deletions
-4
View File
@@ -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)
+61 -16
View File
@@ -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<NativeEngine*>(runtime_);
if (!storage) {
container->SetLocalStorage(nullptr, context->GetBindingObject()->Get<NativeReference>());
@@ -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<WindowSizeChangeReason>(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<std::string>& params, std::vector<std::string>& info)
-2
View File
@@ -70,10 +70,8 @@ private:
std::weak_ptr<OHOS::AbilityRuntime::Context> context_;
void* runtime_ = nullptr;
OHOS::Rosen::Window* window_ = nullptr;
ViewportConfig config_;
std::string startUrl_;
int32_t instanceId_ = -1;
bool updateConfig_ = false;
OHOS::sptr<OHOS::Rosen::IWindowDragListener> dragWindowListener_ = nullptr;
OHOS::sptr<OHOS::Rosen::IOccupiedAreaChangeListener> occupiedAreaChangeListener_ = nullptr;
};
+20
View File
@@ -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",
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{opacity:0.4;}
.st1{fill-rule:evenodd;clip-rule:evenodd;}
</style>
<g id="ic_ohos_window_close" class="st0">
<path id="Shape" class="st1" d="M8.8,16.2c-0.3,0.3-0.8,0.3-1.1,0c-0.3-0.3-0.3-0.8,0-1.1l3.2-3.2L7.8,8.8c-0.3-0.3-0.3-0.8,0-1.1
s0.8-0.3,1.1,0l3.2,3.2l3.2-3.2c0.3-0.3,0.8-0.3,1.1,0c0.3,0.3,0.3,0.8,0,1.1L8.8,16.2z M13.6,12.5l2.7,2.7c0.3,0.3,0.3,0.8,0,1.1
c-0.3,0.3-0.8,0.3-1.1,0l-2.7-2.7L13.6,12.5z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 826 B

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{opacity:0.4;}
</style>
<g id="ic_ohos_window_full" class="st0">
<path id="Path" d="M16.2,11.5c-0.4,0-0.7,0.3-0.7,0.6l0,0.1v3.2h-3.2c-0.4,0-0.7,0.3-0.7,0.6l0,0.1c0,0.4,0.3,0.7,0.6,0.7l0.1,0h4
c0.4,0,0.7-0.3,0.7-0.6l0-0.1v-4C17,11.8,16.7,11.5,16.2,11.5z"/>
<path id="Path_1_" d="M7.8,12.5c0.4,0,0.7-0.3,0.7-0.6l0-0.1V8.5h3.2c0.4,0,0.7-0.3,0.7-0.6l0-0.1c0-0.4-0.3-0.7-0.6-0.7l-0.1,0h-4
C7.4,7,7.1,7.3,7,7.6l0,0.1v4C7,12.2,7.3,12.5,7.8,12.5z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 859 B

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{opacity:0.4;}
.st1{fill-rule:evenodd;clip-rule:evenodd;}
</style>
<g id="ic_ohos_window_minimize" class="st0">
<path id="Rectangle" class="st1" d="M6.8,11.2h10.5c0.4,0,0.8,0.3,0.8,0.8l0,0c0,0.4-0.3,0.8-0.8,0.8H6.8C6.3,12.8,6,12.4,6,12l0,0
C6,11.6,6.3,11.2,6.8,11.2z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 679 B

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{opacity:0.4;}
</style>
<g id="ic_ohos_window_exitfull" class="st0">
<path id="Path" d="M13.2,18c0.4,0,0.7-0.3,0.7-0.6l0-0.1V14h3.2c0.4,0,0.7-0.3,0.7-0.6l0-0.1c0-0.4-0.3-0.7-0.6-0.7l-0.1,0h-4
c-0.4,0-0.7,0.3-0.7,0.6l0,0.1v4C12.5,17.7,12.8,18,13.2,18z"/>
<path id="Path_1_" d="M10.8,6c-0.4,0-0.7,0.3-0.7,0.6l0,0.1V10H6.8c-0.4,0-0.7,0.3-0.7,0.6l0,0.1c0,0.4,0.3,0.7,0.6,0.7l0.1,0h4
c0.4,0,0.7-0.3,0.7-0.6l0-0.1v-4C11.5,6.3,11.2,6,10.8,6z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 855 B

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{opacity:0.4;}
</style>
<g id="ic_ohos_window_split_left" class="st0">
<path id="Path" d="M12,17H9c-1,0-1.4-0.1-1.8-0.3c-0.4-0.2-0.7-0.5-0.9-0.9C6.1,15.5,6,15.1,6,14.2L6,10c0-1,0.1-1.4,0.3-1.8
c0.2-0.4,0.5-0.7,0.9-0.9C7.5,7.1,7.9,7,8.8,7L12,7V17z"/>
<path id="Path_1_" d="M12.8,7H15c1,0,1.4,0.1,1.8,0.3c0.4,0.2,0.7,0.5,0.9,0.9C17.9,8.6,18,9,18,10v4c0,1-0.1,1.4-0.3,1.8
s-0.5,0.7-0.9,0.9S16,17,15,17h-2.3v-1.5l2.4,0l0.3,0c0.1,0,0.2,0,0.2,0l0.2,0c0,0,0.1,0,0.1,0l0.1,0l0,0c0.1-0.1,0.2-0.1,0.3-0.3
l0,0l0-0.1c0,0,0-0.1,0-0.1l0-0.2l0-0.1l0-0.2l0-0.3l0-4.2l0-0.3c0-0.1,0-0.2,0-0.2l0-0.2c0,0,0-0.1,0-0.1l0-0.1l0,0
c-0.1-0.1-0.1-0.2-0.3-0.3l0,0l-0.1,0c0,0-0.1,0-0.1,0l-0.2,0l-0.1,0l-0.4,0l-2.4,0V7z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -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<size_t>(_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<size_t>(_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<size_t>(_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<size_t>(_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<size_t>(_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<size_t>(_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()) {
@@ -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.
@@ -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<size_t>(_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<size_t>(_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<size_t>(_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<size_t>(_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<size_t>(_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<size_t>(_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()) {
@@ -51,7 +51,7 @@ RefPtr<Component> ContainerModalComponent::BuildTitle()
// build title box
auto titleBox = AceType::MakeRefPtr<BoxComponent>();
titleBox->SetHeight(CONTAINER_TITLE_HEIGHT);
titleChildrenRow_ =
auto titleChildrenRow =
AceType::MakeRefPtr<RowComponent>(FlexAlign::FLEX_START, FlexAlign::CENTER, BuildTitleChildren(false));
// handle mouse move
@@ -69,7 +69,7 @@ RefPtr<Component> ContainerModalComponent::BuildTitle()
context->FireWindowStartMoveCallBack();
}
});
titleBox->SetChild(titleChildrenRow_);
titleBox->SetChild(titleChildrenRow);
auto display = AceType::MakeRefPtr<DisplayComponent>(titleBox);
return display;
}
@@ -84,9 +84,9 @@ RefPtr<Component> ContainerModalComponent::BuildFloatingTitle()
titleBox->SetHeight(CONTAINER_TITLE_HEIGHT);
titleBox->SetBackDecoration(titleDecoration);
floatingTitleChildrenRow_ =
auto floatingTitleChildrenRow =
AceType::MakeRefPtr<RowComponent>(FlexAlign::FLEX_START, FlexAlign::CENTER, BuildTitleChildren(true));
titleBox->SetChild(floatingTitleChildrenRow_);
titleBox->SetChild(floatingTitleChildrenRow);
auto tween = AceType::MakeRefPtr<TweenComponent>("ContainerModal", titleBox);
return tween;
}
@@ -108,7 +108,7 @@ RefPtr<Component> ContainerModalComponent::BuildContent()
}
RefPtr<ButtonComponent> ContainerModalComponent::BuildControlButton(
InternalResource::ResourceId icon, std::function<void()>&& clickCallback)
InternalResource::ResourceId icon, std::function<void()>&& clickCallback, bool isFocus)
{
auto image = AceType::MakeRefPtr<ImageComponent>(icon);
image->SetWidth(TITLE_ICON_SIZE);
@@ -120,7 +120,7 @@ RefPtr<ButtonComponent> 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<RefPtr<Component>> ContainerModalComponent::BuildTitleChildren(bool isFloating)
std::list<RefPtr<Component>> ContainerModalComponent::BuildTitleChildren(bool isFloating, bool isFocus)
{
// title icon
if (!titleIcon_) {
@@ -182,57 +182,64 @@ std::list<RefPtr<Component>> ContainerModalComponent::BuildTitleChildren(bool is
// title text
if (!titleLabel_) {
titleLabel_ = AceType::MakeRefPtr<TextComponent>("");
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<RefPtr<Component>> titleChildren;
titleChildren.emplace_back(SetPadding(titleIcon_, TITLE_PADDING_START, TITLE_ELEMENT_MARGIN_HORIZONTAL));
titleChildren.emplace_back(titleLabel_);
@@ -38,6 +38,7 @@ public:
RefPtr<Element> CreateElement() override;
RefPtr<RenderNode> CreateRenderNode() override;
void BuildInnerChild();
std::list<RefPtr<Component>> BuildTitleChildren(bool isFloating, bool isFocus = true);
RefPtr<ImageComponent> GetTitleIcon() const
{
@@ -49,31 +50,18 @@ public:
return titleLabel_;
}
RefPtr<RowComponent> GetTitleChildrenRow() const
{
return titleChildrenRow_;
}
RefPtr<RowComponent> GetFloatingTitleChildrenRow() const
{
return floatingTitleChildrenRow_;
}
private:
RefPtr<Component> BuildTitle();
RefPtr<Component> BuildFloatingTitle();
RefPtr<Component> BuildContent();
RefPtr<ButtonComponent> BuildControlButton(
InternalResource::ResourceId icon, std::function<void()>&& clickCallback);
std::list<RefPtr<Component>> BuildTitleChildren(bool isFloating);
InternalResource::ResourceId icon, std::function<void()>&& clickCallback, bool isFocus);
static RefPtr<Component> SetPadding(
const RefPtr<Component>& component, const Dimension& leftPadding, const Dimension& rightPadding);
WeakPtr<PipelineContext> context_;
RefPtr<ImageComponent> titleIcon_;
RefPtr<TextComponent> titleLabel_;
RefPtr<RowComponent> titleChildrenRow_;
RefPtr<RowComponent> floatingTitleChildrenRow_;
};
} // namespace OHOS::Ace
@@ -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
@@ -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<RenderBox>(containerBox->GetRenderNode());
@@ -199,6 +205,17 @@ void ContainerModalElement::PerformBuild()
LOGE("ContainerModalElement PerformBuild failed, stack element is null!");
return;
}
auto column = AceType::DynamicCast<ColumnElement>(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<DisplayElement>(column->GetFirstChild());
if (titleDisplay) {
titleBox_ = AceType::DynamicCast<BoxElement>(titleDisplay->GetFirstChild());
}
auto tween = AceType::DynamicCast<TweenElement>(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<ContainerModalComponent>(component_);
if (!container) {
containerModalComponent_ = AceType::DynamicCast<ContainerModalComponent>(component_);
if (!containerModalComponent_) {
LOGE("ContainerModalElement update failed, container modal component is null.");
return;
}
titleChildrenRow_ = container->GetTitleChildrenRow();
floatingTitleChildrenRow_ = container->GetFloatingTitleChildrenRow();
auto containerBox = AceType::DynamicCast<BoxComponent>(container->GetChild());
auto containerBox = AceType::DynamicCast<BoxComponent>(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<RenderBox>(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<RowElement>(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<RenderPadding>(*iterator);
auto mode = context->FireWindowGetModeCallBack();
if (mode == WindowMode::WINDOW_MODE_FULLSCREEN) {
rowElement->SetUpdateComponent(floatingTitleChildrenRow_);
if (windowMode_ == WindowMode::WINDOW_MODE_FULLSCREEN) {
auto floatingTitleChildrenRow = AceType::MakeRefPtr<RowComponent>(
FlexAlign::FLEX_START, FlexAlign::CENTER, containerModalComponent_->BuildTitleChildren(true, isFocus));
rowElement->SetUpdateComponent(floatingTitleChildrenRow);
splitButton->SetHidden(false);
} else {
rowElement->SetUpdateComponent(titleChildrenRow_);
auto titleChildrenRow = AceType::MakeRefPtr<RowComponent>(
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<RowElement>(titleBox_->GetFirstChild());
if (!rowElement) {
LOGE("ChangeTitleIcon failed, row element is null.");
return;
}
auto titleChildrenRow = AceType::MakeRefPtr<RowComponent>(
FlexAlign::FLEX_START, FlexAlign::CENTER, containerModalComponent_->BuildTitleChildren(false, isFocus));
rowElement->SetUpdateComponent(titleChildrenRow);
}
void ContainerModalElement::BlurWindow(bool isBlur)
{
auto containerBox = AceType::DynamicCast<BoxElement>(GetFirstChild());
@@ -387,4 +423,30 @@ void ContainerModalElement::BlurWindow(bool isBlur)
}
}
void ContainerModalElement::WindowFocus(bool isFocus)
{
auto containerBox = AceType::DynamicCast<BoxElement>(GetFirstChild());
if (!containerBox) {
LOGE("ContainerModalElement WindowFocus failed, container box element is null!");
return;
}
auto containerRenderBox = AceType::DynamicCast<RenderBox>(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
@@ -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<StageElement> 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<StackElement> GetStackElement() const;
bool CanShowFloatingTitle();
bool CanHideFloatingTitle();
void ChangeFloatingTitleIcon();
void ChangeFloatingTitleIcon(bool isFocus = true);
void ChangeTitleIcon(bool isFocus = true);
WindowMode windowMode_;
RefPtr<Animator> controller_;
RefPtr<RenderDisplay> floatingTitleDisplay_;
RefPtr<BoxElement> floatingTitleBox_;
RefPtr<RowComponent> titleChildrenRow_;
RefPtr<RowComponent> floatingTitleChildrenRow_;
RefPtr<BoxElement> titleBox_;
RefPtr<ContainerModalComponent> containerModalComponent_;
float density_ = 1.0f;
};
+16 -1
View File
@@ -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<ContainerModalElement>(rootElement_->GetFirstChild());
if (containerModal) {
containerModal->WindowFocus(isFocus);
}
}
void PipelineContext::AddPageUpdateTask(std::function<void()>&& task, bool directExecute)
{
CHECK_RUN_ON(UI);
@@ -588,6 +588,8 @@ public:
void FlushFocus();
void WindowFocus(bool isFocus) const;
void SetIsRightToLeft(bool isRightToLeft)
{
isRightToLeft_ = isRightToLeft;