feat: add basic pasters (#7331)

* feat: implement basic IPaster interface

* feat: add pasters for blocks and workspace comments
This commit is contained in:
Beka Westberg
2023-07-31 09:22:24 -07:00
committed by GitHub
parent 889310726e
commit 68a8a5ff19
3 changed files with 84 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
/**
* @license
* Copyright 2023 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {BlockSvg} from '../block_svg.js';
import {CopyData} from '../interfaces/i_copyable';
import {IPaster} from '../interfaces/i_paster.js';
import {State, append} from '../serialization/blocks';
import {Coordinate} from '../utils/coordinate.js';
import {WorkspaceSvg} from '../workspace_svg.js';
export class BlockPaster implements IPaster<BlockCopyData, BlockSvg> {
paste(
copyData: BlockCopyData,
workspace: WorkspaceSvg,
coordinate?: Coordinate,
): BlockSvg | null {
if (!workspace.isCapacityAvailable(copyData.typeCounts!)) return null;
const state = copyData.saveInfo as State;
if (coordinate) {
state['x'] = coordinate.x;
state['y'] = coordinate.y;
}
return append(state, workspace, {recordUndo: true}) as BlockSvg;
}
}
export interface BlockCopyData extends CopyData {}

View File

@@ -0,0 +1,30 @@
/**
* @license
* Copyright 2023 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {IPaster} from '../interfaces/i_paster.js';
import {CopyData} from '../interfaces/i_copyable.js';
import {Coordinate} from '../utils/coordinate.js';
import {WorkspaceSvg} from '../workspace_svg.js';
import {WorkspaceCommentSvg} from '../workspace_comment_svg.js';
export class WorkspaceCommentPaster
implements IPaster<WorkspaceCommentCopyData, WorkspaceCommentSvg>
{
paste(
copyData: WorkspaceCommentCopyData,
workspace: WorkspaceSvg,
coordinate?: Coordinate,
): WorkspaceCommentSvg {
const state = copyData.saveInfo as Element;
if (coordinate) {
state.setAttribute('x', `${coordinate.x}`);
state.setAttribute('y', `${coordinate.y}`);
}
return WorkspaceCommentSvg.fromXmlRendered(state, workspace);
}
}
export interface WorkspaceCommentCopyData extends CopyData {}

View File

@@ -0,0 +1,23 @@
/**
* @license
* Copyright 2023 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {Coordinate} from '../utils/coordinate.js';
import {WorkspaceSvg} from '../workspace_svg.js';
import {ICopyable, CopyData} from './i_copyable.js';
/** An object that can paste data into a workspace. */
export interface IPaster<U extends CopyData, T extends ICopyable> {
paste(
copyData: U,
workspace: WorkspaceSvg,
coordinate?: Coordinate,
): T | null;
}
/** @returns True if the given object is a paster. */
export function isPaster(obj: any): obj is IPaster<CopyData, ICopyable> {
return obj.paste !== undefined;
}