import { AppStorageV2 } from "@kit.ArkUI";
import { SafeAreaInsets } from "./model/SafeAreaInsets";
/**
* @file 窗口安全区状态,用于沉浸式布局的避让区域
* @author Joker.X
*/
/**
* AppStorageV2 键名
*/
export const WINDOW_SAFE_AREA_STATE_KEY: string = "window_safe_area_state";
/**
* 全局窗口安全区状态
*/
@ObservedV2
export class WindowSafeAreaState {
/**
* 顶部安全区高度(vp)
*/
@Trace
topInset: number = 0;
/**
* 左侧安全区宽度(vp)
*/
@Trace
leftInset: number = 0;
/**
* 底部安全区高度(vp)
*/
@Trace
bottomInset: number = 0;
/**
* 右侧安全区宽度(vp)
*/
@Trace
rightInset: number = 0;
/**
* 更新安全区数据
* @param {number} topInset - 顶部安全区高度(vp)
* @param {number} leftInset - 左侧安全区宽度(vp)
* @param {number} bottomInset - 底部安全区高度(vp)
* @param {number} rightInset - 右侧安全区宽度(vp)
* @returns {void} 无返回值
* @example
* state.updateSafeArea(24, 0, 32, 0);
*/
updateSafeArea(topInset: number, leftInset: number, bottomInset: number, rightInset: number): void {
this.topInset = topInset;
this.leftInset = leftInset;
this.bottomInset = bottomInset;
this.rightInset = rightInset;
}
/**
* 更新安全区数据(结构体方式)
* @param {SafeAreaInsets} insets - 安全区数据
* @returns {void} 无返回值
* @example
* state.updateSafeAreaByInsets({ top: 24, left: 0, bottom: 32, right: 0 });
*/
updateSafeAreaByInsets(insets: SafeAreaInsets): void {
this.updateSafeArea(insets.top, insets.left, insets.bottom, insets.right);
}
}
/**
* 获取全局窗口安全区状态实例;若不存在则创建
* @returns {WindowSafeAreaState} 全局窗口安全区状态
* @example
* const state = getWindowSafeAreaState();
*/
export function getWindowSafeAreaState(): WindowSafeAreaState {
return AppStorageV2.connect<WindowSafeAreaState>(
WindowSafeAreaState,
WINDOW_SAFE_AREA_STATE_KEY,
() => new WindowSafeAreaState()
)!;
}