feat(editor) shape gfx extension (#11928)

Closes: BS-3211
This commit is contained in:
Saul-Mirone
2025-04-23 15:46:23 +00:00
parent 61121ab727
commit bc0530a708
20 changed files with 104 additions and 60 deletions
+3 -1
View File
@@ -177,7 +177,9 @@
"./gfx/brush": "./src/gfx/brush/index.ts",
"./gfx/brush/store": "./src/gfx/brush/store.ts",
"./gfx/brush/view": "./src/gfx/brush/view.ts",
"./gfx/shape": "./src/gfx/shape.ts",
"./gfx/shape": "./src/gfx/shape/index.ts",
"./gfx/shape/store": "./src/gfx/shape/store.ts",
"./gfx/shape/view": "./src/gfx/shape/view.ts",
"./gfx/note": "./src/gfx/note.ts",
"./gfx/mindmap": "./src/gfx/mindmap.ts",
"./gfx/connector": "./src/gfx/connector.ts",
@@ -23,10 +23,6 @@ import {
mindmapToMarkdownAdapterMatcher,
mindmapToPlainTextAdapterMatcher,
} from '@blocksuite/affine-gfx-mindmap';
import {
shapeToMarkdownAdapterMatcher,
shapeToPlainTextAdapterMatcher,
} from '@blocksuite/affine-gfx-shape';
import {
textToMarkdownAdapterMatcher,
textToPlainTextAdapterMatcher,
@@ -42,7 +38,6 @@ import type { ExtensionType } from '@blocksuite/store';
const elementToPlainTextAdapterMatchers = [
groupToPlainTextAdapterMatcher,
shapeToPlainTextAdapterMatcher,
connectorToPlainTextAdapterMatcher,
textToPlainTextAdapterMatcher,
mindmapToPlainTextAdapterMatcher,
@@ -50,7 +45,6 @@ const elementToPlainTextAdapterMatchers = [
const elementToMarkdownAdapterMatchers = [
groupToMarkdownAdapterMatcher,
shapeToMarkdownAdapterMatcher,
connectorToMarkdownAdapterMatcher,
textToMarkdownAdapterMatcher,
mindmapToMarkdownAdapterMatcher,
@@ -16,6 +16,7 @@ import { ParagraphStoreExtension } from '@blocksuite/affine-block-paragraph/stor
import { SurfaceRefStoreExtension } from '@blocksuite/affine-block-surface-ref/store';
import { TableStoreExtension } from '@blocksuite/affine-block-table/store';
import { BrushStoreExtension } from '@blocksuite/affine-gfx-brush/store';
import { ShapeStoreExtension } from '@blocksuite/affine-gfx-shape/store';
import { FootnoteStoreExtension } from '@blocksuite/affine-inline-footnote/store';
import { LatexStoreExtension as InlineLatexStoreExtension } from '@blocksuite/affine-inline-latex/store';
import { LinkStoreExtension } from '@blocksuite/affine-inline-link/store';
@@ -51,6 +52,7 @@ export function getInternalStoreExtensions() {
InlinePresetStoreExtension,
BrushStoreExtension,
ShapeStoreExtension,
MigratingStoreExtension,
];
+4 -3
View File
@@ -17,6 +17,7 @@ import { SurfaceRefViewExtension } from '@blocksuite/affine-block-surface-ref/vi
import { TableViewExtension } from '@blocksuite/affine-block-table/view';
import { BrushViewExtension } from '@blocksuite/affine-gfx-brush/view';
import { NoteViewExtension as GfxNoteViewExtension } from '@blocksuite/affine-gfx-note/view';
import { ShapeViewExtension } from '@blocksuite/affine-gfx-shape/view';
import { FootnoteViewExtension } from '@blocksuite/affine-inline-footnote/view';
import { LatexViewExtension as InlineLatexViewExtension } from '@blocksuite/affine-inline-latex/view';
import { LinkViewExtension } from '@blocksuite/affine-inline-link/view';
@@ -30,12 +31,10 @@ export function getInternalViewExtensions() {
return [
GfxNoteViewExtension,
BrushViewExtension,
// shape
ShapeViewExtension,
// mind
// template
MigratingViewExtension,
// Block
AttachmentViewExtension,
BookmarkViewExtension,
@@ -62,5 +61,7 @@ export function getInternalViewExtensions() {
InlineLatexViewExtension,
MentionViewExtension,
InlinePresetViewExtension,
MigratingViewExtension,
];
}
@@ -0,0 +1 @@
export * from '@blocksuite/affine-gfx-shape/store';
@@ -0,0 +1 @@
export * from '@blocksuite/affine-gfx-shape/view';
@@ -4,7 +4,10 @@ import {
} from '@blocksuite/affine-ext-loader';
import { effects } from './effects';
import { FrameHighlightManager } from './frame-highlight-manager';
import { FrameBlockSpec } from './frame-spec';
import { FrameTool } from './frame-tool';
import { PresentTool } from './preset-tool';
export class FrameViewExtension extends ViewExtensionProvider {
override name = 'affine-frame-block';
@@ -17,5 +20,10 @@ export class FrameViewExtension extends ViewExtensionProvider {
override setup(context: ViewExtensionContext): void {
super.setup(context);
context.register(FrameBlockSpec);
if (this.isEdgeless(context.scope)) {
context.register(FrameHighlightManager);
context.register(FrameTool);
context.register(PresentTool);
}
}
}
@@ -11,11 +11,6 @@ import {
MindmapElementRendererExtension,
MindMapView,
} from '@blocksuite/affine-gfx-mindmap';
import {
HighlighterElementRendererExtension,
ShapeElementRendererExtension,
ShapeElementView,
} from '@blocksuite/affine-gfx-shape';
import {
TextElementRendererExtension,
TextElementView,
@@ -56,12 +51,9 @@ const EdgelessElementViews = [
MindMapView,
GroupElementView,
TextElementView,
ShapeElementView,
];
export const EdgelessElementRendererExtension: ExtensionType[] = [
HighlighterElementRendererExtension,
ShapeElementRendererExtension,
TextElementRendererExtension,
ConnectorElementRendererExtension,
GroupElementRendererExtension,
@@ -1,7 +1,6 @@
import { frameQuickTool } from '@blocksuite/affine-block-frame';
import { connectorQuickTool } from '@blocksuite/affine-gfx-connector';
import { mindMapSeniorTool } from '@blocksuite/affine-gfx-mindmap';
import { shapeSeniorTool } from '@blocksuite/affine-gfx-shape';
import { templateSeniorTool } from '@blocksuite/affine-gfx-template';
import { QuickToolExtension } from '@blocksuite/affine-widget-edgeless-toolbar';
import { html } from 'lit';
@@ -33,8 +32,4 @@ export const quickTools = [
linkQuickTool,
];
export const seniorTools = [
shapeSeniorTool,
mindMapSeniorTool,
templateSeniorTool,
];
export const seniorTools = [mindMapSeniorTool, templateSeniorTool];
@@ -1,8 +1,3 @@
import {
FrameHighlightManager,
FrameTool,
PresentTool,
} from '@blocksuite/affine-block-frame';
import { ConnectionOverlay } from '@blocksuite/affine-block-surface';
import type * as BrushEffect from '@blocksuite/affine-gfx-brush';
import {
@@ -14,7 +9,7 @@ import {
MindMapIndicatorOverlay,
} from '@blocksuite/affine-gfx-mindmap';
import type * as NoteEffect from '@blocksuite/affine-gfx-note';
import { ShapeTool } from '@blocksuite/affine-gfx-shape';
import type * as ShapeEffect from '@blocksuite/affine-gfx-shape';
import { TemplateTool } from '@blocksuite/affine-gfx-template';
import { TextTool } from '@blocksuite/affine-gfx-text';
import { InteractivityManager } from '@blocksuite/std/gfx';
@@ -31,18 +26,18 @@ import { SnapExtension } from './interact-extensions/snap-manager.js';
import { EditPropsMiddlewareBuilder } from './middlewares/base.js';
import { SnapOverlay } from './utils/snap-manager.js';
declare type _GLOBAL_ = typeof NoteEffect | typeof BrushEffect;
declare type _GLOBAL_ =
| typeof NoteEffect
| typeof BrushEffect
| typeof ShapeEffect;
export const EdgelessToolExtension: ExtensionType[] = [
DefaultTool,
PanTool,
TextTool,
ShapeTool,
ConnectorTool,
TemplateTool,
EmptyTool,
FrameTool,
PresentTool,
];
export const EdgelessEditExtensions: ExtensionType[] = [
@@ -50,7 +45,6 @@ export const EdgelessEditExtensions: ExtensionType[] = [
ConnectorFilter,
SnapExtension,
MindMapDragExtension,
FrameHighlightManager,
DblClickAddEdgelessText,
];
@@ -1,7 +1,6 @@
import { effects as gfxConnectorEffects } from '@blocksuite/affine-gfx-connector/effects';
import { effects as gfxGroupEffects } from '@blocksuite/affine-gfx-group/effects';
import { effects as gfxMindmapEffects } from '@blocksuite/affine-gfx-mindmap/effects';
import { effects as gfxShapeEffects } from '@blocksuite/affine-gfx-shape/effects';
import { effects as gfxTemplateEffects } from '@blocksuite/affine-gfx-template/effects';
import { effects as gfxCanvasTextEffects } from '@blocksuite/affine-gfx-text/effects';
import { effects as widgetEdgelessToolbarEffects } from '@blocksuite/affine-widget-edgeless-toolbar/effects';
@@ -77,7 +76,6 @@ function registerRootComponents() {
function registerGfxEffects() {
gfxCanvasTextEffects();
gfxShapeEffects();
gfxConnectorEffects();
gfxMindmapEffects();
gfxGroupEffects();
+4 -1
View File
@@ -12,6 +12,7 @@
"dependencies": {
"@blocksuite/affine-block-surface": "workspace:*",
"@blocksuite/affine-components": "workspace:*",
"@blocksuite/affine-ext-loader": "workspace:*",
"@blocksuite/affine-gfx-text": "workspace:*",
"@blocksuite/affine-model": "workspace:*",
"@blocksuite/affine-rich-text": "workspace:*",
@@ -34,7 +35,9 @@
},
"exports": {
".": "./src/index.ts",
"./effects": "./src/effects.ts"
"./effects": "./src/effects.ts",
"./store": "./src/store.ts",
"./view": "./src/view.ts"
},
"files": [
"src",
@@ -0,0 +1,28 @@
import { ShapeElementModel } from '@blocksuite/affine-model';
import { GfxElementModelView } from '@blocksuite/std/gfx';
import { mountShapeTextEditor } from './text/edgeless-shape-text-editor';
export class ShapeElementView extends GfxElementModelView<ShapeElementModel> {
static override type: string = 'shape';
override onCreated(): void {
super.onCreated();
this._initDblClickToEdit();
}
private _initDblClickToEdit(): void {
this.on('dblclick', () => {
const edgeless = this.std.view.getBlock(this.std.store.root!.id);
if (
edgeless &&
!this.model.isLocked() &&
this.model instanceof ShapeElementModel
) {
mountShapeTextEditor(this.model, edgeless);
}
});
}
}
+1 -1
View File
@@ -2,8 +2,8 @@ export * from './adapter';
export * from './consts';
export * from './draggable';
export * from './element-renderer';
export * from './element-view';
export * from './overlay';
export * from './shape-tool';
export * from './text';
export * from './toolbar';
export * from './view';
+19
View File
@@ -0,0 +1,19 @@
import {
type StoreExtensionContext,
StoreExtensionProvider,
} from '@blocksuite/affine-ext-loader';
import {
shapeToMarkdownAdapterMatcher,
shapeToPlainTextAdapterMatcher,
} from './adapter';
export class ShapeStoreExtension extends StoreExtensionProvider {
override name = 'affine-shape-gfx';
override setup(context: StoreExtensionContext) {
super.setup(context);
context.register(shapeToMarkdownAdapterMatcher);
context.register(shapeToPlainTextAdapterMatcher);
}
}
+24 -21
View File
@@ -1,28 +1,31 @@
import { ShapeElementModel } from '@blocksuite/affine-model';
import { GfxElementModelView } from '@blocksuite/std/gfx';
import {
type ViewExtensionContext,
ViewExtensionProvider,
} from '@blocksuite/affine-ext-loader';
import { mountShapeTextEditor } from './text/edgeless-shape-text-editor';
import { effects } from './effects';
import {
HighlighterElementRendererExtension,
ShapeElementRendererExtension,
} from './element-renderer';
import { ShapeElementView } from './element-view';
import { ShapeTool } from './shape-tool';
import { shapeSeniorTool } from './toolbar';
export class ShapeElementView extends GfxElementModelView<ShapeElementModel> {
static override type: string = 'shape';
export class ShapeViewExtension extends ViewExtensionProvider {
override name = 'affine-shape-gfx';
override onCreated(): void {
super.onCreated();
this._initDblClickToEdit();
override effect(): void {
super.effect();
effects();
}
private _initDblClickToEdit(): void {
this.on('dblclick', () => {
const edgeless = this.std.view.getBlock(this.std.store.root!.id);
if (
edgeless &&
!this.model.isLocked() &&
this.model instanceof ShapeElementModel
) {
mountShapeTextEditor(this.model, edgeless);
}
});
override setup(context: ViewExtensionContext) {
super.setup(context);
context.register(HighlighterElementRendererExtension);
context.register(ShapeElementRendererExtension);
context.register(ShapeElementView);
context.register(ShapeTool);
context.register(shapeSeniorTool);
}
}
@@ -9,6 +9,7 @@
"references": [
{ "path": "../../blocks/surface" },
{ "path": "../../components" },
{ "path": "../../ext-loader" },
{ "path": "../text" },
{ "path": "../../model" },
{ "path": "../../rich-text" },