212 行
5.5 KiB
Plaintext
212 行
5.5 KiB
Plaintext
import promptAction from '@ohos.promptAction';
|
|
import { BusinessError } from '@kit.BasicServicesKit';
|
|
import { HashMap } from '@kit.ArkTS';
|
|
|
|
export interface Btn {
|
|
text?: string | Resource;
|
|
color?: string | Resource;
|
|
onClick: () => void
|
|
}
|
|
|
|
export interface AlertOptions {
|
|
title?: string
|
|
msg?: string
|
|
action: Btn
|
|
}
|
|
|
|
export interface ConfirmOptions {
|
|
title?: string
|
|
msg?: string
|
|
confirm: Btn
|
|
cancel: Btn
|
|
}
|
|
|
|
export interface ListOptions<T> {
|
|
title?: string
|
|
cancel?: Btn
|
|
values: Array<T>
|
|
onSelected: (index: number, value: T) => void
|
|
onError?: (msg: string) => void
|
|
}
|
|
|
|
interface ListItem {
|
|
content: string
|
|
}
|
|
|
|
@Builder
|
|
function customDialogBuilder<T>(option: ListOptions<T>, dialogId: number) {
|
|
|
|
Column() {
|
|
Text(option.title)
|
|
.fontSize(13)
|
|
.textAlign(TextAlign.Center)
|
|
.width('60%')
|
|
.maxLines(2)
|
|
.ellipsisMode(EllipsisMode.END)
|
|
.textOverflow({
|
|
overflow: TextOverflow.Ellipsis
|
|
})
|
|
.visibility(option.title ? Visibility.Visible : Visibility.None)
|
|
List({ space: 20, initialIndex: 0 }) {
|
|
ForEach(option.values, (item: T, index: number) => {
|
|
ListItem() {
|
|
Text(typeof item === "string" ? item : (item as ListItem).content)
|
|
.width('100%')
|
|
.fontSize(16)
|
|
.textAlign(TextAlign.Center)
|
|
.onClick(() => {
|
|
if (ToolsHelper.mapDialog.get(dialogId)) {
|
|
promptAction.closeCustomDialog(ToolsHelper.mapDialog.get(dialogId))
|
|
ToolsHelper.mapDialog.remove(dialogId)
|
|
}
|
|
option.onSelected(index, item)
|
|
})
|
|
}
|
|
}, (item: string) => item)
|
|
}
|
|
.listDirection(Axis.Vertical) // 排列方向
|
|
.scrollBar(BarState.Off)
|
|
.friction(0.6)
|
|
.divider({ strokeWidth: 1, color: 0xEEEEEE, startMargin: 20, endMargin: 20 }) // 每行之间的分界线
|
|
.edgeEffect(EdgeEffect.Spring) // 边缘效果设置为Spring
|
|
.width('100%')
|
|
.height(option.values.length < 8 ? `${option.values.length / 16 * 100}%` : '50%')
|
|
.margin({ top: 20 })
|
|
}.padding({ top: 20, bottom: 20, left: 20, right: 20 })
|
|
}
|
|
|
|
/**
|
|
* 常用方法
|
|
*/
|
|
export class ToolsHelper {
|
|
/**
|
|
* 弹出Toast
|
|
* @param msg
|
|
*/
|
|
static showMessage(msg: string) {
|
|
console.info(msg);
|
|
promptAction.showToast({
|
|
message: msg,
|
|
duration: 1500
|
|
});
|
|
}
|
|
|
|
/**kio9
|
|
* 弹出Alert弹窗
|
|
* @param options
|
|
*/
|
|
static showAlertDialog(options: AlertOptions) {
|
|
try {
|
|
promptAction.showDialog({
|
|
alignment: 1,
|
|
title: options.title,
|
|
message: options.msg,
|
|
buttons: [{
|
|
text: options.action.text ?? "确定",
|
|
color: options.action.color ?? "#000000",
|
|
}]
|
|
})
|
|
.then(() => {
|
|
options.action.onClick()
|
|
})
|
|
.catch((err: Error) => {
|
|
ToolsHelper.showMessage(err.message)
|
|
})
|
|
} catch (error) {
|
|
let message = (error as BusinessError).message
|
|
ToolsHelper.showMessage(message)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 弹出Confirm弹窗
|
|
* @param options
|
|
*/
|
|
static showConfirmDialog(options: ConfirmOptions) {
|
|
try {
|
|
promptAction.showDialog({
|
|
alignment: 1,
|
|
title: options.title,
|
|
message: options.msg,
|
|
buttons: [{
|
|
text: options.confirm.text ?? "确定",
|
|
color: options.confirm.color ?? "#000000",
|
|
}, {
|
|
text: options.cancel.text ?? "取消",
|
|
color: options.cancel.color ?? "#666666",
|
|
}]
|
|
})
|
|
.then((data) => {
|
|
if (data.index === 0) {
|
|
options.confirm.onClick()
|
|
} else {
|
|
options.cancel.onClick()
|
|
}
|
|
})
|
|
.catch((err: Error) => {
|
|
ToolsHelper.showMessage(err.message)
|
|
})
|
|
} catch (error) {
|
|
let message = (error as BusinessError).message
|
|
ToolsHelper.showMessage(message)
|
|
}
|
|
}
|
|
|
|
public static mapDialog = new HashMap<number, number>()
|
|
|
|
/**
|
|
* 弹出List弹窗
|
|
* @param options values 如果是非string列表的话,需要存在content字段
|
|
*/
|
|
static showListDialog<T = string>(options: ListOptions<T>, p: object) {
|
|
|
|
let isSuccess: Array<number> = []
|
|
options.values.forEach((item, index) => {
|
|
if (typeof item !== 'string') {
|
|
if (!(item as ListItem).content) {
|
|
isSuccess.push(index)
|
|
}
|
|
}
|
|
})
|
|
if (isSuccess.length > 0) {
|
|
options.onError && options.onError(`第(${isSuccess.join("、")})个数据中,没有content字段。`)
|
|
} else {
|
|
const dialogTag = new Date().getTime()
|
|
promptAction.openCustomDialog({
|
|
alignment: 1,
|
|
builder: customDialogBuilder.bind(p, options, dialogTag)
|
|
}).then((dialogId: number) => {
|
|
ToolsHelper.mapDialog.set(dialogTag, dialogId)
|
|
})
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 弹出自定义弹窗
|
|
* @param alignment 弹窗在竖直方向上的对齐方式
|
|
*/
|
|
static showCustomDialog(b: CustomBuilder, alignment?: DialogAlignment) {
|
|
const dialogTag = new Date().getTime()
|
|
promptAction.openCustomDialog({
|
|
alignment: alignment ?? DialogAlignment.Center,
|
|
builder: b
|
|
}).then((dialogId: number) => {
|
|
ToolsHelper.mapDialog.set(dialogTag, dialogId)
|
|
}).catch((error: Error) => {
|
|
console.log('>>>>>', JSON.stringify(error))
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 获取调用栈第一个类
|
|
*/
|
|
static getStackKey() {
|
|
let stack = new Error().stack
|
|
if (stack) {
|
|
let list = JSON.stringify(stack).split('\\n')
|
|
let a = list[list.length-2].split(':')[0].split('(')[1]
|
|
return a
|
|
}
|
|
return undefined
|
|
}
|
|
} |