import EventEmitter from 'eventemitter3';
import { ApplicationInstanceType, ForgeWindow } from '@netless/forge-room';
import { WhiteboardToolType } from './WhiteboardApplication';
import { IndexedNavigation } from './IndexedNavigation';
import { WhiteboardPermissions } from './WhitePermissions';
import { ToolbarStyle } from './model/ToolbarModel';
export interface WhiteboardEvents {
    /**
     * 元素被选中后触发
     * @param {string} userId - 触发事件的用户 id
     * @param {string} pageId - 元素所属页面 id
     * @param {string} elementId - 元素 id
     * @param {ElementAttributeKey[]} attributes - 元素的可修改属性列表
     * @param {number[]} boundingRect - 所有选中元素的最小包围盒, [x, y, width, height]
     */
    elementSelected: (userId: string, pageId: string, elementId: string, attributes: ElementAttributeKey[], boundingRect: [number, number, number, number]) => void;
    /**
     * 所有元素取消选中后触发
     * @param {string} userId - 触发事件的用户 id
     */
    elementDeselected: (userId: string) => void;
    /**
     * 工具栏发生变化
     * @param {ToolbarStyle} style
     */
    toolbarStyleChange: (style: ToolbarStyle) => void;
    /**
     * 白板页数发生变化
     * @param {string[]} pageList pageId 组成的数组
     */
    pagesChange: (pageList: string[]) => void;
    /**
     * 当前显示页面发生变化后触发
     * @param {string} userId - 触发事件的用户 id
     * @param {string} pageId - 当前页面 id
     */
    activePageChange: (userId: string, pageId: string) => void;
    /**
     * 视角模式发生变化
     * @param {string} userId
     * @param {"free" | "main" | string} viewMode
     */
    userViewModeChange: (userId: string, viewMode: 'free' | 'main' | string) => void;
    /**
     * 输入类型发生变化, "pen" 仅接受手写笔输入, "any" 接受任意输入
     * @param {"pen" | "any"} type
     */
    inputTypeChange: (type: 'pen' | 'any') => void;
    /**
     * 撤销栈发生变化时触发
     * @param {number} length - 撤销栈长度
     */
    undoStackLength: (length: number) => void;
    /**
     * 重做栈发生变化时触发
     * @param {number} length - 重做栈长度
     */
    redoStackLength: (length: number) => void;
    /**
     * grab 工具鼠标按下时触发
     */
    grabDown: () => void;
    /**
     * grab 工具鼠标弹起时触发
     */
    grabUp: () => void;
    error: (errorCode: number, errorMsg: string) => void;
}
export type ElementAttributes = {
    strokeColor: string;
    fillColor: string | null;
    strokeWidth: number;
    fontSize: number;
    dashArray: number[];
    headArrow: 'normal' | 'none';
    tailArrow: 'normal' | 'none';
};
export type ElementAttributeKey = keyof ElementAttributes;
export declare class Whiteboard extends EventEmitter<WhiteboardEvents> implements ApplicationInstanceType {
    readonly view: HTMLDivElement;
    readonly selfUserId: string;
    readonly window: ForgeWindow | undefined;
    readonly permissions: WhiteboardPermissions;
    /**
       * 当前选中的工具
       */
    tool: WhiteboardToolType;
    /**
       * 字体大小
       */
    fontSize: number;
    /**
       * 虚线配置
       */
    dashArray: number[];
    /**
       * 字体名称
       */
    fontFamily: string;
    /**
       * 描边颜色
       */
    strokeColor: string;
    /**
       * 填充颜色
       */
    fillColor: string;
    /**
       * 描边宽度
       */
    strokeWidth: number;
    /**
       * 是否允许用鼠标/触控板进行缩放和拖动画布
       */
    enableCameraByMouse: boolean;
    /**
       * 是否允许触摸屏上触摸事件进行缩放和拖动画布
       */
    enableCameraByTouch: boolean;
    /**
       * 相机超出边界时, 警示阴影的颜色, 默认 "#F44336"
       */
    cameraBoundaryColor: string;
    /**
       * 是否允许相机超出边界时, 警示高亮阴影, 默认 true
       */
    enableCameraBoundaryHighlight: boolean;
    getElementAttribute: <K extends ElementAttributeKey>(pageId: string, elementId: string, attribute: K) => ElementAttributes[K];
    setElementAttribute: <K extends keyof ElementAttributes>(pageId: string, elementId: string, attribute: K, value: ElementAttributes[K]) => any;
    /**
     * 设置性能模式状态, enabled 为 true 时开启性能模式, 否则关闭性能模式
     * 性能模式下, 白板会降低渲染质量及同步频率以提升性能, 适用于低性能设备或需要大量绘制元素的场景
     * @param {boolean} enabled
     */
    setPerformanceMode: (enabled: boolean) => void;
    /**
     * 获取当前是否处于性能模式
     */
    isPerformanceMode: () => boolean;
    /**
       * 删除白板元素
       * @param {string} pageId - 元素所属页面 id
       * @param {string} elementId - 元素 id
       */
    removeElement: (pageId: string, elementId: string) => void;
    getCurrentTool: () => WhiteboardToolType;
    setCurrentTool: (tool: WhiteboardToolType) => void;
    /**
       * 设置画布区域背景色
       * @param {string} color - css 颜色值
       */
    setCanvasBackgroundColor: (color: string) => void;
    /**
       * 设置主题色, 主题色影响选中框和昵称的背景色
       * @param {string} color - css 颜色值
       */
    setThemeColor: (color: string) => void;
    /**
       * 切换到指定页面, 调用端需要有页面切换权限
       * @param {string} id - 指定要切换到的页面 id
       */
    gotoPage: (id: string) => void;
    /**
       * 添加页面, 如果页面已经存在则不做任何修改
       * @param {string} id - 指定要添加到的页面 id
       */
    addPage: (id: string) => void;
    deletePage: (id: string) => void;
    pageList: () => string[];
    /**
       * 获取当前页面 id
       * @param {string=} userId - 指定要获取对应用户的当前页面 id, 不传 userId 参数则获取自己的当前页面 id
       */
    currentPageId: (userId?: string) => string;
    /**
       * 复制页面
       * @param {string} sourceId - 指定要复制的页面, string 类型指定 id
       * @param {string} targetId - 指定要复制到的页面, string 类型指定 id
       */
    clonePage: (sourceId: string, targetId: string) => void;
    /**
       * 清空当前页面
       */
    clearPage: () => void;
    /**
       * 平移画布
       * @param {number} offsetX - x 轴偏移量
       * @param {number} offsetY - y 轴偏移量
       */
    translateCamera: (offsetX: number, offsetY: number) => void;
    /**
       * 以画布中心为固定点缩放画布
       * @param {number} scale - 缩放比例
       * @param {"center" | "top-left"} origin - 缩放原点, "center" 为画布中心, "top-left" 为画布左上角
       */
    scaleCamera: (scale: number, origin?: 'center' | 'top-left') => void;
    /**
       * 重置画布, 将画布缩放比例重置为 1, 平移量重置为 [0, 0]
       */
    resetCamera: () => void;
    /**
       * 是否显示用户光标
       */
    showLiveCursor: (visible: boolean) => void;
    /**
       * 更新视口大小
       */
    updateViewport: (width: number, height: number) => void;
    /**
       * 为 userId 指定的用户设置页面, 调用需要有 `WhiteboardPermissionFlag.setOthersView` 权限,
       * userId 指定的用户的视角模式应为 `free`, 否则调用无效
       */
    setFreeModelUserPage: (id: string, userId: string) => void;
    indexedNavigation: IndexedNavigation;
    /**
       * 设置视角模式为自由模式, 可以修改自己或者他人视角, 修改他人视角需要 `WhiteboardPermissionFlag.setOthersView` 权限
       * @param {string=} userId 可选, 指定要修改视角的 userId, 默认修改自己的视角
       */
    setViewModeToFree: (userId?: string) => void;
    /**
       * 设置视角模式为跟随其他用户, 可以修改自己或者他人视角, 修改他人视角需要 `WhiteboardPermissionFlag.setOthersView` 权限
       * @param {string} flowId 指定要跟随的用户 id
       * @param {string=} userId 可选, 指定要修改视角的 userId, 默认修改自己的视角
       */
    setViewModeToFlow: (flowId: string, userId?: string) => void;
    /**
       * 设置视角模式为跟随白板主视角, 可以修改自己或者他人视角, 修改他人视角需要 `WhiteboardPermissionFlag.setOthersView` 权限
       * @param {string=} userId 可选, 指定要修改视角的 userId, 默认修改自己的视角
       */
    setViewModeToMain: (userId?: string | undefined) => void;
    /**
       * 获取视角模式
       * @param {string=} userId 可选, 默认获取自己的视角模式
       * @return {'free' | 'main' | string} `free` 表示自由视角, `main` 表示主视角, 其他 string 类型代表跟随视角, string 值为跟随的 userId
       */
    getViewModel: (userId?: string) => 'free' | 'main' | string;
    /**
       * 撤销
       */
    undo: () => void;
    /**
       * 重做
       */
    redo: () => void;
    /**
       * 光栅化指定页面的可视区域
       * @param {number} scale 缩放比例
       * @param {string=} page string 指示页码 id; number 指示 IndexedNavigation 页面索引; undefined 指示光栅化当前页
       * @return {Promise<string>} 异步返回光栅化结果, 图片 png 对应的 base64 url. 如果页面不存在返回 null
       */
    rasterizeViewport: (scale: number, page?: string | number | undefined) => Promise<string | null>;
    /**
       * 光栅化指定页面包含所有元素的包围盒
       * @param {number} outputMaxWidth 输出图片最大宽度, 在保证高宽比的情况下限值输出图片的宽度小于等于此值
       * @param {number} outputMaxHeight 输出图片最大高度, 在保证高宽比的情况下限值输出图片的高度小于等于此值
       * @param {string=} page string 指示页码 id; number 指示 IndexedNavigation 页面索引; undefined 指示光栅化当前页
       * @return {Promise<string>} 异步返回光栅化结果, 图片 png 对应的 base64 url. 如果页面不存在返回 null
       */
    rasterizeElementsBounds: (outputMaxWidth: number, outputMaxHeight: number, page?: string | number | undefined) => Promise<string | null>;
    /**
       * 光栅化指定页面最大缩放区域, 如果没有指定 `WhiteboardOption.maxScaleRatio` 或者指定的值为 -1, 则按 `rasterizeViewport` 返回结果.
       * @param {number} scale 缩放比例
       * @param {string=} page string 指示页码 id; number 指示 IndexedNavigation 页面索引; undefined 指示光栅化当前页
       * @return {Promise<string>} 异步返回光栅化结果, 图片 png 对应的 base64 url. 如果页面不存在返回 null
       */
    rasterizeMaxBounds: (scale: number, page?: string | number | undefined) => Promise<string | null>;
    /**
       * 设置输入类型, "pen" 仅接受手写笔输入, "any" 接受任意输入, 当首次侦测到手写笔输入时, 将自动切换为 "pen"
       * @param {"pen" | "any"} type 输入类型
       */
    setInputType: (type: 'pen' | 'any') => void;
    /**
       * 插入图片
       * @param {string} src 图片的 url, 仅支持 https 协议, 同时需要确保不存在跨域问题
       * @param {string=} pageId 可选, 指定要插入到的页面 id, 默认插入到当前页面
       */
    insertImage: (src: string, pageId?: string) => void;
    constructor(view: HTMLDivElement);
}
//# sourceMappingURL=Whiteboard.d.ts.map