kritzel-react 0.1.32 → 0.1.34
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/types/components/stencil-generated/components.d.ts +1 -1
- package/package.json +2 -2
- package/dist/kritzel-react/lib/components/stencil-generated/components.js +0 -122
- package/dist/kritzel-react/lib/index.js +0 -2
- package/dist/kritzel-stencil/src/classes/core/core.class.js +0 -797
- package/dist/kritzel-stencil/src/classes/core/reviver.class.js +0 -97
- package/dist/kritzel-stencil/src/classes/core/store.class.js +0 -153
- package/dist/kritzel-stencil/src/classes/core/viewport.class.js +0 -311
- package/dist/kritzel-stencil/src/classes/core/workspace.class.js +0 -34
- package/dist/kritzel-stencil/src/classes/handlers/base.handler.js +0 -6
- package/dist/kritzel-stencil/src/classes/handlers/context-menu.handler.js +0 -63
- package/dist/kritzel-stencil/src/classes/handlers/hover.handler.js +0 -18
- package/dist/kritzel-stencil/src/classes/handlers/key.handler.js +0 -76
- package/dist/kritzel-stencil/src/classes/handlers/line-handle.handler.js +0 -382
- package/dist/kritzel-stencil/src/classes/handlers/move.handler.js +0 -213
- package/dist/kritzel-stencil/src/classes/handlers/resize.handler.js +0 -205
- package/dist/kritzel-stencil/src/classes/handlers/rotation.handler.js +0 -117
- package/dist/kritzel-stencil/src/classes/handlers/selection.handler.js +0 -313
- package/dist/kritzel-stencil/src/classes/managers/anchor.manager.js +0 -1056
- package/dist/kritzel-stencil/src/classes/managers/cursor.manager.js +0 -117
- package/dist/kritzel-stencil/src/classes/managers/theme.manager.js +0 -103
- package/dist/kritzel-stencil/src/classes/objects/base-object.class.js +0 -249
- package/dist/kritzel-stencil/src/classes/objects/custom-element.class.js +0 -60
- package/dist/kritzel-stencil/src/classes/objects/group.class.js +0 -407
- package/dist/kritzel-stencil/src/classes/objects/image.class.js +0 -55
- package/dist/kritzel-stencil/src/classes/objects/line.class.js +0 -608
- package/dist/kritzel-stencil/src/classes/objects/path.class.js +0 -401
- package/dist/kritzel-stencil/src/classes/objects/selection-box.class.js +0 -21
- package/dist/kritzel-stencil/src/classes/objects/selection-group.class.js +0 -409
- package/dist/kritzel-stencil/src/classes/objects/shape.class.js +0 -412
- package/dist/kritzel-stencil/src/classes/objects/text.class.js +0 -292
- package/dist/kritzel-stencil/src/classes/providers/broadcast-sync-provider.class.js +0 -101
- package/dist/kritzel-stencil/src/classes/providers/hocuspocus-sync-provider.class.js +0 -241
- package/dist/kritzel-stencil/src/classes/providers/indexeddb-sync-provider.class.js +0 -43
- package/dist/kritzel-stencil/src/classes/providers/websocket-sync-provider.class.js +0 -98
- package/dist/kritzel-stencil/src/classes/registries/icon-registry.class.js +0 -66
- package/dist/kritzel-stencil/src/classes/registries/tool.registry.js +0 -21
- package/dist/kritzel-stencil/src/classes/structures/app-state-map.structure.js +0 -212
- package/dist/kritzel-stencil/src/classes/structures/object-map.structure.js +0 -414
- package/dist/kritzel-stencil/src/classes/structures/quadtree.structure.js +0 -151
- package/dist/kritzel-stencil/src/classes/tools/base-tool.class.js +0 -36
- package/dist/kritzel-stencil/src/classes/tools/brush-tool.class.js +0 -161
- package/dist/kritzel-stencil/src/classes/tools/eraser-tool.class.js +0 -85
- package/dist/kritzel-stencil/src/classes/tools/image-tool.class.js +0 -83
- package/dist/kritzel-stencil/src/classes/tools/line-tool.class.js +0 -187
- package/dist/kritzel-stencil/src/classes/tools/selection-tool.class.js +0 -429
- package/dist/kritzel-stencil/src/classes/tools/shape-tool.class.js +0 -196
- package/dist/kritzel-stencil/src/classes/tools/text-tool.class.js +0 -100
- package/dist/kritzel-stencil/src/components/core/kritzel-engine/kritzel-engine.js +0 -1343
- package/dist/kritzel-stencil/src/components/shared/kritzel-brush-style/kritzel-brush-style.js +0 -46
- package/dist/kritzel-stencil/src/components/shared/kritzel-dropdown/kritzel-dropdown.js +0 -312
- package/dist/kritzel-stencil/src/components/shared/kritzel-font-family/kritzel-font-family.js +0 -60
- package/dist/kritzel-stencil/src/components/shared/kritzel-line-endings/kritzel-line-endings.js +0 -105
- package/dist/kritzel-stencil/src/components/shared/kritzel-shape-fill/kritzel-shape-fill.js +0 -53
- package/dist/kritzel-stencil/src/components/ui/kritzel-context-menu/kritzel-context-menu.js +0 -137
- package/dist/kritzel-stencil/src/configs/default-brush-tool.config.js +0 -9
- package/dist/kritzel-stencil/src/configs/default-engine-config.js +0 -63
- package/dist/kritzel-stencil/src/configs/default-line-tool.config.js +0 -9
- package/dist/kritzel-stencil/src/configs/default-sync.config.js +0 -9
- package/dist/kritzel-stencil/src/configs/default-text-tool.config.js +0 -7
- package/dist/kritzel-stencil/src/constants/color-palette.constants.js +0 -37
- package/dist/kritzel-stencil/src/constants/engine.constants.js +0 -2
- package/dist/kritzel-stencil/src/enums/event-button.enum.js +0 -6
- package/dist/kritzel-stencil/src/enums/handle-type.enum.js +0 -7
- package/dist/kritzel-stencil/src/enums/shape-type.enum.js +0 -6
- package/dist/kritzel-stencil/src/helpers/class.helper.js +0 -5
- package/dist/kritzel-stencil/src/helpers/color.helper.js +0 -106
- package/dist/kritzel-stencil/src/helpers/cursor.helper.js +0 -57
- package/dist/kritzel-stencil/src/helpers/devices.helper.js +0 -28
- package/dist/kritzel-stencil/src/helpers/event.helper.js +0 -58
- package/dist/kritzel-stencil/src/helpers/geometry.helper.js +0 -149
- package/dist/kritzel-stencil/src/helpers/keyboard.helper.js +0 -51
- package/dist/kritzel-stencil/src/helpers/math.helper.js +0 -5
- package/dist/kritzel-stencil/src/helpers/object.helper.js +0 -11
- package/dist/kritzel-stencil/src/helpers/theme.helper.js +0 -69
- package/dist/kritzel-stencil/src/index.js +0 -41
- package/dist/kritzel-stencil/src/interfaces/anchor.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/arrow-head.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/bounding-box.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/clonable.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/context-menu-item.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/debug-info.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/dialog.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/displayable-shortcut.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/engine-state.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/line-options.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/master-detail.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/menu-item.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/object.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/path-options.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/point.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/polygon.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/serializable.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/settings.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/shortcut.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/sync-config.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/sync-provider.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/theme.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/tool-config.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/tool.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/toolbar-control.interface.js +0 -1
- package/dist/kritzel-stencil/src/interfaces/undo-state.interface.js +0 -1
- package/dist/kritzel-stencil/src/themes/dark-theme.js +0 -198
- package/dist/kritzel-stencil/src/themes/light-theme.js +0 -199
- package/dist/kritzel-stencil/src/types/shortcut.type.js +0 -1
- package/dist/kritzel-stencil/src/types/state.types.js +0 -1
- package/dist/types/kritzel-react/lib/components/stencil-generated/components.d.ts +0 -74
- package/dist/types/kritzel-react/lib/index.d.ts +0 -2
- package/dist/types/kritzel-stencil/src/classes/core/core.class.d.ts +0 -101
- package/dist/types/kritzel-stencil/src/classes/core/reviver.class.d.ts +0 -6
- package/dist/types/kritzel-stencil/src/classes/core/store.class.d.ts +0 -53
- package/dist/types/kritzel-stencil/src/classes/core/viewport.class.d.ts +0 -48
- package/dist/types/kritzel-stencil/src/classes/core/workspace.class.d.ts +0 -24
- package/dist/types/kritzel-stencil/src/classes/handlers/base.handler.d.ts +0 -5
- package/dist/types/kritzel-stencil/src/classes/handlers/context-menu.handler.d.ts +0 -8
- package/dist/types/kritzel-stencil/src/classes/handlers/hover.handler.d.ts +0 -6
- package/dist/types/kritzel-stencil/src/classes/handlers/key.handler.d.ts +0 -11
- package/dist/types/kritzel-stencil/src/classes/handlers/line-handle.handler.d.ts +0 -34
- package/dist/types/kritzel-stencil/src/classes/handlers/move.handler.d.ts +0 -29
- package/dist/types/kritzel-stencil/src/classes/handlers/resize.handler.d.ts +0 -24
- package/dist/types/kritzel-stencil/src/classes/handlers/rotation.handler.d.ts +0 -12
- package/dist/types/kritzel-stencil/src/classes/handlers/selection.handler.d.ts +0 -27
- package/dist/types/kritzel-stencil/src/classes/managers/anchor.manager.d.ts +0 -180
- package/dist/types/kritzel-stencil/src/classes/managers/cursor.manager.d.ts +0 -43
- package/dist/types/kritzel-stencil/src/classes/managers/theme.manager.d.ts +0 -56
- package/dist/types/kritzel-stencil/src/classes/objects/base-object.class.d.ts +0 -76
- package/dist/types/kritzel-stencil/src/classes/objects/custom-element.class.d.ts +0 -26
- package/dist/types/kritzel-stencil/src/classes/objects/group.class.d.ts +0 -97
- package/dist/types/kritzel-stencil/src/classes/objects/image.class.d.ts +0 -17
- package/dist/types/kritzel-stencil/src/classes/objects/line.class.d.ts +0 -101
- package/dist/types/kritzel-stencil/src/classes/objects/path.class.d.ts +0 -62
- package/dist/types/kritzel-stencil/src/classes/objects/selection-box.class.d.ts +0 -6
- package/dist/types/kritzel-stencil/src/classes/objects/selection-group.class.d.ts +0 -67
- package/dist/types/kritzel-stencil/src/classes/objects/shape.class.d.ts +0 -124
- package/dist/types/kritzel-stencil/src/classes/objects/text.class.d.ts +0 -56
- package/dist/types/kritzel-stencil/src/classes/providers/broadcast-sync-provider.class.d.ts +0 -18
- package/dist/types/kritzel-stencil/src/classes/providers/hocuspocus-sync-provider.class.d.ts +0 -120
- package/dist/types/kritzel-stencil/src/classes/providers/indexeddb-sync-provider.class.d.ts +0 -22
- package/dist/types/kritzel-stencil/src/classes/providers/websocket-sync-provider.class.d.ts +0 -52
- package/dist/types/kritzel-stencil/src/classes/registries/icon-registry.class.d.ts +0 -9
- package/dist/types/kritzel-stencil/src/classes/registries/tool.registry.d.ts +0 -8
- package/dist/types/kritzel-stencil/src/classes/structures/app-state-map.structure.d.ts +0 -31
- package/dist/types/kritzel-stencil/src/classes/structures/object-map.structure.d.ts +0 -63
- package/dist/types/kritzel-stencil/src/classes/structures/quadtree.structure.d.ts +0 -36
- package/dist/types/kritzel-stencil/src/classes/tools/base-tool.class.d.ts +0 -20
- package/dist/types/kritzel-stencil/src/classes/tools/brush-tool.class.d.ts +0 -14
- package/dist/types/kritzel-stencil/src/classes/tools/eraser-tool.class.d.ts +0 -9
- package/dist/types/kritzel-stencil/src/classes/tools/image-tool.class.d.ts +0 -15
- package/dist/types/kritzel-stencil/src/classes/tools/line-tool.class.d.ts +0 -19
- package/dist/types/kritzel-stencil/src/classes/tools/selection-tool.class.d.ts +0 -54
- package/dist/types/kritzel-stencil/src/classes/tools/shape-tool.class.d.ts +0 -39
- package/dist/types/kritzel-stencil/src/classes/tools/text-tool.class.d.ts +0 -13
- package/dist/types/kritzel-stencil/src/components/core/kritzel-engine/kritzel-engine.d.ts +0 -111
- package/dist/types/kritzel-stencil/src/components/shared/kritzel-brush-style/kritzel-brush-style.d.ts +0 -11
- package/dist/types/kritzel-stencil/src/components/shared/kritzel-dropdown/kritzel-dropdown.d.ts +0 -46
- package/dist/types/kritzel-stencil/src/components/shared/kritzel-font-family/kritzel-font-family.d.ts +0 -13
- package/dist/types/kritzel-stencil/src/components/shared/kritzel-line-endings/kritzel-line-endings.d.ts +0 -21
- package/dist/types/kritzel-stencil/src/components/shared/kritzel-shape-fill/kritzel-shape-fill.d.ts +0 -10
- package/dist/types/kritzel-stencil/src/components/ui/kritzel-context-menu/kritzel-context-menu.d.ts +0 -21
- package/dist/types/kritzel-stencil/src/configs/default-brush-tool.config.d.ts +0 -2
- package/dist/types/kritzel-stencil/src/configs/default-engine-config.d.ts +0 -2
- package/dist/types/kritzel-stencil/src/configs/default-line-tool.config.d.ts +0 -2
- package/dist/types/kritzel-stencil/src/configs/default-sync.config.d.ts +0 -5
- package/dist/types/kritzel-stencil/src/configs/default-text-tool.config.d.ts +0 -2
- package/dist/types/kritzel-stencil/src/constants/color-palette.constants.d.ts +0 -29
- package/dist/types/kritzel-stencil/src/constants/engine.constants.d.ts +0 -2
- package/dist/types/kritzel-stencil/src/enums/event-button.enum.d.ts +0 -5
- package/dist/types/kritzel-stencil/src/enums/handle-type.enum.d.ts +0 -6
- package/dist/types/kritzel-stencil/src/enums/shape-type.enum.d.ts +0 -5
- package/dist/types/kritzel-stencil/src/helpers/class.helper.d.ts +0 -3
- package/dist/types/kritzel-stencil/src/helpers/color.helper.d.ts +0 -33
- package/dist/types/kritzel-stencil/src/helpers/cursor.helper.d.ts +0 -22
- package/dist/types/kritzel-stencil/src/helpers/devices.helper.d.ts +0 -8
- package/dist/types/kritzel-stencil/src/helpers/event.helper.d.ts +0 -6
- package/dist/types/kritzel-stencil/src/helpers/geometry.helper.d.ts +0 -38
- package/dist/types/kritzel-stencil/src/helpers/keyboard.helper.d.ts +0 -6
- package/dist/types/kritzel-stencil/src/helpers/math.helper.d.ts +0 -3
- package/dist/types/kritzel-stencil/src/helpers/object.helper.d.ts +0 -4
- package/dist/types/kritzel-stencil/src/helpers/theme.helper.d.ts +0 -41
- package/dist/types/kritzel-stencil/src/index.d.ts +0 -42
- package/dist/types/kritzel-stencil/src/interfaces/anchor.interface.d.ts +0 -137
- package/dist/types/kritzel-stencil/src/interfaces/arrow-head.interface.d.ts +0 -27
- package/dist/types/kritzel-stencil/src/interfaces/bounding-box.interface.d.ts +0 -8
- package/dist/types/kritzel-stencil/src/interfaces/clonable.interface.d.ts +0 -3
- package/dist/types/kritzel-stencil/src/interfaces/context-menu-item.interface.d.ts +0 -17
- package/dist/types/kritzel-stencil/src/interfaces/debug-info.interface.d.ts +0 -4
- package/dist/types/kritzel-stencil/src/interfaces/dialog.interface.d.ts +0 -4
- package/dist/types/kritzel-stencil/src/interfaces/displayable-shortcut.interface.d.ts +0 -5
- package/dist/types/kritzel-stencil/src/interfaces/engine-state.interface.d.ts +0 -73
- package/dist/types/kritzel-stencil/src/interfaces/line-options.interface.d.ts +0 -23
- package/dist/types/kritzel-stencil/src/interfaces/master-detail.interface.d.ts +0 -14
- package/dist/types/kritzel-stencil/src/interfaces/menu-item.interface.d.ts +0 -24
- package/dist/types/kritzel-stencil/src/interfaces/object.interface.d.ts +0 -53
- package/dist/types/kritzel-stencil/src/interfaces/path-options.interface.d.ts +0 -11
- package/dist/types/kritzel-stencil/src/interfaces/point.interface.d.ts +0 -4
- package/dist/types/kritzel-stencil/src/interfaces/polygon.interface.d.ts +0 -7
- package/dist/types/kritzel-stencil/src/interfaces/serializable.interface.d.ts +0 -5
- package/dist/types/kritzel-stencil/src/interfaces/settings.interface.d.ts +0 -11
- package/dist/types/kritzel-stencil/src/interfaces/shortcut.interface.d.ts +0 -10
- package/dist/types/kritzel-stencil/src/interfaces/sync-config.interface.d.ts +0 -22
- package/dist/types/kritzel-stencil/src/interfaces/sync-provider.interface.d.ts +0 -29
- package/dist/types/kritzel-stencil/src/interfaces/theme.interface.d.ts +0 -330
- package/dist/types/kritzel-stencil/src/interfaces/tool-config.interface.d.ts +0 -26
- package/dist/types/kritzel-stencil/src/interfaces/tool.interface.d.ts +0 -7
- package/dist/types/kritzel-stencil/src/interfaces/toolbar-control.interface.d.ts +0 -58
- package/dist/types/kritzel-stencil/src/interfaces/undo-state.interface.d.ts +0 -6
- package/dist/types/kritzel-stencil/src/themes/dark-theme.d.ts +0 -5
- package/dist/types/kritzel-stencil/src/themes/light-theme.d.ts +0 -5
- package/dist/types/kritzel-stencil/src/types/shortcut.type.d.ts +0 -1
- package/dist/types/kritzel-stencil/src/types/state.types.d.ts +0 -3
|
@@ -1,797 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { KritzelContextMenu } from '../../components/ui/kritzel-context-menu/kritzel-context-menu';
|
|
11
|
-
import { DEFAULT_ENGINE_CONFIG } from '../../configs/default-engine-config';
|
|
12
|
-
import { ObjectHelper } from '../../helpers/object.helper';
|
|
13
|
-
import { KritzelSelectionBox } from '../objects/selection-box.class';
|
|
14
|
-
import { KritzelSelectionGroup } from '../objects/selection-group.class';
|
|
15
|
-
import { KritzelGroup } from '../objects/group.class';
|
|
16
|
-
import { KritzelLine } from '../objects/line.class';
|
|
17
|
-
import { KritzelToolRegistry } from '../registries/tool.registry';
|
|
18
|
-
import { KritzelStore } from './store.class';
|
|
19
|
-
import { KritzelWorkspace } from './workspace.class';
|
|
20
|
-
import { KritzelObjectMap } from '../structures/object-map.structure';
|
|
21
|
-
import { KritzelAppStateMap } from '../structures/app-state-map.structure';
|
|
22
|
-
import { KritzelAnchorManager } from '../managers/anchor.manager';
|
|
23
|
-
import { KritzelCursorManager } from '../managers/cursor.manager';
|
|
24
|
-
import { KritzelThemeManager } from '../managers/theme.manager';
|
|
25
|
-
export class KritzelCore {
|
|
26
|
-
get engine() {
|
|
27
|
-
return this._kritzelEngine;
|
|
28
|
-
}
|
|
29
|
-
get store() {
|
|
30
|
-
return this._store;
|
|
31
|
-
}
|
|
32
|
-
get appStateMap() {
|
|
33
|
-
return this._appStateMap;
|
|
34
|
-
}
|
|
35
|
-
get anchorManager() {
|
|
36
|
-
return this._anchorManager;
|
|
37
|
-
}
|
|
38
|
-
get cursorManager() {
|
|
39
|
-
return this._cursorManager;
|
|
40
|
-
}
|
|
41
|
-
get themeManager() {
|
|
42
|
-
return this._themeManager;
|
|
43
|
-
}
|
|
44
|
-
constructor(kritzelEngine) {
|
|
45
|
-
this._kritzelEngine = kritzelEngine;
|
|
46
|
-
this._store = new KritzelStore(DEFAULT_ENGINE_CONFIG);
|
|
47
|
-
this._appStateMap = new KritzelAppStateMap();
|
|
48
|
-
this._anchorManager = new KritzelAnchorManager(this);
|
|
49
|
-
this._cursorManager = new KritzelCursorManager(this);
|
|
50
|
-
this._themeManager = new KritzelThemeManager(this);
|
|
51
|
-
}
|
|
52
|
-
setSyncConfig(config) {
|
|
53
|
-
this._syncConfig = config;
|
|
54
|
-
}
|
|
55
|
-
initializeYjs() {
|
|
56
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
-
yield this._appStateMap.initialize(this, this._syncConfig);
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Load all workspaces from app state map
|
|
62
|
-
*/
|
|
63
|
-
loadWorkspacesFromAppState() {
|
|
64
|
-
return this._appStateMap.allWorkspaces();
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Save a workspace to app state map
|
|
68
|
-
*/
|
|
69
|
-
saveWorkspaceToAppState(workspace) {
|
|
70
|
-
if (this._appStateMap.has(workspace.id)) {
|
|
71
|
-
this._appStateMap.update(workspace);
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
this._appStateMap.insert(workspace);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Delete a workspace from app state map
|
|
79
|
-
*/
|
|
80
|
-
deleteWorkspaceFromAppState(workspaceId) {
|
|
81
|
-
this._appStateMap.remove(w => w.id === workspaceId);
|
|
82
|
-
}
|
|
83
|
-
initializeWorkspace(workspace) {
|
|
84
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
-
var _a, _b, _c, _d;
|
|
86
|
-
// Load all workspaces from app state map
|
|
87
|
-
const workspaces = this.loadWorkspacesFromAppState();
|
|
88
|
-
// Find most recently updated workspace or use provided/fallback
|
|
89
|
-
const mostRecentWorkspace = workspaces.length > 0 ? [...workspaces].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())[0] : null;
|
|
90
|
-
// Check localStorage for last active workspace
|
|
91
|
-
const lastActiveWorkspaceId = localStorage.getItem('kritzel-active-workspace-id');
|
|
92
|
-
const lastActiveWorkspace = lastActiveWorkspaceId ? workspaces.find(w => w.id === lastActiveWorkspaceId) : null;
|
|
93
|
-
let activeWorkspace;
|
|
94
|
-
if (workspace) {
|
|
95
|
-
// Use provided workspace
|
|
96
|
-
activeWorkspace = workspace;
|
|
97
|
-
const existing = workspaces.find(w => w.id === workspace.id);
|
|
98
|
-
if (!existing) {
|
|
99
|
-
// New workspace, save it
|
|
100
|
-
activeWorkspace._core = this;
|
|
101
|
-
this.saveWorkspaceToAppState(activeWorkspace);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
else if (lastActiveWorkspace) {
|
|
105
|
-
// Use last active workspace from localStorage
|
|
106
|
-
activeWorkspace = lastActiveWorkspace;
|
|
107
|
-
}
|
|
108
|
-
else if (mostRecentWorkspace) {
|
|
109
|
-
// Use most recent workspace
|
|
110
|
-
activeWorkspace = mostRecentWorkspace;
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
// Create fallback workspace
|
|
114
|
-
activeWorkspace = new KritzelWorkspace(ObjectHelper.generateUUID(), 'New Workspace');
|
|
115
|
-
activeWorkspace._core = this;
|
|
116
|
-
this.saveWorkspaceToAppState(activeWorkspace);
|
|
117
|
-
}
|
|
118
|
-
// Save active workspace ID to localStorage
|
|
119
|
-
localStorage.setItem('kritzel-active-workspace-id', activeWorkspace.id);
|
|
120
|
-
// Destroy old ObjectMap if switching workspaces
|
|
121
|
-
if (this._store.state.objects && this._store.state.objects.isReady) {
|
|
122
|
-
this._store.state.objects.destroy();
|
|
123
|
-
}
|
|
124
|
-
// Create new ObjectMap with its own Y.Doc for this workspace
|
|
125
|
-
const objectsMap = new KritzelObjectMap();
|
|
126
|
-
// Assign immediately so the UI shows an empty state while loading,
|
|
127
|
-
// instead of showing the old workspace's objects with the new workspace's viewport
|
|
128
|
-
this._store.state.objects = objectsMap;
|
|
129
|
-
// Set active workspace
|
|
130
|
-
this._store.state.activeWorkspace = activeWorkspace;
|
|
131
|
-
this._store.state.workspaces = this.loadWorkspacesFromAppState();
|
|
132
|
-
// Set viewport from workspace
|
|
133
|
-
const viewport = (_a = activeWorkspace.viewport) !== null && _a !== void 0 ? _a : { translateX: 0, translateY: 0, scale: 1 };
|
|
134
|
-
this._store.state.translateX = (_b = viewport.translateX) !== null && _b !== void 0 ? _b : 0;
|
|
135
|
-
this._store.state.translateY = (_c = viewport.translateY) !== null && _c !== void 0 ? _c : 0;
|
|
136
|
-
this._store.state.scale = (_d = viewport.scale) !== null && _d !== void 0 ? _d : 1;
|
|
137
|
-
yield objectsMap.initialize(this, activeWorkspace.id, this._syncConfig);
|
|
138
|
-
// Rebuild anchor index after loading objects
|
|
139
|
-
this._anchorManager.rebuildIndex();
|
|
140
|
-
this.engine.emitObjectsChange();
|
|
141
|
-
this.rerender();
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
getObjectsInViewport() {
|
|
145
|
-
const viewportBounds = {
|
|
146
|
-
x: -this._store.state.translateX / this._store.state.scale,
|
|
147
|
-
y: -this._store.state.translateY / this._store.state.scale,
|
|
148
|
-
z: this._store.state.scale,
|
|
149
|
-
width: this._store.state.viewportWidth / this._store.state.scale,
|
|
150
|
-
height: this._store.state.viewportHeight / this._store.state.scale,
|
|
151
|
-
depth: 100,
|
|
152
|
-
};
|
|
153
|
-
return this._store.state.objects
|
|
154
|
-
.query(viewportBounds)
|
|
155
|
-
.filter(obj => !(obj instanceof KritzelSelectionGroup) && !(obj instanceof KritzelSelectionBox))
|
|
156
|
-
.sort((a, b) => a.zIndex - b.zIndex);
|
|
157
|
-
}
|
|
158
|
-
rerender() {
|
|
159
|
-
if (this._kritzelEngine) {
|
|
160
|
-
this._kritzelEngine.forceUpdate++;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
findObjectById(id) {
|
|
164
|
-
for (const object of this._store.allObjects) {
|
|
165
|
-
if (object.id === id) {
|
|
166
|
-
return object;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
getWorkspaces() {
|
|
172
|
-
return this.loadWorkspacesFromAppState();
|
|
173
|
-
}
|
|
174
|
-
createWorkspace(workspace) {
|
|
175
|
-
workspace._core = this;
|
|
176
|
-
workspace.createdAt = new Date();
|
|
177
|
-
workspace.updatedAt = new Date();
|
|
178
|
-
this.saveWorkspaceToAppState(workspace);
|
|
179
|
-
this._store.state.workspaces = this.loadWorkspacesFromAppState();
|
|
180
|
-
}
|
|
181
|
-
updateWorkspace(workspace) {
|
|
182
|
-
workspace.updatedAt = new Date();
|
|
183
|
-
this.saveWorkspaceToAppState(workspace);
|
|
184
|
-
const workspaces = this._store.state.workspaces;
|
|
185
|
-
const index = workspaces.findIndex(w => w.id === workspace.id);
|
|
186
|
-
if (index !== -1) {
|
|
187
|
-
workspaces[index] = workspace;
|
|
188
|
-
this._store.state.workspaces = workspaces;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
deleteWorkspace(workspace) {
|
|
192
|
-
var _a, _b, _c;
|
|
193
|
-
// If deleting the active workspace, need to handle ObjectMap cleanup
|
|
194
|
-
if (((_a = this._store.state.activeWorkspace) === null || _a === void 0 ? void 0 : _a.id) === workspace.id) {
|
|
195
|
-
(_b = this.engine.viewport) === null || _b === void 0 ? void 0 : _b.cancelPendingUpdates();
|
|
196
|
-
(_c = this._store.state.objects) === null || _c === void 0 ? void 0 : _c.destroy();
|
|
197
|
-
}
|
|
198
|
-
this.deleteWorkspaceFromAppState(workspace.id);
|
|
199
|
-
this._store.state.workspaces = this.loadWorkspacesFromAppState();
|
|
200
|
-
// Also delete the workspace's IndexedDB database
|
|
201
|
-
const dbName = `kritzel-workspace-${workspace.id}`;
|
|
202
|
-
window.indexedDB.deleteDatabase(dbName);
|
|
203
|
-
}
|
|
204
|
-
updateWorkspaceViewport(translateX, translateY, scale) {
|
|
205
|
-
const activeWorkspace = this._store.state.activeWorkspace;
|
|
206
|
-
if (!activeWorkspace) {
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
// Check if the workspace is still valid (not deleted)
|
|
210
|
-
const isValid = this._store.state.workspaces.some(w => w.id === activeWorkspace.id);
|
|
211
|
-
if (!isValid) {
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
activeWorkspace.viewport = { translateX, translateY, scale };
|
|
215
|
-
activeWorkspace.updatedAt = new Date();
|
|
216
|
-
this.saveWorkspaceToAppState(activeWorkspace);
|
|
217
|
-
}
|
|
218
|
-
addObject(object) {
|
|
219
|
-
this._store.state.objects.insert(object);
|
|
220
|
-
}
|
|
221
|
-
removeObject(object, preserveChildren = false) {
|
|
222
|
-
// Handle KritzelGroup: recursively delete all children first (unless preserveChildren is true)
|
|
223
|
-
if (object instanceof KritzelGroup && !preserveChildren) {
|
|
224
|
-
// Get children before removing the group
|
|
225
|
-
const children = [...object.children];
|
|
226
|
-
children.forEach(child => {
|
|
227
|
-
this.removeObject(child);
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
// Handle anchor cleanup
|
|
231
|
-
if (object instanceof KritzelLine) {
|
|
232
|
-
// If removing a line, clean up its anchor index entries
|
|
233
|
-
this._anchorManager.handleLineDeleted(object.id);
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
// If removing a non-line object, detach any lines anchored to it
|
|
237
|
-
this._anchorManager.handleObjectDeleted(object.id);
|
|
238
|
-
}
|
|
239
|
-
object.isMounted = false;
|
|
240
|
-
this._store.state.objects.remove(o => o.id === object.id);
|
|
241
|
-
}
|
|
242
|
-
updateObject(object, updatedProperties) {
|
|
243
|
-
const changedKeys = [];
|
|
244
|
-
for (const key in updatedProperties) {
|
|
245
|
-
if (updatedProperties.hasOwnProperty(key)) {
|
|
246
|
-
object[key] = updatedProperties[key];
|
|
247
|
-
changedKeys.push(key);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
object.onAfterUpdate(changedKeys);
|
|
251
|
-
this._store.state.objects.update(object);
|
|
252
|
-
}
|
|
253
|
-
addSelectionGroup(selectionGroup) {
|
|
254
|
-
this.removeSelectionGroup();
|
|
255
|
-
this.removeSelectionBox();
|
|
256
|
-
this._store.state.objects.insert(selectionGroup);
|
|
257
|
-
this._store.setSelectionGroup(selectionGroup);
|
|
258
|
-
this._kritzelEngine.triggerSelectionChange();
|
|
259
|
-
}
|
|
260
|
-
removeSelectionGroup() {
|
|
261
|
-
const selectionGroup = this._store.selectionGroup;
|
|
262
|
-
if (selectionGroup) {
|
|
263
|
-
this._store.state.objects.remove(object => object.id === selectionGroup.id);
|
|
264
|
-
this._store.setSelectionGroup(null);
|
|
265
|
-
this._kritzelEngine.triggerSelectionChange();
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
removeSelectionBox() {
|
|
269
|
-
const selectionBox = this._store.selectionBox;
|
|
270
|
-
if (selectionBox) {
|
|
271
|
-
this._store.state.objects.remove(object => object.id === selectionBox.id);
|
|
272
|
-
this._store.setSelectionBox(null);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
deselectAllObjects() {
|
|
276
|
-
this.removeSelectionGroup();
|
|
277
|
-
this.rerender();
|
|
278
|
-
}
|
|
279
|
-
delete() {
|
|
280
|
-
const selectionGroup = this._store.selectionGroup;
|
|
281
|
-
if (!selectionGroup) {
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
selectionGroup.objects.forEach(obj => this.removeObject(obj));
|
|
285
|
-
this.removeSelectionGroup();
|
|
286
|
-
this.rerender();
|
|
287
|
-
}
|
|
288
|
-
undo() {
|
|
289
|
-
var _a;
|
|
290
|
-
(_a = this._store.state.objects) === null || _a === void 0 ? void 0 : _a.undo();
|
|
291
|
-
}
|
|
292
|
-
redo() {
|
|
293
|
-
var _a;
|
|
294
|
-
(_a = this._store.state.objects) === null || _a === void 0 ? void 0 : _a.redo();
|
|
295
|
-
}
|
|
296
|
-
deleteObject(id) {
|
|
297
|
-
const object = this.findObjectById(id);
|
|
298
|
-
if (object) {
|
|
299
|
-
this.removeObject(object);
|
|
300
|
-
this.rerender();
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
copy() {
|
|
304
|
-
const selectionGroup = this._store.selectionGroup;
|
|
305
|
-
if (selectionGroup) {
|
|
306
|
-
// Copy each object and store them in an array, also track the ID mapping
|
|
307
|
-
const idMapping = new Map();
|
|
308
|
-
const copiedObjects = selectionGroup.objects
|
|
309
|
-
.sort((a, b) => a.zIndex - b.zIndex)
|
|
310
|
-
.map(obj => {
|
|
311
|
-
const copiedObj = obj.copy();
|
|
312
|
-
// Map: newId -> originalId
|
|
313
|
-
idMapping.set(copiedObj.id, obj.id);
|
|
314
|
-
return copiedObj;
|
|
315
|
-
});
|
|
316
|
-
this._store.state.copiedObjects = copiedObjects;
|
|
317
|
-
this._store.state.copiedObjectIdMapping = idMapping;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
paste(x, y) {
|
|
321
|
-
const copiedObjects = this._store.state.copiedObjects;
|
|
322
|
-
if (!copiedObjects || copiedObjects.length === 0) {
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
const activeWorkspace = this._store.state.activeWorkspace;
|
|
326
|
-
const originalIdMapping = this._store.state.copiedObjectIdMapping;
|
|
327
|
-
// Check if we're pasting from a different workspace
|
|
328
|
-
const isDifferentWorkspace = copiedObjects.some(obj => obj.workspaceId !== activeWorkspace.id);
|
|
329
|
-
// Calculate the bounding box of all copied objects
|
|
330
|
-
const minX = Math.min(...copiedObjects.map(obj => obj.translateX));
|
|
331
|
-
const minY = Math.min(...copiedObjects.map(obj => obj.translateY));
|
|
332
|
-
// Determine the paste position
|
|
333
|
-
let pasteX;
|
|
334
|
-
let pasteY;
|
|
335
|
-
if (x !== undefined && y !== undefined) {
|
|
336
|
-
// Explicit position provided (e.g., right-click paste)
|
|
337
|
-
pasteX = x;
|
|
338
|
-
pasteY = y;
|
|
339
|
-
}
|
|
340
|
-
else if (isDifferentWorkspace) {
|
|
341
|
-
// Pasting to different workspace without explicit position
|
|
342
|
-
// Keep original position; will be centered by centerInViewport() later
|
|
343
|
-
pasteX = minX;
|
|
344
|
-
pasteY = minY;
|
|
345
|
-
}
|
|
346
|
-
else {
|
|
347
|
-
// Same workspace paste: offset by 25 pixels from original position
|
|
348
|
-
pasteX = minX + 25 / this._store.state.scale;
|
|
349
|
-
pasteY = minY + 25 / this._store.state.scale;
|
|
350
|
-
}
|
|
351
|
-
// Calculate the offset to apply to all objects
|
|
352
|
-
const offsetX = pasteX - minX;
|
|
353
|
-
const offsetY = pasteY - minY;
|
|
354
|
-
this.removeSelectionGroup();
|
|
355
|
-
this.removeSelectionBox();
|
|
356
|
-
// Create a new selection group for the pasted objects
|
|
357
|
-
const selectionGroup = KritzelSelectionGroup.create(this);
|
|
358
|
-
// Build a reverse mapping: originalId -> newCopiedObjectId
|
|
359
|
-
// This is used to remap anchor references from original IDs to the copied object IDs
|
|
360
|
-
const originalToNewIdMap = new Map();
|
|
361
|
-
if (originalIdMapping) {
|
|
362
|
-
originalIdMapping.forEach((originalId, copiedId) => {
|
|
363
|
-
originalToNewIdMap.set(originalId, copiedId);
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
|
-
// Precompute zIndex once to avoid O(N * total_objects) repeated scans
|
|
367
|
-
const baseZIndex = this._store.currentZIndex;
|
|
368
|
-
// Batch all inserts and updates in a single Y.js transaction to avoid
|
|
369
|
-
// N separate observer callbacks and N rerenders (fires only once at commit)
|
|
370
|
-
this._store.state.objects.transaction(() => {
|
|
371
|
-
// First add all copied objects to the objectsMap with updated positions
|
|
372
|
-
copiedObjects.forEach((obj, i) => {
|
|
373
|
-
// Update workspace if pasting to a different workspace
|
|
374
|
-
if (obj.workspaceId !== activeWorkspace.id) {
|
|
375
|
-
obj.workspaceId = activeWorkspace.id;
|
|
376
|
-
}
|
|
377
|
-
// Update position
|
|
378
|
-
obj.updatePosition(obj.translateX + offsetX, obj.translateY + offsetY);
|
|
379
|
-
// Update z-index
|
|
380
|
-
obj.zIndex = baseZIndex + i;
|
|
381
|
-
// Handle KritzelGroup: also add pending children with offset
|
|
382
|
-
if (obj instanceof KritzelGroup) {
|
|
383
|
-
const pendingChildren = obj._pendingChildren;
|
|
384
|
-
if (pendingChildren) {
|
|
385
|
-
pendingChildren.forEach((child, childIndex) => {
|
|
386
|
-
// Update workspace
|
|
387
|
-
if (child.workspaceId !== activeWorkspace.id) {
|
|
388
|
-
child.workspaceId = activeWorkspace.id;
|
|
389
|
-
}
|
|
390
|
-
// Update position with offset
|
|
391
|
-
child.updatePosition(child.translateX + offsetX, child.translateY + offsetY);
|
|
392
|
-
// Update z-index
|
|
393
|
-
child.zIndex = baseZIndex + i + childIndex;
|
|
394
|
-
// Add child to store
|
|
395
|
-
this.addObject(child);
|
|
396
|
-
});
|
|
397
|
-
// Clear pending children
|
|
398
|
-
delete obj._pendingChildren;
|
|
399
|
-
// Finalize the group's bounding box and snapshots
|
|
400
|
-
obj.finalize();
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
// Add to objectsMap
|
|
404
|
-
this.addObject(obj);
|
|
405
|
-
// Add to selection group
|
|
406
|
-
selectionGroup.addOrRemove(obj);
|
|
407
|
-
});
|
|
408
|
-
// Update line anchors to point to the newly pasted objects
|
|
409
|
-
// Only remap if the anchor target was also part of the copied selection
|
|
410
|
-
copiedObjects.forEach(obj => {
|
|
411
|
-
if (obj instanceof KritzelLine) {
|
|
412
|
-
let updated = false;
|
|
413
|
-
if (obj.startAnchor && originalToNewIdMap.has(obj.startAnchor.objectId)) {
|
|
414
|
-
obj.startAnchor = { objectId: originalToNewIdMap.get(obj.startAnchor.objectId) };
|
|
415
|
-
updated = true;
|
|
416
|
-
}
|
|
417
|
-
if (obj.endAnchor && originalToNewIdMap.has(obj.endAnchor.objectId)) {
|
|
418
|
-
obj.endAnchor = { objectId: originalToNewIdMap.get(obj.endAnchor.objectId) };
|
|
419
|
-
updated = true;
|
|
420
|
-
}
|
|
421
|
-
// If anchors were updated, rebuild the anchor index and persist the change
|
|
422
|
-
if (updated) {
|
|
423
|
-
this._store.state.objects.update(obj);
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
});
|
|
427
|
-
});
|
|
428
|
-
// Rebuild anchor index after all anchor updates
|
|
429
|
-
this._anchorManager.rebuildIndex();
|
|
430
|
-
// Mark selection group as selected
|
|
431
|
-
selectionGroup.isSelected = true;
|
|
432
|
-
// Set rotation for single object
|
|
433
|
-
if (copiedObjects.length === 1) {
|
|
434
|
-
selectionGroup.rotation = copiedObjects[0].rotation;
|
|
435
|
-
}
|
|
436
|
-
// Add the selection group
|
|
437
|
-
this.addSelectionGroup(selectionGroup);
|
|
438
|
-
// Handle cross-workspace paste: center objects in viewport
|
|
439
|
-
if (isDifferentWorkspace) {
|
|
440
|
-
if (x !== undefined && y !== undefined) {
|
|
441
|
-
// Position was explicitly provided, use it
|
|
442
|
-
selectionGroup.updatePosition(x, y);
|
|
443
|
-
}
|
|
444
|
-
else {
|
|
445
|
-
// Center the selection group in the viewport
|
|
446
|
-
selectionGroup.centerInViewport();
|
|
447
|
-
}
|
|
448
|
-
// Fit the viewport to show the pasted objects
|
|
449
|
-
this.engine.viewport.centerFitInViewport(selectionGroup);
|
|
450
|
-
}
|
|
451
|
-
this._store.state.isSelecting = false;
|
|
452
|
-
// Defer creating copies for future pastes to next frame to avoid
|
|
453
|
-
// doubling the object creation cost in the current paste frame
|
|
454
|
-
requestAnimationFrame(() => {
|
|
455
|
-
const newSelectionGroup = this._store.selectionGroup;
|
|
456
|
-
if (newSelectionGroup) {
|
|
457
|
-
const newIdMapping = new Map();
|
|
458
|
-
const newCopiedObjects = newSelectionGroup.objects
|
|
459
|
-
.sort((a, b) => a.zIndex - b.zIndex)
|
|
460
|
-
.map(obj => {
|
|
461
|
-
const copiedObj = obj.copy();
|
|
462
|
-
newIdMapping.set(copiedObj.id, obj.id);
|
|
463
|
-
return copiedObj;
|
|
464
|
-
});
|
|
465
|
-
this._store.state.copiedObjects = newCopiedObjects;
|
|
466
|
-
this._store.state.copiedObjectIdMapping = newIdMapping;
|
|
467
|
-
}
|
|
468
|
-
});
|
|
469
|
-
this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));
|
|
470
|
-
this.engine.emitObjectsChange();
|
|
471
|
-
this.rerender();
|
|
472
|
-
}
|
|
473
|
-
bringForward(object) {
|
|
474
|
-
const selectionGroup = this._store.selectionGroup;
|
|
475
|
-
const objects = object ? [object] : (selectionGroup === null || selectionGroup === void 0 ? void 0 : selectionGroup.objects) || [];
|
|
476
|
-
const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);
|
|
477
|
-
const max = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1 : 0;
|
|
478
|
-
objects.forEach(obj => {
|
|
479
|
-
if (obj.zIndex !== max) {
|
|
480
|
-
this.updateObject(obj, { zIndex: obj.zIndex + 1 });
|
|
481
|
-
}
|
|
482
|
-
});
|
|
483
|
-
this.rerender();
|
|
484
|
-
}
|
|
485
|
-
sendBackward(object) {
|
|
486
|
-
const selectionGroup = this._store.selectionGroup;
|
|
487
|
-
const objects = object ? [object] : (selectionGroup === null || selectionGroup === void 0 ? void 0 : selectionGroup.objects) || [];
|
|
488
|
-
const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);
|
|
489
|
-
const min = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1 : 0;
|
|
490
|
-
objects.forEach(obj => {
|
|
491
|
-
if (obj.zIndex !== min) {
|
|
492
|
-
this.updateObject(obj, { zIndex: obj.zIndex - 1 });
|
|
493
|
-
}
|
|
494
|
-
});
|
|
495
|
-
this.rerender();
|
|
496
|
-
}
|
|
497
|
-
bringToFront(object) {
|
|
498
|
-
const selectionGroup = this._store.selectionGroup;
|
|
499
|
-
const objects = object ? [object] : (selectionGroup === null || selectionGroup === void 0 ? void 0 : selectionGroup.objects) || [];
|
|
500
|
-
const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);
|
|
501
|
-
const max = Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1;
|
|
502
|
-
objects.forEach(obj => {
|
|
503
|
-
this.updateObject(obj, { zIndex: max });
|
|
504
|
-
});
|
|
505
|
-
this.rerender();
|
|
506
|
-
}
|
|
507
|
-
sendToBack(object) {
|
|
508
|
-
const selectionGroup = this._store.selectionGroup;
|
|
509
|
-
const objects = object ? [object] : (selectionGroup === null || selectionGroup === void 0 ? void 0 : selectionGroup.objects) || [];
|
|
510
|
-
const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);
|
|
511
|
-
const min = Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1;
|
|
512
|
-
objects.forEach(obj => {
|
|
513
|
-
this.updateObject(obj, { zIndex: min });
|
|
514
|
-
});
|
|
515
|
-
this.rerender();
|
|
516
|
-
}
|
|
517
|
-
/**
|
|
518
|
-
* Groups the currently selected objects into a KritzelGroup.
|
|
519
|
-
* Requires at least 2 objects to be selected.
|
|
520
|
-
*/
|
|
521
|
-
group() {
|
|
522
|
-
const selectionGroup = this._store.selectionGroup;
|
|
523
|
-
if (!selectionGroup || selectionGroup.objects.length < 2) {
|
|
524
|
-
return;
|
|
525
|
-
}
|
|
526
|
-
// Create a group from the selected objects
|
|
527
|
-
const group = KritzelGroup.createFromObjects(this, selectionGroup.objects);
|
|
528
|
-
// Add the group to the object store
|
|
529
|
-
this.addObject(group);
|
|
530
|
-
// Remove the selection group and create a new one with just the group
|
|
531
|
-
this.removeSelectionGroup();
|
|
532
|
-
const newSelectionGroup = KritzelSelectionGroup.create(this);
|
|
533
|
-
newSelectionGroup.addOrRemove(group);
|
|
534
|
-
newSelectionGroup.isSelected = true;
|
|
535
|
-
newSelectionGroup.rotation = group.rotation;
|
|
536
|
-
this.addSelectionGroup(newSelectionGroup);
|
|
537
|
-
this.engine.emitObjectsChange();
|
|
538
|
-
this.rerender();
|
|
539
|
-
}
|
|
540
|
-
/**
|
|
541
|
-
* Ungroups any KritzelGroup objects in the current selection.
|
|
542
|
-
* Children are extracted and become top-level objects.
|
|
543
|
-
*/
|
|
544
|
-
ungroup() {
|
|
545
|
-
const selectionGroup = this._store.selectionGroup;
|
|
546
|
-
if (!selectionGroup) {
|
|
547
|
-
return;
|
|
548
|
-
}
|
|
549
|
-
const groups = selectionGroup.objects.filter(obj => obj instanceof KritzelGroup);
|
|
550
|
-
if (groups.length === 0) {
|
|
551
|
-
return;
|
|
552
|
-
}
|
|
553
|
-
// Collect all children from all groups
|
|
554
|
-
const allChildren = [];
|
|
555
|
-
const nonGroupObjects = selectionGroup.objects.filter(obj => !(obj instanceof KritzelGroup));
|
|
556
|
-
groups.forEach(group => {
|
|
557
|
-
// Get children before removing the group
|
|
558
|
-
const children = group.ungroup();
|
|
559
|
-
allChildren.push(...children);
|
|
560
|
-
// Remove the group from the store (but keep children)
|
|
561
|
-
this.removeObject(group, true);
|
|
562
|
-
});
|
|
563
|
-
// Create a new selection group with all the ungrouped children and non-group objects
|
|
564
|
-
this.removeSelectionGroup();
|
|
565
|
-
const newSelectionGroup = KritzelSelectionGroup.create(this);
|
|
566
|
-
[...allChildren, ...nonGroupObjects].forEach(child => {
|
|
567
|
-
newSelectionGroup.addOrRemove(child);
|
|
568
|
-
});
|
|
569
|
-
newSelectionGroup.isSelected = true;
|
|
570
|
-
this.addSelectionGroup(newSelectionGroup);
|
|
571
|
-
this.engine.emitObjectsChange();
|
|
572
|
-
this.rerender();
|
|
573
|
-
}
|
|
574
|
-
selectObjects(objects) {
|
|
575
|
-
if (objects.length === 0) {
|
|
576
|
-
return;
|
|
577
|
-
}
|
|
578
|
-
const selectionGroup = KritzelSelectionGroup.create(this);
|
|
579
|
-
objects.forEach(obj => {
|
|
580
|
-
obj.isSelected = false;
|
|
581
|
-
selectionGroup.addOrRemove(obj);
|
|
582
|
-
});
|
|
583
|
-
selectionGroup.isSelected = true;
|
|
584
|
-
if (objects.length === 1) {
|
|
585
|
-
selectionGroup.rotation = selectionGroup.objects[0].rotation;
|
|
586
|
-
}
|
|
587
|
-
this.addSelectionGroup(selectionGroup);
|
|
588
|
-
this.rerender();
|
|
589
|
-
}
|
|
590
|
-
selectAllObjects() {
|
|
591
|
-
const allObjects = this._store.state.objects
|
|
592
|
-
.allObjects()
|
|
593
|
-
.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox) && !(o instanceof KritzelContextMenu));
|
|
594
|
-
if (allObjects.length > 0) {
|
|
595
|
-
const selectionGroup = KritzelSelectionGroup.create(this);
|
|
596
|
-
allObjects.forEach(obj => {
|
|
597
|
-
obj.isSelected = false;
|
|
598
|
-
selectionGroup.addOrRemove(obj);
|
|
599
|
-
});
|
|
600
|
-
selectionGroup.isSelected = true;
|
|
601
|
-
this._store.state.isSelecting = false;
|
|
602
|
-
if (allObjects.length === 1) {
|
|
603
|
-
selectionGroup.rotation = selectionGroup.objects[0].rotation;
|
|
604
|
-
}
|
|
605
|
-
this.addSelectionGroup(selectionGroup);
|
|
606
|
-
this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));
|
|
607
|
-
this.rerender();
|
|
608
|
-
}
|
|
609
|
-
}
|
|
610
|
-
selectAllObjectsInViewport() {
|
|
611
|
-
const viewportBounds = {
|
|
612
|
-
x: -this._store.state.translateX / this._store.state.scale,
|
|
613
|
-
y: -this._store.state.translateY / this._store.state.scale,
|
|
614
|
-
z: this._store.state.scale,
|
|
615
|
-
width: this._store.state.viewportWidth / this._store.state.scale,
|
|
616
|
-
height: this._store.state.viewportHeight / this._store.state.scale,
|
|
617
|
-
depth: 100,
|
|
618
|
-
};
|
|
619
|
-
const objectsInViewport = this._store.state.objects
|
|
620
|
-
.query(viewportBounds)
|
|
621
|
-
.filter(o => o.isInViewport())
|
|
622
|
-
.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox) && !(o instanceof KritzelContextMenu));
|
|
623
|
-
if (objectsInViewport.length > 0) {
|
|
624
|
-
const selectionGroup = KritzelSelectionGroup.create(this);
|
|
625
|
-
objectsInViewport.forEach(obj => {
|
|
626
|
-
obj.isSelected = false;
|
|
627
|
-
selectionGroup.addOrRemove(obj);
|
|
628
|
-
});
|
|
629
|
-
selectionGroup.isSelected = true;
|
|
630
|
-
this._store.state.isSelecting = false;
|
|
631
|
-
if (objectsInViewport.length === 1) {
|
|
632
|
-
selectionGroup.rotation = selectionGroup.objects[0].rotation;
|
|
633
|
-
}
|
|
634
|
-
this.addSelectionGroup(selectionGroup);
|
|
635
|
-
this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));
|
|
636
|
-
this.rerender();
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
clearSelection() {
|
|
640
|
-
this.removeSelectionGroup();
|
|
641
|
-
this._store.state.objects.remove(o => o instanceof KritzelSelectionBox || o instanceof KritzelSelectionGroup);
|
|
642
|
-
this._store.setSelectionBox(null);
|
|
643
|
-
this._store.setSelectionGroup(null);
|
|
644
|
-
this._store.state.isSelecting = false;
|
|
645
|
-
this._store.state.isResizeHandleSelected = false;
|
|
646
|
-
this._store.state.isRotationHandleSelected = false;
|
|
647
|
-
this._store.state.isLineHandleSelected = false;
|
|
648
|
-
this._store.state.isLineHandleDragging = false;
|
|
649
|
-
this._store.state.lineHandleType = null;
|
|
650
|
-
this.rerender();
|
|
651
|
-
}
|
|
652
|
-
resetActiveText() {
|
|
653
|
-
const activeText = this._store.activeText;
|
|
654
|
-
if (activeText) {
|
|
655
|
-
if (activeText.isEmpty) {
|
|
656
|
-
this.deleteObject(activeText.id);
|
|
657
|
-
}
|
|
658
|
-
else {
|
|
659
|
-
activeText.save();
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
resetActiveShape() {
|
|
664
|
-
const activeShape = this._store.activeShape;
|
|
665
|
-
if (activeShape) {
|
|
666
|
-
activeShape.save();
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
getObjectFromPointerEvent(event, selector = '.object') {
|
|
670
|
-
var _a;
|
|
671
|
-
const shadowRoot = (_a = this._store.state.host) === null || _a === void 0 ? void 0 : _a.shadowRoot;
|
|
672
|
-
if (!shadowRoot)
|
|
673
|
-
return null;
|
|
674
|
-
const clientX = event.clientX;
|
|
675
|
-
const clientY = event.clientY;
|
|
676
|
-
const elementAtPoint = shadowRoot.elementFromPoint(clientX, clientY);
|
|
677
|
-
if (!elementAtPoint)
|
|
678
|
-
return null;
|
|
679
|
-
const selectedObject = elementAtPoint.closest(selector);
|
|
680
|
-
if (selectedObject) {
|
|
681
|
-
const foundObject = this._store.allObjects.find(object => selectedObject.id === object.id);
|
|
682
|
-
const isHit = foundObject === null || foundObject === void 0 ? void 0 : foundObject.hitTest(clientX, clientY);
|
|
683
|
-
return isHit ? foundObject : null;
|
|
684
|
-
}
|
|
685
|
-
return null;
|
|
686
|
-
}
|
|
687
|
-
getObjectsFromPointerEvent(event, selector = '.object') {
|
|
688
|
-
var _a;
|
|
689
|
-
const shadowRoot = (_a = this._store.state.host) === null || _a === void 0 ? void 0 : _a.shadowRoot;
|
|
690
|
-
if (!shadowRoot)
|
|
691
|
-
return [];
|
|
692
|
-
const clientX = event.clientX;
|
|
693
|
-
const clientY = event.clientY;
|
|
694
|
-
const elementsAtPoint = shadowRoot.elementsFromPoint(clientX, clientY);
|
|
695
|
-
if (!elementsAtPoint || elementsAtPoint.length === 0)
|
|
696
|
-
return [];
|
|
697
|
-
const objectIds = new Set();
|
|
698
|
-
elementsAtPoint.forEach(element => {
|
|
699
|
-
const selectedObject = element.closest(selector);
|
|
700
|
-
if (selectedObject && selectedObject.id) {
|
|
701
|
-
objectIds.add(selectedObject.id);
|
|
702
|
-
}
|
|
703
|
-
});
|
|
704
|
-
if (objectIds.size > 0) {
|
|
705
|
-
return this._store.allObjects.filter(object => objectIds.has(object.id)).sort((a, b) => b.zIndex - a.zIndex);
|
|
706
|
-
}
|
|
707
|
-
return [];
|
|
708
|
-
}
|
|
709
|
-
/**
|
|
710
|
-
* Get all elements at a pointer position that match a given selector.
|
|
711
|
-
* Uses elementsFromPoint to find overlapped elements.
|
|
712
|
-
*/
|
|
713
|
-
getElementsAtPoint(event, selector) {
|
|
714
|
-
var _a;
|
|
715
|
-
const shadowRoot = (_a = this._store.state.host) === null || _a === void 0 ? void 0 : _a.shadowRoot;
|
|
716
|
-
if (!shadowRoot)
|
|
717
|
-
return [];
|
|
718
|
-
const elementsAtPoint = shadowRoot.elementsFromPoint(event.clientX, event.clientY);
|
|
719
|
-
if (!elementsAtPoint || elementsAtPoint.length === 0)
|
|
720
|
-
return [];
|
|
721
|
-
return elementsAtPoint.filter(el => el.matches(selector));
|
|
722
|
-
}
|
|
723
|
-
/**
|
|
724
|
-
* Check if any element at the pointer position matches the given selector.
|
|
725
|
-
* Useful for detecting hover states on overlapped elements.
|
|
726
|
-
*/
|
|
727
|
-
isPointerOverElement(event, selector) {
|
|
728
|
-
return this.getElementsAtPoint(event, selector).length > 0;
|
|
729
|
-
}
|
|
730
|
-
getCanvasPoint(event) {
|
|
731
|
-
if (!this._store.state.host) {
|
|
732
|
-
return { x: 0, y: 0 };
|
|
733
|
-
}
|
|
734
|
-
const hostRect = this._store.state.host.getBoundingClientRect();
|
|
735
|
-
const xRelativeToHost = event.clientX - hostRect.left;
|
|
736
|
-
const yRelativeToHost = event.clientY - hostRect.top;
|
|
737
|
-
const xWithoutTranslate = xRelativeToHost - this._store.state.translateX;
|
|
738
|
-
const yWithoutTranslate = yRelativeToHost - this._store.state.translateY;
|
|
739
|
-
const worldX = xWithoutTranslate / this._store.state.scale;
|
|
740
|
-
const worldY = yWithoutTranslate / this._store.state.scale;
|
|
741
|
-
return { x: worldX, y: worldY };
|
|
742
|
-
}
|
|
743
|
-
beforeWorkspaceChange() {
|
|
744
|
-
var _a;
|
|
745
|
-
// Cancel any pending debounced viewport updates to prevent them from
|
|
746
|
-
// saving the old workspace's viewport to the new workspace
|
|
747
|
-
(_a = this._kritzelEngine.viewport) === null || _a === void 0 ? void 0 : _a.cancelPendingUpdates();
|
|
748
|
-
// Immediately save the current workspace's viewport before switching
|
|
749
|
-
const currentWorkspace = this._store.state.activeWorkspace;
|
|
750
|
-
if (currentWorkspace) {
|
|
751
|
-
this.updateWorkspaceViewport(this._store.state.translateX, this._store.state.translateY, this._store.state.scale);
|
|
752
|
-
}
|
|
753
|
-
this.resetActiveText();
|
|
754
|
-
this.clearSelection();
|
|
755
|
-
this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));
|
|
756
|
-
}
|
|
757
|
-
displaySelectionGroupUI(object) {
|
|
758
|
-
if (!object.isSelected) {
|
|
759
|
-
return false;
|
|
760
|
-
}
|
|
761
|
-
const selectionGroup = this._store.selectionGroup;
|
|
762
|
-
if (!selectionGroup) {
|
|
763
|
-
// During selection phase (no group yet), hide UI for KritzelLine objects
|
|
764
|
-
return !(object instanceof KritzelLine);
|
|
765
|
-
}
|
|
766
|
-
// Show UI if selection contains more than one object
|
|
767
|
-
if (selectionGroup.objects.length > 1) {
|
|
768
|
-
return true;
|
|
769
|
-
}
|
|
770
|
-
// Hide UI if selection contains a single KritzelLine
|
|
771
|
-
if (selectionGroup.objects.length === 1) {
|
|
772
|
-
const selectedObject = selectionGroup.objects[0];
|
|
773
|
-
return !(selectedObject instanceof KritzelLine);
|
|
774
|
-
}
|
|
775
|
-
return true;
|
|
776
|
-
}
|
|
777
|
-
displaySelectionLineUI(object) {
|
|
778
|
-
// Only show line UI on KritzelLine objects, not on selection groups
|
|
779
|
-
if (!(object instanceof KritzelLine)) {
|
|
780
|
-
return false;
|
|
781
|
-
}
|
|
782
|
-
// During selection phase (no group yet), show line UI if line is selected
|
|
783
|
-
const selectionGroup = this._store.selectionGroup;
|
|
784
|
-
if (!selectionGroup) {
|
|
785
|
-
return object.isSelected;
|
|
786
|
-
}
|
|
787
|
-
if (!selectionGroup.isSelected) {
|
|
788
|
-
return false;
|
|
789
|
-
}
|
|
790
|
-
// Show UI only if selection contains exactly one KritzelLine and it's this object
|
|
791
|
-
if (selectionGroup.objects.length === 1) {
|
|
792
|
-
const selectedObject = selectionGroup.objects[0];
|
|
793
|
-
return selectedObject instanceof KritzelLine && selectedObject.id === object.id;
|
|
794
|
-
}
|
|
795
|
-
return false;
|
|
796
|
-
}
|
|
797
|
-
}
|