From 1315ce070b1f7f93f171a32110034e24bafa5654 Mon Sep 17 00:00:00 2001 From: Hufe921 Date: Fri, 15 Apr 2022 21:27:19 +0800 Subject: [PATCH] feat:checkbox control set select --- src/editor/core/draw/control/Control.ts | 3 +- .../draw/control/checkbox/CheckboxControl.ts | 45 +++++++++++++++++++ src/editor/core/event/CanvasEvent.ts | 5 +++ src/editor/interface/Checkbox.ts | 3 +- src/editor/utils/element.ts | 1 + 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/editor/core/draw/control/Control.ts b/src/editor/core/draw/control/Control.ts index 8dd242c..0073a2a 100644 --- a/src/editor/core/draw/control/Control.ts +++ b/src/editor/core/draw/control/Control.ts @@ -2,6 +2,7 @@ import { ControlComponent, ControlType } from '../../../dataset/enum/Control' import { ElementType } from '../../../dataset/enum/Element' import { IControl, IControlInitOption, IControlInstance, IControlOption } from '../../../interface/Control' import { IElement, IElementPosition } from '../../../interface/Element' +import { IRange } from '../../../interface/Range' import { deepClone } from '../../../utils' import { pickElementAttr, zipElementList } from '../../../utils/element' import { Listener } from '../../listener/Listener' @@ -67,7 +68,7 @@ export class Control { return this.draw.getPageNo() * (height + pageGap) } - public getRange() { + public getRange(): IRange { return this.range.getRange() } diff --git a/src/editor/core/draw/control/checkbox/CheckboxControl.ts b/src/editor/core/draw/control/checkbox/CheckboxControl.ts index d520ab9..fc1139b 100644 --- a/src/editor/core/draw/control/checkbox/CheckboxControl.ts +++ b/src/editor/core/draw/control/checkbox/CheckboxControl.ts @@ -65,6 +65,51 @@ export class CheckboxControl implements IControlInstance { return endIndex } + public setSelect() { + const { control } = this.element + const elementList = this.control.getElementList() + const { startIndex } = this.control.getRange() + const startElement = elementList[startIndex] + const data: string[] = [] + // 向左查找 + let preIndex = startIndex + while (preIndex > 0) { + const preElement = elementList[preIndex] + if ( + preElement.controlId !== startElement.controlId || + preElement.controlComponent === ControlComponent.PREFIX + ) { + break + } + if (preElement.controlComponent === ControlComponent.CHECKBOX) { + const checkbox = preElement.checkbox + if (checkbox && checkbox.value && checkbox.code) { + data.unshift(checkbox.code) + } + } + preIndex-- + } + // 向右查找 + let nextIndex = startIndex + 1 + while (nextIndex < elementList.length) { + const nextElement = elementList[nextIndex] + if ( + nextElement.controlId !== startElement.controlId || + nextElement.controlComponent === ControlComponent.POSTFIX + ) { + break + } + if (nextElement.controlComponent === ControlComponent.CHECKBOX) { + const checkbox = nextElement.checkbox + if (checkbox && checkbox.value && checkbox.code) { + data.push(checkbox.code) + } + } + nextIndex++ + } + control!.code = data.join(',') + } + public keydown(evt: KeyboardEvent): number { const range = this.control.getRange() // 收缩边界到Value内 diff --git a/src/editor/core/event/CanvasEvent.ts b/src/editor/core/event/CanvasEvent.ts index c03102c..9a20142 100644 --- a/src/editor/core/event/CanvasEvent.ts +++ b/src/editor/core/event/CanvasEvent.ts @@ -18,6 +18,7 @@ import { Position } from '../position/Position' import { RangeManager } from '../range/RangeManager' import { LETTER_REG, NUMBER_LIKE_REG } from '../../dataset/constant/Regular' import { Control } from '../draw/control/Control' +import { CheckboxControl } from '../draw/control/checkbox/CheckboxControl' export class CanvasEvent { @@ -236,6 +237,10 @@ export class CanvasEvent { value: true } } + const activeControl = this.control.getActiveControl() + if (activeControl instanceof CheckboxControl) { + activeControl.setSelect() + } } this.draw.render({ curIndex, diff --git a/src/editor/interface/Checkbox.ts b/src/editor/interface/Checkbox.ts index 055eedf..ee90b22 100644 --- a/src/editor/interface/Checkbox.ts +++ b/src/editor/interface/Checkbox.ts @@ -1,6 +1,7 @@ export interface ICheckbox { - disabled?: boolean; value: boolean | null; + code?: string; + disabled?: boolean; } export interface ICheckboxOption { diff --git a/src/editor/utils/element.ts b/src/editor/utils/element.ts index d77cd43..88bf7f1 100644 --- a/src/editor/utils/element.ts +++ b/src/editor/utils/element.ts @@ -114,6 +114,7 @@ export function formatElementList(elementList: IElement[], options: IFormatEleme control: el.control, controlComponent: ControlComponent.CHECKBOX, checkbox: { + code: valueSet.code, value: codeList.includes(valueSet.code) } })