diff --git a/docs/en/guide/schema.md b/docs/en/guide/schema.md index 72a3a64..f19ac05 100644 --- a/docs/en/guide/schema.md +++ b/docs/en/guide/schema.md @@ -81,6 +81,7 @@ interface IElement { minWidth?: number; underline?: boolean; extension?: unknown; + deletable?: boolean; code: string | null; min?: number; max?: number; diff --git a/docs/guide/schema.md b/docs/guide/schema.md index 4617197..1c0ec9a 100644 --- a/docs/guide/schema.md +++ b/docs/guide/schema.md @@ -81,6 +81,7 @@ interface IElement { minWidth?: number; underline?: boolean; extension?: unknown; + deletable?: boolean; code: string | null; min?: number; max?: number; diff --git a/src/editor/core/command/CommandAdapt.ts b/src/editor/core/command/CommandAdapt.ts index ddbf967..fc0b97f 100644 --- a/src/editor/core/command/CommandAdapt.ts +++ b/src/editor/core/command/CommandAdapt.ts @@ -1945,6 +1945,7 @@ export class CommandAdapt { // 删除控件 const control = this.draw.getControl() const newIndex = control.removeControl(startIndex) + if (newIndex === null) return // 重新渲染 this.range.setRange(newIndex, newIndex) this.draw.render({ diff --git a/src/editor/core/draw/control/Control.ts b/src/editor/core/draw/control/Control.ts index d50e00b..8dcbaf0 100644 --- a/src/editor/core/draw/control/Control.ts +++ b/src/editor/core/draw/control/Control.ts @@ -301,9 +301,11 @@ export class Control { } } - public removeControl(startIndex: number): number { + public removeControl(startIndex: number): number | null { const elementList = this.getElementList() const startElement = elementList[startIndex] + const { deletable = true } = startElement.control! + if (!deletable) return null let leftIndex = -1 let rightIndex = -1 // 向左查找 @@ -395,7 +397,7 @@ export class Control { return this.activeControl.setValue(data) } - public keydown(evt: KeyboardEvent): number { + public keydown(evt: KeyboardEvent): number | null { if (!this.activeControl) { throw new Error('active control is null') } diff --git a/src/editor/core/draw/control/checkbox/CheckboxControl.ts b/src/editor/core/draw/control/checkbox/CheckboxControl.ts index 2f4885a..63f8895 100644 --- a/src/editor/core/draw/control/checkbox/CheckboxControl.ts +++ b/src/editor/core/draw/control/checkbox/CheckboxControl.ts @@ -111,7 +111,7 @@ export class CheckboxControl implements IControlInstance { control!.code = data.join(',') } - public keydown(evt: KeyboardEvent): number { + public keydown(evt: KeyboardEvent): number | null { const range = this.control.getRange() // 收缩边界到Value内 this.control.shrinkBoundary() diff --git a/src/editor/core/draw/control/select/SelectControl.ts b/src/editor/core/draw/control/select/SelectControl.ts index 0b439a6..141d688 100644 --- a/src/editor/core/draw/control/select/SelectControl.ts +++ b/src/editor/core/draw/control/select/SelectControl.ts @@ -78,7 +78,7 @@ export class SelectControl implements IControlInstance { return -1 } - public keydown(evt: KeyboardEvent): number { + public keydown(evt: KeyboardEvent): number | null { const elementList = this.control.getElementList() const range = this.control.getRange() // 收缩边界到Value内 diff --git a/src/editor/core/draw/control/text/TextControl.ts b/src/editor/core/draw/control/text/TextControl.ts index d95a95c..8e7ea0a 100644 --- a/src/editor/core/draw/control/text/TextControl.ts +++ b/src/editor/core/draw/control/text/TextControl.ts @@ -108,7 +108,7 @@ export class TextControl implements IControlInstance { return startIndex } - public keydown(evt: KeyboardEvent): number { + public keydown(evt: KeyboardEvent): number | null { const elementList = this.control.getElementList() const range = this.control.getRange() // 收缩边界到Value内 diff --git a/src/editor/core/event/handlers/keydown.ts b/src/editor/core/event/handlers/keydown.ts index 8f94bd6..37cb033 100644 --- a/src/editor/core/event/handlers/keydown.ts +++ b/src/editor/core/event/handlers/keydown.ts @@ -28,7 +28,7 @@ export function keydown(evt: KeyboardEvent, host: CanvasEvent) { const activeControl = control.getActiveControl() if (evt.key === KeyMap.Backspace) { if (isReadonly || isPartRangeInControlOutside) return - let curIndex: number + let curIndex: number | null if (activeControl) { curIndex = control.keydown(evt) } else { @@ -58,11 +58,12 @@ export function keydown(evt: KeyboardEvent, host: CanvasEvent) { } curIndex = isCollapsed ? index - 1 : startIndex } + if (curIndex === null) return rangeManager.setRange(curIndex, curIndex) draw.render({ curIndex }) } else if (evt.key === KeyMap.Delete) { if (isReadonly || isPartRangeInControlOutside) return - let curIndex: number + let curIndex: number | null if (activeControl) { curIndex = control.keydown(evt) } else if (elementList[endIndex + 1]?.type === ElementType.CONTROL) { @@ -79,6 +80,7 @@ export function keydown(evt: KeyboardEvent, host: CanvasEvent) { } curIndex = isCollapsed ? index : startIndex } + if (curIndex === null) return rangeManager.setRange(curIndex, curIndex) draw.render({ curIndex }) } else if (evt.key === KeyMap.Enter) { diff --git a/src/editor/interface/Control.ts b/src/editor/interface/Control.ts index d592d08..035987f 100644 --- a/src/editor/interface/Control.ts +++ b/src/editor/interface/Control.ts @@ -21,6 +21,10 @@ export interface IControlCheckbox { checkbox?: ICheckbox } +export interface IControlRule { + deletable?: boolean +} + export interface IControlBasic { type: ControlType value: IElement[] | null @@ -34,6 +38,7 @@ export interface IControlBasic { } export type IControl = IControlBasic & + IControlRule & Partial & Partial @@ -63,7 +68,7 @@ export interface IControlInstance { setValue(data: IElement[]): number - keydown(evt: KeyboardEvent): number + keydown(evt: KeyboardEvent): number | null cut(): number }