@hprint/plugins 0.0.9-alpha.1 → 0.0.11-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +53 -53
- package/dist/index.mjs +10140 -9611
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/plugins/ActualContentLayoutPlugin.d.ts.map +1 -1
- package/dist/src/plugins/ControlsPlugin.d.ts +7 -2
- package/dist/src/plugins/ControlsPlugin.d.ts.map +1 -1
- package/dist/src/plugins/GroupAlignPlugin.d.ts +2 -0
- package/dist/src/plugins/GroupAlignPlugin.d.ts.map +1 -1
- package/dist/src/plugins/TablePlugin.d.ts +95 -0
- package/dist/src/plugins/TablePlugin.d.ts.map +1 -0
- package/dist/src/plugins/UnitPlugin.d.ts +1 -0
- package/dist/src/plugins/UnitPlugin.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +21 -11
- package/src/plugins/ActualContentLayoutPlugin.ts +104 -96
- package/src/plugins/ControlsPlugin.ts +73 -23
- package/src/plugins/CreateElementPlugin.ts +5 -5
- package/src/plugins/GroupAlignPlugin.ts +59 -37
- package/src/plugins/TablePlugin.ts +872 -0
- package/src/plugins/UnitPlugin.ts +48 -15
- package/src/utils/units.ts +5 -5
package/dist/src/index.d.ts
CHANGED
|
@@ -5,4 +5,6 @@ declare const pluginsObject: {
|
|
|
5
5
|
};
|
|
6
6
|
declare const pluginsList: IPluginTempl[];
|
|
7
7
|
export { pluginsObject, pluginsList, SelectEvent, SelectMode };
|
|
8
|
+
export type { ITableItem, TableColumn, TableOptions, TableGroup, } from './plugins/TablePlugin';
|
|
9
|
+
export { normalizeTableColumns } from './plugins/TablePlugin';
|
|
8
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA2C5D,QAAA,MAAM,aAAa,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAwCjD,CAAC;AAGF,QAAA,MAAM,WAAW,EAAE,YAAY,EAwC9B,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AAC/D,YAAY,EACR,UAAU,EACV,WAAW,EACX,YAAY,EACZ,UAAU,GACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActualContentLayoutPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/ActualContentLayoutPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,WAAW,2BAA2B;IACxC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CACpC;AAED,KAAK,OAAO,GAAG,IAAI,CAAC,yBAAyB,EAAE,0BAA0B,CAAC,CAAC;AAE3E,OAAO,QAAQ,cAAc,CAAC;IAC1B,UAAU,OAAQ,SAAQ,OAAO;KAAG;CACvC;AASD,cAAM,yBAA0B,YAAW,YAAY;IAKxC,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO;IAL1B,MAAM,CAAC,UAAU,SAA+B;IAChD,MAAM,CAAC,IAAI,WAAgC;gBAGhC,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,MAAM,EAAE,OAAO;IAG1B,OAAO,CAAC,aAAa,CAGjB;IAEE,sBAAsB,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAkB/C,wBAAwB,CAAC,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"ActualContentLayoutPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/ActualContentLayoutPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,WAAW,2BAA2B;IACxC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CACpC;AAED,KAAK,OAAO,GAAG,IAAI,CAAC,yBAAyB,EAAE,0BAA0B,CAAC,CAAC;AAE3E,OAAO,QAAQ,cAAc,CAAC;IAC1B,UAAU,OAAQ,SAAQ,OAAO;KAAG;CACvC;AASD,cAAM,yBAA0B,YAAW,YAAY;IAKxC,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO;IAL1B,MAAM,CAAC,UAAU,SAA+B;IAChD,MAAM,CAAC,IAAI,WAAgC;gBAGhC,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,MAAM,EAAE,OAAO;IAG1B,OAAO,CAAC,aAAa,CAGjB;IAEE,sBAAsB,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAkB/C,wBAAwB,CAAC,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM;IAoHrE,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,qBAAqB;CAyBhC;AAED,eAAe,yBAAyB,CAAC"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import { fabric, IEditor, IPluginTempl } from '@hprint/core';
|
|
1
|
+
import { fabric, IEditor, IPluginOption, IPluginTempl } from '@hprint/core';
|
|
2
|
+
interface ControlsPluginOptions extends IPluginOption {
|
|
3
|
+
/** 是否禁用多选对象的整体缩放,默认保留 Fabric 的缩放能力。 */
|
|
4
|
+
disableActiveSelectionScaling?: boolean;
|
|
5
|
+
}
|
|
2
6
|
declare class ControlsPlugin implements IPluginTempl {
|
|
3
7
|
canvas: fabric.Canvas;
|
|
4
8
|
editor: IEditor;
|
|
9
|
+
private options;
|
|
5
10
|
static pluginName: string;
|
|
6
|
-
constructor(canvas: fabric.Canvas, editor: IEditor);
|
|
11
|
+
constructor(canvas: fabric.Canvas, editor: IEditor, options?: ControlsPluginOptions);
|
|
7
12
|
init(): void;
|
|
8
13
|
/**
|
|
9
14
|
* 为画布上所有对象应用统一的控制点样式
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ControlsPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/ControlsPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAMtC,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ControlsPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/ControlsPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAMtC,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEzE,UAAU,qBAAsB,SAAQ,aAAa;IACjD,uCAAuC;IACvC,6BAA6B,CAAC,EAAE,OAAO,CAAC;CAC3C;AA4ND,cAAM,cAAe,YAAW,YAAY;IAG7B,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO;IACtB,OAAO,CAAC,OAAO;IAJnB,MAAM,CAAC,UAAU,SAAoB;gBAE1B,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,MAAM,EAAE,OAAO,EACd,OAAO,GAAE,qBAA0B;IAI/C,IAAI;IAwBJ;;OAEG;IACH,kBAAkB;IAYlB;;OAEG;IACH,wBAAwB;IA+KxB,OAAO;CAGV;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -10,6 +10,8 @@ declare class GroupAlignPlugin implements IPluginTempl {
|
|
|
10
10
|
static pluginName: string;
|
|
11
11
|
static apis: string[];
|
|
12
12
|
constructor(canvas: fabric.Canvas, editor: IEditor);
|
|
13
|
+
_refreshObjectCoordinates(objects: fabric.Object[]): void;
|
|
14
|
+
_notifySelectionModified(selection: fabric.ActiveSelection): void;
|
|
13
15
|
left(): void;
|
|
14
16
|
right(): void;
|
|
15
17
|
xcenter(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupAlignPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/GroupAlignPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,KAAK,OAAO,GAAG,IAAI,CACf,gBAAgB,EACd,MAAM,GACN,OAAO,GACP,SAAS,GACT,SAAS,GACT,KAAK,GACL,QAAQ,GACR,WAAW,GACX,WAAW,CAChB,CAAC;AAEF,OAAO,QAAQ,cAAc,CAAC;IAE1B,UAAU,OAAQ,SAAQ,OAAO;KAAI;CACxC;AAED,cAAM,gBAAiB,YAAW,YAAY;IAc/B,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO;IAd1B,MAAM,CAAC,UAAU,SAAsB;IACvC,MAAM,CAAC,IAAI,WAST;gBAGS,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,MAAM,EAAE,OAAO;IAG1B,IAAI;
|
|
1
|
+
{"version":3,"file":"GroupAlignPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/GroupAlignPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,KAAK,OAAO,GAAG,IAAI,CACf,gBAAgB,EACd,MAAM,GACN,OAAO,GACP,SAAS,GACT,SAAS,GACT,KAAK,GACL,QAAQ,GACR,WAAW,GACX,WAAW,CAChB,CAAC;AAEF,OAAO,QAAQ,cAAc,CAAC;IAE1B,UAAU,OAAQ,SAAQ,OAAO;KAAI;CACxC;AAED,cAAM,gBAAiB,YAAW,YAAY;IAc/B,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO;IAd1B,MAAM,CAAC,UAAU,SAAsB;IACvC,MAAM,CAAC,IAAI,WAST;gBAGS,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,MAAM,EAAE,OAAO;IAG1B,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;IAOlD,wBAAwB,CAAC,SAAS,EAAE,MAAM,CAAC,eAAe;IAK1D,IAAI;IAwBJ,KAAK;IA2BL,OAAO;IA2BP,OAAO;IA2BP,GAAG;IAuBH,MAAM;IA2BN,SAAS;IA0FT,SAAS;IAsFT,OAAO;CAGV;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { fabric, IEditor, IPluginTempl } from '@hprint/core';
|
|
2
|
+
export interface TableColumn {
|
|
3
|
+
title: string;
|
|
4
|
+
field: string;
|
|
5
|
+
width: number | `${number}%`;
|
|
6
|
+
}
|
|
7
|
+
export interface ITableItem {
|
|
8
|
+
type: 'table';
|
|
9
|
+
key: string;
|
|
10
|
+
title: string;
|
|
11
|
+
columns: TableColumn[];
|
|
12
|
+
data?: Array<Record<string, unknown>>;
|
|
13
|
+
headerHeight?: number;
|
|
14
|
+
rowHeight?: number;
|
|
15
|
+
height?: number;
|
|
16
|
+
heightAllocationMode?: 'stretch' | 'grow';
|
|
17
|
+
cellPaddingHorizontal?: number;
|
|
18
|
+
cellPaddingVertical?: number;
|
|
19
|
+
textOverflow?: 'wrap' | 'ellipsis';
|
|
20
|
+
textAlign?: 'left' | 'center' | 'right' | 'justify';
|
|
21
|
+
}
|
|
22
|
+
export interface TableOptions {
|
|
23
|
+
width?: number;
|
|
24
|
+
height?: number;
|
|
25
|
+
headerHeight?: number;
|
|
26
|
+
rowHeight?: number;
|
|
27
|
+
heightAllocationMode?: 'stretch' | 'grow';
|
|
28
|
+
borderWidth?: number;
|
|
29
|
+
fontFamily?: string;
|
|
30
|
+
fontSize?: number;
|
|
31
|
+
fontWeight?: string;
|
|
32
|
+
fontStyle?: string;
|
|
33
|
+
underline?: boolean | string;
|
|
34
|
+
linethrough?: boolean | string;
|
|
35
|
+
textOverflow?: 'wrap' | 'ellipsis';
|
|
36
|
+
textAlign?: 'left' | 'center' | 'right' | 'justify';
|
|
37
|
+
lineHeight?: number;
|
|
38
|
+
charSpacing?: number;
|
|
39
|
+
color?: string;
|
|
40
|
+
cellPadding?: number;
|
|
41
|
+
cellPaddingHorizontal?: number;
|
|
42
|
+
cellPaddingVertical?: number;
|
|
43
|
+
data?: Array<Record<string, unknown>>;
|
|
44
|
+
_field_?: string;
|
|
45
|
+
_renderRows?: Array<Record<string, unknown>>;
|
|
46
|
+
_clipContent?: boolean;
|
|
47
|
+
_actualContentLayout?: boolean;
|
|
48
|
+
[key: string]: any;
|
|
49
|
+
}
|
|
50
|
+
export type TableGroup = fabric.Group & {
|
|
51
|
+
extensionType?: string;
|
|
52
|
+
extension?: TableOptions & {
|
|
53
|
+
columns: TableColumn[];
|
|
54
|
+
};
|
|
55
|
+
_originSize?: Record<string, any>;
|
|
56
|
+
setExtension?: (fields: Record<string, any>) => Promise<void>;
|
|
57
|
+
setExtensionByUnit?: (fields: Record<string, any>) => Promise<void>;
|
|
58
|
+
setByUnit?: (field: string, value: any) => Promise<any>;
|
|
59
|
+
__tableModified?: () => void;
|
|
60
|
+
};
|
|
61
|
+
type IPlugin = Pick<TablePlugin, 'createTable' | 'initTableEvents' | 'refreshTable'>;
|
|
62
|
+
declare module '@hprint/core' {
|
|
63
|
+
interface IEditor extends IPlugin {
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export declare function normalizeTableColumns(columns: TableColumn[]): {
|
|
67
|
+
ratio: number;
|
|
68
|
+
title: string;
|
|
69
|
+
field: string;
|
|
70
|
+
width: number | `${number}%`;
|
|
71
|
+
}[];
|
|
72
|
+
declare class TablePlugin implements IPluginTempl {
|
|
73
|
+
canvas: fabric.Canvas;
|
|
74
|
+
editor: IEditor;
|
|
75
|
+
static pluginName: string;
|
|
76
|
+
static apis: string[];
|
|
77
|
+
constructor(canvas: fabric.Canvas, editor: IEditor);
|
|
78
|
+
hookTransform(object: any): Promise<void>;
|
|
79
|
+
hookTransformObjectEnd(...args: unknown[]): Promise<void>;
|
|
80
|
+
createTable(columns: TableColumn[], options?: TableOptions): TableGroup;
|
|
81
|
+
initTableEvents(group: TableGroup): void;
|
|
82
|
+
refreshTable(group: TableGroup): Promise<void>;
|
|
83
|
+
private normalizeOptions;
|
|
84
|
+
private positiveNumber;
|
|
85
|
+
private nonNegativeNumber;
|
|
86
|
+
private toPx;
|
|
87
|
+
private buildGroup;
|
|
88
|
+
private createCellText;
|
|
89
|
+
private measureCellTextHeight;
|
|
90
|
+
private ellipsizeCellText;
|
|
91
|
+
private updateOriginSize;
|
|
92
|
+
destroy(): void;
|
|
93
|
+
}
|
|
94
|
+
export default TablePlugin;
|
|
95
|
+
//# sourceMappingURL=TablePlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TablePlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/TablePlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG1D,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;CACvD;AAED,MAAM,WAAW,YAAY;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,YAAY,GAAG;QAAE,OAAO,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACxD,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAEF,KAAK,OAAO,GAAG,IAAI,CACf,WAAW,EACX,aAAa,GAAG,iBAAiB,GAAG,cAAc,CACrD,CAAC;AAEF,OAAO,QAAQ,cAAc,CAAC;IAC1B,UAAU,OAAQ,SAAQ,OAAO;KAAG;CACvC;AA2HD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,EAAE;;;;;IA0C3D;AAED,cAAM,WAAY,YAAW,YAAY;IAK1B,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO;IAL1B,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,IAAI,WAAsD;gBAGtD,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,MAAM,EAAE,OAAO;IAGpB,aAAa,CAAC,MAAM,EAAE,GAAG;IA8BzB,sBAAsB,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAU/C,WAAW,CACP,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,GAAE,YAAiB,GAC3B,UAAU;IASb,eAAe,CAAC,KAAK,EAAE,UAAU;IA2D3B,YAAY,CAAC,KAAK,EAAE,UAAU;IAqCpC,OAAO,CAAC,gBAAgB;IA8ExB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,UAAU;IA0MlB,OAAO,CAAC,cAAc;IAkFtB,OAAO,CAAC,qBAAqB;IAkC7B,OAAO,CAAC,iBAAiB;IAwCzB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO;CACV;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -78,6 +78,7 @@ declare class UnitPlugin implements IPluginTempl {
|
|
|
78
78
|
_syncOriginSize(width?: number, height?: number): void;
|
|
79
79
|
syncOriginSizeByUnit(width?: number, height?: number): void;
|
|
80
80
|
_bindEvents(): void;
|
|
81
|
+
_syncTargetOriginSize(target: fabric.Object): void;
|
|
81
82
|
destroy(): void;
|
|
82
83
|
}
|
|
83
84
|
export default UnitPlugin;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnitPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/UnitPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"UnitPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/UnitPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC,KAAK,OAAO,GAAG,IAAI,CACf,UAAU,EACR,SAAS,GACT,SAAS,GACT,eAAe,GACf,eAAe,GACf,eAAe,GACf,sBAAsB,GACtB,eAAe,GACf,eAAe,GACf,iBAAiB,GACjB,mBAAmB,CACxB,CAAC;AAEF,KAAK,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAElC,OAAO,QAAQ,cAAc,CAAC;IAE1B,UAAU,OAAQ,SAAQ,OAAO;KAAI;CACxC;AAED,cAAM,UAAW,YAAW,YAAY;IAoBzB,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO;IApB1B,MAAM,CAAC,UAAU,SAAgB;IAEjC,MAAM,CAAC,IAAI,WAYT;IACF,IAAI,EAAE,KAAK,CAAQ;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAmC;gBAEtF,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,MAAM,EAAE,OAAO,EACtB,OAAO,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,KAAK,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;KACtB;IAML,cAAc;IAMd,aAAa;IAMb,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,KAAK,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAKnD,OAAO,CAAC,IAAI,EAAE,KAAK;IAMnB,OAAO;IAIP,YAAY;IAIZ,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,MAAM;IAUzD,iBAAiB,CAAC,KAAK,EAAE,MAAM;IAM/B,uBAAuB,CAAC,CAAC,SAAS;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,EACjE,IAAI,EAAE,CAAC,EACP,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EACnB,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GACrB,CAAC;IAqBJ,aAAa,CACT,GAAG,EAAE,MAAM,CAAC,MAAM,EAClB,IAAI,EAAE;QACF,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB;IAYL,aAAa,CACT,GAAG,EAAE,MAAM,CAAC,MAAM,EAClB,EAAE,EAAE;QACA,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB,EACD,GAAG,CAAC,EAAE,MAAM;IAmBhB,eAAe,CACX,GAAG,EAAE,MAAM,CAAC,MAAM,EAClB,IAAI,EAAE;QACF,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB,EACD,GAAG,CAAC,EAAE,MAAM;IAuBhB,iBAAiB,CACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAClB,IAAI,EAAE;QACF,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB,EACD,GAAG,CAAC,EAAE,MAAM;IAShB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;IAOzD,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE;IAcvF,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM;eAhNW,MAAM;gBAAU,MAAM;;IAgP3D,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAQ/C,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAcpD,WAAW;IAsCX,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM;IA+B3C,OAAO;CAGV;AAED,eAAe,UAAU,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hprint/plugins",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11-alpha.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"qs": "~6.12.3",
|
|
23
23
|
"socket.io-client": "^4.8.1",
|
|
24
24
|
"uuid": "~8.3.2",
|
|
25
|
-
"@hprint/core": "0.0.
|
|
26
|
-
"@hprint/shared": "0.0.
|
|
25
|
+
"@hprint/core": "0.0.11-alpha.1",
|
|
26
|
+
"@hprint/shared": "0.0.11-alpha.1"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/bwip-js": "^3.2.3",
|
package/src/index.ts
CHANGED
|
@@ -36,9 +36,10 @@ import ResizePlugin from './plugins/ResizePlugin';
|
|
|
36
36
|
import LockPlugin from './plugins/LockPlugin';
|
|
37
37
|
import AddBaseTypePlugin from './plugins/AddBaseTypePlugin';
|
|
38
38
|
import PrintPlugin from './plugins/PrintPlugin';
|
|
39
|
-
import CreateElementPlugin from './plugins/CreateElementPlugin';
|
|
40
|
-
import ImageTextListPlugin from './plugins/ImageTextListPlugin';
|
|
41
|
-
import ActualContentLayoutPlugin from './plugins/ActualContentLayoutPlugin';
|
|
39
|
+
import CreateElementPlugin from './plugins/CreateElementPlugin';
|
|
40
|
+
import ImageTextListPlugin from './plugins/ImageTextListPlugin';
|
|
41
|
+
import ActualContentLayoutPlugin from './plugins/ActualContentLayoutPlugin';
|
|
42
|
+
import TablePlugin from './plugins/TablePlugin';
|
|
42
43
|
|
|
43
44
|
// 对象形式导出所有插件
|
|
44
45
|
const pluginsObject: { [key: string]: IPluginTempl } = {
|
|
@@ -77,10 +78,11 @@ const pluginsObject: { [key: string]: IPluginTempl } = {
|
|
|
77
78
|
LockPlugin,
|
|
78
79
|
AddBaseTypePlugin,
|
|
79
80
|
PrintPlugin,
|
|
80
|
-
CreateElementPlugin,
|
|
81
|
-
ImageTextListPlugin,
|
|
82
|
-
ActualContentLayoutPlugin,
|
|
83
|
-
|
|
81
|
+
CreateElementPlugin,
|
|
82
|
+
ImageTextListPlugin,
|
|
83
|
+
ActualContentLayoutPlugin,
|
|
84
|
+
TablePlugin,
|
|
85
|
+
};
|
|
84
86
|
|
|
85
87
|
// 数组形式导出所有插件
|
|
86
88
|
const pluginsList: IPluginTempl[] = [
|
|
@@ -119,9 +121,17 @@ const pluginsList: IPluginTempl[] = [
|
|
|
119
121
|
LockPlugin,
|
|
120
122
|
AddBaseTypePlugin,
|
|
121
123
|
PrintPlugin,
|
|
122
|
-
CreateElementPlugin,
|
|
123
|
-
ImageTextListPlugin,
|
|
124
|
-
ActualContentLayoutPlugin,
|
|
125
|
-
|
|
124
|
+
CreateElementPlugin,
|
|
125
|
+
ImageTextListPlugin,
|
|
126
|
+
ActualContentLayoutPlugin,
|
|
127
|
+
TablePlugin,
|
|
128
|
+
];
|
|
126
129
|
|
|
127
130
|
export { pluginsObject, pluginsList, SelectEvent, SelectMode };
|
|
131
|
+
export type {
|
|
132
|
+
ITableItem,
|
|
133
|
+
TableColumn,
|
|
134
|
+
TableOptions,
|
|
135
|
+
TableGroup,
|
|
136
|
+
} from './plugins/TablePlugin';
|
|
137
|
+
export { normalizeTableColumns } from './plugins/TablePlugin';
|
|
@@ -12,12 +12,12 @@ declare module '@hprint/core' {
|
|
|
12
12
|
interface IEditor extends IPlugin {}
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
type LayoutEntry = {
|
|
16
|
-
object: fabric.Object;
|
|
17
|
-
index: number;
|
|
18
|
-
originalTop: number;
|
|
19
|
-
originalBottom: number;
|
|
20
|
-
};
|
|
15
|
+
type LayoutEntry = {
|
|
16
|
+
object: fabric.Object;
|
|
17
|
+
index: number;
|
|
18
|
+
originalTop: number;
|
|
19
|
+
originalBottom: number;
|
|
20
|
+
};
|
|
21
21
|
|
|
22
22
|
class ActualContentLayoutPlugin implements IPluginTempl {
|
|
23
23
|
static pluginName = 'ActualContentLayoutPlugin';
|
|
@@ -51,32 +51,34 @@ class ActualContentLayoutPlugin implements IPluginTempl {
|
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
applyActualContentLayout(templateContent: any, templateHeight: number) {
|
|
55
|
-
const settings = (templateContent?.templateSettings ||
|
|
56
|
-
{}) as ActualContentLayoutSettings;
|
|
57
|
-
if (!settings.actualContentLayout) return templateHeight;
|
|
58
|
-
|
|
59
|
-
const fabricObjects = this.canvas
|
|
60
|
-
.getObjects()
|
|
61
|
-
.filter(this.isPrintableObject);
|
|
62
|
-
const mmPerPx = Number(this.editor.getSizeByUnit?.(1, 'mm')) || 1;
|
|
54
|
+
applyActualContentLayout(templateContent: any, templateHeight: number) {
|
|
55
|
+
const settings = (templateContent?.templateSettings ||
|
|
56
|
+
{}) as ActualContentLayoutSettings;
|
|
57
|
+
if (!settings.actualContentLayout) return templateHeight;
|
|
58
|
+
|
|
59
|
+
const fabricObjects = this.canvas
|
|
60
|
+
.getObjects()
|
|
61
|
+
.filter(this.isPrintableObject);
|
|
62
|
+
const mmPerPx = Number(this.editor.getSizeByUnit?.(1, 'mm')) || 1;
|
|
63
63
|
const sourceObjects = this.getTemplateSourceObjects(templateContent);
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
object,
|
|
78
|
-
|
|
79
|
-
|
|
64
|
+
const unitFactor = mmPerPx;
|
|
65
|
+
const tolerance = 0.01;
|
|
66
|
+
|
|
67
|
+
fabricObjects.forEach((object) => this.preparePrintLayoutObject(object));
|
|
68
|
+
|
|
69
|
+
const entries = fabricObjects.map((object, index) => {
|
|
70
|
+
const origin = this.layoutOrigins.get(object);
|
|
71
|
+
const source = this.getSourceObject(object, sourceObjects);
|
|
72
|
+
const originalTop =
|
|
73
|
+
origin?.top ??
|
|
74
|
+
this.getOriginalTop(source, object, mmPerPx);
|
|
75
|
+
const originalHeight =
|
|
76
|
+
origin?.height ??
|
|
77
|
+
this.getOriginalHeight(source, object, mmPerPx);
|
|
78
|
+
return {
|
|
79
|
+
object,
|
|
80
|
+
index,
|
|
81
|
+
originalTop,
|
|
80
82
|
originalBottom: originalTop + originalHeight,
|
|
81
83
|
};
|
|
82
84
|
}) as LayoutEntry[];
|
|
@@ -143,8 +145,14 @@ class ActualContentLayoutPlugin implements IPluginTempl {
|
|
|
143
145
|
});
|
|
144
146
|
|
|
145
147
|
this.canvas.requestRenderAll();
|
|
148
|
+
const hasExpandedTable = entries.some(
|
|
149
|
+
(entry) =>
|
|
150
|
+
(entry.object as any)?.extensionType === 'table' &&
|
|
151
|
+
this.getActualLayoutHeight(entry.object) * unitFactor >
|
|
152
|
+
entry.originalBottom - entry.originalTop + tolerance
|
|
153
|
+
);
|
|
146
154
|
if (
|
|
147
|
-
settings.overflowMode !== 'expand' ||
|
|
155
|
+
(!hasExpandedTable && settings.overflowMode !== 'expand') ||
|
|
148
156
|
previousActualBottom === undefined
|
|
149
157
|
) {
|
|
150
158
|
return templateHeight;
|
|
@@ -159,22 +167,22 @@ class ActualContentLayoutPlugin implements IPluginTempl {
|
|
|
159
167
|
);
|
|
160
168
|
}
|
|
161
169
|
|
|
162
|
-
private getOriginalTop(
|
|
163
|
-
source: any,
|
|
164
|
-
object: fabric.Object,
|
|
165
|
-
mmPerPx: number
|
|
166
|
-
) {
|
|
170
|
+
private getOriginalTop(
|
|
171
|
+
source: any,
|
|
172
|
+
object: fabric.Object,
|
|
173
|
+
mmPerPx: number
|
|
174
|
+
) {
|
|
167
175
|
const top = Number(source?.top);
|
|
168
176
|
if (Number.isFinite(top)) return top * mmPerPx;
|
|
169
177
|
return this.getOriginMmValue(
|
|
170
178
|
source,
|
|
171
179
|
'top',
|
|
172
180
|
Number(object.top || 0) * mmPerPx
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
private getOriginalHeight(
|
|
177
|
-
source: any,
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
private getOriginalHeight(
|
|
185
|
+
source: any,
|
|
178
186
|
object: fabric.Object,
|
|
179
187
|
mmPerPx: number
|
|
180
188
|
) {
|
|
@@ -188,31 +196,31 @@ class ActualContentLayoutPlugin implements IPluginTempl {
|
|
|
188
196
|
'height',
|
|
189
197
|
Number(object.getScaledHeight?.() || object.height || 0) *
|
|
190
198
|
mmPerPx
|
|
191
|
-
);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
private getTemplateSourceObjects(templateContent: any) {
|
|
195
|
-
const sourceObjects = new Map<string, any>();
|
|
196
|
-
if (!Array.isArray(templateContent?.objects)) return sourceObjects;
|
|
197
|
-
templateContent.objects.forEach((source: any, index: number) => {
|
|
198
|
-
if (source?.id) sourceObjects.set(`id:${source.id}`, source);
|
|
199
|
-
sourceObjects.set(`index:${index}`, source);
|
|
200
|
-
});
|
|
201
|
-
return sourceObjects;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
private getSourceObject(
|
|
205
|
-
object: any,
|
|
206
|
-
sourceObjects: Map<string, any>
|
|
207
|
-
) {
|
|
208
|
-
if (object?.id) {
|
|
209
|
-
const source = sourceObjects.get(`id:${object.id}`);
|
|
210
|
-
if (source) return source;
|
|
211
|
-
}
|
|
212
|
-
const objects = this.canvas.getObjects().filter(this.isPrintableObject);
|
|
213
|
-
const index = objects.indexOf(object);
|
|
214
|
-
return sourceObjects.get(`index:${index}`);
|
|
215
|
-
}
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
private getTemplateSourceObjects(templateContent: any) {
|
|
203
|
+
const sourceObjects = new Map<string, any>();
|
|
204
|
+
if (!Array.isArray(templateContent?.objects)) return sourceObjects;
|
|
205
|
+
templateContent.objects.forEach((source: any, index: number) => {
|
|
206
|
+
if (source?.id) sourceObjects.set(`id:${source.id}`, source);
|
|
207
|
+
sourceObjects.set(`index:${index}`, source);
|
|
208
|
+
});
|
|
209
|
+
return sourceObjects;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
private getSourceObject(
|
|
213
|
+
object: any,
|
|
214
|
+
sourceObjects: Map<string, any>
|
|
215
|
+
) {
|
|
216
|
+
if (object?.id) {
|
|
217
|
+
const source = sourceObjects.get(`id:${object.id}`);
|
|
218
|
+
if (source) return source;
|
|
219
|
+
}
|
|
220
|
+
const objects = this.canvas.getObjects().filter(this.isPrintableObject);
|
|
221
|
+
const index = objects.indexOf(object);
|
|
222
|
+
return sourceObjects.get(`index:${index}`);
|
|
223
|
+
}
|
|
216
224
|
|
|
217
225
|
private getOriginMmValue(
|
|
218
226
|
source: any,
|
|
@@ -232,7 +240,7 @@ class ActualContentLayoutPlugin implements IPluginTempl {
|
|
|
232
240
|
}
|
|
233
241
|
|
|
234
242
|
private preparePrintLayoutObject(object: any) {
|
|
235
|
-
if (object?.extensionType
|
|
243
|
+
if (!['imageTextList', 'table'].includes(object?.extensionType)) return;
|
|
236
244
|
if (object.extension?._clipContent === true) return;
|
|
237
245
|
|
|
238
246
|
// Design canvases can opt into clipping, but print/layout canvases should
|
|
@@ -252,36 +260,36 @@ class ActualContentLayoutPlugin implements IPluginTempl {
|
|
|
252
260
|
);
|
|
253
261
|
}
|
|
254
262
|
|
|
255
|
-
private isEmptyLayoutObject(object: any) {
|
|
256
|
-
if (object?.visible === false) return true;
|
|
257
|
-
const field = object?.extension?._field_;
|
|
258
|
-
if (!field) return false;
|
|
259
|
-
if (object.type === 'textbox') {
|
|
260
|
-
return String(object.text ?? '') === '';
|
|
261
|
-
}
|
|
262
|
-
if (['barcode', 'qrcode'].includes(object.extensionType)) {
|
|
263
|
-
return (
|
|
264
|
-
String(object.extension?.value ?? '') === '' &&
|
|
265
|
-
!this.hasVisibleImageSource(object)
|
|
266
|
-
);
|
|
267
|
-
}
|
|
268
|
-
if (object.extensionType === 'imageTextList') {
|
|
269
|
-
return (
|
|
270
|
-
!Array.isArray(object.extension?.items) ||
|
|
263
|
+
private isEmptyLayoutObject(object: any) {
|
|
264
|
+
if (object?.visible === false) return true;
|
|
265
|
+
const field = object?.extension?._field_;
|
|
266
|
+
if (!field) return false;
|
|
267
|
+
if (object.type === 'textbox') {
|
|
268
|
+
return String(object.text ?? '') === '';
|
|
269
|
+
}
|
|
270
|
+
if (['barcode', 'qrcode'].includes(object.extensionType)) {
|
|
271
|
+
return (
|
|
272
|
+
String(object.extension?.value ?? '') === '' &&
|
|
273
|
+
!this.hasVisibleImageSource(object)
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
if (object.extensionType === 'imageTextList') {
|
|
277
|
+
return (
|
|
278
|
+
!Array.isArray(object.extension?.items) ||
|
|
271
279
|
object.extension.items.length === 0
|
|
272
280
|
);
|
|
273
|
-
}
|
|
274
|
-
return false;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
private hasVisibleImageSource(object: any) {
|
|
278
|
-
const src = String(object?.getSrc?.() ?? object?.src ?? '');
|
|
279
|
-
return src !== '' && /^data:image\//i.test(src);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
private getActualLayoutHeight(object: any) {
|
|
283
|
-
if (object?.extensionType !== 'imageTextList') {
|
|
284
|
-
return Number(
|
|
281
|
+
}
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
private hasVisibleImageSource(object: any) {
|
|
286
|
+
const src = String(object?.getSrc?.() ?? object?.src ?? '');
|
|
287
|
+
return src !== '' && /^data:image\//i.test(src);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
private getActualLayoutHeight(object: any) {
|
|
291
|
+
if (object?.extensionType !== 'imageTextList') {
|
|
292
|
+
return Number(
|
|
285
293
|
object.getScaledHeight?.() || object.height || 0
|
|
286
294
|
);
|
|
287
295
|
}
|
|
@@ -4,7 +4,12 @@ import verticalImg from '../assets/middlecontrol.svg?url';
|
|
|
4
4
|
import horizontalImg from '../assets/middlecontrolhoz.svg?url';
|
|
5
5
|
import edgeImg from '../assets/edgecontrol.svg?url';
|
|
6
6
|
import rotateImg from '../assets/rotateicon.svg?url';
|
|
7
|
-
import type { IEditor, IPluginTempl } from '@hprint/core';
|
|
7
|
+
import type { IEditor, IPluginOption, IPluginTempl } from '@hprint/core';
|
|
8
|
+
|
|
9
|
+
interface ControlsPluginOptions extends IPluginOption {
|
|
10
|
+
/** 是否禁用多选对象的整体缩放,默认保留 Fabric 的缩放能力。 */
|
|
11
|
+
disableActiveSelectionScaling?: boolean;
|
|
12
|
+
}
|
|
8
13
|
|
|
9
14
|
/**
|
|
10
15
|
* 实际场景: 在进行某个对象缩放的时候,由于fabricjs默认精度使用的是toFixed(2)。
|
|
@@ -224,13 +229,14 @@ function rotationControl() {
|
|
|
224
229
|
});
|
|
225
230
|
}
|
|
226
231
|
|
|
227
|
-
class ControlsPlugin implements IPluginTempl {
|
|
228
|
-
static pluginName = 'ControlsPlugin';
|
|
229
|
-
constructor(
|
|
230
|
-
public canvas: fabric.Canvas,
|
|
231
|
-
public editor: IEditor
|
|
232
|
-
|
|
233
|
-
|
|
232
|
+
class ControlsPlugin implements IPluginTempl {
|
|
233
|
+
static pluginName = 'ControlsPlugin';
|
|
234
|
+
constructor(
|
|
235
|
+
public canvas: fabric.Canvas,
|
|
236
|
+
public editor: IEditor,
|
|
237
|
+
private options: ControlsPluginOptions = {}
|
|
238
|
+
) {
|
|
239
|
+
this.init();
|
|
234
240
|
}
|
|
235
241
|
init() {
|
|
236
242
|
// 删除图标
|
|
@@ -274,7 +280,39 @@ class ControlsPlugin implements IPluginTempl {
|
|
|
274
280
|
/**
|
|
275
281
|
* 自定义多选控制点,添加白色填充并确保在边框上方
|
|
276
282
|
*/
|
|
277
|
-
customizeActiveSelection() {
|
|
283
|
+
customizeActiveSelection() {
|
|
284
|
+
const shouldDisableActiveSelectionScaling =
|
|
285
|
+
this.options.disableActiveSelectionScaling === true;
|
|
286
|
+
const scaleControlVisibility = {
|
|
287
|
+
tl: false,
|
|
288
|
+
tr: false,
|
|
289
|
+
bl: false,
|
|
290
|
+
br: false,
|
|
291
|
+
ml: false,
|
|
292
|
+
mr: false,
|
|
293
|
+
mt: false,
|
|
294
|
+
mb: false,
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
const disableActiveSelectionScaling = (target?: fabric.Object) => {
|
|
298
|
+
if (!shouldDisableActiveSelectionScaling) return;
|
|
299
|
+
|
|
300
|
+
const activeObject = target || this.canvas.getActiveObject();
|
|
301
|
+
if (!activeObject || activeObject.type !== 'activeSelection') return;
|
|
302
|
+
|
|
303
|
+
if (!activeObject.lockScalingX || !activeObject.lockScalingY) {
|
|
304
|
+
activeObject.set({
|
|
305
|
+
lockScalingX: true,
|
|
306
|
+
lockScalingY: true,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
Object.entries(scaleControlVisibility).forEach(([key, visible]) => {
|
|
310
|
+
if (activeObject.isControlVisible(key) !== visible) {
|
|
311
|
+
activeObject.setControlVisible(key, visible);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
};
|
|
315
|
+
|
|
278
316
|
// 自定义控制点渲染函数
|
|
279
317
|
const renderCircleControl = (
|
|
280
318
|
ctx: CanvasRenderingContext2D,
|
|
@@ -326,25 +364,37 @@ class ControlsPlugin implements IPluginTempl {
|
|
|
326
364
|
}
|
|
327
365
|
});
|
|
328
366
|
|
|
329
|
-
//
|
|
330
|
-
fabric.ActiveSelection.prototype.set(CONTROL_STYLES);
|
|
367
|
+
// hprint 默认保留多选缩放;由业务方按编辑器实例决定是否关闭。
|
|
368
|
+
fabric.ActiveSelection.prototype.set(CONTROL_STYLES);
|
|
369
|
+
if (shouldDisableActiveSelectionScaling) {
|
|
370
|
+
this.canvas.on('selection:created', (e: any) => {
|
|
371
|
+
disableActiveSelectionScaling(e.target);
|
|
372
|
+
});
|
|
373
|
+
this.canvas.on('selection:updated', (e: any) => {
|
|
374
|
+
disableActiveSelectionScaling(e.target);
|
|
375
|
+
});
|
|
376
|
+
// 覆盖鼠标框选和代码创建 ActiveSelection 未经过选择事件的情况。
|
|
377
|
+
this.canvas.on('before:render', () => {
|
|
378
|
+
disableActiveSelectionScaling();
|
|
379
|
+
});
|
|
380
|
+
}
|
|
331
381
|
|
|
332
|
-
//
|
|
333
|
-
let isTransforming = false;
|
|
382
|
+
// 跟踪是否正在移动、缩放或旋转对象
|
|
383
|
+
let isTransforming = false;
|
|
334
384
|
|
|
335
385
|
// 监听对象移动开始
|
|
336
|
-
this.canvas.on('object:moving', (e: any) => {
|
|
386
|
+
this.canvas.on('object:moving', (e: any) => {
|
|
337
387
|
if (e.target && e.target.type === 'activeSelection') {
|
|
338
388
|
isTransforming = true;
|
|
339
389
|
}
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
//
|
|
343
|
-
this.canvas.on('object:scaling', (e: any) => {
|
|
344
|
-
if (e.target && e.target.type === 'activeSelection') {
|
|
345
|
-
isTransforming = true;
|
|
346
|
-
}
|
|
347
|
-
});
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
// 未关闭多选缩放时,缩放期间不重复绘制控制点。
|
|
393
|
+
this.canvas.on('object:scaling', (e: any) => {
|
|
394
|
+
if (e.target && e.target.type === 'activeSelection') {
|
|
395
|
+
isTransforming = true;
|
|
396
|
+
}
|
|
397
|
+
});
|
|
348
398
|
|
|
349
399
|
// 监听对象旋转开始
|
|
350
400
|
this.canvas.on('object:rotating', (e: any) => {
|
|
@@ -371,7 +421,7 @@ class ControlsPlugin implements IPluginTempl {
|
|
|
371
421
|
|
|
372
422
|
// 监听canvas的after:render事件,在所有内容渲染完成后额外绘制多选控制点
|
|
373
423
|
this.canvas.on('after:render', () => {
|
|
374
|
-
//
|
|
424
|
+
// 如果正在变换(移动、旋转),不绘制控制点
|
|
375
425
|
if (isTransforming) return;
|
|
376
426
|
|
|
377
427
|
const activeObject = this.canvas.getActiveObject();
|