Skip to content

Editor Configuration

Basic     Event     Style     Buttons     Cursor     Selection     Control     Enable     Inner Editor

Event-related configuration. Can be updated in real time during runtime via app.editor.config.

Each element also has an individual edit config that can override the global configuration in real time.

Key Properties

keyEvent: boolean

Whether to listen to keyboard events (e.g. arrow key movement). Default is true.

arrowStep: number

Movement step size for arrow keys. Default is 1.

arrowFastStep: number

Movement step size when holding Shift. Default is 10.

multipleSelectKey: IShortcutKeysCheck

Shortcut key hook for multi-selection.

ts
multipleSelectKey(event) {
    return event.shiftKey || event.ctrlKey // default is shiftKey
}

rotateKey: IShortcutKeysCheck

Shortcut key hook that switches resize handles into rotation mode.

ts
rotateKey(event) {
    return event.ctrlKey // default
}

diagonalRotateKey: IShortcutKeysCheck

Shortcut key hook for diagonal rotation.

ts
diagonalRotateKey(event) {
    return event.shiftKey // default
}

beforeSelect: IEditorBeforeSelect

Pre-hook before selecting elements. Only takes effect during initialization or when updating app.editor.config.

Parameter data is { target }.

Return false to cancel selection. Return a target to modify selection data.

ts
beforeSelect(data) {
    const { target } = data // target can be single or multiple elements
    return true // return false | target
}

beforeEditOuter: IEditorEditOuterData

Pre-hook for opening external editor tools via editOuter.

Parameter data is { target, name }, where name is the tool name (e.g. 'EditTool').

Return false to cancel. Return a string to override the tool name.

ts
beforeEditOuter(data) {
    const { target, name } = data
    return true // return false | name
}

beforeEditInner: IEditorEditInnerData

Pre-hook for opening inner editor via editInner.

Parameter data is { target, name }, where name is the tool name (e.g. 'PathEditor').

Return false to cancel. Return a string to override the tool name.

ts
beforeEditInner(data) {
    const { target, name } = data
    return true // return false | name
}

beforeMove: IEditorBeforeMove

Pre-hook for move operations.

Parameter data is { target, x, y }.

Return false to cancel. Return { x, y } to modify movement.

ts
beforeMove(data) {
    const { target, x, y } = data
    return true // return false | { x, y }
}

beforeScale: IEditorBeforeScale

Pre-hook for resize operations.

Parameter data is { target, origin, scaleX, scaleY }.

Return false to cancel. Return { scaleX, scaleY } to modify scaling.

You can also limit size using widthRange and heightRange.

ts
beforeScale(data) {
    const { target, origin, scaleX, scaleY } = data
    return true // return false | { scaleX, scaleY }
}

beforeRotate: IEditorBeforeRotate

Pre-hook for rotation.

Parameter data is { target, origin, rotation }.

Return false to cancel. Return a number to modify rotation.

ts
beforeRotate(data) {
    const { target, origin, rotation } = data
    return true // return false | rotation
}

beforeSkew: IEditorBeforeSkew

Pre-hook for skew operations.

Parameter data is { target, origin, skewX, skewY }.

Return false to cancel. Return { skewX, skewY } to modify skew.

ts
beforeSkew(data) {
    const { target, origin, skewX, skewY } = data
    return true // return false | { skewX, skewY }
}

onCopy: IEditorOnCopy

Return true if copy operation is executed (required).

See example.

ts
onCopy() {
    // clone elements
    return true
}

Examples

Limit minimum edit size

Implemented via the beforeScale pre-hook.

ts
// #图形编辑器 [限制最小编辑尺寸 (resize 元素事件前置钩子函数)]
import { App, Rect } from 'leafer-ui'
import '@leafer-in/editor' // 导入图形编辑器插件
import '@leafer-in/viewport' // 导入视口插件 (可选)

const app = new App({
    view: window,
    editor: {
        lockRatio: true,
        beforeScale({ target, scaleX, scaleY }) {
            if (target.width * scaleX < 20 || target.height * scaleY < 20) {
                const scale = Math.min(20 / target.width, 20 / target.height)
                return { scaleX: scale, scaleY: scale }
            }
            return true
        }
    }
})

const rect = Rect.one({ editable: true, fill: '#32cd79', cornerRadius: 30 }, 100, 100)
app.tree.add(rect)

app.editor.select(rect)
ts
// #图形编辑器 [限制最小编辑尺寸,且支持镜像操作 (resize 元素事件前置钩子函数)]
import { App, Rect } from 'leafer-ui'
import '@leafer-in/editor' // 导入图形编辑器插件
import '@leafer-in/viewport' // 导入视口插件 (可选)

const app = new App({
    view: window,
    editor: {
        lockRatio: true,
        beforeScale({ target, scaleX, scaleY }) {
            if (target.width * Math.abs(scaleX) < 20 || target.height * Math.abs(scaleY) < 20) {
                const scale = Math.min(20 / target.width, 20 / target.height)
                return { scaleX: scaleX < 0 ? -scale : scale, scaleY: scaleY < 0 ? -scale : scale }
            }
            return true
        }
    }
})

const rect = Rect.one({ editable: true, fill: '#32cd79', cornerRadius: 30 }, 100, 100)
app.tree.add(rect)

app.editor.select(rect)

Copy elements by holding Alt key while dragging

ts
// #图形编辑器 [按住alt键移动可复制元素]
import { App, Rect } from 'leafer-ui'
import '@leafer-in/editor' // 导入图形编辑器插件 
import '@leafer-in/viewport' // 导入视口插件 (可选)

const app = new App({
    view: window,
    editor: {
        onCopy() {  // 按住alt键移动可复制元素
            const list = app.editor.list.map(item => {
                const cloneItem = item.clone()
                item.parent.add(cloneItem)
                return cloneItem
            })
            app.editor.target = list.length > 1 ? list : list[0]
            return true
        }
    }
})

app.tree.add({ tag: 'Text', x: 150, y: 50, text: '按住alt键移动可复制元素', fill: '#999', fontSize: 16 })

app.tree.add(Rect.one({ editable: true, fill: '#FEB027', cornerRadius: [20, 0, 0, 20] }, 100, 100))
app.tree.add(Rect.one({ editable: true, fill: '#FFE04B', cornerRadius: [0, 20, 20, 0] }, 300, 100))

Released under the MIT License.