@leafer-in/editor 1.6.7 → 1.7.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"editor.esm.min.js","sources":["../../../../../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.34.6_tslib@2.8.1_typescript@5.7.3/node_modules/tslib/tslib.es6.js","../../../../../../src/in/packages/editor/src/event/EditorEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorMoveEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorScaleEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorRotateEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorSkewEvent.ts","../../../../../../src/in/packages/editor/src/decorator/data.ts","../../../../../../src/in/packages/editor/src/display/Stroker.ts","../../../../../../src/in/packages/editor/src/display/SelectArea.ts","../../../../../../src/in/packages/editor/src/helper/EditSelectHelper.ts","../../../../../../src/in/packages/editor/src/display/EditSelect.ts","../../../../../../src/in/packages/editor/src/helper/EditDataHelper.ts","../../../../../../src/in/packages/editor/src/editor/cursor.ts","../../../../../../src/in/packages/editor/src/display/EditPoint.ts","../../../../../../src/in/packages/editor/src/display/EditBox.ts","../../../../../../src/in/packages/editor/src/display/EditMask.ts","../../../../../../src/in/packages/editor/src/svg.ts","../../../../../../src/in/packages/editor/src/config.ts","../../../../../../src/in/packages/editor/src/editor/simulate.ts","../../../../../../src/in/packages/editor/src/helper/EditorHelper.ts","../../../../../../src/in/packages/editor/src/tool/EditToolCreator.ts","../../../../../../src/in/packages/editor/src/event/InnerEditorEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorGroupEvent.ts","../../../../../../src/in/packages/editor/src/display/SimulateElement.ts","../../../../../../src/in/packages/editor/src/Editor.ts","../../../../../../src/in/packages/editor/src/editor/target.ts","../../../../../../src/in/packages/editor/src/tool/InnerEditor.ts","../../../../../../src/in/packages/editor/src/tool/EditTool.ts","../../../../../../src/in/packages/editor/src/tool/LineEditTool.ts","../../../../../../src/in/packages/editor/src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { IUI, IPointData } from '@leafer-ui/interface'\nimport { Event } from '@leafer-ui/draw'\n\nimport { IEditor, IEditorEvent } from '@leafer-in/interface'\n\n\nfunction toList(value: IUI | IUI[]): IUI[] {\n return value ? (value instanceof Array ? value : [value]) : []\n}\n\nexport class EditorEvent extends Event implements IEditorEvent {\n\n static BEFORE_SELECT = 'editor.before_select'\n static SELECT = 'editor.select'\n\n static BEFORE_HOVER = 'editor.before_hover'\n static HOVER = 'editor.hover'\n\n declare readonly target: IUI\n readonly editor: IEditor\n\n readonly value: IUI | IUI[]\n readonly oldValue: IUI | IUI[]\n\n get list() { return toList(this.value) }\n get oldList() { return toList(this.oldValue) }\n\n readonly worldOrigin: IPointData\n declare readonly origin: IPointData\n\n constructor(type: string, data?: IEditorEvent) {\n super(type)\n if (data) Object.assign(this, data)\n }\n\n}","import { IEditorMoveEvent } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\n\n\nexport class EditorMoveEvent extends EditorEvent implements IEditorMoveEvent {\n\n static BEFORE_MOVE = 'editor.before_move'\n static MOVE = 'editor.move'\n\n readonly moveX: number\n readonly moveY: number\n\n constructor(type: string, data?: IEditorMoveEvent) {\n super(type, data)\n }\n\n}","import { IAround, IDragEvent, IMatrixData } from '@leafer-ui/interface'\n\nimport { IEditorScaleEvent } from '@leafer-in/interface'\nimport { Direction9 } from '@leafer-ui/draw'\n\nimport { EditorEvent } from './EditorEvent'\n\n\nexport class EditorScaleEvent extends EditorEvent implements IEditorScaleEvent {\n\n static BEFORE_SCALE = 'editor.before_scale'\n static SCALE = 'editor.scale'\n\n // scaleOf(origin, scaleX, scaleY, resize)\n readonly scaleX: number\n readonly scaleY: number\n readonly transform?: IMatrixData\n\n readonly drag: IDragEvent\n\n readonly direction: Direction9\n readonly lockRatio: boolean\n readonly around: IAround\n\n constructor(type: string, data?: IEditorScaleEvent) {\n super(type, data)\n }\n\n}","import { IEditorRotateEvent } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\n\n\nexport class EditorRotateEvent extends EditorEvent implements IEditorRotateEvent {\n\n static BEFORE_ROTATE = 'editor.before_rotate'\n static ROTATE = 'editor.rotate'\n\n // rotateOf(origin, rotation)\n readonly rotation: number\n\n constructor(type: string, data?: IEditorRotateEvent) {\n super(type, data)\n }\n\n}","import { IEditorSkewEvent } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\n\n\nexport class EditorSkewEvent extends EditorEvent implements IEditorSkewEvent {\n\n static BEFORE_SKEW = 'editor.before_skew'\n static SKEW = 'editor.skew'\n\n // skewOf(origin, skewX, skewY)\n readonly skewX: number\n readonly skewY: number\n\n constructor(type: string, data?: IEditorSkewEvent) {\n super(type, data)\n }\n\n}","import { IFunction, ILeaf, IObject, IUI, } from '@leafer-ui/interface'\nimport { IEditor } from '@leafer-in/interface'\nimport { defineKey, isNull } from '@leafer-ui/draw'\n\nimport { EditorEvent } from '../event/EditorEvent'\n\n\nexport function targetAttr(fn: IFunction) {\n return (target: ILeaf, key: string) => {\n const privateKey = '_' + key\n defineKey(target, key, {\n get() { return (this as IObject)[privateKey] },\n set(value: IUI | IUI[]) {\n const old = (this as IObject)[privateKey]\n if (old !== value) {\n\n if ((this as IEditor).config) { // Editor\n\n const isSelect = key === 'target'\n if (isSelect) {\n if (value instanceof Array && value.length > 1 && value[0].locked) value.splice(0, 1) // fix: 单个锁定 + shift多选\n\n const { beforeSelect } = (this as IEditor).config\n if (beforeSelect) {\n const check = beforeSelect({ target: value })\n if (typeof check === 'object') value = check\n else if (check === false) return\n }\n }\n\n const type = isSelect ? EditorEvent.BEFORE_SELECT : EditorEvent.BEFORE_HOVER\n if (this.hasEvent(type)) this.emitEvent(new EditorEvent(type, { editor: this as IEditor, value: value as IUI, oldValue: old }))\n }\n\n (this as IObject)[privateKey] = value, fn(this, old)\n }\n }\n } as ThisType<ILeaf>)\n }\n}\n\n\nexport function mergeConfigAttr() {\n return (target: IEditor, key: string) => {\n defineKey(target, key, {\n get() {\n const { config, element, dragPoint } = this, mergeConfig = { ...config } // 实时合并,后期可优化\n if (element && element.editConfig) Object.assign(mergeConfig, element.editConfig)\n if (dragPoint) {\n if (dragPoint.editConfig) Object.assign(mergeConfig, dragPoint.editConfig)\n if (mergeConfig.editSize === 'font-size') mergeConfig.lockRatio = true // 强制锁定比例\n if (dragPoint.pointType === 'resize-rotate') {\n mergeConfig.around || (mergeConfig.around = 'center')\n isNull(mergeConfig.lockRatio) && (mergeConfig.lockRatio = true)\n }\n }\n return (this as IObject).mergedConfig = mergeConfig\n }\n } as ThisType<IEditor>)\n }\n}\n\n\n","import { IUI, ILeaferCanvas, IRenderOptions, IRectInputData, IMatrixWithOptionHalfData } from '@leafer-ui/interface'\nimport { Paint, UI, MatrixHelper, getBoundsData, getMatrixData, BoundsHelper, LeafBoundsHelper } from '@leafer-ui/draw'\n\nimport { IStroker } from '@leafer-in/interface'\n\nimport { targetAttr } from '../decorator/data'\n\n\nconst { abs } = Math\nconst { copy, scale } = MatrixHelper\nconst { setListWithFn } = BoundsHelper\nconst { worldBounds } = LeafBoundsHelper\nconst matrix = getMatrixData() as IMatrixWithOptionHalfData\nconst bounds = getBoundsData()\n\nexport class Stroker extends UI implements IStroker {\n\n @targetAttr(onTarget)\n public target: IUI | IUI[]\n\n public list: IUI[] = []\n\n constructor() {\n super()\n this.visible = 0\n this.hittable = false\n this.strokeAlign = 'center'\n }\n\n public setTarget(target: IUI | IUI[], style: IRectInputData): void {\n this.set(style)\n this.target = target\n this.update()\n }\n\n public update(): void {\n const { list } = this\n if (list.length) {\n setListWithFn(bounds, list, worldBounds)\n this.set(bounds)\n this.visible = true\n } else this.visible = 0\n }\n\n public __draw(canvas: ILeaferCanvas, options: IRenderOptions): void {\n const { list } = this\n\n if (list.length) {\n\n let leaf: IUI\n const data = this.__, { stroke, strokeWidth, fill } = data, { bounds } = options\n\n for (let i = 0; i < list.length; i++) {\n leaf = list[i]\n const { worldTransform, worldRenderBounds } = leaf\n\n if (worldRenderBounds.width && worldRenderBounds.height && (!bounds || bounds.hit(worldRenderBounds, options.matrix))) {\n\n const aScaleX = abs(worldTransform.scaleX), aScaleY = abs(worldTransform.scaleY)\n\n copy(matrix, worldTransform)\n matrix.half = strokeWidth % 2\n\n if (aScaleX !== aScaleY) { // need no scale stroke, use rect path\n\n scale(matrix, 1 / aScaleX, 1 / aScaleY)\n canvas.setWorld(matrix, options.matrix)\n canvas.beginPath()\n data.strokeWidth = strokeWidth\n\n const { x, y, width, height } = leaf.__layout.boxBounds\n canvas.rect(x * aScaleX, y * aScaleY, width * aScaleX, height * aScaleY)\n\n } else {\n\n canvas.setWorld(matrix, options.matrix)\n canvas.beginPath()\n\n if (leaf.__.__useArrow) leaf.__drawPath(canvas)\n else leaf.__.__pathForRender ? leaf.__drawRenderPath(canvas) : leaf.__drawPathByBox(canvas)\n\n data.strokeWidth = strokeWidth / abs(worldTransform.scaleX)\n\n }\n\n if (stroke) typeof stroke === 'string' ? Paint.stroke(stroke, this, canvas) : Paint.strokes(stroke, this, canvas)\n if (fill) typeof fill === 'string' ? Paint.fill(fill, this, canvas) : Paint.fills(fill, this, canvas)\n }\n }\n\n data.strokeWidth = strokeWidth\n }\n }\n\n public destroy(): void {\n this.target = null\n super.destroy()\n }\n\n}\n\nfunction onTarget(stroker: Stroker): void {\n const value = stroker.target\n stroker.list = value ? (value instanceof Array ? value : [value]) : []\n}\n","import { IBoundsData, IGroupInputData, IRect, IRectInputData } from '@leafer-ui/interface'\nimport { Group, Rect } from '@leafer-ui/draw'\n\nimport { ISelectArea } from '@leafer-in/interface'\n\n\nexport class SelectArea extends Group implements ISelectArea {\n\n protected strokeArea: IRect = new Rect({ strokeAlign: 'center' })\n protected fillArea: IRect = new Rect()\n\n constructor(data?: IGroupInputData) {\n super(data)\n this.visible = 0\n this.hittable = false\n this.addMany(this.fillArea, this.strokeArea)\n }\n\n public setStyle(style: IRectInputData, userStyle?: IRectInputData): void {\n const { visible, stroke, strokeWidth } = style\n this.visible = visible\n this.strokeArea.reset({ stroke, strokeWidth, ...(userStyle || {}) })\n this.fillArea.reset({ visible: userStyle ? false : true, fill: stroke, opacity: 0.2 })\n }\n\n public setBounds(bounds: IBoundsData): void {\n this.strokeArea.set(bounds)\n this.fillArea.set(bounds)\n }\n\n}","import { IBounds, ILeafList, IUI, IUIData } from '@leafer-ui/interface'\n\n\nexport const EditSelectHelper = {\n\n findOne(path: ILeafList): IUI {\n return path.list.find((leaf) => leaf.editable) as IUI\n },\n\n findByBounds(branch: IUI, bounds: IBounds): IUI[] {\n const list: IUI[] = []\n eachFind([branch], list, bounds)\n return list\n }\n\n}\n\n\nfunction eachFind(children: IUI[], list: IUI[], bounds: IBounds): void {\n let child: IUI, data: IUIData\n for (let i = 0, len = children.length; i < len; i++) {\n child = children[i], data = child.__\n if (data.hittable && data.visible && !data.locked && bounds.hit(child.__world)) {\n\n if (data.editable) {\n if (child.isBranch && !data.hitChildren) {\n if (data.hitSelf) list.push(child)\n continue\n } else if (child.isFrame) {\n if (bounds.includes(child.__layout.boxBounds, child.__world)) {\n list.push(child)\n continue\n }\n } else if (bounds.hit(child.__layout.boxBounds, child.__world) && data.hitSelf) list.push(child)\n }\n\n if (child.isBranch) eachFind(child.children, list, bounds)\n\n }\n }\n}","import { IBounds, ILeaf, ILeafList, IUI, IEventListenerId, IPointerEvent, IFunction } from '@leafer-ui/interface'\nimport { Bounds, LeafList, Group } from '@leafer-ui/draw'\nimport { PointerEvent, DragEvent, MoveEvent, ZoomEvent } from '@leafer-ui/core'\n\nimport { IEditSelect, IEditor, ISelectArea, IStroker } from '@leafer-in/interface'\n\nimport { Stroker } from './Stroker'\nimport { SelectArea } from './SelectArea'\nimport { EditSelectHelper } from '../helper/EditSelectHelper'\nimport { EditorEvent } from '../event/EditorEvent'\n\n\nconst { findOne, findByBounds } = EditSelectHelper\n\nexport class EditSelect extends Group implements IEditSelect {\n\n public editor: IEditor\n\n public get dragging(): boolean { return !!this.originList }\n public get running(): boolean { const { editor } = this; return this.hittable && editor.visible && editor.hittable && editor.mergeConfig.selector }\n public get isMoveMode(): boolean { return this.app && this.app.interaction.moveMode }\n\n public hoverStroker: IStroker = new Stroker()\n public targetStroker: IStroker = new Stroker()\n\n public bounds: IBounds = new Bounds()\n public selectArea: ISelectArea = new SelectArea()\n\n protected originList: ILeafList\n protected needRemoveItem: IUI\n\n protected waitSelect: IFunction // 手机端延迟选中,防止多点触屏误选元素\n\n protected __eventIds: IEventListenerId[] = []\n\n constructor(editor: IEditor) {\n super()\n this.editor = editor\n this.addMany(this.targetStroker, this.hoverStroker, this.selectArea)\n this.__listenEvents()\n }\n\n // hover / select\n\n protected onHover(): void {\n const { editor } = this\n if (this.running && !this.dragging && !editor.dragging) {\n const { stroke, strokeWidth, hover, hoverStyle } = editor.mergeConfig\n this.hoverStroker.setTarget(hover ? this.editor.hoverTarget : null, { stroke, strokeWidth, ...(hoverStyle || {}) })\n } else {\n this.hoverStroker.target = null\n }\n }\n\n protected onSelect(): void {\n if (this.running) {\n const { mergeConfig, list } = this.editor\n const { stroke, strokeWidth, selectedStyle } = mergeConfig\n this.targetStroker.setTarget(list, { stroke, strokeWidth: Math.max(1, strokeWidth / 2), ...(selectedStyle || {}) })\n this.hoverStroker.target = null\n }\n }\n\n public update(): void {\n this.hoverStroker.update()\n this.targetStroker.update()\n }\n\n // move / down\n\n protected onPointerMove(e: PointerEvent): void {\n const { app, editor } = this\n if (this.running && !this.isMoveMode && app.interaction.canHover && !app.interaction.dragging) {\n const find = this.findUI(e)\n editor.hoverTarget = editor.hasItem(find) ? null : find\n } if (this.isMoveMode) {\n editor.hoverTarget = null // move.dragEmpty\n }\n }\n\n protected onBeforeDown(e: PointerEvent): void {\n if (e.multiTouch) return\n\n const { select } = this.editor.mergeConfig\n if (select === 'press') {\n if (this.app.config.mobile) {\n this.waitSelect = () => this.checkAndSelect(e)\n } else {\n this.checkAndSelect(e)\n }\n }\n }\n\n protected onTap(e: PointerEvent): void {\n if (e.multiTouch) return\n\n const { editor } = this\n const { select } = editor.mergeConfig\n\n if (select === 'tap') this.checkAndSelect(e)\n else if (this.waitSelect) this.waitSelect()\n\n if (this.needRemoveItem) {\n editor.removeItem(this.needRemoveItem)\n } else if (this.isMoveMode) {\n editor.target = null // move.dragEmpty\n }\n\n }\n\n protected checkAndSelect(e: PointerEvent): void { // pointer.down or tap\n this.needRemoveItem = null\n\n if (this.allowSelect(e)) {\n const { editor } = this\n const find = this.findUI(e)\n\n if (find) {\n if (this.isMultipleSelect(e)) {\n if (editor.hasItem(find)) this.needRemoveItem = find // 等待tap事件再实际移除\n else editor.addItem(find)\n } else {\n editor.target = find\n }\n\n } else if (this.allow(e.target)) {\n\n if (!e.shiftKey) editor.target = null\n\n }\n }\n }\n\n // drag\n\n protected onDragStart(e: DragEvent): void {\n if (e.multiTouch) return\n if (this.waitSelect) this.waitSelect()\n\n if (this.allowDrag(e)) {\n const { editor } = this\n const { stroke, area } = editor.mergeConfig\n const { x, y } = e.getInnerPoint(this)\n\n this.bounds.set(x, y)\n\n this.selectArea.setStyle({ visible: true, stroke, x, y }, area)\n this.selectArea.setBounds(this.bounds.get())\n\n this.originList = editor.leafList.clone()\n }\n }\n\n protected onDrag(e: DragEvent): void {\n if (e.multiTouch) return\n if (this.editor.dragging) return this.onDragEnd(e)\n\n if (this.dragging) {\n const { editor } = this\n const total = e.getInnerTotal(this)\n\n const dragBounds = this.bounds.clone().unsign()\n const list = new LeafList(findByBounds(editor.app, dragBounds))\n\n this.bounds.width = total.x\n this.bounds.height = total.y\n\n this.selectArea.setBounds(dragBounds.get())\n\n if (list.length) {\n\n const selectList: ILeaf[] = []\n\n this.originList.forEach(item => { if (!list.has(item)) selectList.push(item) })\n list.forEach(item => { if (!this.originList.has(item)) selectList.push(item) })\n\n if (selectList.length !== editor.list.length || editor.list.some((child, index) => child !== selectList[index])) {\n editor.target = selectList as IUI[]\n }\n\n } else {\n\n editor.target = this.originList.list as IUI[]\n\n }\n }\n }\n\n protected onDragEnd(e: DragEvent): void {\n if (e.multiTouch) return\n\n if (this.dragging) this.originList = null, this.selectArea.visible = 0\n }\n\n protected onAutoMove(e: MoveEvent): void {\n if (this.dragging) {\n const { x, y } = e.getLocalMove(this)\n this.bounds.x += x\n this.bounds.y += y\n }\n }\n\n // helper\n\n protected allow(target: ILeaf): boolean {\n return target.leafer !== this.editor.leafer\n }\n\n protected allowDrag(e: DragEvent) {\n const { boxSelect, multipleSelect } = this.editor.mergeConfig\n if (this.running && (multipleSelect && boxSelect) && !e.target.draggable) {\n return (!this.editor.editing && this.allow(e.target)) || (e.shiftKey && !findOne(e.path))\n } else {\n return false\n }\n }\n\n protected allowSelect(e: IPointerEvent): boolean {\n return this.running && !this.isMoveMode && !e.middle\n }\n\n public findDeepOne(e: PointerEvent): IUI {\n const options = { exclude: new LeafList(this.editor.editBox.rect) }\n return findOne(e.target.leafer.interaction.findPath(e, options)) as IUI\n }\n\n public findUI(e: PointerEvent): IUI {\n return this.isMultipleSelect(e) ? this.findDeepOne(e) : findOne(e.path)\n }\n\n public isMultipleSelect(e: IPointerEvent): boolean {\n const { multipleSelect, continuousSelect } = this.editor.mergeConfig\n return multipleSelect && (e.shiftKey || continuousSelect)\n }\n\n protected __listenEvents(): void {\n const { editor } = this\n editor.waitLeafer(() => {\n\n const { app } = editor\n app.selector.proxy = editor\n\n this.__eventIds = [\n editor.on_([\n [EditorEvent.HOVER, this.onHover, this],\n [EditorEvent.SELECT, this.onSelect, this]\n ]),\n\n app.on_([\n [PointerEvent.MOVE, this.onPointerMove, this],\n [PointerEvent.BEFORE_DOWN, this.onBeforeDown, this],\n [PointerEvent.TAP, this.onTap, this],\n\n [DragEvent.START, this.onDragStart, this, true], // 采用捕获事件,需要比EditBox中的dragStart早触发\n [DragEvent.DRAG, this.onDrag, this],\n [DragEvent.END, this.onDragEnd, this],\n\n [MoveEvent.MOVE, this.onAutoMove, this],\n [[ZoomEvent.ZOOM, MoveEvent.MOVE], () => { this.editor.hoverTarget = null }],\n ])\n ]\n\n })\n }\n\n protected __removeListenEvents(): void {\n this.off_(this.__eventIds)\n }\n\n public destroy(): void {\n this.editor = this.originList = this.needRemoveItem = null\n this.__removeListenEvents()\n super.destroy()\n }\n}","import { IBoundsData, IPointData, IAround, IAlign, IUI, ILayoutBoundsData } from '@leafer-ui/interface'\nimport { AroundHelper, MathHelper, PointHelper, BoundsHelper, Bounds, Direction9 } from '@leafer-ui/draw'\n\nimport { IEditorScaleEvent, IEditorSkewEvent, IEditorRotateEvent } from '@leafer-in/interface'\n\n\nconst { topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left } = Direction9\nconst { toPoint } = AroundHelper\nconst { within } = MathHelper\n\nexport const EditDataHelper = {\n\n getScaleData(element: IUI, startBounds: ILayoutBoundsData, direction: Direction9, totalMove: IPointData, lockRatio: boolean | 'corner', around: IAround, flipable: boolean, scaleMode: boolean): IEditorScaleEvent {\n let align: IAlign, origin = {} as IPointData, scaleX: number = 1, scaleY: number = 1\n\n const { boxBounds, widthRange, heightRange, dragBounds, worldBoxBounds } = element\n const { width, height } = startBounds\n\n if (around) {\n totalMove.x *= 2\n totalMove.y *= 2\n }\n\n\n // 获取已经改变的比例\n const originChangedScaleX = element.scaleX / startBounds.scaleX\n const originChangedScaleY = element.scaleY / startBounds.scaleY\n const signX = originChangedScaleX < 0 ? -1 : 1\n const signY = originChangedScaleY < 0 ? -1 : 1\n\n const changedScaleX = scaleMode ? originChangedScaleX : signX * boxBounds.width / width\n const changedScaleY = scaleMode ? originChangedScaleY : signY * boxBounds.height / height\n\n totalMove.x *= scaleMode ? originChangedScaleX : signX\n totalMove.y *= scaleMode ? originChangedScaleY : signY\n\n const topScale = (-totalMove.y + height) / height\n const rightScale = (totalMove.x + width) / width\n const bottomScale = (totalMove.y + height) / height\n const leftScale = (-totalMove.x + width) / width\n\n switch (direction) {\n case top:\n scaleY = topScale\n align = 'bottom'\n break\n case right:\n scaleX = rightScale\n align = 'left'\n break\n case bottom:\n scaleY = bottomScale\n align = 'top'\n break\n case left:\n scaleX = leftScale\n align = 'right'\n break\n case topLeft:\n scaleY = topScale\n scaleX = leftScale\n align = 'bottom-right'\n break\n case topRight:\n scaleY = topScale\n scaleX = rightScale\n align = 'bottom-left'\n break\n case bottomRight:\n scaleY = bottomScale\n scaleX = rightScale\n align = 'top-left'\n break\n case bottomLeft:\n scaleY = bottomScale\n scaleX = leftScale\n align = 'top-right'\n }\n\n if (lockRatio) {\n if (lockRatio === 'corner' && direction % 2) {\n lockRatio = false\n } else {\n let scale: number\n switch (direction) {\n case top:\n case bottom:\n scale = scaleY\n break\n case left:\n case right:\n scale = scaleX\n break\n default:\n scale = Math.sqrt(Math.abs(scaleX * scaleY))\n }\n scaleX = scaleX < 0 ? -scale : scale\n scaleY = scaleY < 0 ? -scale : scale\n }\n }\n\n const useScaleX = scaleX !== 1, useScaleY = scaleY !== 1\n\n if (useScaleX) scaleX /= changedScaleX\n if (useScaleY) scaleY /= changedScaleY\n\n if (!flipable) {\n const { worldTransform } = element\n if (scaleX < 0) scaleX = 1 / boxBounds.width / worldTransform.scaleX\n if (scaleY < 0) scaleY = 1 / boxBounds.height / worldTransform.scaleY\n }\n\n // 检查限制\n\n toPoint(around || align, boxBounds, origin, true)\n\n if (dragBounds) {\n const allowBounds = dragBounds === 'parent' ? element.parent.boxBounds : dragBounds\n const localBounds = new Bounds(element.__localBoxBounds)\n localBounds.scaleOf(element.getLocalPointByInner(origin), scaleX, scaleY)\n\n if (!BoundsHelper.includes(allowBounds, localBounds)) {\n const realBounds = localBounds.getIntersect(allowBounds)\n const fitScaleX = realBounds.width / localBounds.width, fitScaleY = realBounds.height / localBounds.height\n if (useScaleX) scaleX *= fitScaleX\n if (useScaleY) scaleY *= fitScaleY // 后续需优化带旋转的场景\n }\n }\n\n if (useScaleX && widthRange) {\n const nowWidth = boxBounds.width * element.scaleX\n scaleX = within(nowWidth * scaleX, widthRange) / nowWidth\n }\n\n if (useScaleY && heightRange) {\n const nowHeight = boxBounds.height * element.scaleY\n scaleY = within(nowHeight * scaleY, heightRange) / nowHeight\n }\n\n // 防止小于1px\n if (useScaleX && Math.abs(scaleX * worldBoxBounds.width) < 1) scaleX = (scaleX < 0 ? -1 : 1) / worldBoxBounds.width\n if (useScaleY && Math.abs(scaleY * worldBoxBounds.height) < 1) scaleY = (scaleY < 0 ? -1 : 1) / worldBoxBounds.height\n\n if (lockRatio && scaleX !== scaleY) scaleY = scaleX = Math.min(scaleX, scaleY)\n\n return { origin, scaleX, scaleY, direction, lockRatio, around }\n },\n\n getRotateData(bounds: IBoundsData, direction: Direction9, current: IPointData, last: IPointData, around: IAround): IEditorRotateEvent {\n let align: IAlign, origin = {} as IPointData\n\n switch (direction) {\n case topLeft:\n align = 'bottom-right'\n break\n case topRight:\n align = 'bottom-left'\n break\n case bottomRight:\n align = 'top-left'\n break\n case bottomLeft:\n align = 'top-right'\n break\n default:\n align = 'center'\n }\n\n toPoint(around || align, bounds, origin, true)\n\n return { origin, rotation: PointHelper.getRotation(last, origin, current) }\n },\n\n getSkewData(bounds: IBoundsData, direction: Direction9, move: IPointData, around: IAround): IEditorSkewEvent {\n let align: IAlign, origin = {} as IPointData, skewX = 0, skewY = 0\n let last: IPointData\n\n switch (direction) {\n case top:\n case topLeft:\n last = { x: 0.5, y: 0 }\n align = 'bottom'\n skewX = 1\n break\n case bottom:\n case bottomRight:\n last = { x: 0.5, y: 1 }\n align = 'top'\n skewX = 1\n break\n case left:\n case bottomLeft:\n last = { x: 0, y: 0.5 }\n align = 'right'\n skewY = 1\n break\n case right:\n case topRight:\n last = { x: 1, y: 0.5 }\n align = 'left'\n skewY = 1\n }\n\n const { width, height } = bounds\n\n last.x = last.x * width\n last.y = last.y * height\n\n toPoint(around || align, bounds, origin, true)\n\n const rotation = PointHelper.getRotation(last, origin, { x: last.x + (skewX ? move.x : 0), y: last.y + (skewY ? move.y : 0) })\n skewX ? skewX = -rotation : skewY = rotation\n\n return { origin, skewX, skewY }\n },\n\n\n getAround(around: IAround, altKey: boolean): IAround {\n return (altKey && !around) ? 'center' : around\n },\n\n getRotateDirection(direction: number, rotation: number, totalDirection = 8): number {\n direction = (direction + Math.round(rotation / (360 / totalDirection))) % totalDirection\n if (direction < 0) direction += totalDirection\n return direction\n },\n\n getFlipDirection(direction: Direction9, flipedX: boolean, flipedY: boolean): Direction9 {\n if (flipedX) {\n switch (direction) {\n case left: direction = right; break\n case topLeft: direction = topRight; break\n case bottomLeft: direction = bottomRight; break\n case right: direction = left; break\n case topRight: direction = topLeft; break\n case bottomRight: direction = bottomLeft; break\n }\n }\n\n if (flipedY) {\n switch (direction) {\n case top: direction = bottom; break\n case topLeft: direction = bottomLeft; break\n case topRight: direction = bottomRight; break\n case bottom: direction = top; break\n case bottomLeft: direction = topLeft; break\n case bottomRight: direction = topRight; break\n }\n }\n\n return direction\n }\n\n}","import { IObject, IUIEvent } from '@leafer-ui/interface'\n\nimport { IEditor } from '@leafer-in/interface'\nimport { MathHelper } from '@leafer-ui/draw'\n\nimport { EditDataHelper } from '../helper/EditDataHelper'\n\n\nconst cacheCursors: IObject = {}\n\nexport function updateCursor(editor: IEditor, e: IUIEvent): void {\n const { editBox } = editor, point = editBox.enterPoint\n if (!point || !editor.editing || !editBox.visible) return\n if (point.name === 'circle') return // 独立旋转按钮\n if (point.pointType === 'button') { // 普通按钮\n if (!point.cursor) point.cursor = 'pointer'\n return\n }\n\n let { rotation } = editBox\n const { resizeCursor, rotateCursor, skewCursor, resizeable, rotateable, skewable } = editor.mergeConfig\n const { pointType } = point, { flippedX, flippedY } = editBox\n\n let showResize = pointType.includes('resize')\n if (showResize && rotateable && (e.metaKey || e.ctrlKey || !resizeable)) showResize = false\n const showSkew = skewable && !showResize && (point.name === 'resize-line' || pointType === 'skew')\n\n const cursor = showSkew ? skewCursor : (showResize ? resizeCursor : rotateCursor)\n rotation += (EditDataHelper.getFlipDirection(point.direction, flippedX, flippedY) + 1) * 45\n rotation = Math.round(MathHelper.formatRotation(rotation, true) / 2) * 2\n\n const { url, x, y } = cursor\n const key = url + rotation\n\n if (cacheCursors[key]) {\n point.cursor = cacheCursors[key]\n } else {\n cacheCursors[key] = point.cursor = { url: toDataURL(url, rotation), x, y }\n }\n}\n\nexport function updateMoveCursor(editor: IEditor): void {\n const { moveCursor, moveable } = editor.mergeConfig\n editor.editBox.rect.cursor = moveable ? moveCursor : undefined\n}\n\n\nfunction toDataURL(svg: string, rotation: number): string {\n return '\"data:image/svg+xml,' + encodeURIComponent(svg.replace('{{rotation}}', rotation.toString())) + '\"'\n}","import { Box, Direction9 } from '@leafer-ui/draw'\n\nimport { IEditPoint, IEditPointInputData, IEditPointType } from '@leafer-in/interface'\n\n\nexport class EditPoint extends Box implements IEditPoint {\n\n public direction: Direction9\n public pointType: IEditPointType\n\n constructor(data: IEditPointInputData) {\n super(data)\n this.useFastShadow = true\n }\n\n}","import { IRect, IEventListenerId, IBoundsData, IPointData, IKeyEvent, IGroup, IBox, IBoxInputData, IAlign, IUI, IEditorConfig, IEditorDragStartData, IEventParams } from '@leafer-ui/interface'\nimport { Group, Box, Text, AroundHelper, Direction9, ResizeEvent } from '@leafer-ui/draw'\nimport { DragEvent, PointerEvent } from '@leafer-ui/core'\n\nimport { IEditBox, IEditor, IEditPoint, IEditPointType } from '@leafer-in/interface'\n\nimport { updateCursor, updateMoveCursor } from '../editor/cursor'\nimport { EditorEvent } from '../event/EditorEvent'\nimport { EditPoint } from './EditPoint'\nimport { EditDataHelper } from '../helper/EditDataHelper'\n\n\nconst fourDirection = ['top', 'right', 'bottom', 'left'], editConfig: IEditorConfig = undefined\n\nexport class EditBox extends Group implements IEditBox {\n\n public editor: IEditor\n public dragging: boolean\n public moving: boolean\n\n public view: IGroup = new Group() // 放置默认编辑工具控制点\n\n public rect: IBox = new Box({ name: 'rect', hitFill: 'all', hitStroke: 'none', strokeAlign: 'center', hitRadius: 5 }) // target rect\n public circle: IEditPoint = new EditPoint({ name: 'circle', strokeAlign: 'center', around: 'center', cursor: 'crosshair', hitRadius: 5 }) // rotate point\n public buttons: IGroup = new Group({ around: 'center', hitSelf: false, visible: 0 })\n\n public resizePoints: IEditPoint[] = [] // topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left\n public rotatePoints: IEditPoint[] = [] // topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left\n public resizeLines: IEditPoint[] = [] // top, right, bottom, left\n\n public enterPoint: IEditPoint\n public dragPoint: IEditPoint // 正在拖拽的控制点\n\n public dragStartData = {} as IEditorDragStartData\n\n // fliped\n public get flipped(): boolean { return this.flippedX || this.flippedY }\n public get flippedX(): boolean { return this.scaleX < 0 }\n public get flippedY(): boolean { return this.scaleY < 0 }\n public get flippedOne(): boolean { return this.scaleX * this.scaleY < 0 }\n\n protected __eventIds: IEventListenerId[] = []\n\n constructor(editor: IEditor) {\n super()\n this.editor = editor\n this.visible = false\n this.create()\n this.__listenEvents()\n }\n\n public create() {\n let rotatePoint: IEditPoint, resizeLine: IEditPoint, resizePoint: IEditPoint\n const { view, resizePoints, rotatePoints, resizeLines, rect, circle, buttons } = this\n const arounds: IAlign[] = ['bottom-right', 'bottom', 'bottom-left', 'left', 'top-left', 'top', 'top-right', 'right']\n\n for (let i = 0; i < 8; i++) {\n rotatePoint = new EditPoint({ name: 'rotate-point', around: arounds[i], width: 15, height: 15, hitFill: \"all\" })\n rotatePoints.push(rotatePoint)\n this.listenPointEvents(rotatePoint, 'rotate', i)\n\n if (i % 2) {\n resizeLine = new EditPoint({ name: 'resize-line', around: 'center', width: 10, height: 10, hitFill: \"all\" })\n resizeLines.push(resizeLine)\n this.listenPointEvents(resizeLine, 'resize', i)\n }\n\n resizePoint = new EditPoint({ name: 'resize-point', hitRadius: 5 })\n resizePoints.push(resizePoint)\n this.listenPointEvents(resizePoint, 'resize', i)\n }\n\n this.listenPointEvents(circle, 'rotate', 2)\n\n view.addMany(...rotatePoints, rect, circle, buttons, ...resizeLines, ...resizePoints)\n this.add(view)\n }\n\n public load(): void {\n const { mergeConfig, element, single } = this.editor\n const { rect, circle, resizePoints } = this\n const { stroke, strokeWidth } = mergeConfig\n\n const pointsStyle = this.getPointsStyle()\n const middlePointsStyle = this.getMiddlePointsStyle()\n\n let resizeP: IRect\n\n for (let i = 0; i < 8; i++) {\n resizeP = resizePoints[i]\n resizeP.set(this.getPointStyle((i % 2) ? middlePointsStyle[((i - 1) / 2) % middlePointsStyle.length] : pointsStyle[(i / 2) % pointsStyle.length]))\n if (!(i % 2)) resizeP.rotation = (i / 2) * 90\n }\n\n // rotate\n circle.set(this.getPointStyle(mergeConfig.circle || mergeConfig.rotatePoint || pointsStyle[0]))\n\n // rect\n rect.set({ stroke, strokeWidth, editConfig, ...(mergeConfig.rect || {}) })\n rect.hittable = !single\n rect.syncEventer = single && this.editor // 单选下 rect 的事件不会冒泡,需要手动传递给editor\n\n // 编辑框作为底部虚拟元素, 在 onSelect 方法移除\n if (single) {\n element.syncEventer = rect\n this.app.interaction.bottomList = [{ target: rect, proxy: element }]\n }\n }\n\n public update(bounds: IBoundsData): void {\n const { rect, circle, buttons, resizePoints, rotatePoints, resizeLines, editor } = this\n const { mergeConfig, element, multiple, editMask } = editor\n const { middlePoint, resizeable, rotateable, hideOnSmall, editBox, mask } = mergeConfig\n\n this.visible = !element.locked\n editMask.visible = mask ? true : 0\n\n if (this.view.worldOpacity) {\n const { width, height } = bounds\n const smallSize = typeof hideOnSmall === 'number' ? hideOnSmall : 10\n const showPoints = editBox && !(hideOnSmall && width < smallSize && height < smallSize)\n\n let point = {} as IPointData, rotateP: IRect, resizeP: IRect, resizeL: IRect\n\n for (let i = 0; i < 8; i++) {\n\n AroundHelper.toPoint(AroundHelper.directionData[i], bounds, point)\n resizeP = resizePoints[i]\n rotateP = rotatePoints[i]\n resizeL = resizeLines[Math.floor(i / 2)]\n resizeP.set(point)\n rotateP.set(point)\n resizeL.set(point)\n\n // visible \n resizeP.visible = resizeL.visible = showPoints && !!(resizeable || rotateable)\n rotateP.visible = showPoints && rotateable && resizeable && !mergeConfig.rotatePoint\n\n if (i % 2) { // top, right, bottom, left\n\n resizeP.visible = rotateP.visible = showPoints && !!middlePoint\n\n if (((i + 1) / 2) % 2) { // top, bottom\n resizeL.width = width\n if (hideOnSmall && resizeP.width * 2 > width) resizeP.visible = false\n } else {\n resizeL.height = height\n resizeP.rotation = 90\n if (hideOnSmall && resizeP.width * 2 > height) resizeP.visible = false\n }\n }\n\n }\n\n // rotate\n circle.visible = showPoints && rotateable && !!(mergeConfig.circle || mergeConfig.rotatePoint)\n if (circle.visible) this.layoutCircle(mergeConfig)\n\n // rect\n if (rect.path) rect.path = null // line可能会变成path优先模式\n rect.set({ ...bounds, visible: multiple ? true : editBox })\n\n // buttons\n buttons.visible = showPoints && buttons.children.length > 0 || 0\n if (buttons.visible) this.layoutButtons(mergeConfig)\n } else rect.set(bounds) // 需要更新大小\n }\n\n protected layoutCircle(config: IEditorConfig): void {\n const { circleDirection, circleMargin, buttonsMargin, buttonsDirection, middlePoint } = config\n const direction = fourDirection.indexOf(circleDirection || ((this.buttons.children.length && buttonsDirection === 'bottom') ? 'top' : 'bottom'))\n this.setButtonPosition(this.circle, direction, circleMargin || buttonsMargin, !!middlePoint)\n }\n\n protected layoutButtons(config: IEditorConfig): void {\n const { buttons } = this\n const { buttonsDirection, buttonsFixed, buttonsMargin, middlePoint } = config\n\n const { flippedX, flippedY } = this\n let index = fourDirection.indexOf(buttonsDirection)\n if ((index % 2 && flippedX) || ((index + 1) % 2 && flippedY)) {\n if (buttonsFixed) index = (index + 2) % 4 // flip x / y\n }\n\n const direction = buttonsFixed ? EditDataHelper.getRotateDirection(index, this.flippedOne ? this.rotation : -this.rotation, 4) : index\n this.setButtonPosition(buttons, direction, buttonsMargin, !!middlePoint)\n\n if (buttonsFixed) buttons.rotation = (direction - index) * 90\n buttons.scaleX = flippedX ? -1 : 1\n buttons.scaleY = flippedY ? -1 : 1\n }\n\n protected setButtonPosition(buttons: IUI, direction: number, buttonsMargin: number, useMiddlePoint: boolean): void {\n const point = this.resizePoints[direction * 2 + 1] // 4 map 8 direction\n const useX = direction % 2 // left / right\n const sign = (!direction || direction === 3) ? -1 : 1 // top / left = -1\n\n const useWidth = direction % 2 // left / right origin direction\n const margin = (buttonsMargin + (useWidth ? ((useMiddlePoint ? point.width : 0) + buttons.boxBounds.width) : ((useMiddlePoint ? point.height : 0) + buttons.boxBounds.height)) / 2) * sign\n\n if (useX) {\n buttons.x = point.x + margin\n buttons.y = point.y\n } else {\n buttons.x = point.x\n buttons.y = point.y + margin\n }\n }\n\n\n public unload(): void {\n this.visible = false\n }\n\n\n public getPointStyle(userStyle?: IBoxInputData): IBoxInputData {\n const { stroke, strokeWidth, pointFill, pointSize, pointRadius } = this.editor.mergeConfig\n const defaultStyle = { fill: pointFill, stroke, strokeWidth, around: 'center', strokeAlign: 'center', width: pointSize, height: pointSize, cornerRadius: pointRadius, offsetX: 0, offsetY: 0, editConfig } as IBoxInputData\n return userStyle ? Object.assign(defaultStyle, userStyle) : defaultStyle\n }\n\n public getPointsStyle(): IBoxInputData[] {\n const { point } = this.editor.mergeConfig\n return point instanceof Array ? point : [point]\n }\n\n public getMiddlePointsStyle(): IBoxInputData[] {\n const { middlePoint } = this.editor.mergeConfig\n return middlePoint instanceof Array ? middlePoint : (middlePoint ? [middlePoint] : this.getPointsStyle())\n }\n\n protected onSelect(e: EditorEvent): void {\n if (e.oldList.length === 1) {\n e.oldList[0].syncEventer = null\n if (this.app) this.app.interaction.bottomList = null\n }\n }\n\n // drag\n\n protected onDragStart(e: DragEvent): void {\n this.dragging = true\n const point = this.dragPoint = e.current as IEditPoint, { pointType } = point\n const { editor, dragStartData } = this, { element } = editor\n if (point.name === 'rect') {\n this.moving = true\n editor.opacity = editor.mergeConfig.hideOnMove ? 0 : 1 // move\n }\n dragStartData.x = e.x\n dragStartData.y = e.y\n dragStartData.point = { x: element.x, y: element.y } // 用于移动\n dragStartData.bounds = { ...element.getLayoutBounds('box', 'local') } // 用于resize\n dragStartData.rotation = element.rotation // 用于旋转\n if (pointType && pointType.includes('resize')) ResizeEvent.resizingKeys = editor.leafList.keys // 记录正在resize中的元素列表\n }\n\n protected onDragEnd(e: DragEvent): void {\n this.dragging = false\n this.dragPoint = null\n this.moving = false\n const { name, pointType } = e.current as IEditPoint\n if (name === 'rect') this.editor.opacity = 1 // move\n if (pointType && pointType.includes('resize')) ResizeEvent.resizingKeys = null\n }\n\n protected onDrag(e: DragEvent): void {\n const { editor } = this\n const { pointType } = this.enterPoint = e.current as IEditPoint\n if (pointType.includes('rotate') || e.metaKey || e.ctrlKey || !editor.mergeConfig.resizeable) {\n editor.onRotate(e)\n if (pointType === 'resize-rotate') editor.onScale(e)\n } else if (pointType === 'resize') editor.onScale(e)\n if (pointType === 'skew') editor.onSkew(e)\n updateCursor(editor, e)\n }\n\n public onArrow(e: IKeyEvent): void {\n const { editor } = this\n if (editor.editing && editor.mergeConfig.keyEvent) {\n let x = 0, y = 0\n const distance = e.shiftKey ? 10 : 1\n switch (e.code) {\n case 'ArrowDown':\n y = distance\n break\n case 'ArrowUp':\n y = -distance\n break\n case 'ArrowLeft':\n x = -distance\n break\n case 'ArrowRight':\n x = distance\n }\n if (x || y) editor.move(x, y)\n }\n }\n\n\n protected onDoubleTap(e: PointerEvent): void {\n if (this.editor.mergeConfig.openInner === 'double') this.openInner(e)\n }\n\n protected onLongPress(e: PointerEvent): void {\n if (this.editor.mergeConfig.openInner === 'long') this.openInner(e)\n }\n\n protected openInner(e: PointerEvent): void {\n const { editor } = this\n if (editor.single) {\n const { element } = editor\n if (element.locked) return\n if (element.isBranch && !element.editInner) {\n if ((element as IBox).textBox) {\n const { children } = element\n const find = children.find(item => item.editable && item instanceof Text) || children.find(item => item instanceof Text)\n if (find) return editor.openInnerEditor(find) // 文本Box直接进入编辑状态,如便利贴文本\n }\n\n editor.openGroup(element as IGroup)\n editor.target = editor.selector.findDeepOne(e)\n } else {\n editor.openInnerEditor()\n }\n }\n }\n\n\n public listenPointEvents(point: IEditPoint, type: IEditPointType, direction: Direction9): void {\n const { editor } = this\n point.direction = direction\n point.pointType = type\n\n const events: IEventParams[] = [\n [DragEvent.START, this.onDragStart, this],\n [DragEvent.DRAG, this.onDrag, this],\n [DragEvent.END, this.onDragEnd, this],\n [PointerEvent.LEAVE, () => { this.enterPoint = null }],\n ]\n if (point.name !== 'circle') events.push([PointerEvent.ENTER, (e: PointerEvent) => { this.enterPoint = point, updateCursor(editor, e) }])\n this.__eventIds.push(point.on_(events))\n }\n\n protected __listenEvents(): void {\n const { rect, editor } = this\n this.__eventIds.push(\n editor.on_(EditorEvent.SELECT, this.onSelect, this),\n\n rect.on_([\n [DragEvent.START, this.onDragStart, this],\n [DragEvent.DRAG, editor.onMove, editor],\n [DragEvent.END, this.onDragEnd, this],\n\n [PointerEvent.ENTER, () => updateMoveCursor(editor)],\n [PointerEvent.DOUBLE_TAP, this.onDoubleTap, this],\n [PointerEvent.LONG_PRESS, this.onLongPress, this]\n ])\n )\n }\n\n protected __removeListenEvents(): void {\n this.off_(this.__eventIds)\n }\n\n public destroy(): void {\n this.editor = null\n this.__removeListenEvents()\n super.destroy()\n }\n\n}","import { IBox, ILeaferCanvas, IRenderOptions } from '@leafer-ui/interface'\nimport { UI } from '@leafer-ui/draw'\n\nimport { IEditor } from '@leafer-in/interface'\n\nconst bigBounds = { x: 0, y: 0, width: 100000, height: 100000 }\n\nexport class EditMask extends UI {\n\n public editor: IEditor\n\n constructor(editor: IEditor) {\n super()\n this.editor = editor\n this.hittable = false\n this.visible = 0\n }\n\n override __updateWorldBounds(): void {\n Object.assign(this.__local, bigBounds) // 强制修改渲染包围盒\n Object.assign(this.__world, bigBounds)\n }\n\n public __draw(canvas: ILeaferCanvas, options: IRenderOptions): void {\n\n const { editor } = this, { mask } = editor.mergedConfig\n if (mask && editor.editing) {\n canvas.fillWorld(canvas.bounds, mask === true ? 'rgba(0,0,0,0.8)' : mask)\n if (options.bounds && !options.bounds.hit(editor.editBox.rect.__world, options.matrix)) return\n\n canvas.saveBlendMode('destination-out')\n editor.list.forEach(item => {\n item.__renderShape(canvas, options)\n const { __box, parent } = item\n if ((item = __box) || ((item = parent) && (parent as IBox).textBox)) item.__renderShape(canvas, options) // 文本框\n })\n canvas.restoreBlendMode()\n }\n }\n\n public destroy(): void {\n this.editor = null\n super.destroy()\n }\n\n}\n","const filterStyle = `\n<feOffset dy=\"1\"/>\n<feGaussianBlur stdDeviation=\"1.5\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" result=\"shape\"/>`\n\n\nexport const resizeSVG = `\n<svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#f)\">\n<g transform=\"rotate({{rotation}},12,12)\">\n<path d=\"M7.5 8.0H8.5V5.9L6.8 7.2L7.5 8.0ZM3 11.4L2.3 10.6L1.3 11.4L2.3 12.2L3 11.4ZM7.5 10.4H6.5V11.4H7.5V10.4ZM16.5 10.4V11.4H17.5V10.4H16.5ZM16.5 8.0L17.1 7.2L15.5 5.9V8.0H16.5ZM21 11.4L21.6 12.2L22.6 11.4L21.6 10.6L21 11.4ZM16.5 14.9H15.5V16.9L17.1 15.7L16.5 14.9ZM16.5 12.4H17.5V11.4H16.5V12.4ZM7.5 12.4V11.4H6.5V12.4H7.5ZM7.5 14.9L6.8 15.7L8.5 16.9V14.9H7.5ZM6.8 7.2L2.3 10.6L3.6 12.2L8.1 8.7L6.8 7.2ZM8.5 10.4V8.0H6.5V10.4H8.5ZM16.5 9.4H7.5V11.4H16.5V9.4ZM17.5 10.4V8.0H15.5V10.4H17.5ZM15.8 8.7L20.3 12.2L21.6 10.6L17.1 7.2L15.8 8.7ZM20.3 10.6L15.8 14.1L17.1 15.7L21.6 12.2L20.3 10.6ZM17.5 14.9V12.4H15.5V14.9H17.5ZM7.5 13.4H16.5V11.4H7.5V13.4ZM8.5 14.9V12.4H6.5V14.9H8.5ZM2.3 12.2L6.8 15.7L8.1 14.1L3.6 10.6L2.3 12.2Z\" fill=\"white\"/>\n<path fill-rule=\"evenodd\" d=\"M3 11.4L7.5 8.0V10.4H16.5V8.0L21 11.4L16.5 14.9V12.4H7.5V14.9L3 11.4Z\" fill=\"black\"/>\n</g>\n</g>\n<defs>\n<filter id=\"f\" x=\"-1.6\" y=\"3.9\" width=\"27.2\" height=\"16.9\" filterUnits=\"userSpaceOnUse\">\n${filterStyle}\n</filter>\n</defs>\n</svg>\n`\n\nexport const rotateSVG = `\n<svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#f)\">\n<g transform=\"rotate(135,12,12),rotate({{rotation}},12,12)\">\n<path d=\"M20.4 8H21.4L20.8 7.1L17.3 2.6L17 2.1L16.6 2.6L13.1 7.1L12.5 8H13.5H15.4C14.9 11.8 11.8 14.9 8 15.4V13.5V12.5L7.1 13.1L2.6 16.6L2.1 17L2.6 17.3L7.1 20.8L8 21.4V20.4V18.4C13.5 17.9 17.9 13.5 18.4 8H20.4Z\" stroke=\"white\"/>\n<path fill-rule=\"evenodd\" d=\"M17 3L20.4 7.5H17.9C17.7 13.1 13.1 17.7 7.5 17.9V20.4L3 17L7.5 13.5V15.9C12.0 15.7 15.7 12.0 15.9 7.5H13.5L17 3Z\" fill=\"black\"/>\n</g>\n</g>\n<defs>\n<filter id=\"f\" x=\"-1.6\" y=\"-0.6\" width=\"27.1\" height=\"27.1\" filterUnits=\"userSpaceOnUse\">\n${filterStyle}\n</filter>\n</defs>\n</svg>\n`\n\nexport const skewSVG = `\n<svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#f)\">\n<g transform=\"rotate(90,12,12),rotate({{rotation}},12,12)\">\n<path d=\"M21 10.4L21 11.4L23.8 11.4L21.6 9.6L21 10.4ZM17 10.4V11.4L17 11.4L17 10.4ZM15.5 6L16.1 5.2L14.5 3.9V6H15.5ZM15.5 8.4V9.4H16.5V8.4H15.5ZM6 8.4V7.4H5V8.4H6ZM6 10.4H5V11.4H6V10.4ZM7 14.4V13.4L7 13.4L7 14.4ZM3 14.4L3 13.4L0.1 13.4L2.3 15.2L3 14.4ZM8.5 18.9L7.8 19.7L9.5 21.0V18.9H8.5ZM8.5 16.4V15.4H7.5V16.4H8.5ZM19 16.4V17.4H20V16.4H19ZM19 14.4H20V13.4H19V14.4ZM21 9.4L17 9.4L17 11.4L21 11.4L21 9.4ZM14.8 6.7L20.3 11.2L21.6 9.6L16.1 5.2L14.8 6.7ZM16.5 8.4V6H14.5V8.4H16.5ZM6 9.4H15.5V7.4H6V9.4ZM7 10.4V8.4H5V10.4H7ZM15.5 9.4H6V11.4H15.5V9.4ZM17 9.4H15.5V11.4H17V9.4ZM7 15.4H8.5V13.4H7V15.4ZM3 15.4L7 15.4L7 13.4L3 13.4L3 15.4ZM9.1 18.1L3.6 13.6L2.3 15.2L7.8 19.7L9.1 18.1ZM7.5 16.4V18.9H9.5V16.4H7.5ZM19 15.4H8.5V17.4H19V15.4ZM18 14.4V16.4H20V14.4H18ZM8.5 15.4H19V13.4H8.5V15.4Z\" fill=\"white\"/>\n<path fill-rule=\"evenodd\" d=\"M17 10.4L21 10.4L15.5 6V8.4H6V10.4H15.5H17ZM8.5 14.4H7L3 14.4L8.5 18.9V16.4H19V14.4H8.5Z\" fill=\"black\"/>\n</g>\n</g>\n<defs>\n<filter x=\"-2.8\" y=\"1.9\" width=\"29.6\" height=\"23.1\" filterUnits=\"userSpaceOnUse\" >\n${filterStyle}\n</filter>\n</defs>\n</svg>\n`","import { IEditorConfig } from '@leafer-in/interface'\nimport { resizeSVG, rotateSVG, skewSVG } from './svg'\n\n\nexport const config: IEditorConfig = {\n editSize: 'size',\n keyEvent: true,\n\n stroke: '#836DFF',\n strokeWidth: 2,\n\n pointFill: '#FFFFFF',\n pointSize: 10,\n pointRadius: 16,\n\n rotateGap: 45,\n\n buttonsDirection: 'bottom',\n buttonsMargin: 12,\n\n hideOnSmall: true,\n\n moveCursor: 'move',\n resizeCursor: { url: resizeSVG, x: 12, y: 12 },\n rotateCursor: { url: rotateSVG, x: 12, y: 12 },\n skewCursor: { url: skewSVG, x: 12, y: 12 },\n\n selector: true,\n editBox: true,\n hover: true,\n select: 'press',\n openInner: 'double',\n multipleSelect: true,\n boxSelect: true,\n\n moveable: true,\n resizeable: true,\n flipable: true,\n rotateable: true,\n skewable: true\n}","import { IGroup, ILeaf } from '@leafer-ui/interface'\nimport { Bounds } from '@leafer-ui/draw'\n\nimport { IEditor } from '@leafer-in/interface'\n\n\nconst bounds = new Bounds()\n\nexport function simulate(editor: IEditor) {\n const { simulateTarget, list } = editor\n const { zoomLayer } = list[0].leafer.zoomLayer as IGroup // follow zoomLayer zoom / move\n simulateTarget.safeChange(() => {\n bounds.setListWithFn(list, (leaf: ILeaf) => leaf.getBounds('box', 'page'))\n if (bounds.width === 0) bounds.width = 0.1 // fix\n if (bounds.height === 0) bounds.height = 0.1\n simulateTarget.reset(bounds.get())\n })\n zoomLayer.add(simulateTarget)\n}","import { IGroup, IGroupInputData, ILeaf, IUI } from '@leafer-ui/interface'\nimport { Group, Matrix } from '@leafer-ui/draw'\n\n\nconst order = (a: ILeaf, b: ILeaf) => a.parent.children.indexOf(a) - b.parent.children.indexOf(b)\nconst reverseOrder = (a: ILeaf, b: ILeaf) => b.parent.children.indexOf(b) - a.parent.children.indexOf(a)\n\nexport const EditorHelper = {\n\n group(list: IUI[], element?: IUI, userGroup?: IGroup | IGroupInputData): IGroup {\n list.sort(reverseOrder)\n const { app, parent } = list[0]\n\n let group: IGroup\n if (userGroup && (userGroup as IGroup).add) {\n group = userGroup as IGroup\n } else {\n group = new Group(userGroup)\n }\n\n parent.addAt(group, parent.children.indexOf(list[0]))\n list.sort(order)\n\n const matrx = new Matrix(element.worldTransform)\n matrx.divideParent(parent.worldTransform)\n group.setTransform(matrx)\n group.editable = true\n group.hitChildren = false\n\n app.lockLayout()\n list.forEach(child => child.dropTo(group))\n app.unlockLayout()\n\n return group\n },\n\n ungroup(list: IUI[]): IUI[] {\n const { app } = list[0]\n const ungroupList: IUI[] = []\n\n app.lockLayout()\n list.forEach(leaf => {\n if (leaf.isBranch) {\n const { parent, children } = leaf\n while (children.length) {\n ungroupList.push(children[0])\n children[0].dropTo(parent, parent.children.indexOf(leaf))\n }\n if (leaf.isBranchLeaf) ungroupList.push(leaf)\n else leaf.remove()\n } else {\n ungroupList.push(leaf)\n }\n })\n app.unlockLayout()\n\n return ungroupList\n },\n\n toTop(list: IUI[]): void {\n list.sort(order)\n list.forEach(leaf => {\n if (leaf.parent) leaf.parent.add(leaf)\n })\n },\n\n toBottom(list: IUI[]): void {\n list.sort(reverseOrder)\n list.forEach(leaf => {\n if (leaf.parent) leaf.parent.addAt(leaf, 0)\n })\n }\n\n}","import { IObject } from '@leafer-ui/interface'\nimport { Debug } from '@leafer-ui/draw'\n\nimport { IEditTool, IEditor } from '@leafer-in/interface'\n\n\nconst debug = Debug.get('EditToolCreator')\n\nexport function registerEditTool() {\n return (target: IObject) => {\n EditToolCreator.register(target)\n }\n}\n\nexport const registerInnerEditor = registerEditTool\n\nexport const EditToolCreator = {\n\n list: {} as IObject,\n\n register(EditTool: IObject): void {\n const { tag } = EditTool.prototype as IEditTool\n list[tag] && debug.repeat(tag)\n list[tag] = EditTool\n },\n\n get(tag: string, editor: IEditor): IEditTool {\n return new list[tag](editor)\n }\n\n}\n\nconst { list } = EditToolCreator","import { IInnerEditorEvent, IInnerEditor } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\nimport { IUI } from '@leafer-ui/interface'\nimport { } from '../tool/InnerEditor'\n\n\nexport class InnerEditorEvent extends EditorEvent implements IInnerEditorEvent {\n\n static BEFORE_OPEN = 'innerEditor.before_open'\n static OPEN = 'innerEditor.open'\n\n static BEFORE_CLOSE = 'innerEditor.before_close'\n static CLOSE = 'innerEditor.close'\n\n readonly editTarget: IUI\n readonly innerEditor: IInnerEditor\n\n constructor(type: string, data?: IInnerEditorEvent) {\n super(type, data)\n }\n\n}","import { IEditorGroupEvent } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\nimport { IGroup } from '@leafer-ui/interface'\nimport { } from '../tool/InnerEditor'\n\n\nexport class EditorGroupEvent extends EditorEvent implements IEditorGroupEvent {\n\n\n static BEFORE_GROUP = 'editor.before_group'\n static GROUP = 'editor.group'\n\n static BEFORE_UNGROUP = 'editor.before_ungroup'\n static UNGROUP = 'editor.ungroup'\n\n static BEFORE_OPEN = 'editor.before_open_group'\n static OPEN = 'editor.open_group'\n\n static BEFORE_CLOSE = 'editor.before_close_group'\n static CLOSE = 'editor.close_group'\n\n readonly editTarget: IGroup\n\n constructor(type: string, data?: IEditorGroupEvent) {\n super(type, data)\n }\n\n}","import { IObject, IFunction, IMatrix } from '@leafer-ui/interface'\nimport { LeafHelper, Matrix, PropertyEvent, Rect } from '@leafer-ui/draw'\n\nimport { IEditor, ISimulateElement } from '@leafer-in/interface'\n\n\nconst { updateMatrix } = LeafHelper\nconst checkMap: IObject = { x: 1, y: 1, scaleX: 1, scaleY: 1, rotation: 1, skewX: 1, skewY: 1 }, origin = 'top-left'\n\nexport class SimulateElement extends Rect implements ISimulateElement {\n\n public get __tag() { return 'SimulateElement' }\n\n public checkChange = true\n\n public canChange = true\n\n public changedTransform: IMatrix\n\n\n constructor(editor: IEditor) {\n super()\n\n this.visible = this.hittable = false\n\n this.on(PropertyEvent.CHANGE, (event: PropertyEvent) => {\n\n if (this.checkChange && checkMap[event.attrName]) {\n\n const { attrName, newValue, oldValue } = event\n const addValue = attrName[0] === 's' ? (<number>newValue || 1) / (<number>oldValue || 1) : (<number>newValue || 0) - (<number>oldValue || 0)\n\n this.canChange = false\n\n const data: IObject = this.__\n\n // old matrix\n data[attrName] = oldValue\n updateMatrix(this.parent)\n updateMatrix(this)\n\n const oldMatrix = new Matrix(this.__world)\n\n // new matrix\n data[attrName] = newValue\n this.__layout.rotationChange()\n updateMatrix(this)\n\n this.changedTransform = new Matrix(this.__world).divide(oldMatrix) // world change transform\n\n switch (attrName) {\n case 'x':\n editor.move(addValue, 0)\n break\n case 'y':\n editor.move(0, addValue)\n break\n case 'rotation':\n editor.rotateOf(origin, addValue)\n break\n case 'scaleX':\n editor.scaleOf(origin, addValue, 1)\n break\n case 'scaleY':\n editor.scaleOf(origin, 1, addValue)\n break\n case 'skewX':\n editor.skewOf(origin, addValue, 0)\n break\n case 'skewY':\n editor.skewOf(origin, 0, addValue)\n }\n\n this.canChange = true\n\n }\n })\n }\n\n public safeChange(changeFn: IFunction): void {\n if (this.canChange) {\n this.checkChange = false\n changeFn()\n this.checkChange = true\n }\n }\n}","import { IGroupInputData, IUI, IEventListenerId, IPointData, ILeafList, IEditSize, IGroup, IObject, IAlign, IAxis, IFunction, IMatrix, IApp } from '@leafer-ui/interface'\nimport { Group, DataHelper, MathHelper, LeafList, Matrix, RenderEvent, LeafHelper, Direction9, Plugin } from '@leafer-ui/draw'\nimport { DragEvent, RotateEvent, KeyEvent, ZoomEvent, MoveEvent } from '@leafer-ui/core'\n\nimport { IEditBox, IEditPoint, IEditor, IEditorConfig, IEditTool, IEditorScaleEvent, IInnerEditor, ISimulateElement, IEditorMoveEvent, IEditorRotateEvent, IEditorSkewEvent } from '@leafer-in/interface'\n\nimport { EditorMoveEvent } from './event/EditorMoveEvent'\nimport { EditorScaleEvent } from './event/EditorScaleEvent'\nimport { EditorRotateEvent } from './event/EditorRotateEvent'\nimport { EditorSkewEvent } from './event/EditorSkewEvent'\n\nimport { EditSelect } from './display/EditSelect'\nimport { EditBox } from './display/EditBox'\nimport { EditMask } from './display/EditMask'\n\nimport { config } from './config'\n\nimport { onTarget, onHover } from './editor/target'\nimport { targetAttr, mergeConfigAttr } from './decorator/data'\nimport { EditorHelper } from './helper/EditorHelper'\nimport { EditDataHelper } from './helper/EditDataHelper'\nimport { simulate } from './editor/simulate'\nimport { updateCursor } from './editor/cursor'\nimport { EditToolCreator } from './tool/EditToolCreator'\nimport { InnerEditorEvent } from './event/InnerEditorEvent'\nimport { EditorGroupEvent } from './event/EditorGroupEvent'\nimport { SimulateElement } from './display/SimulateElement'\n\n\nexport class Editor extends Group implements IEditor {\n\n public config: IEditorConfig\n\n @mergeConfigAttr()\n readonly mergeConfig: IEditorConfig\n readonly mergedConfig: IEditorConfig\n\n @targetAttr(onHover)\n public hoverTarget?: IUI\n\n @targetAttr(onTarget)\n public target?: IUI | IUI[]\n\n // 列表\n\n public leafList: ILeafList = new LeafList() // from target\n public get list(): IUI[] { return this.leafList.list as IUI[] }\n public get dragHoverExclude(): IUI[] { return [this.editBox.rect] }\n public openedGroupList: ILeafList = new LeafList()\n\n // 状态\n\n public get editing(): boolean { return !!this.list.length }\n public innerEditing: boolean\n public get groupOpening(): boolean { return !!this.openedGroupList.length }\n public resizeDirection?: Direction9\n\n public get multiple(): boolean { return this.list.length > 1 }\n public get single(): boolean { return this.list.length === 1 }\n\n public get dragging(): boolean { return this.editBox.dragging }\n public get moving(): boolean { return this.editBox.moving }\n public get dragPoint(): IEditPoint { return this.editBox.dragPoint }\n\n // 组件\n\n public get element() { return this.multiple ? this.simulateTarget : this.list[0] as ISimulateElement }\n public simulateTarget: ISimulateElement = new SimulateElement(this)\n\n public editBox: IEditBox = new EditBox(this)\n public get buttons() { return this.editBox.buttons }\n\n public editTool?: IEditTool\n\n public innerEditor?: IInnerEditor\n public editToolList: IObject = {}\n\n public selector: EditSelect = new EditSelect(this)\n public editMask: EditMask = new EditMask(this)\n\n public targetChanged: boolean\n public targetEventIds: IEventListenerId[] = []\n\n\n constructor(userConfig?: IEditorConfig, data?: IGroupInputData) {\n super(data)\n let mergedConfig: IEditorConfig = DataHelper.clone(config)\n if (userConfig) mergedConfig = DataHelper.default(userConfig, mergedConfig)\n this.mergedConfig = this.config = mergedConfig\n\n this.addMany(this.editMask, this.selector, this.editBox)\n if (!Plugin.has('resize')) this.config.editSize = 'scale'\n }\n\n // select \n\n public select(target: IUI | IUI[]): void {\n this.target = target\n }\n\n public cancel(): void {\n this.target = null\n }\n\n // item\n\n public hasItem(item: IUI): boolean {\n return this.leafList.has(item)\n }\n\n public addItem(item: IUI): void {\n if (!this.hasItem(item) && !item.locked) this.leafList.add(item), this.target = this.leafList.list as IUI[]\n }\n\n public removeItem(item: IUI): void {\n if (this.hasItem(item)) this.leafList.remove(item), this.target = this.leafList.list as IUI[]\n }\n\n public shiftItem(item: IUI): void {\n this.hasItem(item) ? this.removeItem(item) : this.addItem(item)\n }\n\n // update\n\n public update(): void {\n if (this.editing) {\n if (!this.element.parent) return this.cancel()\n if (this.innerEditing) this.innerEditor.update()\n this.editTool.update()\n this.selector.update()\n }\n }\n\n public updateEditBox(): void {\n if (this.multiple) simulate(this)\n this.update()\n }\n\n public updateEditTool(): void {\n const tool = this.editTool\n if (tool) {\n this.editBox.unload()\n tool.unload()\n this.editTool = null\n }\n\n if (this.editing) {\n const tag = this.single ? this.list[0].editOuter as string : 'EditTool'\n this.editTool = this.editToolList[tag] = this.editToolList[tag] || EditToolCreator.get(tag, this)\n this.editBox.load()\n this.editTool.load()\n }\n }\n\n\n // get\n\n public getEditSize(_ui: IUI): IEditSize {\n return this.mergeConfig.editSize\n }\n\n // operate\n\n public onMove(e: DragEvent | MoveEvent): void {\n if (e instanceof MoveEvent) {\n\n if (e.moveType !== 'drag') {\n const { moveable, resizeable } = this.mergeConfig\n const move = e.getLocalMove(this.element)\n if (moveable === 'move') e.stop(), this.move(move.x, move.y)\n else if (resizeable === 'zoom') e.stop()\n }\n\n } else {\n\n const total = { x: e.totalX, y: e.totalY }\n\n if (e.shiftKey) {\n if (Math.abs(total.x) > Math.abs(total.y)) total.y = 0\n else total.x = 0\n }\n\n this.move(DragEvent.getValidMove(this.element, this.editBox.dragStartData.point, total))\n\n }\n }\n\n public onScale(e: DragEvent | ZoomEvent): void {\n const { element } = this\n let { around, lockRatio, resizeable, flipable, editSize } = this.mergeConfig\n\n if (e instanceof ZoomEvent) {\n\n if (resizeable === 'zoom') e.stop(), this.scaleOf(element.getBoxPoint(e), e.scale, e.scale)\n\n } else {\n\n const { direction } = e.current as IEditPoint\n\n if (e.shiftKey || element.lockRatio) lockRatio = true\n\n const data = EditDataHelper.getScaleData(element, this.editBox.dragStartData.bounds, direction, e.getInnerTotal(element), lockRatio, EditDataHelper.getAround(around, e.altKey), flipable, this.multiple || editSize === 'scale')\n\n if (this.editTool.onScaleWithDrag) {\n data.drag = e\n this.scaleWithDrag(data)\n } else {\n this.scaleOf(data.origin, data.scaleX, data.scaleY)\n }\n\n }\n }\n\n public onRotate(e: DragEvent | RotateEvent): void {\n const { skewable, rotateable, around, rotateGap } = this.mergeConfig\n const { direction, name } = e.current as IEditPoint\n if (skewable && name === 'resize-line') return this.onSkew(e as DragEvent)\n\n const { element } = this, { dragStartData } = this.editBox\n let origin: IPointData, rotation: number\n\n if (e instanceof RotateEvent) {\n\n if (rotateable === 'rotate') e.stop(), rotation = e.rotation, origin = element.getBoxPoint(e)\n else return\n\n if (element.scaleX * element.scaleY < 0) rotation = -rotation // flippedOne\n\n } else {\n\n const data = EditDataHelper.getRotateData(element.boxBounds, direction, e.getBoxPoint(element), element.getBoxPoint(dragStartData), e.shiftKey ? null : (element.around || element.origin || around || 'center'))\n rotation = data.rotation\n origin = data.origin\n\n }\n\n if (element.scaleX * element.scaleY < 0) rotation = -rotation // flippedOne\n if (e instanceof DragEvent) rotation = dragStartData.rotation + rotation - element.rotation\n\n rotation = MathHelper.float(MathHelper.getGapRotation(rotation, rotateGap, element.rotation), 2)\n if (!rotation) return\n\n this.rotateOf(origin, rotation)\n }\n\n\n public onSkew(e: DragEvent): void {\n const { element } = this\n const { around } = this.mergeConfig\n\n const { origin, skewX, skewY } = EditDataHelper.getSkewData(element.boxBounds, (e.current as IEditPoint).direction, e.getInnerMove(element), EditDataHelper.getAround(around, e.altKey))\n if (!skewX && !skewY) return\n\n this.skewOf(origin, skewX, skewY)\n }\n\n\n // transform\n\n public move(x: number | IPointData, y = 0): void {\n if (!this.checkTransform('moveable')) return\n if (typeof x === 'object') y = x.y, x = x.x\n\n const { element: target } = this, { beforeMove } = this.mergeConfig\n if (beforeMove) {\n const check = beforeMove({ target, x, y })\n if (typeof check === 'object') x = check.x, y = check.y\n else if (check === false) return\n }\n\n const world = target.getWorldPointByLocal({ x, y }, null, true)\n if (this.multiple) target.safeChange(() => target.move(x, y))\n const data: IEditorMoveEvent = { target, editor: this, moveX: world.x, moveY: world.y }\n\n this.emitEvent(new EditorMoveEvent(EditorMoveEvent.BEFORE_MOVE, data))\n const event = new EditorMoveEvent(EditorMoveEvent.MOVE, data)\n this.editTool.onMove(event)\n this.emitEvent(event)\n }\n\n public scaleWithDrag(data: IEditorScaleEvent): void {\n if (!this.checkTransform('resizeable')) return\n\n const { element: target } = this, { beforeScale } = this.mergeConfig\n if (beforeScale) {\n const { origin, scaleX, scaleY, drag } = data\n const check = beforeScale({ target, drag, origin, scaleX, scaleY })\n if (check === false) return\n }\n\n data = { ...data, target, editor: this, worldOrigin: target.getWorldPoint(data.origin) }\n\n this.emitEvent(new EditorScaleEvent(EditorScaleEvent.BEFORE_SCALE, data))\n const event = new EditorScaleEvent(EditorScaleEvent.SCALE, data)\n this.editTool.onScaleWithDrag(event)\n this.emitEvent(event)\n }\n\n\n override scaleOf(origin: IPointData | IAlign, scaleX: number, scaleY = scaleX, _resize?: boolean): void {\n if (!this.checkTransform('resizeable')) return\n\n const { element: target } = this, { beforeScale } = this.mergeConfig\n if (beforeScale) {\n const check = beforeScale({ target, origin, scaleX, scaleY })\n if (typeof check === 'object') scaleX = check.scaleX, scaleY = check.scaleY\n else if (check === false) return\n }\n\n const worldOrigin = this.getWorldOrigin(origin)\n const transform = this.multiple && this.getChangedTransform(() => target.safeChange(() => target.scaleOf(origin, scaleX, scaleY)))\n const data: IEditorScaleEvent = { target, editor: this, worldOrigin, scaleX, scaleY, transform }\n\n this.emitEvent(new EditorScaleEvent(EditorScaleEvent.BEFORE_SCALE, data))\n const event = new EditorScaleEvent(EditorScaleEvent.SCALE, data)\n this.editTool.onScale(event)\n this.emitEvent(event)\n }\n\n override flip(axis: IAxis): void {\n if (!this.checkTransform('resizeable')) return\n\n const { element } = this\n const worldOrigin = this.getWorldOrigin('center')\n const transform = this.multiple ? this.getChangedTransform(() => element.safeChange(() => element.flip(axis))) : new Matrix(LeafHelper.getFlipTransform(element, axis))\n const data: IEditorScaleEvent = { target: element, editor: this, worldOrigin, scaleX: axis === 'x' ? -1 : 1, scaleY: axis === 'y' ? -1 : 1, transform }\n\n this.emitEvent(new EditorScaleEvent(EditorScaleEvent.BEFORE_SCALE, data))\n const event = new EditorScaleEvent(EditorScaleEvent.SCALE, data)\n this.editTool.onScale(event)\n this.emitEvent(event)\n }\n\n override rotateOf(origin: IPointData | IAlign, rotation: number): void {\n if (!this.checkTransform('rotateable')) return\n\n const { element: target } = this, { beforeRotate } = this.mergeConfig\n if (beforeRotate) {\n const check = beforeRotate({ target, origin, rotation })\n if (typeof check === 'number') rotation = check\n else if (check === false) return\n }\n\n const worldOrigin = this.getWorldOrigin(origin)\n const transform = this.multiple && this.getChangedTransform(() => target.safeChange(() => target.rotateOf(origin, rotation)))\n const data: IEditorRotateEvent = { target, editor: this, worldOrigin, rotation, transform }\n\n this.emitEvent(new EditorRotateEvent(EditorRotateEvent.BEFORE_ROTATE, data))\n const event = new EditorRotateEvent(EditorRotateEvent.ROTATE, data)\n this.editTool.onRotate(event)\n this.emitEvent(event)\n }\n\n override skewOf(origin: IPointData | IAlign, skewX: number, skewY = 0, _resize?: boolean): void {\n if (!this.checkTransform('skewable')) return\n\n const { element: target } = this, { beforeSkew } = this.mergeConfig\n if (beforeSkew) {\n const check = beforeSkew({ target, origin, skewX, skewY })\n if (typeof check === 'object') skewX = check.skewX, skewY = check.skewY\n else if (check === false) return\n }\n\n const worldOrigin = this.getWorldOrigin(origin)\n const transform = this.multiple && this.getChangedTransform(() => target.safeChange(() => target.skewOf(origin, skewX, skewY)))\n const data: IEditorSkewEvent = { target, editor: this, worldOrigin, skewX, skewY, transform }\n\n this.emitEvent(new EditorSkewEvent(EditorSkewEvent.BEFORE_SKEW, data))\n const event = new EditorSkewEvent(EditorSkewEvent.SKEW, data)\n this.editTool.onSkew(event)\n this.emitEvent(event)\n }\n\n public checkTransform(type: 'moveable' | 'resizeable' | 'rotateable' | 'skewable'): boolean { return this.element && !this.element.locked && this.mergeConfig[type] as boolean }\n\n protected getWorldOrigin(origin: IPointData | IAlign): IPointData {\n return this.element.getWorldPoint(LeafHelper.getInnerOrigin(this.element, origin))\n }\n\n protected getChangedTransform(func: IFunction): IMatrix {\n const { element } = this\n if (this.multiple && !element.canChange) return element.changedTransform\n\n const oldMatrix = new Matrix(element.worldTransform)\n func()\n return new Matrix(element.worldTransform).divide(oldMatrix) // world change transform\n }\n\n\n // group\n\n public group(userGroup?: IGroup | IGroupInputData): IGroup {\n if (this.multiple) {\n this.emitGroupEvent(EditorGroupEvent.BEFORE_GROUP)\n this.target = EditorHelper.group(this.list, this.element, userGroup)\n this.emitGroupEvent(EditorGroupEvent.GROUP, this.target as IGroup)\n }\n return this.target as IGroup\n }\n\n public ungroup(): IUI[] {\n const { list } = this\n if (list.length) {\n list.forEach(item => item.isBranch && this.emitGroupEvent(EditorGroupEvent.BEFORE_UNGROUP, item as IGroup))\n this.target = EditorHelper.ungroup(list)\n list.forEach(item => item.isBranch && this.emitGroupEvent(EditorGroupEvent.UNGROUP, item as IGroup))\n }\n return this.list\n }\n\n public openGroup(group: IGroup): void {\n this.emitGroupEvent(EditorGroupEvent.BEFORE_OPEN, group)\n this.openedGroupList.add(group)\n group.hitChildren = true\n this.emitGroupEvent(EditorGroupEvent.OPEN, group)\n }\n\n public closeGroup(group: IGroup): void {\n this.emitGroupEvent(EditorGroupEvent.BEFORE_CLOSE, group)\n this.openedGroupList.remove(group)\n group.hitChildren = false\n this.emitGroupEvent(EditorGroupEvent.CLOSE, group)\n }\n\n public checkOpenedGroups(): void {\n const opened = this.openedGroupList\n if (opened.length) {\n let { list } = opened\n if (this.editing) list = [], opened.forEach(item => this.list.every(leaf => !LeafHelper.hasParent(leaf, item)) && list.push(item))\n list.forEach(item => this.closeGroup(item as IGroup))\n }\n if (this.editing && !this.selector.dragging) this.checkDeepSelect()\n }\n\n public checkDeepSelect(): void {\n let parent: IGroup, { list } = this\n for (let i = 0; i < list.length; i++) {\n parent = list[i].parent\n while (parent && !parent.hitChildren) {\n this.openGroup(parent)\n parent = parent.parent\n }\n }\n }\n\n public emitGroupEvent(type: string, group?: IGroup): void {\n const event = new EditorGroupEvent(type, { editTarget: group })\n this.emitEvent(event)\n if (group) group.emitEvent(event)\n }\n\n // inner\n\n public openInnerEditor(target?: IUI, select?: boolean): void {\n if (target && select) this.target = target\n if (this.single) {\n const editTarget = target || this.element\n const tag = editTarget.editInner\n if (tag && EditToolCreator.list[tag]) {\n this.editTool.unload()\n this.innerEditing = true\n this.innerEditor = this.editToolList[tag] || EditToolCreator.get(tag, this)\n this.innerEditor.editTarget = editTarget\n\n this.emitInnerEvent(InnerEditorEvent.BEFORE_OPEN)\n this.innerEditor.load()\n this.emitInnerEvent(InnerEditorEvent.OPEN)\n }\n }\n }\n\n public closeInnerEditor(): void {\n if (this.innerEditing) {\n this.innerEditing = false\n\n this.emitInnerEvent(InnerEditorEvent.BEFORE_CLOSE)\n this.innerEditor.unload()\n this.emitInnerEvent(InnerEditorEvent.CLOSE)\n\n this.editTool.load()\n this.innerEditor = null\n }\n }\n\n public emitInnerEvent(type: string): void {\n const { innerEditor } = this, { editTarget } = innerEditor\n const event = new InnerEditorEvent(type, { editTarget, innerEditor })\n this.emitEvent(event)\n editTarget.emitEvent(event)\n }\n\n // lock\n\n public lock(): void {\n this.list.forEach(leaf => leaf.locked = true)\n this.update()\n }\n\n public unlock(): void {\n this.list.forEach(leaf => leaf.locked = false)\n this.update()\n }\n\n // level\n\n public toTop(): void {\n if (this.list.length) {\n EditorHelper.toTop(this.list)\n this.leafList.update()\n }\n }\n\n public toBottom(): void {\n if (this.list.length) {\n EditorHelper.toBottom(this.list)\n this.leafList.update()\n }\n }\n\n protected onAppRenderStart(app: IApp): void {\n if (this.targetChanged = app.children.some(leafer => leafer !== this.leafer && leafer.renderer.changed)) this.editBox.forceRender()\n }\n\n protected onRenderStart(): void {\n if (this.targetChanged) this.update()\n }\n\n protected onKey(e: KeyEvent): void {\n updateCursor(this, e)\n }\n\n // event \n\n public listenTargetEvents(): void {\n if (!this.targetEventIds.length) {\n const { app, leafer, editBox, editMask } = this\n this.targetEventIds = [\n leafer.on_(RenderEvent.START, this.onRenderStart, this),\n\n app.on_([\n [RenderEvent.CHILD_START, this.onAppRenderStart, this],\n\n [MoveEvent.BEFORE_MOVE, this.onMove, this, true],\n [ZoomEvent.BEFORE_ZOOM, this.onScale, this, true],\n [RotateEvent.BEFORE_ROTATE, this.onRotate, this, true],\n\n [[KeyEvent.HOLD, KeyEvent.UP], this.onKey, this],\n [KeyEvent.DOWN, editBox.onArrow, editBox]\n ])\n ]\n if (editMask.visible) editMask.forceRender()\n }\n }\n\n public removeTargetEvents(): void {\n const { targetEventIds, editMask } = this\n if (targetEventIds.length) {\n this.off_(targetEventIds)\n if (editMask.visible) editMask.forceRender()\n }\n }\n\n public destroy(): void {\n if (!this.destroyed) {\n this.target = this.hoverTarget = null\n\n Object.values(this.editToolList).forEach(item => item.destroy())\n this.simulateTarget.destroy()\n\n this.editToolList = {}\n this.simulateTarget = this.editTool = this.innerEditor = null\n\n super.destroy()\n }\n }\n\n}","import { LeafList } from '@leafer-ui/draw'\n\nimport { IEditor, IUI } from '@leafer-in/interface'\n\nimport { simulate } from './simulate'\nimport { updateMoveCursor } from './cursor'\nimport { EditorEvent } from '../event/EditorEvent'\n\n\nexport function onTarget(editor: IEditor, oldValue: IUI | IUI[]): void {\n const { target } = editor\n if (target) {\n editor.leafList = target instanceof LeafList ? target : new LeafList(target)\n if (editor.multiple) simulate(editor) // 更新模拟元素\n } else {\n editor.simulateTarget.remove()\n editor.leafList.reset()\n editor.closeInnerEditor()\n }\n\n editor.emitEvent(new EditorEvent(EditorEvent.SELECT, { editor, value: target, oldValue }))\n editor.checkOpenedGroups()\n\n if (editor.editing) {\n editor.waitLeafer(() => {\n updateMoveCursor(editor)\n editor.updateEditTool()\n editor.update()\n editor.listenTargetEvents()\n })\n } else {\n editor.updateEditTool()\n editor.removeTargetEvents()\n }\n}\n\n\nexport function onHover(editor: IEditor, oldValue: IUI): void {\n editor.emitEvent(new EditorEvent(EditorEvent.HOVER, { editor, value: editor.hoverTarget, oldValue }))\n}","import { IGroup, IEventListenerId, IUI, IObject } from '@leafer-ui/interface'\nimport { IInnerEditor, IEditor, IEditBox } from '@leafer-in/interface'\n\nimport { Group } from '@leafer-ui/draw'\nimport { EditToolCreator } from './EditToolCreator'\n\nexport class InnerEditor implements IInnerEditor {\n\n static registerInnerEditor() {\n EditToolCreator.register(this)\n }\n\n\n public get tag() { return 'InnerEditor' }\n\n public editTarget: IUI\n\n public config: IObject\n\n public editor: IEditor\n public get editBox(): IEditBox { return this.editor.editBox }\n\n public view: IGroup\n\n public eventIds: IEventListenerId[]\n\n\n constructor(editor: IEditor) {\n this.editor = editor\n this.create()\n }\n\n\n public onCreate(): void { }\n public create(): void {\n this.view = new Group()\n this.onCreate()\n }\n\n\n // 状态\n\n public onLoad(): void { }\n public load(): void {\n const { editor } = this\n if (editor) {\n if (editor.app) editor.selector.hittable = editor.app.tree.hitChildren = false\n this.onLoad()\n }\n }\n\n public onUpdate(): void { }\n public update(): void { this.onUpdate() }\n\n public onUnload(): void { }\n public unload(): void {\n const { editor } = this\n if (editor) {\n if (editor.app) editor.selector.hittable = editor.app.tree.hitChildren = true\n this.onUnload()\n }\n }\n\n public onDestroy(): void { }\n public destroy(): void {\n this.onDestroy()\n if (this.editor) {\n if (this.view) this.view.destroy()\n if (this.eventIds) this.editor.off_(this.eventIds)\n this.editor = this.view = this.eventIds = null\n }\n }\n\n}","import { IEditorScaleEvent, IEditorRotateEvent, IEditTool, IEditorSkewEvent, IEditorMoveEvent } from '@leafer-in/interface'\n\nimport { registerEditTool, EditToolCreator } from './EditToolCreator'\nimport { InnerEditor } from './InnerEditor'\n\n\n@registerEditTool()\nexport class EditTool extends InnerEditor implements IEditTool {\n\n static registerEditTool() {\n EditToolCreator.register(this)\n }\n\n\n public get tag() { return 'EditTool' }\n\n\n // 操作\n\n public onMove(e: IEditorMoveEvent): void {\n const { moveX, moveY, editor } = e\n const { app, list } = editor\n app.lockLayout()\n list.forEach(target => { target.moveWorld(moveX, moveY) })\n app.unlockLayout()\n }\n\n public onScale(e: IEditorScaleEvent): void {\n const { scaleX, scaleY, transform, worldOrigin, editor } = e\n const { app, list } = editor\n app.lockLayout()\n list.forEach(target => {\n const resize = editor.getEditSize(target) !== 'scale'\n if (transform) target.transformWorld(transform, resize)\n else target.scaleOfWorld(worldOrigin, scaleX, scaleY, resize)\n })\n app.unlockLayout()\n }\n\n public onRotate(e: IEditorRotateEvent): void {\n const { rotation, transform, worldOrigin, editor } = e\n const { app, list } = editor\n app.lockLayout()\n list.forEach(target => {\n const resize = editor.getEditSize(target) !== 'scale'\n if (transform) target.transformWorld(transform, resize)\n else target.rotateOfWorld(worldOrigin, rotation)\n })\n app.unlockLayout()\n }\n\n public onSkew(e: IEditorSkewEvent): void {\n const { skewX, skewY, transform, worldOrigin, editor } = e\n const { app, list } = editor\n app.lockLayout()\n list.forEach(target => {\n const resize = editor.getEditSize(target) !== 'scale'\n if (transform) target.transformWorld(transform, resize)\n else target.skewOfWorld(worldOrigin, skewX, skewY, resize)\n })\n app.unlockLayout()\n }\n\n // 状态\n\n public load(): void {\n this.editBox.view.visible = true\n this.onLoad()\n }\n\n public update(): void {\n const { editor, editBox } = this\n const { x, y, scaleX, scaleY, rotation, skewX, skewY, width, height } = editor.element.getLayoutBounds('box', editor, true)\n editBox.set({ x, y, scaleX, scaleY, rotation, skewX, skewY })\n editBox.update({ x: 0, y: 0, width, height })\n this.onUpdate()\n }\n\n public unload(): void {\n this.editBox.view.visible = false\n this.onUnload()\n }\n\n}","import { IEditorScaleEvent, ILine, IEditorSkewEvent, IPointData, IAround, IPathCommandData, IFromToData, IUI, IDragEvent } from '@leafer-in/interface'\n\nimport { getPointData, Direction9, PointHelper } from '@leafer-ui/draw'\n\nimport { EditTool } from './EditTool'\nimport { registerEditTool } from './EditToolCreator'\n\n\nconst { left, right } = Direction9\nconst { move, copy, toNumberPoints } = PointHelper\n\n@registerEditTool()\nexport class LineEditTool extends EditTool {\n\n public get tag() { return 'LineEditTool' }\n\n public scaleOfEvent = true\n\n onScaleWithDrag(e: IEditorScaleEvent): void {\n const { drag, direction, lockRatio, around } = e\n const line = e.target as ILine\n const isDragFrom = direction === left\n\n if (line.pathInputed) {\n\n const { path } = line.__\n const { from, to } = this.getFromToByPath(path)\n\n this.dragPoint(from, to, isDragFrom, around, this.getInnerMove(line, drag, lockRatio))\n\n path[1] = from.x, path[2] = from.y\n path[4] = to.x, path[5] = to.y\n line.path = path\n\n } else if (line.points) {\n\n const { points } = line\n const { from, to } = this.getFromToByPoints(points)\n\n this.dragPoint(from, to, isDragFrom, around, this.getInnerMove(line, drag, lockRatio))\n\n points[0] = from.x, points[1] = from.y\n points[2] = to.x, points[3] = to.y\n line.points = points\n\n } else {\n\n const from = getPointData()\n const { toPoint } = line\n line.rotation = 0\n\n this.dragPoint(from, toPoint, isDragFrom, around, this.getInnerMove(line, drag, lockRatio))\n\n line.getLocalPointByInner(from, null, null, true)\n line.getLocalPointByInner(toPoint, null, null, true)\n line.x = from.x\n line.y = from.y\n\n line.getInnerPointByLocal(toPoint, null, null, true)\n line.toPoint = toPoint\n\n }\n\n }\n\n getInnerMove(ui: IUI, event: IDragEvent, lockRatio: boolean | 'corner'): IPointData {\n const movePoint = event.getInnerMove(ui)\n if (lockRatio) Math.abs(movePoint.x) > Math.abs(movePoint.y) ? movePoint.y = 0 : movePoint.x = 0\n return movePoint\n }\n\n getFromToByPath(path: IPathCommandData): IFromToData {\n return {\n from: { x: path[1], y: path[2] },\n to: { x: path[4], y: path[5] }\n }\n }\n\n getFromToByPoints(originPoints: number[] | IPointData[]): IFromToData {\n const points = toNumberPoints(originPoints)\n return {\n from: { x: points[0], y: points[1] },\n to: { x: points[2], y: points[3] }\n }\n\n }\n\n dragPoint(fromPoint: IPointData, toPoint: IPointData, isDragFrom: boolean, around: IAround, movePoint: IPointData): void {\n const { x, y } = movePoint\n if (isDragFrom) {\n move(fromPoint, x, y)\n if (around) move(toPoint, -x, -y)\n } else {\n if (around) move(fromPoint, -x, -y)\n move(toPoint, x, y)\n }\n }\n\n onSkew(_e: IEditorSkewEvent): void {\n\n }\n\n onUpdate() {\n const { editBox } = this, { rotatePoints, resizeLines, resizePoints, rect } = editBox\n const line = this.editor.element as ILine\n\n let fromTo: IFromToData, leftOrRight: boolean\n if (line.pathInputed) fromTo = this.getFromToByPath(line.__.path)\n else if (line.points) fromTo = this.getFromToByPoints(line.__.points)\n\n if (fromTo) {\n const { from, to } = fromTo\n line.innerToWorld(from, from, false, editBox)\n line.innerToWorld(to, to, false, editBox)\n rect.pen.clearPath().moveTo(from.x, from.y).lineTo(to.x, to.y)\n copy(resizePoints[7] as IPointData, from)\n copy(rotatePoints[7] as IPointData, from)\n copy(resizePoints[3] as IPointData, to)\n copy(rotatePoints[3] as IPointData, to)\n }\n\n for (let i = 0; i < 8; i++) {\n if (i < 4) resizeLines[i].visible = false\n leftOrRight = i === left || i === right\n resizePoints[i].visible = leftOrRight\n rotatePoints[i].visible = fromTo ? false : leftOrRight\n }\n }\n\n}","export { Editor } from './Editor'\n\nexport { EditBox } from './display/EditBox'\nexport { EditPoint } from './display/EditPoint'\nexport { EditSelect } from './display/EditSelect'\nexport { SelectArea } from './display/SelectArea'\nexport { Stroker } from './display/Stroker'\n\n\nexport { EditorEvent } from './event/EditorEvent'\nexport { EditorMoveEvent } from './event/EditorMoveEvent'\nexport { EditorScaleEvent } from './event/EditorScaleEvent'\nexport { EditorRotateEvent } from './event/EditorRotateEvent'\nexport { EditorSkewEvent } from './event/EditorSkewEvent'\nexport { EditorGroupEvent } from './event/EditorGroupEvent'\nexport { InnerEditorEvent } from './event/InnerEditorEvent'\n\nexport { EditToolCreator, registerEditTool, registerInnerEditor } from './tool/EditToolCreator'\nexport { InnerEditor } from './tool/InnerEditor'\nexport { EditTool } from './tool/EditTool'\nexport { LineEditTool } from './tool/LineEditTool'\n\nexport { EditorHelper } from './helper/EditorHelper'\nexport { EditDataHelper } from './helper/EditDataHelper'\nexport { EditSelectHelper } from './helper/EditSelectHelper'\n\n\nimport { IEditor, IEditorConfig, IEditToolFunction, IEditorConfigFunction, IApp } from '@leafer-in/interface'\nimport { Creator, UI, Group, Text, Box, dataType, Plugin } from '@leafer-ui/draw'\n\nimport '@leafer-in/resize'\n\nimport { Editor } from './Editor'\n\n\nPlugin.add('editor', 'resize')\n\n\nCreator.editor = function (options?: IEditorConfig, app?: IApp): IEditor {\n const editor = new Editor(options)\n if (app) app.sky.add(app.editor = editor)\n return editor\n}\n\nBox.addAttr('textBox', false, dataType)\n\nUI.addAttr('editConfig', undefined, dataType)\nUI.addAttr('editOuter', (ui: UI) => ui.__.__isLinePath ? 'LineEditTool' : 'EditTool', dataType)\n\nUI.addAttr('editInner', 'PathEditor', dataType)\nGroup.addAttr('editInner', '', dataType) // 必须设为空\nText.addAttr('editInner', 'TextEditor', dataType)\n\nUI.setEditConfig = function (config: IEditorConfig | IEditorConfigFunction): void { this.changeAttr('editConfig', config) }\nUI.setEditOuter = function (toolName: string | IEditToolFunction): void { this.changeAttr('editOuter', toolName) }\nUI.setEditInner = function (editorName: string | IEditToolFunction): void { this.changeAttr('editInner', editorName) }"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","toList","value","Array","SuppressedError","EditorEvent","Event","list","this","oldList","oldValue","constructor","type","data","super","assign","BEFORE_SELECT","SELECT","BEFORE_HOVER","HOVER","EditorMoveEvent","BEFORE_MOVE","MOVE","EditorScaleEvent","BEFORE_SCALE","SCALE","EditorRotateEvent","BEFORE_ROTATE","ROTATE","EditorSkewEvent","targetAttr","fn","privateKey","defineKey","get","set","old","config","isSelect","locked","splice","beforeSelect","check","hasEvent","emitEvent","editor","BEFORE_SKEW","SKEW","abs","Math","copy","scale","MatrixHelper","setListWithFn","BoundsHelper","worldBounds","LeafBoundsHelper","matrix","getMatrixData","bounds","getBoundsData","Stroker","UI","visible","hittable","strokeAlign","setTarget","style","update","__draw","canvas","options","leaf","__","stroke","strokeWidth","fill","worldTransform","worldRenderBounds","width","height","hit","aScaleX","scaleX","aScaleY","scaleY","half","setWorld","beginPath","x","y","__layout","boxBounds","rect","__useArrow","__drawPath","__pathForRender","__drawRenderPath","__drawPathByBox","Paint","strokes","fills","destroy","stroker","prototype","SelectArea","Group","strokeArea","Rect","fillArea","addMany","setStyle","userStyle","reset","opacity","setBounds","EditSelectHelper","findOne","path","find","editable","findByBounds","branch","eachFind","children","child","len","__world","isBranch","hitChildren","hitSelf","push","isFrame","includes","EditSelect","dragging","originList","running","mergeConfig","selector","isMoveMode","app","interaction","moveMode","hoverStroker","targetStroker","Bounds","selectArea","__eventIds","__listenEvents","onHover","hover","hoverStyle","hoverTarget","onSelect","selectedStyle","max","onPointerMove","e","canHover","findUI","hasItem","onBeforeDown","multiTouch","select","mobile","waitSelect","checkAndSelect","onTap","needRemoveItem","removeItem","allowSelect","isMultipleSelect","addItem","allow","shiftKey","onDragStart","allowDrag","area","getInnerPoint","leafList","clone","onDrag","onDragEnd","total","getInnerTotal","dragBounds","unsign","LeafList","selectList","forEach","item","has","some","index","onAutoMove","getLocalMove","leafer","boxSelect","multipleSelect","draggable","editing","middle","findDeepOne","exclude","editBox","findPath","continuousSelect","waitLeafer","proxy","on_","PointerEvent","BEFORE_DOWN","TAP","DragEvent","START","DRAG","END","MoveEvent","ZoomEvent","ZOOM","__removeListenEvents","off_","topLeft","top","topRight","right","bottomRight","bottom","bottomLeft","left","Direction9","toPoint","AroundHelper","within","MathHelper","EditDataHelper","getScaleData","element","startBounds","direction","totalMove","lockRatio","around","flipable","scaleMode","align","origin","widthRange","heightRange","worldBoxBounds","originChangedScaleX","originChangedScaleY","signX","signY","changedScaleX","changedScaleY","topScale","rightScale","bottomScale","leftScale","sqrt","useScaleX","useScaleY","allowBounds","parent","localBounds","__localBoxBounds","scaleOf","getLocalPointByInner","realBounds","getIntersect","fitScaleX","fitScaleY","nowWidth","nowHeight","min","getRotateData","current","last","rotation","PointHelper","getRotation","getSkewData","move","skewX","skewY","getAround","altKey","getRotateDirection","totalDirection","round","getFlipDirection","flipedX","flipedY","cacheCursors","updateCursor","point","enterPoint","name","pointType","cursor","resizeCursor","rotateCursor","skewCursor","resizeable","rotateable","skewable","flippedX","flippedY","showResize","metaKey","ctrlKey","formatRotation","url","toDataURL","updateMoveCursor","moveCursor","moveable","undefined","svg","encodeURIComponent","replace","toString","EditPoint","Box","useFastShadow","fourDirection","editConfig","EditBox","flipped","flippedOne","view","hitFill","hitStroke","hitRadius","circle","buttons","resizePoints","rotatePoints","resizeLines","dragStartData","create","rotatePoint","resizeLine","resizePoint","arounds","listenPointEvents","add","load","single","pointsStyle","getPointsStyle","middlePointsStyle","getMiddlePointsStyle","resizeP","getPointStyle","syncEventer","bottomList","multiple","editMask","middlePoint","hideOnSmall","mask","worldOpacity","smallSize","showPoints","rotateP","resizeL","directionData","floor","layoutCircle","layoutButtons","circleDirection","circleMargin","buttonsMargin","buttonsDirection","indexOf","setButtonPosition","buttonsFixed","useMiddlePoint","useX","sign","margin","unload","pointFill","pointSize","pointRadius","defaultStyle","cornerRadius","offsetX","offsetY","dragPoint","moving","hideOnMove","getLayoutBounds","ResizeEvent","resizingKeys","keys","onRotate","onScale","onSkew","onArrow","keyEvent","distance","code","onDoubleTap","openInner","onLongPress","editInner","textBox","Text","openInnerEditor","openGroup","events","LEAVE","ENTER","onMove","DOUBLE_TAP","LONG_PRESS","bigBounds","EditMask","__updateWorldBounds","__local","mergedConfig","fillWorld","saveBlendMode","__renderShape","__box","restoreBlendMode","filterStyle","editSize","rotateGap","simulate","simulateTarget","zoomLayer","safeChange","getBounds","order","a","b","reverseOrder","EditorHelper","group","userGroup","sort","addAt","matrx","Matrix","divideParent","setTransform","lockLayout","dropTo","unlockLayout","ungroup","ungroupList","isBranchLeaf","remove","toTop","toBottom","debug","Debug","registerEditTool","EditToolCreator","register","registerInnerEditor","EditTool","tag","repeat","InnerEditorEvent","BEFORE_OPEN","OPEN","BEFORE_CLOSE","CLOSE","EditorGroupEvent","BEFORE_GROUP","GROUP","BEFORE_UNGROUP","UNGROUP","updateMatrix","LeafHelper","checkMap","SimulateElement","__tag","checkChange","canChange","on","PropertyEvent","CHANGE","event","attrName","newValue","addValue","oldMatrix","rotationChange","changedTransform","divide","rotateOf","skewOf","changeFn","Editor","dragHoverExclude","groupOpening","openedGroupList","userConfig","editToolList","targetEventIds","DataHelper","default","Plugin","cancel","shiftItem","innerEditing","innerEditor","editTool","updateEditBox","updateEditTool","tool","editOuter","getEditSize","_ui","moveType","stop","totalX","totalY","getValidMove","getBoxPoint","onScaleWithDrag","drag","scaleWithDrag","RotateEvent","float","getGapRotation","getInnerMove","checkTransform","beforeMove","world","getWorldPointByLocal","moveX","moveY","beforeScale","worldOrigin","getWorldPoint","_resize","getWorldOrigin","transform","getChangedTransform","flip","axis","getFlipTransform","beforeRotate","beforeSkew","getInnerOrigin","func","emitGroupEvent","closeGroup","checkOpenedGroups","opened","every","hasParent","checkDeepSelect","editTarget","emitInnerEvent","closeInnerEditor","lock","unlock","onAppRenderStart","targetChanged","renderer","changed","forceRender","onRenderStart","onKey","listenTargetEvents","RenderEvent","CHILD_START","BEFORE_ZOOM","KeyEvent","HOLD","UP","DOWN","removeTargetEvents","destroyed","values","isNull","InnerEditor","onCreate","onLoad","tree","onUpdate","onUnload","onDestroy","eventIds","moveWorld","resize","transformWorld","scaleOfWorld","rotateOfWorld","skewOfWorld","toNumberPoints","LineEditTool","scaleOfEvent","line","isDragFrom","pathInputed","from","to","getFromToByPath","points","getFromToByPoints","getPointData","getInnerPointByLocal","ui","movePoint","originPoints","fromPoint","_e","fromTo","leftOrRight","innerToWorld","pen","clearPath","moveTo","lineTo","Creator","sky","addAttr","dataType","__isLinePath","setEditConfig","changeAttr","setEditOuter","toolName","setEditInner","editorName"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"editor.esm.min.js","sources":["../../../../../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.34.6_tslib@2.8.1_typescript@5.7.3/node_modules/tslib/tslib.es6.js","../../../../../../src/in/packages/editor/src/event/EditorEvent.ts","../../../../../../src/in/packages/editor/src/decorator/data.ts","../../../../../../src/in/packages/editor/src/display/Stroker.ts","../../../../../../src/in/packages/editor/src/display/SelectArea.ts","../../../../../../src/in/packages/editor/src/helper/EditSelectHelper.ts","../../../../../../src/in/packages/editor/src/display/EditSelect.ts","../../../../../../src/in/packages/editor/src/helper/EditDataHelper.ts","../../../../../../src/in/packages/editor/src/editor/cursor.ts","../../../../../../src/in/packages/editor/src/display/EditPoint.ts","../../../../../../src/in/packages/editor/src/display/EditBox.ts","../../../../../../src/in/packages/editor/src/display/EditMask.ts","../../../../../../src/in/packages/editor/src/svg.ts","../../../../../../src/in/packages/editor/src/config.ts","../../../../../../src/in/packages/editor/src/editor/simulate.ts","../../../../../../src/in/packages/editor/src/helper/EditorHelper.ts","../../../../../../src/in/packages/editor/src/tool/EditToolCreator.ts","../../../../../../src/in/packages/editor/src/event/InnerEditorEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorGroupEvent.ts","../../../../../../src/in/packages/editor/src/display/SimulateElement.ts","../../../../../../src/in/packages/editor/src/event/EditorMoveEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorScaleEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorRotateEvent.ts","../../../../../../src/in/packages/editor/src/event/EditorSkewEvent.ts","../../../../../../src/in/packages/editor/src/tool/TransformTool.ts","../../../../../../src/in/packages/editor/src/Editor.ts","../../../../../../src/in/packages/editor/src/editor/target.ts","../../../../../../src/in/packages/editor/src/tool/InnerEditor.ts","../../../../../../src/in/packages/editor/src/tool/EditTool.ts","../../../../../../src/in/packages/editor/src/tool/LineEditTool.ts","../../../../../../src/in/packages/editor/src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { IUI, IPointData } from '@leafer-ui/interface'\nimport { Event } from '@leafer-ui/draw'\n\nimport { IEditor, IEditorEvent } from '@leafer-in/interface'\n\n\nfunction toList(value: IUI | IUI[]): IUI[] {\n return value ? (value instanceof Array ? value : [value]) : []\n}\n\nexport class EditorEvent extends Event implements IEditorEvent {\n\n static BEFORE_SELECT = 'editor.before_select'\n static SELECT = 'editor.select'\n static AFTER_SELECT = 'editor.after_select'\n\n static BEFORE_HOVER = 'editor.before_hover'\n static HOVER = 'editor.hover'\n\n declare readonly target: IUI\n readonly editor: IEditor\n\n readonly value: IUI | IUI[]\n readonly oldValue: IUI | IUI[]\n\n get list() { return toList(this.value) }\n get oldList() { return toList(this.oldValue) }\n\n readonly worldOrigin: IPointData\n declare readonly origin: IPointData\n\n constructor(type: string, data?: IEditorEvent) {\n super(type)\n if (data) Object.assign(this, data)\n }\n\n}","import { IFunction, ILeaf, IObject, IUI, } from '@leafer-ui/interface'\nimport { IEditor } from '@leafer-in/interface'\nimport { defineKey, isNull } from '@leafer-ui/draw'\n\nimport { EditorEvent } from '../event/EditorEvent'\n\n\nexport function targetAttr(fn: IFunction) {\n return (target: ILeaf, key: string) => {\n const privateKey = '_' + key\n defineKey(target, key, {\n get() { return (this as IObject)[privateKey] },\n set(value: IUI | IUI[]) {\n const old = (this as IObject)[privateKey]\n if (old !== value) {\n\n if ((this as IEditor).config) { // Editor\n\n const isSelect = key === 'target'\n if (isSelect) {\n if (value instanceof Array && value.length > 1 && value[0].locked) value.splice(0, 1) // fix: 单个锁定 + shift多选\n\n const { beforeSelect } = (this as IEditor).config\n if (beforeSelect) {\n const check = beforeSelect({ target: value })\n if (typeof check === 'object') value = check\n else if (check === false) return\n }\n }\n\n const type = isSelect ? EditorEvent.BEFORE_SELECT : EditorEvent.BEFORE_HOVER\n if (this.hasEvent(type)) this.emitEvent(new EditorEvent(type, { editor: this as IEditor, value: value as IUI, oldValue: old }))\n }\n\n (this as IObject)[privateKey] = value, fn(this, old)\n }\n }\n } as ThisType<ILeaf>)\n }\n}\n\n\nexport function mergeConfigAttr() {\n return (target: IEditor, key: string) => {\n defineKey(target, key, {\n get() {\n const { config, element, dragPoint } = this, mergeConfig = { ...config } // 实时合并,后期可优化\n if (element && element.editConfig) Object.assign(mergeConfig, element.editConfig)\n if (dragPoint) {\n if (dragPoint.editConfig) Object.assign(mergeConfig, dragPoint.editConfig)\n if (mergeConfig.editSize === 'font-size') mergeConfig.lockRatio = true // 强制锁定比例\n if (dragPoint.pointType === 'resize-rotate') {\n mergeConfig.around || (mergeConfig.around = 'center')\n isNull(mergeConfig.lockRatio) && (mergeConfig.lockRatio = true)\n }\n }\n return (this as IObject).mergedConfig = mergeConfig\n }\n } as ThisType<IEditor>)\n }\n}\n\n\n","import { IUI, ILeaferCanvas, IRenderOptions, IRectInputData, IMatrixWithOptionHalfData } from '@leafer-ui/interface'\nimport { Paint, UI, MatrixHelper, getBoundsData, getMatrixData, BoundsHelper, LeafBoundsHelper } from '@leafer-ui/draw'\n\nimport { IStroker } from '@leafer-in/interface'\n\nimport { targetAttr } from '../decorator/data'\n\n\nconst { abs } = Math\nconst { copy, scale } = MatrixHelper\nconst { setListWithFn } = BoundsHelper\nconst { worldBounds } = LeafBoundsHelper\nconst matrix = getMatrixData() as IMatrixWithOptionHalfData\nconst bounds = getBoundsData()\n\nexport class Stroker extends UI implements IStroker {\n\n @targetAttr(onTarget)\n public target: IUI | IUI[]\n\n public list: IUI[] = []\n\n constructor() {\n super()\n this.visible = 0\n this.hittable = false\n this.strokeAlign = 'center'\n }\n\n public setTarget(target: IUI | IUI[], style: IRectInputData): void {\n this.set(style)\n this.target = target\n this.update()\n }\n\n public update(): void {\n const { list } = this\n if (list.length) {\n setListWithFn(bounds, list, worldBounds)\n this.set(bounds)\n this.visible = true\n } else this.visible = 0\n }\n\n public __draw(canvas: ILeaferCanvas, options: IRenderOptions): void {\n const { list } = this\n\n if (list.length) {\n\n let leaf: IUI\n const data = this.__, { stroke, strokeWidth, fill } = data, { bounds } = options\n\n for (let i = 0; i < list.length; i++) {\n leaf = list[i]\n const { worldTransform, worldRenderBounds } = leaf\n\n if (worldRenderBounds.width && worldRenderBounds.height && (!bounds || bounds.hit(worldRenderBounds, options.matrix))) {\n\n const aScaleX = abs(worldTransform.scaleX), aScaleY = abs(worldTransform.scaleY)\n\n copy(matrix, worldTransform)\n matrix.half = strokeWidth % 2\n\n if (aScaleX !== aScaleY) { // need no scale stroke, use rect path\n\n scale(matrix, 1 / aScaleX, 1 / aScaleY)\n canvas.setWorld(matrix, options.matrix)\n canvas.beginPath()\n data.strokeWidth = strokeWidth\n\n const { x, y, width, height } = leaf.__layout.boxBounds\n canvas.rect(x * aScaleX, y * aScaleY, width * aScaleX, height * aScaleY)\n\n } else {\n\n canvas.setWorld(matrix, options.matrix)\n canvas.beginPath()\n\n if (leaf.__.__useArrow) leaf.__drawPath(canvas)\n else leaf.__.__pathForRender ? leaf.__drawRenderPath(canvas) : leaf.__drawPathByBox(canvas)\n\n data.strokeWidth = strokeWidth / abs(worldTransform.scaleX)\n\n }\n\n if (stroke) typeof stroke === 'string' ? Paint.stroke(stroke, this, canvas) : Paint.strokes(stroke, this, canvas)\n if (fill) typeof fill === 'string' ? Paint.fill(fill, this, canvas) : Paint.fills(fill, this, canvas)\n }\n }\n\n data.strokeWidth = strokeWidth\n }\n }\n\n public destroy(): void {\n this.target = null\n super.destroy()\n }\n\n}\n\nfunction onTarget(stroker: Stroker): void {\n const value = stroker.target\n stroker.list = value ? (value instanceof Array ? value : [value]) : []\n}\n","import { IBoundsData, IGroupInputData, IRect, IRectInputData } from '@leafer-ui/interface'\nimport { Group, Rect } from '@leafer-ui/draw'\n\nimport { ISelectArea } from '@leafer-in/interface'\n\n\nexport class SelectArea extends Group implements ISelectArea {\n\n protected strokeArea: IRect = new Rect({ strokeAlign: 'center' })\n protected fillArea: IRect = new Rect()\n\n constructor(data?: IGroupInputData) {\n super(data)\n this.visible = 0\n this.hittable = false\n this.addMany(this.fillArea, this.strokeArea)\n }\n\n public setStyle(style: IRectInputData, userStyle?: IRectInputData): void {\n const { visible, stroke, strokeWidth } = style\n this.visible = visible\n this.strokeArea.reset({ stroke, strokeWidth, ...(userStyle || {}) })\n this.fillArea.reset({ visible: userStyle ? false : true, fill: stroke, opacity: 0.2 })\n }\n\n public setBounds(bounds: IBoundsData): void {\n this.strokeArea.set(bounds)\n this.fillArea.set(bounds)\n }\n\n}","import { IBounds, ILeafList, IUI, IUIData } from '@leafer-ui/interface'\n\n\nexport const EditSelectHelper = {\n\n findOne(path: ILeafList): IUI {\n return path.list.find((leaf) => leaf.editable) as IUI\n },\n\n findByBounds(branch: IUI, bounds: IBounds): IUI[] {\n const list: IUI[] = []\n eachFind([branch], list, bounds)\n return list\n }\n\n}\n\n\nfunction eachFind(children: IUI[], list: IUI[], bounds: IBounds): void {\n let child: IUI, data: IUIData\n for (let i = 0, len = children.length; i < len; i++) {\n child = children[i], data = child.__\n if (data.hittable && data.visible && !data.locked && bounds.hit(child.__world)) {\n\n if (data.editable) {\n if (child.isBranch && !data.hitChildren) {\n if (data.hitSelf) list.push(child)\n continue\n } else if (child.isFrame) {\n if (bounds.includes(child.__layout.boxBounds, child.__world)) {\n list.push(child)\n continue\n }\n } else if (bounds.hit(child.__layout.boxBounds, child.__world) && data.hitSelf) list.push(child)\n }\n\n if (child.isBranch) eachFind(child.children, list, bounds)\n\n }\n }\n}","import { IBounds, ILeaf, ILeafList, IUI, IEventListenerId, IPointerEvent, IFunction } from '@leafer-ui/interface'\nimport { Bounds, LeafList, Group } from '@leafer-ui/draw'\nimport { PointerEvent, DragEvent, MoveEvent, ZoomEvent } from '@leafer-ui/core'\n\nimport { IEditSelect, IEditor, ISelectArea, IStroker } from '@leafer-in/interface'\n\nimport { Stroker } from './Stroker'\nimport { SelectArea } from './SelectArea'\nimport { EditSelectHelper } from '../helper/EditSelectHelper'\nimport { EditorEvent } from '../event/EditorEvent'\n\n\nconst { findOne, findByBounds } = EditSelectHelper\n\nexport class EditSelect extends Group implements IEditSelect {\n\n public editor: IEditor\n\n public get dragging(): boolean { return !!this.originList }\n public get running(): boolean { const { editor } = this; return this.hittable && editor.visible && editor.hittable && editor.mergeConfig.selector }\n public get isMoveMode(): boolean { return this.app && this.app.interaction.moveMode }\n\n public hoverStroker: IStroker = new Stroker()\n public targetStroker: IStroker = new Stroker()\n\n public bounds: IBounds = new Bounds()\n public selectArea: ISelectArea = new SelectArea()\n\n protected originList: ILeafList\n protected needRemoveItem: IUI\n\n protected waitSelect: IFunction // 手机端延迟选中,防止多点触屏误选元素\n\n protected __eventIds: IEventListenerId[] = []\n\n constructor(editor: IEditor) {\n super()\n this.editor = editor\n this.addMany(this.targetStroker, this.hoverStroker, this.selectArea)\n this.__listenEvents()\n }\n\n // hover / select\n\n protected onHover(): void {\n const { editor } = this\n if (this.running && !this.dragging && !editor.dragging) {\n const { stroke, strokeWidth, hover, hoverStyle } = editor.mergeConfig\n this.hoverStroker.setTarget(hover ? this.editor.hoverTarget : null, { stroke, strokeWidth, ...(hoverStyle || {}) })\n } else {\n this.hoverStroker.target = null\n }\n }\n\n protected onSelect(): void {\n if (this.running) {\n const { mergeConfig, list } = this.editor\n const { stroke, strokeWidth, selectedStyle } = mergeConfig\n this.targetStroker.setTarget(list, { stroke, strokeWidth: Math.max(1, strokeWidth / 2), ...(selectedStyle || {}) })\n this.hoverStroker.target = null\n }\n }\n\n public update(): void {\n this.hoverStroker.update()\n this.targetStroker.update()\n }\n\n // move / down\n\n protected onPointerMove(e: PointerEvent): void {\n const { app, editor } = this\n if (this.running && !this.isMoveMode && app.interaction.canHover && !app.interaction.dragging) {\n const find = this.findUI(e)\n editor.hoverTarget = editor.hasItem(find) ? null : find\n } if (this.isMoveMode) {\n editor.hoverTarget = null // move.dragEmpty\n }\n }\n\n protected onBeforeDown(e: PointerEvent): void {\n if (e.multiTouch) return\n\n const { select } = this.editor.mergeConfig\n if (select === 'press') {\n if (this.app.config.mobile) {\n this.waitSelect = () => this.checkAndSelect(e)\n } else {\n this.checkAndSelect(e)\n }\n }\n }\n\n protected onTap(e: PointerEvent): void {\n if (e.multiTouch) return\n\n const { editor } = this\n const { select } = editor.mergeConfig\n\n if (select === 'tap') this.checkAndSelect(e)\n else if (this.waitSelect) this.waitSelect()\n\n if (this.needRemoveItem) {\n editor.removeItem(this.needRemoveItem)\n } else if (this.isMoveMode) {\n editor.target = null // move.dragEmpty\n }\n\n }\n\n protected checkAndSelect(e: PointerEvent): void { // pointer.down or tap\n this.needRemoveItem = null\n\n if (this.allowSelect(e)) {\n const { editor } = this\n const find = this.findUI(e)\n\n if (find) {\n if (this.isMultipleSelect(e)) {\n if (editor.hasItem(find)) this.needRemoveItem = find // 等待tap事件再实际移除\n else editor.addItem(find)\n } else {\n editor.target = find\n }\n\n } else if (this.allow(e.target)) {\n\n if (!e.shiftKey) editor.target = null\n\n }\n }\n }\n\n // drag\n\n protected onDragStart(e: DragEvent): void {\n if (e.multiTouch) return\n if (this.waitSelect) this.waitSelect()\n\n if (this.allowDrag(e)) {\n const { editor } = this\n const { stroke, area } = editor.mergeConfig\n const { x, y } = e.getInnerPoint(this)\n\n this.bounds.set(x, y)\n\n this.selectArea.setStyle({ visible: true, stroke, x, y }, area)\n this.selectArea.setBounds(this.bounds.get())\n\n this.originList = editor.leafList.clone()\n }\n }\n\n protected onDrag(e: DragEvent): void {\n if (e.multiTouch) return\n if (this.editor.dragging) return this.onDragEnd(e)\n\n if (this.dragging) {\n const { editor } = this\n const total = e.getInnerTotal(this)\n\n const dragBounds = this.bounds.clone().unsign()\n const list = new LeafList(findByBounds(editor.app, dragBounds))\n\n this.bounds.width = total.x\n this.bounds.height = total.y\n\n this.selectArea.setBounds(dragBounds.get())\n\n if (list.length) {\n\n const selectList: ILeaf[] = []\n\n this.originList.forEach(item => { if (!list.has(item)) selectList.push(item) })\n list.forEach(item => { if (!this.originList.has(item)) selectList.push(item) })\n\n if (selectList.length !== editor.list.length || editor.list.some((child, index) => child !== selectList[index])) {\n editor.target = selectList as IUI[]\n }\n\n } else {\n\n editor.target = this.originList.list as IUI[]\n\n }\n }\n }\n\n protected onDragEnd(e: DragEvent): void {\n if (e.multiTouch) return\n\n if (this.dragging) this.originList = null, this.selectArea.visible = 0\n }\n\n protected onAutoMove(e: MoveEvent): void {\n if (this.dragging) {\n const { x, y } = e.getLocalMove(this)\n this.bounds.x += x\n this.bounds.y += y\n }\n }\n\n // helper\n\n protected allow(target: ILeaf): boolean {\n return target.leafer !== this.editor.leafer\n }\n\n protected allowDrag(e: DragEvent) {\n const { boxSelect, multipleSelect } = this.editor.mergeConfig\n if (this.running && (multipleSelect && boxSelect) && !e.target.draggable) {\n return (!this.editor.editing && this.allow(e.target)) || (e.shiftKey && !findOne(e.path))\n } else {\n return false\n }\n }\n\n protected allowSelect(e: IPointerEvent): boolean {\n return this.running && !this.isMoveMode && !e.middle\n }\n\n public findDeepOne(e: PointerEvent): IUI {\n const options = { exclude: new LeafList(this.editor.editBox.rect) }\n return findOne(e.target.leafer.interaction.findPath(e, options)) as IUI\n }\n\n public findUI(e: PointerEvent): IUI {\n return this.isMultipleSelect(e) ? this.findDeepOne(e) : findOne(e.path)\n }\n\n public isMultipleSelect(e: IPointerEvent): boolean {\n const { multipleSelect, continuousSelect } = this.editor.mergeConfig\n return multipleSelect && (e.shiftKey || continuousSelect)\n }\n\n protected __listenEvents(): void {\n const { editor } = this\n editor.waitLeafer(() => {\n\n const { app } = editor\n app.selector.proxy = editor\n\n this.__eventIds = [\n editor.on_([\n [EditorEvent.HOVER, this.onHover, this],\n [EditorEvent.SELECT, this.onSelect, this]\n ]),\n\n app.on_([\n [PointerEvent.MOVE, this.onPointerMove, this],\n [PointerEvent.BEFORE_DOWN, this.onBeforeDown, this],\n [PointerEvent.TAP, this.onTap, this],\n\n [DragEvent.START, this.onDragStart, this, true], // 采用捕获事件,需要比EditBox中的dragStart早触发\n [DragEvent.DRAG, this.onDrag, this],\n [DragEvent.END, this.onDragEnd, this],\n\n [MoveEvent.MOVE, this.onAutoMove, this],\n [[ZoomEvent.ZOOM, MoveEvent.MOVE], () => { this.editor.hoverTarget = null }],\n ])\n ]\n\n })\n }\n\n protected __removeListenEvents(): void {\n this.off_(this.__eventIds)\n }\n\n public destroy(): void {\n this.editor = this.originList = this.needRemoveItem = null\n this.__removeListenEvents()\n super.destroy()\n }\n}","import { IBoundsData, IPointData, IAround, IAlign, IUI, ILayoutBoundsData } from '@leafer-ui/interface'\nimport { AroundHelper, MathHelper, PointHelper, BoundsHelper, Bounds, Direction9 } from '@leafer-ui/draw'\n\nimport { IEditorScaleEvent, IEditorSkewEvent, IEditorRotateEvent } from '@leafer-in/interface'\n\n\nconst { topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left } = Direction9\nconst { toPoint } = AroundHelper\nconst { within } = MathHelper\n\nexport const EditDataHelper = {\n\n getScaleData(target: IUI, startBounds: ILayoutBoundsData, direction: Direction9, totalMove: IPointData, lockRatio: boolean | 'corner', around: IAround, flipable: boolean, scaleMode: boolean): IEditorScaleEvent {\n let align: IAlign, origin = {} as IPointData, scaleX: number = 1, scaleY: number = 1\n\n const { boxBounds, widthRange, heightRange, dragBounds, worldBoxBounds } = target\n const { width, height } = startBounds\n\n if (around) {\n totalMove.x *= 2\n totalMove.y *= 2\n }\n\n\n // 获取已经改变的比例\n const originChangedScaleX = target.scaleX / startBounds.scaleX\n const originChangedScaleY = target.scaleY / startBounds.scaleY\n const signX = originChangedScaleX < 0 ? -1 : 1\n const signY = originChangedScaleY < 0 ? -1 : 1\n\n const changedScaleX = scaleMode ? originChangedScaleX : signX * boxBounds.width / width\n const changedScaleY = scaleMode ? originChangedScaleY : signY * boxBounds.height / height\n\n totalMove.x *= scaleMode ? originChangedScaleX : signX\n totalMove.y *= scaleMode ? originChangedScaleY : signY\n\n const topScale = (-totalMove.y + height) / height\n const rightScale = (totalMove.x + width) / width\n const bottomScale = (totalMove.y + height) / height\n const leftScale = (-totalMove.x + width) / width\n\n switch (direction) {\n case top:\n scaleY = topScale\n align = 'bottom'\n break\n case right:\n scaleX = rightScale\n align = 'left'\n break\n case bottom:\n scaleY = bottomScale\n align = 'top'\n break\n case left:\n scaleX = leftScale\n align = 'right'\n break\n case topLeft:\n scaleY = topScale\n scaleX = leftScale\n align = 'bottom-right'\n break\n case topRight:\n scaleY = topScale\n scaleX = rightScale\n align = 'bottom-left'\n break\n case bottomRight:\n scaleY = bottomScale\n scaleX = rightScale\n align = 'top-left'\n break\n case bottomLeft:\n scaleY = bottomScale\n scaleX = leftScale\n align = 'top-right'\n }\n\n if (lockRatio) {\n if (lockRatio === 'corner' && direction % 2) {\n lockRatio = false\n } else {\n let scale: number\n switch (direction) {\n case top:\n case bottom:\n scale = scaleY\n break\n case left:\n case right:\n scale = scaleX\n break\n default:\n scale = Math.sqrt(Math.abs(scaleX * scaleY))\n }\n scaleX = scaleX < 0 ? -scale : scale\n scaleY = scaleY < 0 ? -scale : scale\n }\n }\n\n const useScaleX = scaleX !== 1, useScaleY = scaleY !== 1\n\n if (useScaleX) scaleX /= changedScaleX\n if (useScaleY) scaleY /= changedScaleY\n\n if (!flipable) {\n const { worldTransform } = target\n if (scaleX < 0) scaleX = 1 / boxBounds.width / worldTransform.scaleX\n if (scaleY < 0) scaleY = 1 / boxBounds.height / worldTransform.scaleY\n }\n\n // 检查限制\n\n toPoint(around || align, boxBounds, origin, true)\n\n if (dragBounds) {\n const allowBounds = dragBounds === 'parent' ? target.parent.boxBounds : dragBounds\n const localBounds = new Bounds(target.__localBoxBounds)\n localBounds.scaleOf(target.getLocalPointByInner(origin), scaleX, scaleY)\n\n if (!BoundsHelper.includes(allowBounds, localBounds)) {\n const realBounds = localBounds.getIntersect(allowBounds)\n const fitScaleX = realBounds.width / localBounds.width, fitScaleY = realBounds.height / localBounds.height\n if (useScaleX) scaleX *= fitScaleX\n if (useScaleY) scaleY *= fitScaleY // 后续需优化带旋转的场景\n }\n }\n\n if (useScaleX && widthRange) {\n const nowWidth = boxBounds.width * target.scaleX\n scaleX = within(nowWidth * scaleX, widthRange) / nowWidth\n }\n\n if (useScaleY && heightRange) {\n const nowHeight = boxBounds.height * target.scaleY\n scaleY = within(nowHeight * scaleY, heightRange) / nowHeight\n }\n\n // 防止小于1px\n if (useScaleX && Math.abs(scaleX * worldBoxBounds.width) < 1) scaleX = (scaleX < 0 ? -1 : 1) / worldBoxBounds.width\n if (useScaleY && Math.abs(scaleY * worldBoxBounds.height) < 1) scaleY = (scaleY < 0 ? -1 : 1) / worldBoxBounds.height\n\n if (lockRatio && scaleX !== scaleY) scaleY = scaleX = Math.min(scaleX, scaleY)\n\n return { origin, scaleX, scaleY, direction, lockRatio, around }\n },\n\n getRotateData(target: IUI, direction: Direction9, current: IPointData, last: IPointData, around: IAround): IEditorRotateEvent {\n let align: IAlign, origin = {} as IPointData\n\n switch (direction) {\n case topLeft:\n align = 'bottom-right'\n break\n case topRight:\n align = 'bottom-left'\n break\n case bottomRight:\n align = 'top-left'\n break\n case bottomLeft:\n align = 'top-right'\n break\n default:\n align = 'center'\n }\n\n toPoint(around || align, target.boxBounds, origin, true)\n\n return { origin, rotation: PointHelper.getRotation(last, target.getWorldPointByBox(origin), current) }\n },\n\n getSkewData(bounds: IBoundsData, direction: Direction9, move: IPointData, around: IAround): IEditorSkewEvent {\n let align: IAlign, origin = {} as IPointData, skewX = 0, skewY = 0\n let last: IPointData\n\n switch (direction) {\n case top:\n case topLeft:\n last = { x: 0.5, y: 0 }\n align = 'bottom'\n skewX = 1\n break\n case bottom:\n case bottomRight:\n last = { x: 0.5, y: 1 }\n align = 'top'\n skewX = 1\n break\n case left:\n case bottomLeft:\n last = { x: 0, y: 0.5 }\n align = 'right'\n skewY = 1\n break\n case right:\n case topRight:\n last = { x: 1, y: 0.5 }\n align = 'left'\n skewY = 1\n }\n\n const { width, height } = bounds\n\n last.x = last.x * width\n last.y = last.y * height\n\n toPoint(around || align, bounds, origin, true)\n\n const rotation = PointHelper.getRotation(last, origin, { x: last.x + (skewX ? move.x : 0), y: last.y + (skewY ? move.y : 0) })\n skewX ? skewX = -rotation : skewY = rotation\n\n return { origin, skewX, skewY }\n },\n\n\n getAround(around: IAround, altKey: boolean): IAround {\n return (altKey && !around) ? 'center' : around\n },\n\n getRotateDirection(direction: number, rotation: number, totalDirection = 8): number {\n direction = (direction + Math.round(rotation / (360 / totalDirection))) % totalDirection\n if (direction < 0) direction += totalDirection\n return direction\n },\n\n getFlipDirection(direction: Direction9, flipedX: boolean, flipedY: boolean): Direction9 {\n if (flipedX) {\n switch (direction) {\n case left: direction = right; break\n case topLeft: direction = topRight; break\n case bottomLeft: direction = bottomRight; break\n case right: direction = left; break\n case topRight: direction = topLeft; break\n case bottomRight: direction = bottomLeft; break\n }\n }\n\n if (flipedY) {\n switch (direction) {\n case top: direction = bottom; break\n case topLeft: direction = bottomLeft; break\n case topRight: direction = bottomRight; break\n case bottom: direction = top; break\n case bottomLeft: direction = topLeft; break\n case bottomRight: direction = topRight; break\n }\n }\n\n return direction\n }\n\n}","import { IObject, IUIEvent } from '@leafer-ui/interface'\n\nimport { IEditBox } from '@leafer-in/interface'\nimport { MathHelper } from '@leafer-ui/draw'\n\nimport { EditDataHelper } from '../helper/EditDataHelper'\n\n\nconst cacheCursors: IObject = {}\n\nexport function updateCursor(editBox: IEditBox, e: IUIEvent): void {\n const { enterPoint: point } = editBox\n if (!point || !editBox.editor.editing || !editBox.visible) return\n if (point.name === 'circle') return // 独立旋转按钮\n if (point.pointType === 'button') { // 普通按钮\n if (!point.cursor) point.cursor = 'pointer'\n return\n }\n\n let { rotation, flippedX, flippedY } = editBox\n const { pointType } = point, { resizeCursor, rotateCursor, skewCursor, resizeable, rotateable, skewable } = editBox.mergeConfig\n\n let showResize = pointType.includes('resize')\n if (showResize && rotateable && (e.metaKey || e.ctrlKey || !resizeable)) showResize = false\n const showSkew = skewable && !showResize && (point.name === 'resize-line' || pointType === 'skew')\n\n const cursor = showSkew ? skewCursor : (showResize ? resizeCursor : rotateCursor)\n rotation += (EditDataHelper.getFlipDirection(point.direction, flippedX, flippedY) + 1) * 45\n rotation = Math.round(MathHelper.formatRotation(rotation, true) / 2) * 2\n\n const { url, x, y } = cursor\n const key = url + rotation\n\n if (cacheCursors[key]) {\n point.cursor = cacheCursors[key]\n } else {\n cacheCursors[key] = point.cursor = { url: toDataURL(url, rotation), x, y }\n }\n}\n\nexport function updateMoveCursor(editBox: IEditBox): void {\n const { moveCursor, moveable } = editBox.mergeConfig\n editBox.rect.cursor = moveable ? moveCursor : undefined\n}\n\n\nfunction toDataURL(svg: string, rotation: number): string {\n return '\"data:image/svg+xml,' + encodeURIComponent(svg.replace('{{rotation}}', rotation.toString())) + '\"'\n}","import { Box, Direction9 } from '@leafer-ui/draw'\n\nimport { IEditPoint, IEditPointInputData, IEditPointType } from '@leafer-in/interface'\n\n\nexport class EditPoint extends Box implements IEditPoint {\n\n public direction: Direction9\n public pointType: IEditPointType\n\n constructor(data: IEditPointInputData) {\n super(data)\n this.useFastShadow = true\n }\n\n}","import { IRect, IEventListenerId, IBoundsData, IPointData, IKeyEvent, IGroup, IBox, IBoxInputData, IAlign, IUI, IEditorConfig, IEditorDragStartData, IEventParams, ITransformTool } from '@leafer-ui/interface'\nimport { Group, Box, Text, AroundHelper, Direction9, ResizeEvent } from '@leafer-ui/draw'\nimport { DragEvent, PointerEvent, KeyEvent } from '@leafer-ui/core'\n\nimport { IEditBox, IEditor, IEditPoint, IEditPointType } from '@leafer-in/interface'\n\nimport { updateCursor, updateMoveCursor } from '../editor/cursor'\nimport { EditorEvent } from '../event/EditorEvent'\nimport { EditPoint } from './EditPoint'\nimport { EditDataHelper } from '../helper/EditDataHelper'\n\n\nconst fourDirection = ['top', 'right', 'bottom', 'left'], editConfig: IEditorConfig = undefined\n\nexport class EditBox extends Group implements IEditBox {\n\n public editor: IEditor\n\n public dragging: boolean\n public moving: boolean\n\n public view: IGroup = new Group() // 放置默认编辑工具控制点\n\n public rect: IBox = new Box({ name: 'rect', hitFill: 'all', hitStroke: 'none', strokeAlign: 'center', hitRadius: 5 }) // target rect\n public circle: IEditPoint = new EditPoint({ name: 'circle', strokeAlign: 'center', around: 'center', cursor: 'crosshair', hitRadius: 5 }) // rotate point\n public buttons: IGroup = new Group({ around: 'center', hitSelf: false, visible: 0 })\n\n public resizePoints: IEditPoint[] = [] // topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left\n public rotatePoints: IEditPoint[] = [] // topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left\n public resizeLines: IEditPoint[] = [] // top, right, bottom, left\n\n public enterPoint: IEditPoint\n public dragPoint: IEditPoint // 正在拖拽的控制点\n\n public dragStartData = {} as IEditorDragStartData\n\n public config: IEditorConfig\n public mergedConfig: IEditorConfig\n\n public get mergeConfig(): IEditorConfig {\n const { config } = this, { mergeConfig } = this.editor\n return this.mergedConfig = config ? { ...mergeConfig, ...config } : mergeConfig\n }\n\n protected _target: IUI\n public get target(): IUI { return this._target || this.editor.element } // 操作的元素,默认为editor.element\n public set target(target: IUI) { this._target = target }\n\n public get single(): boolean { return !!this._target || this.editor.single }\n\n protected _transformTool: ITransformTool\n public get transformTool(): ITransformTool { return this._transformTool || this.editor }\n public set transformTool(tool: ITransformTool) { this._transformTool = tool }\n\n // fliped\n public get flipped(): boolean { return this.flippedX || this.flippedY }\n public get flippedX(): boolean { return this.scaleX < 0 }\n public get flippedY(): boolean { return this.scaleY < 0 }\n public get flippedOne(): boolean { return this.scaleX * this.scaleY < 0 }\n\n protected __eventIds: IEventListenerId[] = []\n\n constructor(editor: IEditor) {\n super()\n this.editor = editor\n this.visible = false\n this.create()\n this.__listenEvents()\n }\n\n public create() {\n let rotatePoint: IEditPoint, resizeLine: IEditPoint, resizePoint: IEditPoint\n const { view, resizePoints, rotatePoints, resizeLines, rect, circle, buttons } = this\n const arounds: IAlign[] = ['bottom-right', 'bottom', 'bottom-left', 'left', 'top-left', 'top', 'top-right', 'right']\n\n for (let i = 0; i < 8; i++) {\n rotatePoint = new EditPoint({ name: 'rotate-point', around: arounds[i], width: 15, height: 15, hitFill: \"all\" })\n rotatePoints.push(rotatePoint)\n this.listenPointEvents(rotatePoint, 'rotate', i)\n\n if (i % 2) {\n resizeLine = new EditPoint({ name: 'resize-line', around: 'center', width: 10, height: 10, hitFill: \"all\" })\n resizeLines.push(resizeLine)\n this.listenPointEvents(resizeLine, 'resize', i)\n }\n\n resizePoint = new EditPoint({ name: 'resize-point', hitRadius: 5 })\n resizePoints.push(resizePoint)\n this.listenPointEvents(resizePoint, 'resize', i)\n }\n\n this.listenPointEvents(circle, 'rotate', 2)\n\n view.addMany(...rotatePoints, rect, circle, buttons, ...resizeLines, ...resizePoints)\n this.add(view)\n }\n\n public load(): void {\n const { target, mergeConfig, single, rect, circle, resizePoints } = this\n const { stroke, strokeWidth } = mergeConfig\n\n const pointsStyle = this.getPointsStyle()\n const middlePointsStyle = this.getMiddlePointsStyle()\n\n let resizeP: IRect\n\n for (let i = 0; i < 8; i++) {\n resizeP = resizePoints[i]\n resizeP.set(this.getPointStyle((i % 2) ? middlePointsStyle[((i - 1) / 2) % middlePointsStyle.length] : pointsStyle[(i / 2) % pointsStyle.length]))\n if (!(i % 2)) resizeP.rotation = (i / 2) * 90\n }\n\n // rotate\n circle.set(this.getPointStyle(mergeConfig.circle || mergeConfig.rotatePoint || pointsStyle[0]))\n\n // rect\n rect.set({ stroke, strokeWidth, editConfig, ...(mergeConfig.rect || {}) })\n\n const syncEventer = single && this.transformTool.editTool\n\n rect.hittable = !syncEventer\n rect.syncEventer = syncEventer && this.editor // 单选下 rect 的事件不会冒泡,需要手动传递给editor\n\n // 编辑框作为底部虚拟元素, 在 onSelect 方法移除\n if (syncEventer) {\n target.syncEventer = rect\n this.app.interaction.bottomList = [{ target: rect, proxy: target }]\n }\n\n updateMoveCursor(this)\n }\n\n public update(): void {\n const { editor } = this\n const { x, y, scaleX, scaleY, rotation, skewX, skewY, width, height } = this.target.getLayoutBounds('box', editor, true)\n this.set({ x, y, scaleX, scaleY, rotation, skewX, skewY })\n this.updateBounds({ x: 0, y: 0, width, height })\n }\n\n public updateBounds(bounds: IBoundsData): void {\n const { editMask } = this.editor\n const { mergeConfig, single, rect, circle, buttons, resizePoints, rotatePoints, resizeLines } = this\n const { middlePoint, resizeable, rotateable, hideOnSmall, editBox, mask } = mergeConfig\n\n this.visible = !this.target.locked\n editMask.visible = mask ? true : 0\n\n if (this.view.worldOpacity) {\n const { width, height } = bounds\n const smallSize = typeof hideOnSmall === 'number' ? hideOnSmall : 10\n const showPoints = editBox && !(hideOnSmall && width < smallSize && height < smallSize)\n\n let point = {} as IPointData, rotateP: IRect, resizeP: IRect, resizeL: IRect\n\n for (let i = 0; i < 8; i++) {\n\n AroundHelper.toPoint(AroundHelper.directionData[i], bounds, point)\n resizeP = resizePoints[i]\n rotateP = rotatePoints[i]\n resizeL = resizeLines[Math.floor(i / 2)]\n resizeP.set(point)\n rotateP.set(point)\n resizeL.set(point)\n\n // visible \n resizeP.visible = resizeL.visible = showPoints && !!(resizeable || rotateable)\n rotateP.visible = showPoints && rotateable && resizeable && !mergeConfig.rotatePoint\n\n if (i % 2) { // top, right, bottom, left\n\n resizeP.visible = rotateP.visible = showPoints && !!middlePoint\n\n if (((i + 1) / 2) % 2) { // top, bottom\n resizeL.width = width\n if (hideOnSmall && resizeP.width * 2 > width) resizeP.visible = false\n } else {\n resizeL.height = height\n resizeP.rotation = 90\n if (hideOnSmall && resizeP.width * 2 > height) resizeP.visible = false\n }\n }\n\n }\n\n // rotate\n circle.visible = showPoints && rotateable && !!(mergeConfig.circle || mergeConfig.rotatePoint)\n if (circle.visible) this.layoutCircle()\n\n // rect\n if (rect.path) rect.path = null // line可能会变成path优先模式\n rect.set({ ...bounds, visible: single ? editBox : true })\n\n // buttons\n buttons.visible = showPoints && buttons.children.length > 0 || 0\n if (buttons.visible) this.layoutButtons()\n } else rect.set(bounds) // 需要更新大小\n }\n\n protected layoutCircle(): void {\n const { circleDirection, circleMargin, buttonsMargin, buttonsDirection, middlePoint } = this.mergedConfig\n const direction = fourDirection.indexOf(circleDirection || ((this.buttons.children.length && buttonsDirection === 'bottom') ? 'top' : 'bottom'))\n this.setButtonPosition(this.circle, direction, circleMargin || buttonsMargin, !!middlePoint)\n }\n\n protected layoutButtons(): void {\n const { buttons } = this\n const { buttonsDirection, buttonsFixed, buttonsMargin, middlePoint } = this.mergedConfig\n\n const { flippedX, flippedY } = this\n let index = fourDirection.indexOf(buttonsDirection)\n if ((index % 2 && flippedX) || ((index + 1) % 2 && flippedY)) {\n if (buttonsFixed) index = (index + 2) % 4 // flip x / y\n }\n\n const direction = buttonsFixed ? EditDataHelper.getRotateDirection(index, this.flippedOne ? this.rotation : -this.rotation, 4) : index\n this.setButtonPosition(buttons, direction, buttonsMargin, !!middlePoint)\n\n if (buttonsFixed) buttons.rotation = (direction - index) * 90\n buttons.scaleX = flippedX ? -1 : 1\n buttons.scaleY = flippedY ? -1 : 1\n }\n\n protected setButtonPosition(buttons: IUI, direction: number, buttonsMargin: number, useMiddlePoint: boolean): void {\n const point = this.resizePoints[direction * 2 + 1] // 4 map 8 direction\n const useX = direction % 2 // left / right\n const sign = (!direction || direction === 3) ? -1 : 1 // top / left = -1\n\n const useWidth = direction % 2 // left / right origin direction\n const margin = (buttonsMargin + (useWidth ? ((useMiddlePoint ? point.width : 0) + buttons.boxBounds.width) : ((useMiddlePoint ? point.height : 0) + buttons.boxBounds.height)) / 2) * sign\n\n if (useX) {\n buttons.x = point.x + margin\n buttons.y = point.y\n } else {\n buttons.x = point.x\n buttons.y = point.y + margin\n }\n }\n\n\n public unload(): void {\n this.visible = false\n }\n\n\n public getPointStyle(userStyle?: IBoxInputData): IBoxInputData {\n const { stroke, strokeWidth, pointFill, pointSize, pointRadius } = this.mergedConfig\n const defaultStyle = { fill: pointFill, stroke, strokeWidth, around: 'center', strokeAlign: 'center', width: pointSize, height: pointSize, cornerRadius: pointRadius, offsetX: 0, offsetY: 0, editConfig } as IBoxInputData\n return userStyle ? Object.assign(defaultStyle, userStyle) : defaultStyle\n }\n\n public getPointsStyle(): IBoxInputData[] {\n const { point } = this.mergedConfig\n return point instanceof Array ? point : [point]\n }\n\n public getMiddlePointsStyle(): IBoxInputData[] {\n const { middlePoint } = this.mergedConfig\n return middlePoint instanceof Array ? middlePoint : (middlePoint ? [middlePoint] : this.getPointsStyle())\n }\n\n protected onSelect(e: EditorEvent): void {\n if (e.oldList.length === 1) {\n e.oldList[0].syncEventer = null\n if (this.app) this.app.interaction.bottomList = null\n }\n }\n\n // drag\n\n protected onDragStart(e: DragEvent): void {\n this.dragging = true\n const point = this.dragPoint = e.current as IEditPoint, { pointType } = point\n const { editor, dragStartData } = this, { target } = this\n if (point.name === 'rect') {\n this.moving = true\n editor.opacity = this.mergeConfig.hideOnMove ? 0 : 1 // move\n }\n dragStartData.x = e.x\n dragStartData.y = e.y\n dragStartData.point = { x: target.x, y: target.y } // 用于移动\n dragStartData.bounds = { ...target.getLayoutBounds('box', 'local') } // 用于resize\n dragStartData.rotation = target.rotation // 用于旋转\n if (pointType && pointType.includes('resize')) ResizeEvent.resizingKeys = editor.leafList.keys // 记录正在resize中的元素列表\n }\n\n protected onDragEnd(e: DragEvent): void {\n this.dragging = false\n this.dragPoint = null\n this.moving = false\n const { name, pointType } = e.current as IEditPoint\n if (name === 'rect') this.editor.opacity = 1 // move\n if (pointType && pointType.includes('resize')) ResizeEvent.resizingKeys = null\n }\n\n protected onDrag(e: DragEvent): void {\n const { transformTool } = this, point = e.current as IEditPoint\n if (point.name === 'rect') {\n transformTool.onMove(e)\n updateMoveCursor(this)\n } else {\n const { pointType } = this.enterPoint = point\n if (pointType.includes('rotate') || e.metaKey || e.ctrlKey || !this.mergeConfig.resizeable) {\n transformTool.onRotate(e)\n if (pointType === 'resize-rotate') transformTool.onScale(e)\n } else if (pointType === 'resize') transformTool.onScale(e)\n if (pointType === 'skew') transformTool.onSkew(e)\n updateCursor(this, e)\n }\n }\n\n protected onKey(e: KeyEvent): void {\n updateCursor(this, e)\n }\n\n public onArrow(e: IKeyEvent): void {\n const { editor } = this\n if (editor.editing && this.mergeConfig.keyEvent) {\n let x = 0, y = 0\n const distance = e.shiftKey ? 10 : 1\n switch (e.code) {\n case 'ArrowDown':\n y = distance\n break\n case 'ArrowUp':\n y = -distance\n break\n case 'ArrowLeft':\n x = -distance\n break\n case 'ArrowRight':\n x = distance\n }\n if (x || y) editor.move(x, y)\n }\n }\n\n\n protected onDoubleTap(e: PointerEvent): void {\n const { openInner, preventEditInner } = this.mergeConfig\n if (openInner === 'double' && !preventEditInner) this.openInner(e)\n }\n\n protected onLongPress(e: PointerEvent): void {\n const { openInner, preventEditInner } = this.mergeConfig\n if (openInner === 'long' && preventEditInner) this.openInner(e)\n }\n\n protected openInner(e: PointerEvent): void {\n const { editor, target } = this\n if (this.single) {\n if (target.locked) return\n if (target.isBranch && !target.editInner) {\n if ((target as IBox).textBox) {\n const { children } = target\n const find = children.find(item => item.editable && item instanceof Text) || children.find(item => item instanceof Text)\n if (find) return editor.openInnerEditor(find) // 文本Box直接进入编辑状态,如便利贴文本\n }\n\n editor.openGroup(target as IGroup)\n editor.target = editor.selector.findDeepOne(e)\n } else {\n editor.openInnerEditor()\n }\n }\n }\n\n\n public listenPointEvents(point: IEditPoint, type: IEditPointType, direction: Direction9): void {\n point.direction = direction\n point.pointType = type\n\n const events: IEventParams[] = [\n [DragEvent.START, this.onDragStart, this],\n [DragEvent.DRAG, this.onDrag, this],\n [DragEvent.END, this.onDragEnd, this],\n [PointerEvent.LEAVE, () => { this.enterPoint = null }],\n ]\n if (point.name !== 'circle') events.push([PointerEvent.ENTER, (e: PointerEvent) => { this.enterPoint = point, updateCursor(this, e) }])\n this.__eventIds.push(point.on_(events))\n }\n\n protected __listenEvents(): void {\n const { rect, editor, __eventIds: events } = this\n\n events.push(\n editor.on_(EditorEvent.SELECT, this.onSelect, this),\n\n rect.on_([\n [DragEvent.START, this.onDragStart, this],\n [DragEvent.DRAG, this.onDrag, this],\n [DragEvent.END, this.onDragEnd, this],\n\n [PointerEvent.ENTER, () => updateMoveCursor(this)],\n [PointerEvent.DOUBLE_TAP, this.onDoubleTap, this],\n [PointerEvent.LONG_PRESS, this.onLongPress, this]\n ])\n )\n\n this.waitLeafer(() => {\n events.push(\n editor.app.on_([\n [[KeyEvent.HOLD, KeyEvent.UP], this.onKey, this],\n [KeyEvent.DOWN, this.onArrow, this]\n ])\n )\n })\n }\n\n protected __removeListenEvents(): void {\n this.off_(this.__eventIds)\n }\n\n public destroy(): void {\n this.editor = null\n this.__removeListenEvents()\n super.destroy()\n }\n\n}","import { IBox, ILeaferCanvas, IRenderOptions } from '@leafer-ui/interface'\nimport { UI } from '@leafer-ui/draw'\n\nimport { IEditor } from '@leafer-in/interface'\n\nconst bigBounds = { x: 0, y: 0, width: 100000, height: 100000 }\n\nexport class EditMask extends UI {\n\n public editor: IEditor\n\n constructor(editor: IEditor) {\n super()\n this.editor = editor\n this.hittable = false\n this.visible = 0\n }\n\n override __updateWorldBounds(): void {\n Object.assign(this.__local, bigBounds) // 强制修改渲染包围盒\n Object.assign(this.__world, bigBounds)\n }\n\n public __draw(canvas: ILeaferCanvas, options: IRenderOptions): void {\n\n const { editor } = this, { mask } = editor.mergedConfig\n if (mask && editor.editing) {\n canvas.fillWorld(canvas.bounds, mask === true ? 'rgba(0,0,0,0.8)' : mask)\n if (options.bounds && !options.bounds.hit(editor.editBox.rect.__world, options.matrix)) return\n\n canvas.saveBlendMode('destination-out')\n options = { ...options, shape: true }\n editor.list.forEach(item => {\n item.__render(canvas, options)\n const { parent } = item\n if (parent && (parent as IBox).textBox) parent.__renderShape(canvas, options) // 文本框\n })\n canvas.restoreBlendMode()\n }\n }\n\n public destroy(): void {\n this.editor = null\n super.destroy()\n }\n\n}\n","const filterStyle = `\n<feOffset dy=\"1\"/>\n<feGaussianBlur stdDeviation=\"1.5\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" result=\"shape\"/>`\n\n\nexport const resizeSVG = `\n<svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#f)\">\n<g transform=\"rotate({{rotation}},12,12)\">\n<path d=\"M7.5 8.0H8.5V5.9L6.8 7.2L7.5 8.0ZM3 11.4L2.3 10.6L1.3 11.4L2.3 12.2L3 11.4ZM7.5 10.4H6.5V11.4H7.5V10.4ZM16.5 10.4V11.4H17.5V10.4H16.5ZM16.5 8.0L17.1 7.2L15.5 5.9V8.0H16.5ZM21 11.4L21.6 12.2L22.6 11.4L21.6 10.6L21 11.4ZM16.5 14.9H15.5V16.9L17.1 15.7L16.5 14.9ZM16.5 12.4H17.5V11.4H16.5V12.4ZM7.5 12.4V11.4H6.5V12.4H7.5ZM7.5 14.9L6.8 15.7L8.5 16.9V14.9H7.5ZM6.8 7.2L2.3 10.6L3.6 12.2L8.1 8.7L6.8 7.2ZM8.5 10.4V8.0H6.5V10.4H8.5ZM16.5 9.4H7.5V11.4H16.5V9.4ZM17.5 10.4V8.0H15.5V10.4H17.5ZM15.8 8.7L20.3 12.2L21.6 10.6L17.1 7.2L15.8 8.7ZM20.3 10.6L15.8 14.1L17.1 15.7L21.6 12.2L20.3 10.6ZM17.5 14.9V12.4H15.5V14.9H17.5ZM7.5 13.4H16.5V11.4H7.5V13.4ZM8.5 14.9V12.4H6.5V14.9H8.5ZM2.3 12.2L6.8 15.7L8.1 14.1L3.6 10.6L2.3 12.2Z\" fill=\"white\"/>\n<path fill-rule=\"evenodd\" d=\"M3 11.4L7.5 8.0V10.4H16.5V8.0L21 11.4L16.5 14.9V12.4H7.5V14.9L3 11.4Z\" fill=\"black\"/>\n</g>\n</g>\n<defs>\n<filter id=\"f\" x=\"-1.6\" y=\"3.9\" width=\"27.2\" height=\"16.9\" filterUnits=\"userSpaceOnUse\">\n${filterStyle}\n</filter>\n</defs>\n</svg>\n`\n\nexport const rotateSVG = `\n<svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#f)\">\n<g transform=\"rotate(135,12,12),rotate({{rotation}},12,12)\">\n<path d=\"M20.4 8H21.4L20.8 7.1L17.3 2.6L17 2.1L16.6 2.6L13.1 7.1L12.5 8H13.5H15.4C14.9 11.8 11.8 14.9 8 15.4V13.5V12.5L7.1 13.1L2.6 16.6L2.1 17L2.6 17.3L7.1 20.8L8 21.4V20.4V18.4C13.5 17.9 17.9 13.5 18.4 8H20.4Z\" stroke=\"white\"/>\n<path fill-rule=\"evenodd\" d=\"M17 3L20.4 7.5H17.9C17.7 13.1 13.1 17.7 7.5 17.9V20.4L3 17L7.5 13.5V15.9C12.0 15.7 15.7 12.0 15.9 7.5H13.5L17 3Z\" fill=\"black\"/>\n</g>\n</g>\n<defs>\n<filter id=\"f\" x=\"-1.6\" y=\"-0.6\" width=\"27.1\" height=\"27.1\" filterUnits=\"userSpaceOnUse\">\n${filterStyle}\n</filter>\n</defs>\n</svg>\n`\n\nexport const skewSVG = `\n<svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#f)\">\n<g transform=\"rotate(90,12,12),rotate({{rotation}},12,12)\">\n<path d=\"M21 10.4L21 11.4L23.8 11.4L21.6 9.6L21 10.4ZM17 10.4V11.4L17 11.4L17 10.4ZM15.5 6L16.1 5.2L14.5 3.9V6H15.5ZM15.5 8.4V9.4H16.5V8.4H15.5ZM6 8.4V7.4H5V8.4H6ZM6 10.4H5V11.4H6V10.4ZM7 14.4V13.4L7 13.4L7 14.4ZM3 14.4L3 13.4L0.1 13.4L2.3 15.2L3 14.4ZM8.5 18.9L7.8 19.7L9.5 21.0V18.9H8.5ZM8.5 16.4V15.4H7.5V16.4H8.5ZM19 16.4V17.4H20V16.4H19ZM19 14.4H20V13.4H19V14.4ZM21 9.4L17 9.4L17 11.4L21 11.4L21 9.4ZM14.8 6.7L20.3 11.2L21.6 9.6L16.1 5.2L14.8 6.7ZM16.5 8.4V6H14.5V8.4H16.5ZM6 9.4H15.5V7.4H6V9.4ZM7 10.4V8.4H5V10.4H7ZM15.5 9.4H6V11.4H15.5V9.4ZM17 9.4H15.5V11.4H17V9.4ZM7 15.4H8.5V13.4H7V15.4ZM3 15.4L7 15.4L7 13.4L3 13.4L3 15.4ZM9.1 18.1L3.6 13.6L2.3 15.2L7.8 19.7L9.1 18.1ZM7.5 16.4V18.9H9.5V16.4H7.5ZM19 15.4H8.5V17.4H19V15.4ZM18 14.4V16.4H20V14.4H18ZM8.5 15.4H19V13.4H8.5V15.4Z\" fill=\"white\"/>\n<path fill-rule=\"evenodd\" d=\"M17 10.4L21 10.4L15.5 6V8.4H6V10.4H15.5H17ZM8.5 14.4H7L3 14.4L8.5 18.9V16.4H19V14.4H8.5Z\" fill=\"black\"/>\n</g>\n</g>\n<defs>\n<filter x=\"-2.8\" y=\"1.9\" width=\"29.6\" height=\"23.1\" filterUnits=\"userSpaceOnUse\" >\n${filterStyle}\n</filter>\n</defs>\n</svg>\n`","import { IEditorConfig } from '@leafer-in/interface'\nimport { resizeSVG, rotateSVG, skewSVG } from './svg'\n\n\nexport const config: IEditorConfig = {\n editSize: 'size',\n keyEvent: true,\n\n stroke: '#836DFF',\n strokeWidth: 2,\n\n pointFill: '#FFFFFF',\n pointSize: 10,\n pointRadius: 16,\n\n rotateGap: 45,\n\n buttonsDirection: 'bottom',\n buttonsMargin: 12,\n\n hideOnSmall: true,\n\n moveCursor: 'move',\n resizeCursor: { url: resizeSVG, x: 12, y: 12 },\n rotateCursor: { url: rotateSVG, x: 12, y: 12 },\n skewCursor: { url: skewSVG, x: 12, y: 12 },\n\n selector: true,\n editBox: true,\n hover: true,\n select: 'press',\n openInner: 'double',\n multipleSelect: true,\n boxSelect: true,\n\n moveable: true,\n resizeable: true,\n flipable: true,\n rotateable: true,\n skewable: true\n}","import { ILeaf } from '@leafer-ui/interface'\nimport { Bounds } from '@leafer-ui/draw'\n\nimport { IEditor } from '@leafer-in/interface'\n\n\nconst bounds = new Bounds()\n\nexport function simulate(editor: IEditor) {\n const { simulateTarget, list } = editor\n const { zoomLayer } = list[0].leafer // follow zoomLayer zoom / move\n simulateTarget.safeChange(() => {\n bounds.setListWithFn(list, (leaf: ILeaf) => leaf.getBounds('box', 'page'))\n if (bounds.width === 0) bounds.width = 0.1 // fix\n if (bounds.height === 0) bounds.height = 0.1\n simulateTarget.reset(bounds.get())\n })\n zoomLayer.add(simulateTarget)\n}","import { IGroup, IGroupInputData, ILeaf, IUI } from '@leafer-ui/interface'\nimport { Group, Matrix } from '@leafer-ui/draw'\n\n\nconst order = (a: ILeaf, b: ILeaf) => a.parent.children.indexOf(a) - b.parent.children.indexOf(b)\nconst reverseOrder = (a: ILeaf, b: ILeaf) => b.parent.children.indexOf(b) - a.parent.children.indexOf(a)\n\nexport const EditorHelper = {\n\n group(list: IUI[], element?: IUI, userGroup?: IGroup | IGroupInputData): IGroup {\n list.sort(reverseOrder)\n const { app, parent } = list[0]\n\n let group: IGroup\n if (userGroup && (userGroup as IGroup).add) {\n group = userGroup as IGroup\n } else {\n group = new Group(userGroup)\n }\n\n parent.addAt(group, parent.children.indexOf(list[0]))\n list.sort(order)\n\n const matrx = new Matrix(element.worldTransform)\n matrx.divideParent(parent.worldTransform)\n group.setTransform(matrx)\n group.editable = true\n group.hitChildren = false\n\n app.lockLayout()\n list.forEach(child => child.dropTo(group))\n app.unlockLayout()\n\n return group\n },\n\n ungroup(list: IUI[]): IUI[] {\n const { app } = list[0]\n const ungroupList: IUI[] = []\n\n app.lockLayout()\n list.forEach(leaf => {\n if (leaf.isBranch) {\n const { parent, children } = leaf\n while (children.length) {\n ungroupList.push(children[0])\n children[0].dropTo(parent, parent.children.indexOf(leaf))\n }\n if (leaf.isBranchLeaf) ungroupList.push(leaf)\n else leaf.remove()\n } else {\n ungroupList.push(leaf)\n }\n })\n app.unlockLayout()\n\n return ungroupList\n },\n\n toTop(list: IUI[]): void {\n list.sort(order)\n list.forEach(leaf => {\n if (leaf.parent) leaf.parent.add(leaf)\n })\n },\n\n toBottom(list: IUI[]): void {\n list.sort(reverseOrder)\n list.forEach(leaf => {\n if (leaf.parent) leaf.parent.addAt(leaf, 0)\n })\n }\n\n}","import { IObject } from '@leafer-ui/interface'\nimport { Debug } from '@leafer-ui/draw'\n\nimport { IEditTool, IEditor } from '@leafer-in/interface'\n\n\nconst debug = Debug.get('EditToolCreator')\n\nexport function registerEditTool() {\n return (target: IObject) => {\n EditToolCreator.register(target)\n }\n}\n\nexport const registerInnerEditor = registerEditTool\n\nexport const EditToolCreator = {\n\n list: {} as IObject,\n\n register(EditTool: IObject): void {\n const { tag } = EditTool.prototype as IEditTool\n list[tag] && debug.repeat(tag)\n list[tag] = EditTool\n },\n\n get(tag: string, editor: IEditor): IEditTool {\n return new list[tag](editor)\n }\n\n}\n\nconst { list } = EditToolCreator","import { IInnerEditorEvent, IInnerEditor } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\nimport { IUI } from '@leafer-ui/interface'\nimport { } from '../tool/InnerEditor'\n\n\nexport class InnerEditorEvent extends EditorEvent implements IInnerEditorEvent {\n\n static BEFORE_OPEN = 'innerEditor.before_open'\n static OPEN = 'innerEditor.open'\n\n static BEFORE_CLOSE = 'innerEditor.before_close'\n static CLOSE = 'innerEditor.close'\n\n readonly editTarget: IUI\n readonly innerEditor: IInnerEditor\n\n constructor(type: string, data?: IInnerEditorEvent) {\n super(type, data)\n }\n\n}","import { IEditorGroupEvent } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\nimport { IGroup } from '@leafer-ui/interface'\nimport { } from '../tool/InnerEditor'\n\n\nexport class EditorGroupEvent extends EditorEvent implements IEditorGroupEvent {\n\n\n static BEFORE_GROUP = 'editor.before_group'\n static GROUP = 'editor.group'\n\n static BEFORE_UNGROUP = 'editor.before_ungroup'\n static UNGROUP = 'editor.ungroup'\n\n static BEFORE_OPEN = 'editor.before_open_group'\n static OPEN = 'editor.open_group'\n\n static BEFORE_CLOSE = 'editor.before_close_group'\n static CLOSE = 'editor.close_group'\n\n readonly editTarget: IGroup\n\n constructor(type: string, data?: IEditorGroupEvent) {\n super(type, data)\n }\n\n}","import { IObject, IFunction, IMatrix } from '@leafer-ui/interface'\nimport { LeafHelper, Matrix, PropertyEvent, Rect } from '@leafer-ui/draw'\n\nimport { IEditor, ISimulateElement } from '@leafer-in/interface'\n\n\nconst { updateMatrix } = LeafHelper\nconst checkMap: IObject = { x: 1, y: 1, scaleX: 1, scaleY: 1, rotation: 1, skewX: 1, skewY: 1 }, origin = 'top-left'\n\nexport class SimulateElement extends Rect implements ISimulateElement {\n\n public get __tag() { return 'SimulateElement' }\n\n public checkChange = true\n\n public canChange = true\n\n public changedTransform: IMatrix\n\n\n constructor(editor: IEditor) {\n super()\n\n this.visible = this.hittable = false\n\n this.on(PropertyEvent.CHANGE, (event: PropertyEvent) => {\n\n if (this.checkChange && checkMap[event.attrName]) {\n\n const { attrName, newValue, oldValue } = event\n const addValue = attrName[0] === 's' ? (<number>newValue || 1) / (<number>oldValue || 1) : (<number>newValue || 0) - (<number>oldValue || 0)\n\n this.canChange = false\n\n const data: IObject = this.__\n\n // old matrix\n data[attrName] = oldValue\n updateMatrix(this.parent)\n updateMatrix(this)\n\n const oldMatrix = new Matrix(this.__world)\n\n // new matrix\n data[attrName] = newValue\n this.__layout.rotationChange()\n updateMatrix(this)\n\n this.changedTransform = new Matrix(this.__world).divide(oldMatrix) // world change transform\n\n switch (attrName) {\n case 'x':\n editor.move(addValue, 0)\n break\n case 'y':\n editor.move(0, addValue)\n break\n case 'rotation':\n editor.rotateOf(origin, addValue)\n break\n case 'scaleX':\n editor.scaleOf(origin, addValue, 1)\n break\n case 'scaleY':\n editor.scaleOf(origin, 1, addValue)\n break\n case 'skewX':\n editor.skewOf(origin, addValue, 0)\n break\n case 'skewY':\n editor.skewOf(origin, 0, addValue)\n }\n\n this.canChange = true\n\n }\n })\n }\n\n public safeChange(changeFn: IFunction): void {\n if (this.canChange) {\n this.checkChange = false\n changeFn()\n this.checkChange = true\n }\n }\n}","import { IEditorMoveEvent } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\n\n\nexport class EditorMoveEvent extends EditorEvent implements IEditorMoveEvent {\n\n static BEFORE_MOVE = 'editor.before_move'\n static MOVE = 'editor.move'\n\n readonly moveX: number\n readonly moveY: number\n\n constructor(type: string, data?: IEditorMoveEvent) {\n super(type, data)\n }\n\n}","import { IAround, IDragEvent, IMatrixData } from '@leafer-ui/interface'\n\nimport { IEditorScaleEvent } from '@leafer-in/interface'\nimport { Direction9 } from '@leafer-ui/draw'\n\nimport { EditorEvent } from './EditorEvent'\n\n\nexport class EditorScaleEvent extends EditorEvent implements IEditorScaleEvent {\n\n static BEFORE_SCALE = 'editor.before_scale'\n static SCALE = 'editor.scale'\n\n // scaleOf(origin, scaleX, scaleY, resize)\n readonly scaleX: number\n readonly scaleY: number\n readonly transform?: IMatrixData\n\n readonly drag: IDragEvent\n\n readonly direction: Direction9\n readonly lockRatio: boolean\n readonly around: IAround\n\n constructor(type: string, data?: IEditorScaleEvent) {\n super(type, data)\n }\n\n}","import { IEditorRotateEvent } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\n\n\nexport class EditorRotateEvent extends EditorEvent implements IEditorRotateEvent {\n\n static BEFORE_ROTATE = 'editor.before_rotate'\n static ROTATE = 'editor.rotate'\n\n // rotateOf(origin, rotation)\n readonly rotation: number\n\n constructor(type: string, data?: IEditorRotateEvent) {\n super(type, data)\n }\n\n}","import { IEditorSkewEvent } from '@leafer-in/interface'\n\nimport { EditorEvent } from './EditorEvent'\n\n\nexport class EditorSkewEvent extends EditorEvent implements IEditorSkewEvent {\n\n static BEFORE_SKEW = 'editor.before_skew'\n static SKEW = 'editor.skew'\n\n // skewOf(origin, skewX, skewY)\n readonly skewX: number\n readonly skewY: number\n\n constructor(type: string, data?: IEditorSkewEvent) {\n super(type, data)\n }\n\n}","import { IEvent, IPointData, IAlign, IAxis, IFunction, IMatrix } from '@leafer-ui/interface'\nimport { MathHelper, Matrix, LeafHelper } from '@leafer-ui/draw'\nimport { DragEvent, RotateEvent, ZoomEvent, MoveEvent } from '@leafer-ui/core'\n\nimport { IEditBox, IEditPoint, IEditTool, IEditorScaleEvent, ISimulateElement, IEditorMoveEvent, IEditorRotateEvent, IEditorSkewEvent } from '@leafer-in/interface'\n\nimport { EditorMoveEvent } from '../event/EditorMoveEvent'\nimport { EditorScaleEvent } from '../event/EditorScaleEvent'\nimport { EditorRotateEvent } from '../event/EditorRotateEvent'\nimport { EditorSkewEvent } from '../event/EditorSkewEvent'\n\nimport { EditDataHelper } from '../helper/EditDataHelper'\nimport { ITransformTool } from '@leafer-ui/interface'\n\nexport class TransformTool implements ITransformTool { // Editor use\n\n public editBox: IEditBox\n\n public editTool?: IEditTool // 可能不存在值\n\n\n // operate\n\n public onMove(e: DragEvent | MoveEvent): void {\n\n const { target, mergeConfig, dragStartData } = this.editBox\n\n if (e instanceof MoveEvent) {\n\n if (e.moveType !== 'drag') {\n const { moveable, resizeable } = mergeConfig\n const move = e.getLocalMove(target)\n\n if (moveable === 'move') e.stop(), this.move(move.x, move.y)\n else if (resizeable === 'zoom') e.stop()\n }\n\n } else {\n\n const total = { x: e.totalX, y: e.totalY }\n\n if (e.shiftKey) {\n if (Math.abs(total.x) > Math.abs(total.y)) total.y = 0\n else total.x = 0\n }\n\n this.move(DragEvent.getValidMove(target, dragStartData.point, total))\n\n }\n }\n\n public onScale(e: DragEvent | ZoomEvent): void {\n\n const { target, mergeConfig, single, dragStartData } = this.editBox\n let { around, lockRatio, resizeable, flipable, editSize } = mergeConfig\n\n if (e instanceof ZoomEvent) {\n\n if (resizeable === 'zoom') e.stop(), this.scaleOf(target.getBoxPoint(e), e.scale, e.scale)\n\n } else {\n\n const { direction } = e.current as IEditPoint\n if (e.shiftKey || target.lockRatio) lockRatio = true\n\n const data = EditDataHelper.getScaleData(target, dragStartData.bounds, direction, e.getInnerTotal(target), lockRatio, EditDataHelper.getAround(around, e.altKey), flipable, !single || editSize === 'scale')\n\n if (this.editTool && this.editTool.onScaleWithDrag) {\n data.drag = e\n this.scaleWithDrag(data)\n } else {\n this.scaleOf(data.origin, data.scaleX, data.scaleY)\n }\n\n }\n }\n\n public onRotate(e: DragEvent | RotateEvent): void {\n\n const { target, mergeConfig, dragStartData } = this.editBox\n const { skewable, rotateable, around, rotateGap } = mergeConfig\n const { direction, name } = e.current as IEditPoint\n\n if (skewable && name === 'resize-line') return this.onSkew(e as DragEvent)\n\n let origin: IPointData, rotation: number\n\n if (e instanceof RotateEvent) {\n\n if (rotateable === 'rotate') e.stop(), rotation = e.rotation, origin = target.getBoxPoint(e)\n else return\n\n if (target.scaleX * target.scaleY < 0) rotation = -rotation // flippedOne\n\n } else {\n\n const data = EditDataHelper.getRotateData(target, direction, e, dragStartData, e.shiftKey ? null : (target.around || target.origin || around || 'center'))\n rotation = data.rotation\n origin = data.origin\n\n }\n\n if (target.scaleX * target.scaleY < 0) rotation = -rotation // flippedOne\n if (e instanceof DragEvent) rotation = dragStartData.rotation + rotation - target.rotation\n\n rotation = MathHelper.float(MathHelper.getGapRotation(rotation, rotateGap, target.rotation), 2)\n if (!rotation) return\n\n this.rotateOf(origin, rotation)\n }\n\n public onSkew(e: DragEvent): void {\n\n const { target, mergeConfig } = this.editBox\n const { around } = mergeConfig\n\n const { origin, skewX, skewY } = EditDataHelper.getSkewData(target.boxBounds, (e.current as IEditPoint).direction, e.getInnerMove(target), EditDataHelper.getAround(around, e.altKey))\n if (!skewX && !skewY) return\n\n this.skewOf(origin, skewX, skewY)\n }\n\n\n // transform\n\n public move(x: number | IPointData, y = 0): void {\n if (!this.checkTransform('moveable')) return\n if (typeof x === 'object') y = x.y, x = x.x\n\n const { target, mergeConfig, single, editor } = this.editBox\n const { beforeMove } = mergeConfig\n if (beforeMove) {\n const check = beforeMove({ target, x, y })\n if (typeof check === 'object') x = check.x, y = check.y\n else if (check === false) return\n }\n\n const world = target.getWorldPointByLocal({ x, y }, null, true)\n if (!single) (target as ISimulateElement).safeChange(() => target.move(x, y))\n const data: IEditorMoveEvent = { target, editor, moveX: world.x, moveY: world.y }\n\n this.emitEvent(new EditorMoveEvent(EditorMoveEvent.BEFORE_MOVE, data))\n const event = new EditorMoveEvent(EditorMoveEvent.MOVE, data)\n this.doMove(event)\n this.emitEvent(event)\n }\n\n public scaleWithDrag(data: IEditorScaleEvent): void {\n if (!this.checkTransform('resizeable')) return\n\n const { target, mergeConfig, editor } = this.editBox\n const { beforeScale } = mergeConfig\n if (beforeScale) {\n const { origin, scaleX, scaleY, drag } = data\n const check = beforeScale({ target, drag, origin, scaleX, scaleY })\n if (check === false) return\n }\n\n data = { ...data, target, editor, worldOrigin: target.getWorldPoint(data.origin) }\n\n this.emitEvent(new EditorScaleEvent(EditorScaleEvent.BEFORE_SCALE, data))\n const event = new EditorScaleEvent(EditorScaleEvent.SCALE, data)\n this.editTool.onScaleWithDrag(event)\n this.emitEvent(event)\n }\n\n public scaleOf(origin: IPointData | IAlign, scaleX: number, scaleY = scaleX, _resize?: boolean): void {\n if (!this.checkTransform('resizeable')) return\n\n const { target, mergeConfig, single, editor } = this.editBox\n\n const { beforeScale } = mergeConfig\n if (beforeScale) {\n const check = beforeScale({ target, origin, scaleX, scaleY })\n if (typeof check === 'object') scaleX = check.scaleX, scaleY = check.scaleY\n else if (check === false) return\n }\n\n const worldOrigin = this.getWorldOrigin(origin)\n const transform = !single && this.getChangedTransform(() => (target as ISimulateElement).safeChange(() => target.scaleOf(origin, scaleX, scaleY)))\n const data: IEditorScaleEvent = { target, editor, worldOrigin, scaleX, scaleY, transform }\n\n this.emitEvent(new EditorScaleEvent(EditorScaleEvent.BEFORE_SCALE, data))\n const event = new EditorScaleEvent(EditorScaleEvent.SCALE, data)\n this.doScale(event)\n this.emitEvent(event)\n }\n\n public flip(axis: IAxis): void {\n if (!this.checkTransform('resizeable')) return\n\n const { target, single, editor } = this.editBox\n\n const worldOrigin = this.getWorldOrigin('center')\n const transform = !single ? this.getChangedTransform(() => (target as ISimulateElement).safeChange(() => target.flip(axis))) : new Matrix(LeafHelper.getFlipTransform(target, axis))\n const data: IEditorScaleEvent = { target, editor, worldOrigin, scaleX: axis === 'x' ? -1 : 1, scaleY: axis === 'y' ? -1 : 1, transform }\n\n this.emitEvent(new EditorScaleEvent(EditorScaleEvent.BEFORE_SCALE, data))\n const event = new EditorScaleEvent(EditorScaleEvent.SCALE, data)\n this.doScale(event)\n this.emitEvent(event)\n }\n\n public rotateOf(origin: IPointData | IAlign, rotation: number): void {\n if (!this.checkTransform('rotateable')) return\n\n const { target, mergeConfig, single, editor } = this.editBox\n\n const { beforeRotate } = mergeConfig\n if (beforeRotate) {\n const check = beforeRotate({ target, origin, rotation })\n if (typeof check === 'number') rotation = check\n else if (check === false) return\n }\n\n const worldOrigin = this.getWorldOrigin(origin)\n const transform = !single && this.getChangedTransform(() => (target as ISimulateElement).safeChange(() => target.rotateOf(origin, rotation)))\n const data: IEditorRotateEvent = { target, editor, worldOrigin, rotation, transform }\n\n this.emitEvent(new EditorRotateEvent(EditorRotateEvent.BEFORE_ROTATE, data))\n const event = new EditorRotateEvent(EditorRotateEvent.ROTATE, data)\n this.doRotate(event)\n this.emitEvent(event)\n }\n\n public skewOf(origin: IPointData | IAlign, skewX: number, skewY = 0, _resize?: boolean): void {\n if (!this.checkTransform('skewable')) return\n\n const { target, mergeConfig, single, editor } = this.editBox\n\n const { beforeSkew } = mergeConfig\n if (beforeSkew) {\n const check = beforeSkew({ target, origin, skewX, skewY })\n if (typeof check === 'object') skewX = check.skewX, skewY = check.skewY\n else if (check === false) return\n }\n\n const worldOrigin = this.getWorldOrigin(origin)\n const transform = !single && this.getChangedTransform(() => (target as ISimulateElement).safeChange(() => target.skewOf(origin, skewX, skewY)))\n const data: IEditorSkewEvent = { target, editor, worldOrigin, skewX, skewY, transform }\n\n this.emitEvent(new EditorSkewEvent(EditorSkewEvent.BEFORE_SKEW, data))\n const event = new EditorSkewEvent(EditorSkewEvent.SKEW, data)\n this.doSkew(event)\n this.emitEvent(event)\n }\n\n\n // do\n\n protected doMove(event: IEditorMoveEvent) {\n this.editTool.onMove(event)\n }\n\n protected doScale(event: IEditorScaleEvent): void {\n this.editTool.onScale(event)\n }\n\n protected doRotate(event: IEditorRotateEvent): void {\n this.editTool.onRotate(event)\n }\n\n protected doSkew(event: IEditorSkewEvent): void {\n this.editTool.onSkew(event)\n }\n\n // helper\n\n public checkTransform(type: 'moveable' | 'resizeable' | 'rotateable' | 'skewable'): boolean {\n const { target, mergeConfig } = this.editBox\n return target && !target.locked && mergeConfig[type] as boolean\n }\n\n protected getWorldOrigin(origin: IPointData | IAlign): IPointData {\n const { target } = this.editBox\n return target.getWorldPoint(LeafHelper.getInnerOrigin(target, origin))\n }\n\n protected getChangedTransform(func: IFunction): IMatrix {\n\n const { target, single } = this.editBox\n if (!single && !(target as ISimulateElement).canChange) return (target as ISimulateElement).changedTransform\n\n const oldMatrix = new Matrix(target.worldTransform)\n func()\n return new Matrix(target.worldTransform).divide(oldMatrix) // world change transform\n }\n\n // need rewrite\n public emitEvent(event?: IEvent, capture?: boolean): void {\n this.editBox.editor.emitEvent(event, capture)\n }\n\n}","import { IGroupInputData, IUI, IEventListenerId, IPointData, ILeafList, IEditSize, IGroup, IObject, IAlign, IAxis, IFunction, IMatrix, IApp } from '@leafer-ui/interface'\nimport { Group, DataHelper, LeafList, RenderEvent, LeafHelper, Direction9, Plugin } from '@leafer-ui/draw'\nimport { DragEvent, RotateEvent, ZoomEvent, MoveEvent, useModule } from '@leafer-ui/core'\n\nimport { IEditBox, IEditPoint, IEditor, IEditorConfig, IEditTool, IEditorScaleEvent, IInnerEditor, ISimulateElement } from '@leafer-in/interface'\n\nimport { EditSelect } from './display/EditSelect'\nimport { EditBox } from './display/EditBox'\nimport { EditMask } from './display/EditMask'\n\nimport { config } from './config'\n\nimport { onTarget, onHover } from './editor/target'\nimport { targetAttr, mergeConfigAttr } from './decorator/data'\nimport { EditorHelper } from './helper/EditorHelper'\nimport { simulate } from './editor/simulate'\nimport { EditToolCreator } from './tool/EditToolCreator'\nimport { InnerEditorEvent } from './event/InnerEditorEvent'\nimport { EditorGroupEvent } from './event/EditorGroupEvent'\nimport { SimulateElement } from './display/SimulateElement'\nimport { TransformTool } from './tool/TransformTool'\n\n@useModule(TransformTool, ['editBox', 'editTool', 'emitEvent'])\nexport class Editor extends Group implements IEditor {\n\n public config: IEditorConfig\n\n @mergeConfigAttr()\n readonly mergeConfig: IEditorConfig\n readonly mergedConfig: IEditorConfig\n\n @targetAttr(onHover)\n public hoverTarget?: IUI\n\n @targetAttr(onTarget)\n public target?: IUI | IUI[]\n\n // 列表\n\n public leafList: ILeafList = new LeafList() // from target\n public get list(): IUI[] { return this.leafList.list as IUI[] }\n public get dragHoverExclude(): IUI[] { return [this.editBox.rect] }\n public openedGroupList: ILeafList = new LeafList()\n\n // 状态\n\n public get editing(): boolean { return !!this.list.length }\n public innerEditing: boolean\n public get groupOpening(): boolean { return !!this.openedGroupList.length }\n public resizeDirection?: Direction9\n\n public get multiple(): boolean { return this.list.length > 1 }\n public get single(): boolean { return this.list.length === 1 }\n\n public get dragging(): boolean { return this.editBox.dragging }\n public get moving(): boolean { return this.editBox.moving }\n public get dragPoint(): IEditPoint { return this.editBox.dragPoint }\n\n // 组件\n\n public get element() { return this.multiple ? this.simulateTarget : this.list[0] as ISimulateElement }\n public simulateTarget: ISimulateElement = new SimulateElement(this)\n\n public editBox: IEditBox = new EditBox(this)\n public get buttons() { return this.editBox.buttons }\n\n public editTool?: IEditTool\n\n public innerEditor?: IInnerEditor\n public editToolList: IObject = {}\n\n public selector: EditSelect = new EditSelect(this)\n public editMask: EditMask = new EditMask(this)\n\n public targetChanged: boolean\n public targetEventIds: IEventListenerId[] = []\n\n\n constructor(userConfig?: IEditorConfig, data?: IGroupInputData) {\n super(data)\n let mergedConfig: IEditorConfig = DataHelper.clone(config)\n if (userConfig) mergedConfig = DataHelper.default(userConfig, mergedConfig)\n this.mergedConfig = this.config = mergedConfig\n\n this.addMany(this.editMask, this.selector, this.editBox)\n if (!Plugin.has('resize')) this.config.editSize = 'scale'\n }\n\n // select \n\n public select(target: IUI | IUI[]): void {\n this.target = target\n }\n\n public cancel(): void {\n this.target = null\n }\n\n // item\n\n public hasItem(item: IUI): boolean {\n return this.leafList.has(item)\n }\n\n public addItem(item: IUI): void {\n if (!this.hasItem(item) && !item.locked) this.leafList.add(item), this.target = this.leafList.list as IUI[]\n }\n\n public removeItem(item: IUI): void {\n if (this.hasItem(item)) this.leafList.remove(item), this.target = this.leafList.list as IUI[]\n }\n\n public shiftItem(item: IUI): void {\n this.hasItem(item) ? this.removeItem(item) : this.addItem(item)\n }\n\n // update\n\n public update(): void {\n if (this.editing) {\n if (!this.element.parent) return this.cancel()\n if (this.innerEditing) this.innerEditor.update()\n this.editTool.update()\n this.selector.update()\n }\n }\n\n public updateEditBox(): void {\n if (this.multiple) simulate(this)\n this.update()\n }\n\n public updateEditTool(): void {\n let tool = this.editTool\n if (tool) {\n this.editBox.unload()\n tool.unload()\n this.editTool = null\n }\n\n if (this.editing) {\n const tag = this.element.editOuter || 'EditTool'\n tool = this.editTool = this.editToolList[tag] = this.editToolList[tag] || EditToolCreator.get(tag, this)\n this.editBox.load()\n tool.load()\n this.update()\n }\n }\n\n\n // get\n\n public getEditSize(_ui: IUI): IEditSize {\n return this.mergeConfig.editSize\n }\n\n\n // TransformTool will rewrite -----\n\n // operate \n\n public onMove(_e: DragEvent | MoveEvent): void { }\n\n public onScale(_e: DragEvent | ZoomEvent): void { }\n\n public onRotate(_e: DragEvent | RotateEvent): void { }\n\n public onSkew(_e: DragEvent): void { }\n\n\n // transform\n\n public move(_x: number | IPointData, _y = 0): void { }\n\n public scaleWithDrag(_data: IEditorScaleEvent): void { }\n\n override scaleOf(_origin: IPointData | IAlign, scaleX: number, _scaleY = scaleX, _resize?: boolean): void { }\n\n override flip(_axis: IAxis): void { }\n\n override rotateOf(_origin: IPointData | IAlign, _rotation: number): void { }\n\n override skewOf(_origin: IPointData | IAlign, _skewX: number, _skewY = 0, _resize?: boolean): void { }\n\n public checkTransform(_type: 'moveable' | 'resizeable' | 'rotateable' | 'skewable'): boolean { return undefined }\n\n protected getWorldOrigin(_origin: IPointData | IAlign): IPointData { return undefined }\n\n protected getChangedTransform(_func: IFunction): IMatrix { return undefined }\n\n // --------\n\n\n // group\n\n public group(userGroup?: IGroup | IGroupInputData): IGroup {\n if (this.multiple) {\n this.emitGroupEvent(EditorGroupEvent.BEFORE_GROUP)\n this.target = EditorHelper.group(this.list, this.element, userGroup)\n this.emitGroupEvent(EditorGroupEvent.GROUP, this.target as IGroup)\n }\n return this.target as IGroup\n }\n\n public ungroup(): IUI[] {\n const { list } = this\n if (list.length) {\n list.forEach(item => item.isBranch && this.emitGroupEvent(EditorGroupEvent.BEFORE_UNGROUP, item as IGroup))\n this.target = EditorHelper.ungroup(list)\n list.forEach(item => item.isBranch && this.emitGroupEvent(EditorGroupEvent.UNGROUP, item as IGroup))\n }\n return this.list\n }\n\n public openGroup(group: IGroup): void {\n this.emitGroupEvent(EditorGroupEvent.BEFORE_OPEN, group)\n this.openedGroupList.add(group)\n group.hitChildren = true\n this.emitGroupEvent(EditorGroupEvent.OPEN, group)\n }\n\n public closeGroup(group: IGroup): void {\n this.emitGroupEvent(EditorGroupEvent.BEFORE_CLOSE, group)\n this.openedGroupList.remove(group)\n group.hitChildren = false\n this.emitGroupEvent(EditorGroupEvent.CLOSE, group)\n }\n\n public checkOpenedGroups(): void {\n const opened = this.openedGroupList\n if (opened.length) {\n let { list } = opened\n if (this.editing) list = [], opened.forEach(item => this.list.every(leaf => !LeafHelper.hasParent(leaf, item)) && list.push(item))\n list.forEach(item => this.closeGroup(item as IGroup))\n }\n if (this.editing && !this.selector.dragging) this.checkDeepSelect()\n }\n\n public checkDeepSelect(): void {\n let parent: IGroup, { list } = this\n for (let i = 0; i < list.length; i++) {\n parent = list[i].parent\n while (parent && !parent.hitChildren) {\n this.openGroup(parent)\n parent = parent.parent\n }\n }\n }\n\n public emitGroupEvent(type: string, group?: IGroup): void {\n const event = new EditorGroupEvent(type, { editTarget: group })\n this.emitEvent(event)\n if (group) group.emitEvent(event)\n }\n\n // inner\n\n public openInnerEditor(target?: IUI, select?: boolean): void {\n if (target && select) this.target = target\n if (this.single) {\n const editTarget = target || this.element\n const tag = editTarget.editInner\n if (tag && EditToolCreator.list[tag]) {\n this.editTool.unload()\n this.innerEditing = true\n this.innerEditor = this.editToolList[tag] || EditToolCreator.get(tag, this)\n this.innerEditor.editTarget = editTarget\n\n this.emitInnerEvent(InnerEditorEvent.BEFORE_OPEN)\n this.innerEditor.load()\n this.emitInnerEvent(InnerEditorEvent.OPEN)\n }\n }\n }\n\n public closeInnerEditor(): void {\n if (this.innerEditing) {\n this.innerEditing = false\n\n this.emitInnerEvent(InnerEditorEvent.BEFORE_CLOSE)\n this.innerEditor.unload()\n this.emitInnerEvent(InnerEditorEvent.CLOSE)\n\n this.editTool.load()\n this.innerEditor = null\n }\n }\n\n public emitInnerEvent(type: string): void {\n const { innerEditor } = this, { editTarget } = innerEditor\n const event = new InnerEditorEvent(type, { editTarget, innerEditor })\n this.emitEvent(event)\n editTarget.emitEvent(event)\n }\n\n // lock\n\n public lock(): void {\n this.list.forEach(leaf => leaf.locked = true)\n this.update()\n }\n\n public unlock(): void {\n this.list.forEach(leaf => leaf.locked = false)\n this.update()\n }\n\n // level\n\n public toTop(): void {\n if (this.list.length) {\n EditorHelper.toTop(this.list)\n this.leafList.update()\n }\n }\n\n public toBottom(): void {\n if (this.list.length) {\n EditorHelper.toBottom(this.list)\n this.leafList.update()\n }\n }\n\n protected onAppRenderStart(app: IApp): void {\n if (this.targetChanged = app.children.some(leafer => leafer !== this.leafer && leafer.renderer.changed)) this.editBox.forceRender()\n }\n\n protected onRenderStart(): void {\n if (this.targetChanged) this.update()\n }\n\n\n // event \n\n public listenTargetEvents(): void {\n if (!this.targetEventIds.length) {\n const { app, leafer, editMask } = this\n this.targetEventIds = [\n leafer.on_(RenderEvent.START, this.onRenderStart, this),\n\n app.on_([\n [RenderEvent.CHILD_START, this.onAppRenderStart, this],\n\n [MoveEvent.BEFORE_MOVE, this.onMove, this, true],\n [ZoomEvent.BEFORE_ZOOM, this.onScale, this, true],\n [RotateEvent.BEFORE_ROTATE, this.onRotate, this, true],\n ])\n ]\n if (editMask.visible) editMask.forceRender()\n }\n }\n\n public removeTargetEvents(): void {\n const { targetEventIds, editMask } = this\n if (targetEventIds.length) {\n this.off_(targetEventIds)\n if (editMask.visible) editMask.forceRender()\n }\n }\n\n public destroy(): void {\n if (!this.destroyed) {\n this.target = this.hoverTarget = null\n\n Object.values(this.editToolList).forEach(item => item.destroy())\n this.simulateTarget.destroy()\n\n this.editToolList = {}\n this.simulateTarget = this.editTool = this.innerEditor = null\n\n super.destroy()\n }\n }\n\n}","import { LeafList } from '@leafer-ui/draw'\n\nimport { IEditor, IUI } from '@leafer-in/interface'\n\nimport { simulate } from './simulate'\nimport { EditorEvent } from '../event/EditorEvent'\n\n\nexport function onTarget(editor: IEditor, oldValue: IUI | IUI[]): void {\n const { target } = editor\n if (target) {\n editor.leafList = target instanceof LeafList ? target : new LeafList(target)\n if (editor.multiple) simulate(editor) // 更新模拟元素\n } else {\n editor.simulateTarget.remove()\n editor.leafList.reset()\n }\n\n editor.closeInnerEditor()\n\n const data = { editor, value: target, oldValue }\n editor.emitEvent(new EditorEvent(EditorEvent.SELECT, data))\n editor.checkOpenedGroups()\n\n if (editor.editing) {\n editor.waitLeafer(() => {\n editor.updateEditTool()\n editor.listenTargetEvents()\n })\n } else {\n editor.updateEditTool()\n editor.removeTargetEvents()\n }\n\n editor.emitEvent(new EditorEvent(EditorEvent.AFTER_SELECT, data))\n}\n\n\nexport function onHover(editor: IEditor, oldValue: IUI): void {\n editor.emitEvent(new EditorEvent(EditorEvent.HOVER, { editor, value: editor.hoverTarget, oldValue }))\n}","import { IGroup, IEventListenerId, IUI, IObject } from '@leafer-ui/interface'\nimport { IInnerEditor, IEditor, IEditBox, IInnerEditorMode } from '@leafer-in/interface'\n\nimport { Group } from '@leafer-ui/draw'\nimport { EditToolCreator } from './EditToolCreator'\n\nexport class InnerEditor implements IInnerEditor {\n\n static registerInnerEditor() {\n EditToolCreator.register(this)\n }\n\n\n public get tag() { return 'InnerEditor' }\n\n public get mode(): IInnerEditorMode { return 'focus' } // 专注模式\n\n public editTarget: IUI\n\n public config: IObject\n\n public editor: IEditor\n public get editBox(): IEditBox { return this.editor.editBox }\n\n public view: IGroup\n\n public eventIds: IEventListenerId[] = []\n\n\n constructor(editor: IEditor) {\n this.editor = editor\n this.create()\n }\n\n\n public onCreate(): void { }\n public create(): void {\n this.view = new Group()\n this.onCreate()\n }\n\n\n // 状态\n\n public onLoad(): void { }\n public load(): void {\n const { editor } = this\n if (editor) {\n if (editor.app && this.mode === 'focus') editor.selector.hittable = editor.app.tree.hitChildren = false\n this.onLoad()\n }\n }\n\n public onUpdate(): void { }\n public update(): void { this.onUpdate() }\n\n public onUnload(): void { }\n public unload(): void {\n const { editor } = this\n if (editor) {\n if (editor.app && this.mode === 'focus') editor.selector.hittable = editor.app.tree.hitChildren = true\n this.onUnload()\n }\n }\n\n public onDestroy(): void { }\n public destroy(): void {\n this.onDestroy()\n if (this.editor) {\n if (this.view) this.view.destroy()\n if (this.eventIds) this.editor.off_(this.eventIds)\n this.editor = this.view = this.eventIds = null\n }\n }\n\n}","import { IEditorScaleEvent, IEditorRotateEvent, IEditTool, IEditorSkewEvent, IEditorMoveEvent } from '@leafer-in/interface'\n\nimport { registerEditTool, EditToolCreator } from './EditToolCreator'\nimport { InnerEditor } from './InnerEditor'\n\n\n@registerEditTool()\nexport class EditTool extends InnerEditor implements IEditTool {\n\n static registerEditTool() {\n EditToolCreator.register(this)\n }\n\n\n public get tag() { return 'EditTool' }\n\n\n // 操作\n\n public onMove(e: IEditorMoveEvent): void {\n const { moveX, moveY, editor } = e\n const { app, list } = editor\n app.lockLayout()\n list.forEach(target => { target.moveWorld(moveX, moveY) })\n app.unlockLayout()\n }\n\n public onScale(e: IEditorScaleEvent): void {\n const { scaleX, scaleY, transform, worldOrigin, editor } = e\n const { app, list } = editor\n app.lockLayout()\n list.forEach(target => {\n const resize = editor.getEditSize(target) !== 'scale'\n if (transform) target.transformWorld(transform, resize)\n else target.scaleOfWorld(worldOrigin, scaleX, scaleY, resize)\n })\n app.unlockLayout()\n }\n\n public onRotate(e: IEditorRotateEvent): void {\n const { rotation, transform, worldOrigin, editor } = e\n const { app, list } = editor\n app.lockLayout()\n list.forEach(target => {\n const resize = editor.getEditSize(target) !== 'scale'\n if (transform) target.transformWorld(transform, resize)\n else target.rotateOfWorld(worldOrigin, rotation)\n })\n app.unlockLayout()\n }\n\n public onSkew(e: IEditorSkewEvent): void {\n const { skewX, skewY, transform, worldOrigin, editor } = e\n const { app, list } = editor\n app.lockLayout()\n list.forEach(target => {\n const resize = editor.getEditSize(target) !== 'scale'\n if (transform) target.transformWorld(transform, resize)\n else target.skewOfWorld(worldOrigin, skewX, skewY, resize)\n })\n app.unlockLayout()\n }\n\n // 状态\n\n public load(): void {\n this.editBox.view.visible = true\n this.onLoad()\n }\n\n public update(): void {\n this.editBox.update()\n this.onUpdate()\n }\n\n public unload(): void {\n this.editBox.view.visible = false\n this.onUnload()\n }\n\n}","import { IEditorScaleEvent, ILine, IEditorSkewEvent, IPointData, IAround, IPathCommandData, IFromToData, IUI, IDragEvent } from '@leafer-in/interface'\n\nimport { getPointData, Direction9, PointHelper } from '@leafer-ui/draw'\n\nimport { EditTool } from './EditTool'\nimport { registerEditTool } from './EditToolCreator'\n\n\nconst { left, right } = Direction9\nconst { move, copy, toNumberPoints } = PointHelper\n\n@registerEditTool()\nexport class LineEditTool extends EditTool {\n\n public get tag() { return 'LineEditTool' }\n\n public scaleOfEvent = true\n\n onScaleWithDrag(e: IEditorScaleEvent): void {\n const { drag, direction, lockRatio, around } = e\n const line = e.target as ILine\n const isDragFrom = direction === left\n\n if (line.pathInputed) {\n\n const { path } = line.__\n const { from, to } = this.getFromToByPath(path)\n\n this.dragPoint(from, to, isDragFrom, around, this.getInnerMove(line, drag, lockRatio))\n\n path[1] = from.x, path[2] = from.y\n path[4] = to.x, path[5] = to.y\n line.path = path\n\n } else if (line.points) {\n\n const { points } = line\n const { from, to } = this.getFromToByPoints(points)\n\n this.dragPoint(from, to, isDragFrom, around, this.getInnerMove(line, drag, lockRatio))\n\n points[0] = from.x, points[1] = from.y\n points[2] = to.x, points[3] = to.y\n line.points = points\n\n } else {\n\n const from = getPointData()\n const { toPoint } = line\n line.rotation = 0\n\n this.dragPoint(from, toPoint, isDragFrom, around, this.getInnerMove(line, drag, lockRatio))\n\n line.getLocalPointByInner(from, null, null, true)\n line.getLocalPointByInner(toPoint, null, null, true)\n line.x = from.x\n line.y = from.y\n\n line.getInnerPointByLocal(toPoint, null, null, true)\n line.toPoint = toPoint\n\n }\n\n }\n\n getInnerMove(ui: IUI, event: IDragEvent, lockRatio: boolean | 'corner'): IPointData {\n const movePoint = event.getInnerMove(ui)\n if (lockRatio) Math.abs(movePoint.x) > Math.abs(movePoint.y) ? movePoint.y = 0 : movePoint.x = 0\n return movePoint\n }\n\n getFromToByPath(path: IPathCommandData): IFromToData {\n return {\n from: { x: path[1], y: path[2] },\n to: { x: path[4], y: path[5] }\n }\n }\n\n getFromToByPoints(originPoints: number[] | IPointData[]): IFromToData {\n const points = toNumberPoints(originPoints)\n return {\n from: { x: points[0], y: points[1] },\n to: { x: points[2], y: points[3] }\n }\n\n }\n\n dragPoint(fromPoint: IPointData, toPoint: IPointData, isDragFrom: boolean, around: IAround, movePoint: IPointData): void {\n const { x, y } = movePoint\n if (isDragFrom) {\n move(fromPoint, x, y)\n if (around) move(toPoint, -x, -y)\n } else {\n if (around) move(fromPoint, -x, -y)\n move(toPoint, x, y)\n }\n }\n\n onSkew(_e: IEditorSkewEvent): void {\n\n }\n\n onUpdate() {\n const { editBox } = this, { rotatePoints, resizeLines, resizePoints, rect } = editBox\n const line = this.editor.element as ILine\n\n let fromTo: IFromToData, leftOrRight: boolean\n if (line.pathInputed) fromTo = this.getFromToByPath(line.__.path)\n else if (line.points) fromTo = this.getFromToByPoints(line.__.points)\n\n if (fromTo) {\n const { from, to } = fromTo\n line.innerToWorld(from, from, false, editBox)\n line.innerToWorld(to, to, false, editBox)\n rect.pen.clearPath().moveTo(from.x, from.y).lineTo(to.x, to.y)\n copy(resizePoints[7] as IPointData, from)\n copy(rotatePoints[7] as IPointData, from)\n copy(resizePoints[3] as IPointData, to)\n copy(rotatePoints[3] as IPointData, to)\n }\n\n for (let i = 0; i < 8; i++) {\n if (i < 4) resizeLines[i].visible = false\n leftOrRight = i === left || i === right\n resizePoints[i].visible = leftOrRight\n rotatePoints[i].visible = fromTo ? false : leftOrRight\n }\n }\n\n}","export { Editor } from './Editor'\n\nexport { EditBox } from './display/EditBox'\nexport { EditPoint } from './display/EditPoint'\nexport { EditSelect } from './display/EditSelect'\nexport { SelectArea } from './display/SelectArea'\nexport { Stroker } from './display/Stroker'\n\n\nexport { EditorEvent } from './event/EditorEvent'\nexport { EditorMoveEvent } from './event/EditorMoveEvent'\nexport { EditorScaleEvent } from './event/EditorScaleEvent'\nexport { EditorRotateEvent } from './event/EditorRotateEvent'\nexport { EditorSkewEvent } from './event/EditorSkewEvent'\nexport { EditorGroupEvent } from './event/EditorGroupEvent'\nexport { InnerEditorEvent } from './event/InnerEditorEvent'\n\nexport { EditToolCreator, registerEditTool, registerInnerEditor } from './tool/EditToolCreator'\nexport { InnerEditor } from './tool/InnerEditor'\nexport { EditTool } from './tool/EditTool'\nexport { LineEditTool } from './tool/LineEditTool'\nexport { TransformTool } from './tool/TransformTool'\n\n\nexport { EditorHelper } from './helper/EditorHelper'\nexport { EditDataHelper } from './helper/EditDataHelper'\nexport { EditSelectHelper } from './helper/EditSelectHelper'\n\n\nimport { IEditor, IEditorConfig, IEditToolFunction, IEditorConfigFunction, IApp } from '@leafer-in/interface'\nimport { Creator, UI, Group, Text, Box, dataType, Plugin } from '@leafer-ui/draw'\n\nimport '@leafer-in/resize'\n\nimport { Editor } from './Editor'\n\n\nPlugin.add('editor', 'resize')\n\n\nCreator.editor = function (options?: IEditorConfig, app?: IApp): IEditor {\n const editor = new Editor(options)\n if (app) app.sky.add(app.editor = editor)\n return editor\n}\n\nBox.addAttr('textBox', false, dataType)\n\nUI.addAttr('editConfig', undefined, dataType)\nUI.addAttr('editOuter', (ui: UI) => ui.__.__isLinePath ? 'LineEditTool' : 'EditTool', dataType)\n\nUI.addAttr('editInner', 'PathEditor', dataType)\nGroup.addAttr('editInner', '', dataType) // 必须设为空\nText.addAttr('editInner', 'TextEditor', dataType)\n\nUI.setEditConfig = function (config: IEditorConfig | IEditorConfigFunction): void { this.changeAttr('editConfig', config) }\nUI.setEditOuter = function (toolName: string | IEditToolFunction): void { this.changeAttr('editOuter', toolName) }\nUI.setEditInner = function (editorName: string | IEditToolFunction): void { this.changeAttr('editInner', editorName) }"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","toList","value","Array","SuppressedError","EditorEvent","Event","list","this","oldList","oldValue","constructor","type","data","super","assign","targetAttr","fn","privateKey","defineKey","get","set","old","config","isSelect","locked","splice","beforeSelect","check","BEFORE_SELECT","BEFORE_HOVER","hasEvent","emitEvent","editor","SELECT","AFTER_SELECT","HOVER","abs","Math","copy","scale","MatrixHelper","setListWithFn","BoundsHelper","worldBounds","LeafBoundsHelper","matrix","getMatrixData","bounds","getBoundsData","Stroker","UI","visible","hittable","strokeAlign","setTarget","style","update","__draw","canvas","options","leaf","__","stroke","strokeWidth","fill","worldTransform","worldRenderBounds","width","height","hit","aScaleX","scaleX","aScaleY","scaleY","half","setWorld","beginPath","x","y","__layout","boxBounds","rect","__useArrow","__drawPath","__pathForRender","__drawRenderPath","__drawPathByBox","Paint","strokes","fills","destroy","stroker","prototype","SelectArea","Group","strokeArea","Rect","fillArea","addMany","setStyle","userStyle","reset","opacity","setBounds","EditSelectHelper","findOne","path","find","editable","findByBounds","branch","eachFind","children","child","len","__world","isBranch","hitChildren","hitSelf","push","isFrame","includes","EditSelect","dragging","originList","running","mergeConfig","selector","isMoveMode","app","interaction","moveMode","hoverStroker","targetStroker","Bounds","selectArea","__eventIds","__listenEvents","onHover","hover","hoverStyle","hoverTarget","onSelect","selectedStyle","max","onPointerMove","e","canHover","findUI","hasItem","onBeforeDown","multiTouch","select","mobile","waitSelect","checkAndSelect","onTap","needRemoveItem","removeItem","allowSelect","isMultipleSelect","addItem","allow","shiftKey","onDragStart","allowDrag","area","getInnerPoint","leafList","clone","onDrag","onDragEnd","total","getInnerTotal","dragBounds","unsign","LeafList","selectList","forEach","item","has","some","index","onAutoMove","getLocalMove","leafer","boxSelect","multipleSelect","draggable","editing","middle","findDeepOne","exclude","editBox","findPath","continuousSelect","waitLeafer","proxy","on_","PointerEvent","MOVE","BEFORE_DOWN","TAP","DragEvent","START","DRAG","END","MoveEvent","ZoomEvent","ZOOM","__removeListenEvents","off_","topLeft","top","topRight","right","bottomRight","bottom","bottomLeft","left","Direction9","toPoint","AroundHelper","within","MathHelper","EditDataHelper","getScaleData","startBounds","direction","totalMove","lockRatio","around","flipable","scaleMode","align","origin","widthRange","heightRange","worldBoxBounds","originChangedScaleX","originChangedScaleY","signX","signY","changedScaleX","changedScaleY","topScale","rightScale","bottomScale","leftScale","sqrt","useScaleX","useScaleY","allowBounds","parent","localBounds","__localBoxBounds","scaleOf","getLocalPointByInner","realBounds","getIntersect","fitScaleX","fitScaleY","nowWidth","nowHeight","min","getRotateData","current","last","rotation","PointHelper","getRotation","getWorldPointByBox","getSkewData","move","skewX","skewY","getAround","altKey","getRotateDirection","totalDirection","round","getFlipDirection","flipedX","flipedY","cacheCursors","updateCursor","enterPoint","point","name","pointType","cursor","flippedX","flippedY","resizeCursor","rotateCursor","skewCursor","resizeable","rotateable","skewable","showResize","metaKey","ctrlKey","formatRotation","url","toDataURL","updateMoveCursor","moveCursor","moveable","undefined","svg","encodeURIComponent","replace","toString","EditPoint","Box","useFastShadow","fourDirection","editConfig","EditBox","mergedConfig","_target","element","single","transformTool","_transformTool","tool","flipped","flippedOne","view","hitFill","hitStroke","hitRadius","circle","buttons","resizePoints","rotatePoints","resizeLines","dragStartData","create","rotatePoint","resizeLine","resizePoint","arounds","listenPointEvents","add","load","pointsStyle","getPointsStyle","middlePointsStyle","getMiddlePointsStyle","resizeP","getPointStyle","syncEventer","editTool","bottomList","getLayoutBounds","updateBounds","editMask","middlePoint","hideOnSmall","mask","worldOpacity","smallSize","showPoints","rotateP","resizeL","directionData","floor","layoutCircle","layoutButtons","circleDirection","circleMargin","buttonsMargin","buttonsDirection","indexOf","setButtonPosition","buttonsFixed","useMiddlePoint","useX","sign","margin","unload","pointFill","pointSize","pointRadius","defaultStyle","cornerRadius","offsetX","offsetY","dragPoint","moving","hideOnMove","ResizeEvent","resizingKeys","keys","onMove","onRotate","onScale","onSkew","onKey","onArrow","keyEvent","distance","code","onDoubleTap","openInner","preventEditInner","onLongPress","editInner","textBox","Text","openInnerEditor","openGroup","events","LEAVE","ENTER","DOUBLE_TAP","LONG_PRESS","KeyEvent","HOLD","UP","DOWN","bigBounds","EditMask","__updateWorldBounds","__local","fillWorld","saveBlendMode","shape","__render","__renderShape","restoreBlendMode","filterStyle","editSize","rotateGap","simulate","simulateTarget","zoomLayer","safeChange","getBounds","order","a","b","reverseOrder","EditorHelper","group","userGroup","sort","addAt","matrx","Matrix","divideParent","setTransform","lockLayout","dropTo","unlockLayout","ungroup","ungroupList","isBranchLeaf","remove","toTop","toBottom","debug","Debug","registerEditTool","EditToolCreator","register","registerInnerEditor","EditTool","tag","repeat","InnerEditorEvent","BEFORE_OPEN","OPEN","BEFORE_CLOSE","CLOSE","EditorGroupEvent","BEFORE_GROUP","GROUP","BEFORE_UNGROUP","UNGROUP","updateMatrix","LeafHelper","checkMap","SimulateElement","__tag","checkChange","canChange","on","PropertyEvent","CHANGE","event","attrName","newValue","addValue","oldMatrix","rotationChange","changedTransform","divide","rotateOf","skewOf","changeFn","EditorMoveEvent","BEFORE_MOVE","EditorScaleEvent","BEFORE_SCALE","SCALE","EditorRotateEvent","BEFORE_ROTATE","ROTATE","EditorSkewEvent","BEFORE_SKEW","SKEW","TransformTool","moveType","stop","totalX","totalY","getValidMove","getBoxPoint","onScaleWithDrag","drag","scaleWithDrag","RotateEvent","float","getGapRotation","getInnerMove","checkTransform","beforeMove","world","getWorldPointByLocal","moveX","moveY","doMove","beforeScale","worldOrigin","getWorldPoint","_resize","getWorldOrigin","transform","getChangedTransform","doScale","flip","axis","getFlipTransform","beforeRotate","doRotate","beforeSkew","doSkew","getInnerOrigin","func","capture","Editor","dragHoverExclude","groupOpening","openedGroupList","multiple","userConfig","editToolList","targetEventIds","DataHelper","default","Plugin","cancel","shiftItem","innerEditing","innerEditor","updateEditBox","updateEditTool","editOuter","getEditSize","_ui","_e","_x","_y","_data","_origin","_scaleY","_axis","_rotation","_skewX","_skewY","_type","_func","emitGroupEvent","closeGroup","checkOpenedGroups","opened","every","hasParent","checkDeepSelect","editTarget","emitInnerEvent","closeInnerEditor","lock","unlock","onAppRenderStart","targetChanged","renderer","changed","forceRender","onRenderStart","listenTargetEvents","RenderEvent","CHILD_START","BEFORE_ZOOM","removeTargetEvents","destroyed","values","isNull","useModule","InnerEditor","mode","eventIds","onCreate","onLoad","tree","onUpdate","onUnload","onDestroy","moveWorld","resize","transformWorld","scaleOfWorld","rotateOfWorld","skewOfWorld","toNumberPoints","LineEditTool","scaleOfEvent","line","isDragFrom","pathInputed","from","to","getFromToByPath","points","getFromToByPoints","getPointData","getInnerPointByLocal","ui","movePoint","originPoints","fromPoint","fromTo","leftOrRight","innerToWorld","pen","clearPath","moveTo","lineTo","Creator","sky","addAttr","dataType","__isLinePath","setEditConfig","changeAttr","setEditOuter","toolName","setEditInner","editorName"],"mappings":"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","x_google_ignoreList":[0]}