fix: fix disableWatcher effect and select element effect

This commit is contained in:
chenshenhai 2025-06-28 13:56:27 +08:00
parent 106260558c
commit a4bda10496
7 changed files with 55 additions and 37 deletions

View file

@ -1,6 +1,6 @@
{
"private": false,
"version": "0.4.1",
"version": "0.4.2",
"workspaces": [
"packages/*"
],

View file

@ -45,7 +45,8 @@ export class Board<T extends BoardExtendEventMap = BoardExtendEventMap> {
const watcher = new BoardWatcher({
boardContent,
sharer
sharer,
disabled: opts?.disableWatcher
});
const renderer = new Renderer({
viewContext: boardContent.viewContext,

View file

@ -32,6 +32,9 @@ export class BoardWatcher extends EventEmitter<BoardWatcherEventMap> {
}
onEvents() {
if (this.#opts.disabled === true) {
return;
}
if (this.#hasDestroyed) {
return;
}
@ -48,6 +51,9 @@ export class BoardWatcher extends EventEmitter<BoardWatcherEventMap> {
}
offEvents() {
if (this.#opts.disabled === true) {
return;
}
const container = window;
const canvas = this.#opts.boardContent.boardContext.canvas;
container.removeEventListener('mousemove', this.#onHover);

View file

@ -260,6 +260,7 @@ export const MiddlewareSelector: Middleware<
const groupQueue = getGroupQueueFromList(elem.uuid, data?.elements || []);
sharer.setSharedStorage(keyGroupQueue, groupQueue);
updateSelectedElementList(elements);
pointStartElementSizeList = [{ ...getElementSize(elements[0]), uuid: elements[0].uuid }];
viewer.drawFrame();
}
};
@ -806,44 +807,47 @@ export const MiddlewareSelector: Middleware<
type = 'resizeElement';
}
if (hasChangedData) {
const startSize = pointStartElementSizeList[0] as ElementSize & { uuid: string };
let modifyRecord: ModifyRecord | null | undefined = null;
if (selectedElements.length === 1) {
modifyRecord = {
type: 'resizeElement',
time: 0,
content: {
method: 'modifyElement',
uuid: startSize.uuid,
before: toFlattenElement(startSize),
after: toFlattenElement(getElementSize(selectedElements[0]))
}
};
if (selectedElements[0].type === 'group' && startResizeGroupRecord && endResizeGroupRecord) {
if (Array.isArray(pointStartElementSizeList) && pointStartElementSizeList.length) {
const startSize = pointStartElementSizeList[0] as ElementSize & { uuid: string };
if (selectedElements.length === 1) {
modifyRecord = {
...endResizeGroupRecord,
type: 'resizeElement',
time: 0,
content: {
...endResizeGroupRecord.content,
before: startResizeGroupRecord.content.before
method: 'modifyElement',
uuid: startSize.uuid,
before: toFlattenElement(startSize),
after: toFlattenElement(getElementSize(selectedElements[0]))
}
};
if (selectedElements[0].type === 'group' && startResizeGroupRecord && endResizeGroupRecord) {
modifyRecord = {
...endResizeGroupRecord,
content: {
...endResizeGroupRecord.content,
before: startResizeGroupRecord.content.before
}
};
}
} else if (selectedElements.length > 1) {
modifyRecord = {
type: 'resizeElements',
time: 0,
content: {
method: 'modifyElements',
before: pointStartElementSizeList.map((item) => ({
...toFlattenElement(item),
uuid: item.uuid
})),
after: selectedElements.map((item) => ({
...toFlattenElement(getElementSize(item)),
uuid: item.uuid
}))
}
};
}
} else if (selectedElements.length > 1) {
modifyRecord = {
type: 'resizeElements',
time: 0,
content: {
method: 'modifyElements',
before: pointStartElementSizeList.map((item) => ({
...toFlattenElement(item),
uuid: item.uuid
})),
after: selectedElements.map((item) => ({
...toFlattenElement(getElementSize(item)),
uuid: item.uuid
}))
}
};
}
eventHub.trigger(coreEventKeys.CHANGE, { data, type, selectedElements, hoverElement, modifyRecord });
hasChangedData = false;

View file

@ -42,8 +42,8 @@ export class iDraw {
constructor(mount: HTMLDivElement, options: IDrawOptions) {
const opts = { ...defaultSettings, ...defaultOptions, ...options };
this.#store.set('middlewareStyles', parseStyles(opts));
const { width, height, devicePixelRatio } = opts;
const core = new Core<IDrawEvent>(mount, { width, height, devicePixelRatio });
const { width, height, devicePixelRatio, disableWatcher } = opts;
const core = new Core<IDrawEvent>(mount, { width, height, devicePixelRatio, disableWatcher });
this.#core = core;
this.#opts = opts;
this.#init();
@ -171,7 +171,7 @@ export class iDraw {
createElement<T extends ElementType>(
type: T,
element: RecursivePartial<Element<T>>,
element: RecursivePartial<Omit<Element, 'uuid' | 'type'>>,
opts?: { viewCenter?: boolean }
): Element<T> {
return createElement<T>({ core: this.#core }, type, element, opts);
@ -249,4 +249,8 @@ export class iDraw {
undo() {
this.#historyHandler?.undo();
}
clearHistory() {
this.#historyHandler?.clear();
}
}

View file

@ -204,9 +204,11 @@ export const useHistory = (opts: { core: Core; limit?: number }) => {
while (doRecords?.length > 0) {
doRecords.pop();
}
doRecords = [];
while (undoRecords?.length > 0) {
undoRecords.pop();
}
undoRecords = [];
};
const getDoRecords = () => doRecords;

View file

@ -156,6 +156,7 @@ export interface BoardRenderer extends UtilEventEmitter<RendererEventMap> {
}
export interface BoardWatcherOptions {
disabled?: boolean;
boardContent: BoardContent;
sharer: StoreSharer<Record<any | symbol, any>>;
}