@leafer-in/editor 2.0.1 → 2.0.2

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.44.2_tslib@2.8.1_typescript@5.8.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, isArray } from '@leafer-ui/draw'\n\nimport { IEditor, IEditorEvent } from '@leafer-in/interface'\n\n\nfunction toList(value: IUI | IUI[]): IUI[] {\n return value ? (isArray(value) ? 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 { defineKey, isNull, isArray, isObject, isUndefined } from '@leafer-ui/draw'\n\nimport { IEditor } from '@leafer-in/interface'\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 const t = this as IEditor\n\n if (t.config) { // Editor\n\n const isSelect = key === 'target'\n if (isSelect) {\n const { beforeSelect } = t.config\n if (beforeSelect) {\n const check = beforeSelect({ target: value })\n if (isObject(check)) value = check\n else if (check === false) return\n }\n\n t.setDimOthers(false)\n t.setBright(false)\n\n if (isArray(value) && value.length > 1 && value[0].locked) value.splice(0, 1) // fix: 单个锁定 + shift多选\n if (t.single) {\n delete t.element.syncEventer // 重置 EditBox.load() 同步事件设置\n delete t.element.__world.ignorePixelSnap // 重置 EditBox.load() 忽略对齐像素设置\n }\n }\n\n const type = isSelect ? EditorEvent.BEFORE_SELECT : EditorEvent.BEFORE_HOVER\n if (this.hasEvent(type)) this.emitEvent(new EditorEvent(type, { editor: t, 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, editBox, app } = this, mergeConfig = { ...config } // 实时合并,后期可优化\n if (element && element.editConfig) {\n let { editConfig } = element\n if (editConfig.hover || editConfig.hoverStyle) { // 元素的hover样式,不能覆盖到总配置里\n editConfig = { ...editConfig }\n delete editConfig.hover\n delete editConfig.hoverStyle\n }\n Object.assign(mergeConfig, editConfig) // 元素上的配置\n }\n if (editBox.config) Object.assign(mergeConfig, editBox.config) // EditBox 上的配置\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 if (isUndefined(mergeConfig.dragLimitAnimate)) mergeConfig.dragLimitAnimate = app && app.config.pointer.dragLimitAnimate\n return (this as IObject).mergedConfig = mergeConfig\n }\n } as ThisType<IEditor>)\n }\n}\n\n\n","import { IUI, ILeaferCanvas, IRenderOptions, IUIInputData, IMatrixWithOptionHalfData } from '@leafer-ui/interface'\nimport { Paint, UI, MatrixHelper, getBoundsData, getMatrixData, BoundsHelper, LeafBoundsHelper, isArray, isString, surfaceType, ColorConvert } from '@leafer-ui/draw'\n\nimport { IStroker } from '@leafer-in/interface'\n\nimport { targetAttr } from '../decorator/data'\n\n\nconst { abs } = Math\nconst { copy } = 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 @surfaceType('render-path')\n public strokePathType: 'path' | 'render-path'\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?: IUIInputData): void {\n if (style) this.set(style)\n this.target = target\n this.update()\n }\n\n public update(style?: IUIInputData): void {\n const { list } = this\n if (list.length) {\n setListWithFn(bounds, list, worldBounds)\n if (style) this.set(style)\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 canvas.setWorld(matrix, options.matrix)\n canvas.beginPath()\n\n\n if (this.strokePathType === 'path') {\n leaf.__drawPath(canvas)\n } else {\n if (leaf.__.__useArrow) leaf.__drawPath(canvas)\n else leaf.__.__pathForRender ? leaf.__drawRenderPath(canvas) : leaf.__drawPathByBox(canvas)\n }\n\n data.strokeWidth = strokeWidth / Math.max(aScaleX, aScaleY)\n\n if (data.shadow) {\n const shadow = data.shadow[0], { scaleX, scaleY } = this.getRenderScaleData(true, shadow.scaleFixed)\n canvas.save(), canvas.setWorldShadow(shadow.x * scaleX, shadow.y * scaleY, shadow.blur * scaleX, ColorConvert.string(shadow.color))\n }\n\n if (stroke) isString(stroke) ? Paint.stroke(stroke, this, canvas, options) : Paint.strokes(stroke, this, canvas, options)\n if (fill) isString(fill) ? Paint.fill(fill, this, canvas, options) : Paint.fills(fill, this, canvas, options)\n\n if (data.shadow) canvas.restore()\n\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 ? (isArray(value) ? 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, app } = this; return this.hittable && editor.visible && editor.hittable && editor.mergeConfig.selector && (app && app.mode === 'normal') }\n public get isMoveMode(): boolean { const { app } = this; return app && 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 { hoverTarget, mergeConfig } = editor, config = { ...mergeConfig }\n if (hoverTarget && hoverTarget.editConfig) Object.assign(config, hoverTarget.editConfig) // hover元素上的配置\n const { stroke, strokeWidth, hover, hoverStyle } = config\n this.hoverStroker.setTarget(hover ? hoverTarget : null, { stroke, strokeWidth, ...(hoverStyle || {}) })\n } else {\n this.hoverStroker.target = null\n }\n }\n\n protected onSelect(): void {\n if (this.running) {\n this.targetStroker.setTarget(this.editor.list)\n this.hoverStroker.target = null\n }\n }\n\n public update(): void {\n this.hoverStroker.update()\n\n const { stroke, strokeWidth, selectedPathType, selectedStyle } = this.editor.mergedConfig\n this.targetStroker.update({ stroke, strokeWidth: strokeWidth && Math.max(1, strokeWidth / 2), strokePathType: selectedPathType, ...(selectedStyle || {}) })\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, selectKeep } = 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 if (!selectKeep) 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 (!this.isHoldMultipleSelectKey(e) && !this.editor.mergedConfig.selectKeep) 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)) || (this.isHoldMultipleSelectKey(e) && !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 && (this.isHoldMultipleSelectKey(e) || continuousSelect)\n }\n\n public isHoldMultipleSelectKey(e: IPointerEvent): boolean {\n const { multipleSelectKey } = this.editor.mergedConfig\n if (multipleSelectKey) return e.isHoldKeys(multipleSelectKey)\n return e.shiftKey\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, Direction9, isNumber } from '@leafer-ui/draw'\nimport { DragBoundsHelper } from '@leafer-ui/core'\n\nimport { IEditorScaleEvent, IEditorSkewEvent, IEditorRotateEvent } from '@leafer-in/interface'\n\n\nconst { topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left } = Direction9\nconst { toPoint } = AroundHelper, { within, sign } = MathHelper, { abs } = Math\n\nexport const EditDataHelper = {\n\n getScaleData(target: IUI, startBounds: ILayoutBoundsData, direction: Direction9, totalMoveOrScale: IPointData | number, lockRatio: boolean | 'corner', around: IAround, flipable: boolean, scaleMode: boolean): IEditorScaleEvent {\n let align: IAlign, origin = {} as IPointData, scaleX: number = 1, scaleY: number = 1, lockScale: number\n\n const { boxBounds, widthRange, heightRange, dragBounds, worldBoxBounds } = target\n const { width, height } = startBounds\n\n // 获取已经改变的比例\n const originChangedScaleX = target.scaleX / startBounds.scaleX\n const originChangedScaleY = target.scaleY / startBounds.scaleY\n const signX = sign(originChangedScaleX)\n const signY = sign(originChangedScaleY)\n\n const changedScaleX = scaleMode ? originChangedScaleX : signX * boxBounds.width / width\n const changedScaleY = scaleMode ? originChangedScaleY : signY * boxBounds.height / height\n\n if (isNumber(totalMoveOrScale)) {\n\n scaleX = scaleY = Math.sqrt(totalMoveOrScale)\n\n } else {\n\n if (around) {\n totalMoveOrScale.x *= 2\n totalMoveOrScale.y *= 2\n }\n\n totalMoveOrScale.x *= scaleMode ? originChangedScaleX : signX\n totalMoveOrScale.y *= scaleMode ? originChangedScaleY : signY\n\n const topScale = (-totalMoveOrScale.y + height) / height\n const rightScale = (totalMoveOrScale.x + width) / width\n const bottomScale = (totalMoveOrScale.y + height) / height\n const leftScale = (-totalMoveOrScale.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 switch (direction) {\n case top:\n case bottom:\n scaleX = scaleY\n break\n case left:\n case right:\n scaleY = scaleX\n break\n default:\n lockScale = Math.sqrt(abs(scaleX * scaleY))\n scaleX = sign(scaleX) * lockScale\n scaleY = sign(scaleY) * lockScale\n }\n }\n }\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 scaleData = { x: scaleX, y: scaleY }\n DragBoundsHelper.limitScaleOf(target, origin, scaleData, lockRatio as boolean)\n scaleX = scaleData.x\n scaleY = scaleData.y\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 && abs(scaleX * worldBoxBounds.width) < 1) scaleX = sign(scaleX) / worldBoxBounds.width\n if (useScaleY && abs(scaleY * worldBoxBounds.height) < 1) scaleY = sign(scaleY) / worldBoxBounds.height\n\n if (lockRatio && scaleX !== scaleY) {\n lockScale = Math.min(abs(scaleX), abs(scaleY))\n scaleX = sign(scaleX) * lockScale\n scaleY = sign(scaleY) * lockScale\n }\n\n isFinite(scaleX) || (scaleX = 1)\n isFinite(scaleY) || (scaleY = 1)\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 updatePointCursor(editBox: IEditBox, e: IUIEvent): void {\n const { enterPoint: point, dragging, skewing, resizing, flippedX, flippedY } = editBox\n if (!point || !editBox.editor.editing || !editBox.canUse) return\n if (point.name === 'rect') return updateMoveCursor(editBox) // rect 移动元素\n if (point.name === 'circle') return // 独立旋转按钮\n\n let { rotation } = editBox\n const { pointType } = point, { moveCursor, resizeCursor, rotateCursor, skewCursor, moveable, resizeable, rotateable, skewable } = editBox.mergeConfig\n\n if (pointType === 'move') { // 移动类型\n point.cursor = moveCursor\n if (!moveable) point.visible = false\n return\n } else if (pointType === 'button') { // 普通按钮\n if (!point.cursor) point.cursor = 'pointer'\n return\n }\n\n let showResize = pointType.includes('resize')\n if (showResize && rotateable && (editBox.isHoldRotateKey(e) || !resizeable)) showResize = false\n const showSkew = skewable && !showResize && (point.name === 'resize-line' || pointType === 'skew')\n\n const cursor = dragging\n ? (skewing ? skewCursor : (resizing ? resizeCursor : rotateCursor))\n : (showSkew ? skewCursor : (showResize ? resizeCursor : rotateCursor))\n\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 if (editBox.canUse) 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, ITransformTool, IUIEvent, IEditPointInputData } from '@leafer-ui/interface'\nimport { Group, Text, AroundHelper, Direction9, ResizeEvent, BoundsHelper, DataHelper, isArray, isString, isNumber, isNull, getPointData } from '@leafer-ui/draw'\nimport { DragEvent, PointerEvent, KeyEvent, RotateEvent, ZoomEvent, MoveEvent } from '@leafer-ui/core'\n\nimport { IEditBox, IEditor, IEditPoint, IEditPointType } from '@leafer-in/interface'\n\nimport { updatePointCursor, updateMoveCursor } from '../editor/cursor'\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 gesturing: boolean\n\n public moving: boolean\n public resizing: boolean\n public rotating: boolean\n public skewing: boolean\n\n public view: IGroup = new Group() // 放置默认编辑工具控制点\n\n public rect: IEditPoint = new EditPoint({ 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, editBox } = this.editor\n return this.mergedConfig = config && (editBox !== this) ? { ...mergeConfig, ...config } : mergeConfig // 可能会出现多个editBox的情况\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 public get canUse(): boolean { return this.app && this.editor.editing } // 编辑框是否处于激活状态\n public get canGesture(): boolean { // 是否支持手势\n if (!this.canUse) return false\n const { moveable, resizeable, rotateable } = this.mergeConfig\n return isString(moveable) || isString(resizeable) || isString(rotateable)\n }\n public get canDragLimitAnimate(): boolean { return (this.moving && this.mergeConfig.dragLimitAnimate && this.target.dragBounds) as any as boolean }\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 this.listenPointEvents(rect, 'move', 8) // center\n\n view.addMany(...rotatePoints, rect, circle, buttons, ...resizeLines, ...resizePoints)\n this.add(view)\n }\n\n\n public load(): void {\n const { target, mergeConfig, single, rect, circle, resizePoints, resizeLines } = this\n const { stroke, strokeWidth, ignorePixelSnap } = mergeConfig\n\n const pointsStyle = this.getPointsStyle()\n const middlePointsStyle = this.getMiddlePointsStyle()\n const resizeLinesStyle = this.getResizeLinesStyle()\n\n this.visible = !target.locked\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 resizeP.rotation = ((i - (i % 2 ? 1 : 0)) / 2) * 90\n if (i % 2) resizeLines[(i - 1) / 2].set({ pointType: 'resize', rotation: (i - 1) / 2 * 90, ...(resizeLinesStyle[((i - 1) / 2) % resizeLinesStyle.length] || {}) } as IEditPointInputData)\n }\n\n // rotate\n circle.set(this.getPointStyle(mergeConfig.circle || mergeConfig.rotatePoint || pointsStyle[0]))\n\n // rect\n rect.set({ stroke, strokeWidth, opacity: 1, editConfig, ...(mergeConfig.rect || {}) })\n\n // 编辑框作为底部虚拟元素, 在 unload() 中重置\n const rectThrough = isNull(mergeConfig.rectThrough) ? single : mergeConfig.rectThrough\n rect.hittable = !rectThrough\n\n if (rectThrough) {\n target.syncEventer = rect // 同步给 rect 冒泡,在 target 属性装饰器中重置\n this.app.interaction.bottomList = [{ target: rect, proxy: target }]\n }\n\n // 忽略元素像素对齐,在 target 属性装饰器中重置\n if (single) DataHelper.stintSet(target.__world, 'ignorePixelSnap', ignorePixelSnap)\n\n updateMoveCursor(this)\n }\n\n // 必须来自 editor.update(),需同步更新编辑工具 \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.visible = !this.target.locked\n this.set({ x, y, scaleX, scaleY, rotation, skewX, skewY })\n this.updateBounds({ x: 0, y: 0, width, height })\n }\n\n public unload(): void {\n this.visible = false\n if (this.app) this.rect.syncEventer = this.app.interaction.bottomList = null\n }\n\n\n public updateBounds(bounds: IBoundsData): void {\n const { editor, mergeConfig, single, rect, circle, buttons, resizePoints, rotatePoints, resizeLines } = this\n const { editMask } = editor\n const { middlePoint, resizeable, rotateable, hideOnSmall, editBox, mask, dimOthers, bright, spread, hideRotatePoints, hideResizeLines } = mergeConfig\n\n editMask.visible = mask ? true : 0\n\n editor.setDimOthers(dimOthers)\n editor.setBright(!!dimOthers || bright)\n\n if (spread) BoundsHelper.spread(bounds, spread)\n\n if (this.view.worldOpacity) {\n const { width, height } = bounds\n const smallSize = isNumber(hideOnSmall) ? 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 resizeP.set(point)\n rotateP.set(point)\n\n // visible \n resizeP.visible = showPoints && !!(resizeable || rotateable)\n rotateP.visible = showPoints && rotateable && resizeable && !hideRotatePoints\n\n if (i % 2) { // top, right, bottom, left\n\n resizeL = resizeLines[(i - 1) / 2]\n resizeL.set(point)\n\n resizeL.visible = resizeP.visible && !hideResizeLines\n resizeP.visible = rotateP.visible = showPoints && !!middlePoint\n\n if (((i + 1) / 2) % 2) { // top, bottom\n resizeL.width = width + resizeL.height\n if (hideOnSmall && resizeP.width * 2 > width) resizeP.visible = false\n } else {\n resizeL.width = height + resizeL.height\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 getPointStyle(userStyle?: IBoxInputData): IBoxInputData {\n const { stroke, strokeWidth, pointFill, pointSize, pointRadius } = this.mergedConfig\n const defaultStyle = { fill: pointFill, stroke, strokeWidth, around: 'center', strokeAlign: 'center', opacity: 1, 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 isArray(point) ? point : [point]\n }\n\n public getMiddlePointsStyle(): IBoxInputData[] {\n const { middlePoint } = this.mergedConfig\n return isArray(middlePoint) ? middlePoint : (middlePoint ? [middlePoint] : this.getPointsStyle())\n }\n\n public getResizeLinesStyle(): IBoxInputData[] {\n const { resizeLine } = this.mergedConfig\n return isArray(resizeLine) ? resizeLine : [resizeLine]\n }\n\n\n // drag\n\n public onDragStart(e: DragEvent): void {\n this.dragging = true\n const point = this.dragPoint = e.current as IEditPoint, { pointType } = point\n const { moveable, resizeable, rotateable, skewable } = this.mergeConfig\n\n // 确定模式\n if (pointType === 'move') {\n moveable && (this.moving = true)\n } else {\n if (pointType.includes('rotate') || this.isHoldRotateKey(e) || !resizeable) {\n rotateable && (this.rotating = true)\n if (pointType === 'resize-rotate') resizeable && (this.resizing = true)\n else if (point.name === 'resize-line') skewable && (this.skewing = true), this.rotating = false\n } else if (pointType === 'resize') resizeable && (this.resizing = true)\n if (pointType === 'skew') skewable && (this.skewing = true)\n }\n\n this.onTransformStart(e)\n }\n\n public onDrag(e: DragEvent): void {\n const { transformTool, moving, resizing, rotating, skewing } = this\n if (moving) {\n transformTool.onMove(e)\n } else if (resizing || rotating || skewing) {\n const point = e.current as IEditPoint\n if (point.pointType) this.enterPoint = point// 防止变化\n if (rotating) transformTool.onRotate(e)\n if (resizing) transformTool.onScale(e)\n if (skewing) transformTool.onSkew(e)\n }\n updatePointCursor(this, e)\n }\n\n public onDragEnd(e: DragEvent): void {\n this.onTransformEnd(e)\n this.dragPoint = null\n }\n\n // 操作事件共用\n\n public onTransformStart(e: IUIEvent): void {\n if (this.moving || this.gesturing) this.editor.opacity = this.mergedConfig.hideOnMove ? 0 : 1 // move\n if (this.resizing) ResizeEvent.resizingKeys = this.editor.leafList.keys // 记录正在resize中的元素列表\n\n const { dragStartData, target } = this\n dragStartData.x = e.x\n dragStartData.y = e.y\n dragStartData.totalOffset = getPointData() // 缩放、旋转造成的总偏移量,一般用于手势操作的move纠正\n dragStartData.point = { x: target.x, y: target.y } // 用于移动\n dragStartData.bounds = { ...target.getLayoutBounds('box', 'local') } // 用于resize\n dragStartData.rotation = target.rotation // 用于旋转\n }\n\n public onTransformEnd(e: IUIEvent): void {\n if (this.canDragLimitAnimate && (e instanceof DragEvent || e instanceof MoveEvent)) this.transformTool.onMove(e)\n if (this.resizing) ResizeEvent.resizingKeys = null\n\n this.dragging = this.gesturing = this.moving = this.resizing = this.rotating = this.skewing = false\n this.editor.opacity = 1\n this.editor.update() // 移动端手势操作hideOnMove移动需强制更新一次 \n }\n\n // 手势控制元素\n\n public onMove(e: MoveEvent): void {\n if (this.canGesture && e.moveType !== 'drag') {\n e.stop()\n if (isString(this.mergedConfig.moveable)) {\n this.gesturing = this.moving = true\n switch (e.type) {\n case MoveEvent.START: this.onTransformStart(e); break\n case MoveEvent.END: this.onTransformEnd(e); break\n default: this.transformTool.onMove(e)\n }\n }\n }\n }\n\n public onScale(e: ZoomEvent): void {\n if (this.canGesture) {\n e.stop()\n if (isString(this.mergedConfig.resizeable)) {\n this.gesturing = this.resizing = true\n switch (e.type) {\n case ZoomEvent.START: this.onTransformStart(e); break\n case ZoomEvent.END: this.onTransformEnd(e); break\n default: this.transformTool.onScale(e)\n }\n }\n }\n }\n\n public onRotate(e: RotateEvent): void {\n if (this.canGesture) {\n e.stop()\n if (isString(this.mergedConfig.rotateable)) {\n this.gesturing = this.rotating = true\n switch (e.type) {\n case ZoomEvent.START: this.onTransformStart(e); break\n case ZoomEvent.END: this.onTransformEnd(e); break\n default: this.transformTool.onRotate(e)\n }\n }\n }\n }\n\n // 键盘\n\n public isHoldRotateKey(e: IUIEvent): boolean { // 按住ctrl在控制点上变旋转功能\n const { rotateKey } = this.mergedConfig\n if (rotateKey) return e.isHoldKeys(rotateKey)\n return e.metaKey || e.ctrlKey\n }\n\n protected onKey(e: KeyEvent): void {\n updatePointCursor(this, e)\n }\n\n public onArrow(e: IKeyEvent): void {\n if (this.canUse && 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) this.transformTool.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 this.__eventIds.push(\n point.on_([\n [DragEvent.START, this.onDragStart, this],\n [DragEvent.DRAG, this.onDrag, this],\n [DragEvent.END, this.onDragEnd, this],\n\n [PointerEvent.ENTER, (e: PointerEvent) => { this.enterPoint = point, updatePointCursor(this, e) }],\n [PointerEvent.LEAVE, () => { this.enterPoint = null }]\n ])\n )\n }\n\n protected __listenEvents(): void {\n const { rect, editor, __eventIds: events } = this\n\n events.push(\n rect.on_([\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 [[MoveEvent.START, MoveEvent.BEFORE_MOVE, MoveEvent.END], this.onMove, this, true],\n [[ZoomEvent.START, ZoomEvent.BEFORE_ZOOM, ZoomEvent.END], this.onScale, this, true],\n [[RotateEvent.START, RotateEvent.BEFORE_ROTATE, RotateEvent.END], this.onRotate, this, true]\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.scrollWorldTransform)\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, IUI } from '@leafer-ui/interface'\nimport { MathHelper, PointHelper, Matrix, LeafHelper, AroundHelper, isObject, isString, isNumber } 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\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 let move: IPointData, { dragLimitAnimate } = mergeConfig\n\n const isMoveEnd = e.type === MoveEvent.END || e.type === DragEvent.END\n const axisDrag = isString(target.draggable)\n const checkLimitMove = !dragLimitAnimate || isMoveEnd || axisDrag\n\n const total = { x: e.totalX, y: e.totalY }\n\n if (e instanceof MoveEvent) {\n PointHelper.move(total, target.getWorldPointByLocal(dragStartData.totalOffset, null, true))\n }\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 move = DragEvent.getValidMove(target, dragStartData.point, total, checkLimitMove)\n\n if (move.x || move.y) {\n if (dragLimitAnimate && !axisDrag && isMoveEnd) LeafHelper.animateMove(this as unknown as IUI, move, isNumber(dragLimitAnimate) ? dragLimitAnimate : 0.3) // 是否进行动画\n else this.move(move)\n }\n }\n\n public onScale(e: DragEvent | ZoomEvent): void {\n\n const { target, mergeConfig, single, dragStartData } = this.editBox\n let { around, lockRatio, flipable, editSize } = mergeConfig, totalMove: IPointData | number\n\n if (e instanceof ZoomEvent) {\n if (!around) around = target.getBoxPoint(e)\n totalMove = e.totalScale\n } else {\n totalMove = e.getInnerTotal(target)\n }\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, totalMove, lockRatio, EditDataHelper.getAround(around, e.altKey), flipable, !single || editSize === 'scale')\n\n const targetX = target.x, targetY = target.y\n\n if (e instanceof DragEvent && 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 PointHelper.move(dragStartData.totalOffset, target.x - targetX, target.y - targetY)\n }\n\n public onRotate(e: DragEvent | RotateEvent): void {\n\n const { target, mergeConfig, dragStartData } = this.editBox\n const { around, rotateAround, rotateGap, diagonalRotateKey } = mergeConfig\n const { direction } = e.current as IEditPoint\n\n let origin: IPointData, rotation: number\n\n if (e instanceof RotateEvent) {\n\n rotation = e.rotation\n origin = rotateAround ? AroundHelper.getPoint(rotateAround, target.boxBounds) : target.getBoxPoint(e)\n\n } else {\n\n const isDiagonalRotate = diagonalRotateKey ? e.isHoldKeys(diagonalRotateKey) : e.shiftKey // 对角旋转\n\n const data = EditDataHelper.getRotateData(target, direction, e, dragStartData, isDiagonalRotate ? null : (rotateAround || target.around || target.origin || around || 'center'))\n rotation = dragStartData.rotation + data.rotation - target.rotation\n origin = data.origin\n\n }\n\n rotation = MathHelper.float(MathHelper.getGapRotation(rotation, rotateGap, target.rotation), 2)\n if (!rotation) return\n\n const targetX = target.x, targetY = target.y\n\n this.rotateOf(origin, rotation)\n\n PointHelper.move(dragStartData.totalOffset, target.x - targetX, target.y - targetY)\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 (isObject(x)) 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 (isObject(check)) 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 (isObject(check)) 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 (isNumber(check)) 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 (isObject(check)) 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, ILeaferMode } from '@leafer-ui/interface'\nimport { Group, DataHelper, LeafList, RenderEvent, LeafHelper, Direction9, Plugin, isString, PropertyEvent, LeaferEvent, isArray } 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(onTarget)\n public target?: IUI | IUI[]\n\n @targetAttr(onHover)\n public hoverTarget?: IUI\n\n public dimTarget?: IGroup | IGroup[] // 需要淡化的容器\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 dragPoint(): IEditPoint { return this.editBox.dragPoint }\n\n public get dragging(): boolean { return this.editBox.dragging }\n public get gesturing(): boolean { return this.editBox.gesturing } // 手势操作元素中\n\n public get moving(): boolean { return this.editBox.moving }\n public get resizing(): boolean { return this.editBox.resizing }\n public get rotating(): boolean { return this.editBox.rotating }\n public get skewing(): boolean { return this.editBox.skewing }\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 get targetLeafer() { const first = this.list[0]; return first && first.leafer }\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 getItem(index?: number): IUI {\n return this.list[index || 0]\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 // 淡化 / 突出\n\n public setDimOthers(value: boolean | number, attrName: 'bright' | 'dim' = 'dim', list?: IUI[]): void {\n if (!list) {\n const { dimTarget, targetLeafer } = this\n list = dimTarget ? (isArray(dimTarget) ? dimTarget : [dimTarget]) : [targetLeafer]\n }\n if (list[0] && list[0][attrName] !== (value || false)) list.forEach(item => DataHelper.stintSet(item, attrName, value))\n }\n\n public setBright(value: boolean): void {\n this.setDimOthers(value, 'bright', this.list)\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\n // editTool\n\n public getEditTool(name: string): IEditTool {\n return this.editToolList[name] = this.editToolList[name] || EditToolCreator.get(name, this)\n }\n\n public updateEditTool(): void {\n this.unloadEditTool()\n\n if (this.editing) {\n const target = this.element\n let name = target.editOuter || 'EditTool'\n\n const { beforeEditOuter } = this.mergeConfig\n if (beforeEditOuter) {\n const check = beforeEditOuter({ target, name })\n if (isString(check)) name = check\n else if (check === false) return\n }\n\n if (EditToolCreator.list[name]) {\n const tool = this.editTool = this.getEditTool(name)\n this.editBox.load()\n tool.load()\n this.update()\n }\n }\n }\n\n public unloadEditTool(): void {\n let tool = this.editTool\n if (tool) {\n this.editBox.unload()\n tool.unload()\n this.editTool = null\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 getInnerEditor(name: string): IInnerEditor {\n return this.editToolList[name] = this.editToolList[name] || EditToolCreator.get(name, this)\n }\n\n public openInnerEditor(target?: IUI, nameOrSelect?: string | boolean, select?: boolean): void {\n let name: string\n if (isString(nameOrSelect)) name = nameOrSelect\n else if (!select) select = nameOrSelect\n\n if (target && select) this.target = target\n\n if (this.single) {\n if (!target) target = this.element\n if (!name) name = target.editInner\n\n const { beforeEditInner } = this.mergeConfig\n if (beforeEditInner) {\n const check = beforeEditInner({ target, name })\n if (isString(check)) name = check\n else if (check === false) return\n }\n\n if (EditToolCreator.list[name]) {\n this.editTool.unload()\n this.innerEditing = true\n this.innerEditor = this.getInnerEditor(name)\n this.innerEditor.editTarget = target\n\n this.emitInnerEvent(InnerEditorEvent.BEFORE_OPEN)\n this.innerEditor.load()\n this.emitInnerEvent(InnerEditorEvent.OPEN)\n }\n }\n }\n\n public closeInnerEditor(onlyInnerEditor?: boolean): 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 if (!onlyInnerEditor) this.updateEditTool()\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 onChildScroll(): void {\n if (this.multiple) this.updateEditBox()\n }\n\n // event \n\n public listenTargetEvents(): void {\n if (!this.targetEventIds.length) {\n const { app, leafer, targetLeafer, editMask } = this\n this.targetEventIds = [\n leafer.on_(RenderEvent.START, this.onRenderStart, this),\n targetLeafer && targetLeafer.on_(PropertyEvent.SCROLL, this.onChildScroll, this),\n app.on_(RenderEvent.CHILD_START, this.onAppRenderStart, this),\n app.on_(LeaferEvent.UPDATE_MODE, (data: { mode: ILeaferMode }) => { if (data.mode && data.mode !== 'normal') this.cancel() })\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(true)\n editor.unloadEditTool()\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\n protected _editBox: IEditBox\n public get editBox(): IEditBox { return this._editBox || this.editor.editBox } // 编辑框,默认为editor.editBox\n public set editBox(value: IEditBox) { this._editBox = value }\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 = editBox.target 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.updateLayout(); return ui.__.__isLinePath ? 'LineEditTool' : 'EditTool' }, dataType) // fix: Line 需要更新布局才能精准确定\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","isArray","SuppressedError","EditorEvent","Event","list","this","oldList","oldValue","constructor","type","data","super","assign","targetAttr","fn","privateKey","defineKey","get","set","old","t","config","isSelect","beforeSelect","check","isObject","setDimOthers","setBright","locked","splice","single","element","syncEventer","__world","ignorePixelSnap","BEFORE_SELECT","BEFORE_HOVER","hasEvent","emitEvent","editor","SELECT","AFTER_SELECT","HOVER","abs","Math","copy","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","strokePathType","__useArrow","__drawPath","__pathForRender","__drawRenderPath","__drawPathByBox","max","shadow","getRenderScaleData","scaleFixed","save","setWorldShadow","x","y","blur","ColorConvert","string","color","isString","Paint","strokes","fills","restore","destroy","stroker","prototype","surfaceType","SelectArea","Group","strokeArea","Rect","fillArea","addMany","setStyle","userStyle","reset","opacity","setBounds","EditSelectHelper","findOne","path","find","editable","findByBounds","branch","eachFind","children","child","len","isBranch","hitChildren","hitSelf","push","isFrame","includes","__layout","boxBounds","EditSelect","dragging","originList","running","app","mergeConfig","selector","mode","isMoveMode","interaction","moveMode","hoverStroker","targetStroker","Bounds","selectArea","__eventIds","__listenEvents","onHover","hoverTarget","editConfig","hover","hoverStyle","onSelect","selectedPathType","selectedStyle","mergedConfig","onPointerMove","e","canHover","findUI","hasItem","onBeforeDown","multiTouch","select","mobile","waitSelect","checkAndSelect","onTap","selectKeep","needRemoveItem","removeItem","allowSelect","isMultipleSelect","addItem","allow","isHoldMultipleSelectKey","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","rect","findPath","continuousSelect","multipleSelectKey","isHoldKeys","shiftKey","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","sign","MathHelper","EditDataHelper","getScaleData","startBounds","direction","totalMoveOrScale","lockRatio","around","flipable","scaleMode","align","lockScale","origin","widthRange","heightRange","worldBoxBounds","originChangedScaleX","originChangedScaleY","signX","signY","changedScaleX","changedScaleY","isNumber","sqrt","topScale","rightScale","bottomScale","leftScale","useScaleX","useScaleY","scaleData","DragBoundsHelper","limitScaleOf","nowWidth","nowHeight","min","isFinite","getRotateData","current","last","rotation","PointHelper","getRotation","getWorldPointByBox","getSkewData","move","skewX","skewY","getAround","altKey","getRotateDirection","totalDirection","round","getFlipDirection","flipedX","flipedY","cacheCursors","updatePointCursor","enterPoint","point","skewing","resizing","flippedX","flippedY","canUse","name","updateMoveCursor","pointType","moveCursor","resizeCursor","rotateCursor","skewCursor","moveable","resizeable","rotateable","skewable","cursor","showResize","isHoldRotateKey","showSkew","formatRotation","url","toDataURL","undefined","svg","encodeURIComponent","replace","toString","EditPoint","Box","useFastShadow","fourDirection","EditBox","_target","transformTool","_transformTool","tool","flipped","flippedOne","canGesture","canDragLimitAnimate","moving","dragLimitAnimate","view","hitFill","hitStroke","hitRadius","circle","buttons","resizePoints","rotatePoints","resizeLines","dragStartData","create","rotatePoint","resizeLine","resizePoint","arounds","listenPointEvents","add","load","pointsStyle","getPointsStyle","middlePointsStyle","getMiddlePointsStyle","resizeLinesStyle","getResizeLinesStyle","resizeP","getPointStyle","rectThrough","isNull","bottomList","DataHelper","stintSet","getLayoutBounds","updateBounds","unload","editMask","middlePoint","hideOnSmall","mask","dimOthers","bright","spread","hideRotatePoints","hideResizeLines","worldOpacity","smallSize","showPoints","rotateP","resizeL","directionData","layoutCircle","layoutButtons","circleDirection","circleMargin","buttonsMargin","buttonsDirection","indexOf","setButtonPosition","buttonsFixed","useMiddlePoint","useX","margin","pointFill","pointSize","pointRadius","defaultStyle","cornerRadius","offsetX","offsetY","dragPoint","rotating","onTransformStart","onMove","onRotate","onScale","onSkew","onTransformEnd","gesturing","hideOnMove","ResizeEvent","resizingKeys","keys","totalOffset","getPointData","moveType","stop","rotateKey","metaKey","ctrlKey","onKey","onArrow","keyEvent","distance","code","onDoubleTap","openInner","preventEditInner","onLongPress","editInner","textBox","Text","openInnerEditor","openGroup","ENTER","LEAVE","events","DOUBLE_TAP","LONG_PRESS","KeyEvent","HOLD","UP","DOWN","BEFORE_MOVE","BEFORE_ZOOM","RotateEvent","BEFORE_ROTATE","bigBounds","EditMask","__updateWorldBounds","__local","fillWorld","saveBlendMode","shape","__render","parent","__renderShape","restoreBlendMode","filterStyle","editSize","rotateGap","simulate","simulateTarget","zoomLayer","safeChange","getBounds","order","a","b","reverseOrder","EditorHelper","group","userGroup","sort","addAt","matrx","Matrix","divideParent","scrollWorldTransform","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","scaleOf","skewOf","changeFn","EditorMoveEvent","EditorScaleEvent","BEFORE_SCALE","SCALE","EditorRotateEvent","ROTATE","EditorSkewEvent","BEFORE_SKEW","SKEW","TransformTool","isMoveEnd","axisDrag","checkLimitMove","totalX","totalY","getWorldPointByLocal","getValidMove","animateMove","totalMove","getBoxPoint","totalScale","targetX","targetY","editTool","onScaleWithDrag","drag","scaleWithDrag","rotateAround","diagonalRotateKey","getPoint","isDiagonalRotate","float","getGapRotation","getInnerMove","checkTransform","beforeMove","world","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","targetLeafer","first","userConfig","editToolList","targetEventIds","default","Plugin","cancel","getItem","shiftItem","dimTarget","innerEditing","innerEditor","updateEditBox","getEditTool","updateEditTool","unloadEditTool","editOuter","beforeEditOuter","getEditSize","_ui","_e","_x","_y","_data","_origin","_scaleY","_axis","_rotation","_skewX","_skewY","_type","_func","emitGroupEvent","closeGroup","checkOpenedGroups","opened","every","hasParent","checkDeepSelect","editTarget","getInnerEditor","nameOrSelect","beforeEditInner","emitInnerEvent","closeInnerEditor","onlyInnerEditor","lock","unlock","onAppRenderStart","targetChanged","renderer","changed","forceRender","onRenderStart","onChildScroll","listenTargetEvents","RenderEvent","SCROLL","CHILD_START","LeaferEvent","UPDATE_MODE","removeTargetEvents","destroyed","values","isUndefined","pointer","useModule","InnerEditor","_editBox","eventIds","onCreate","onLoad","tree","onUpdate","onUnload","onDestroy","moveWorld","resize","transformWorld","scaleOfWorld","rotateOfWorld","skewOfWorld","toNumberPoints","LineEditTool","scaleOfEvent","line","isDragFrom","pathInputed","from","to","getFromToByPath","points","getFromToByPoints","getLocalPointByInner","getInnerPointByLocal","ui","movePoint","originPoints","fromPoint","fromTo","leftOrRight","innerToWorld","pen","clearPath","moveTo","lineTo","Creator","sky","addAttr","dataType","updateLayout","__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.44.2_tslib@2.8.1_typescript@5.8.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, isArray } from '@leafer-ui/draw'\n\nimport { IEditor, IEditorEvent } from '@leafer-in/interface'\n\n\nfunction toList(value: IUI | IUI[]): IUI[] {\n return value ? (isArray(value) ? 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 { defineKey, isNull, isArray, isObject, isUndefined } from '@leafer-ui/draw'\n\nimport { IEditor } from '@leafer-in/interface'\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 const t = this as IEditor\n\n if (t.config) { // Editor\n\n const isSelect = key === 'target'\n if (isSelect) {\n const { beforeSelect } = t.config\n if (beforeSelect) {\n const check = beforeSelect({ target: value })\n if (isObject(check)) value = check\n else if (check === false) return\n }\n\n t.setDimOthers(false)\n t.setBright(false)\n\n if (isArray(value) && value.length > 1 && value[0].locked) value.splice(0, 1) // fix: 单个锁定 + shift多选\n if (t.single) {\n delete t.element.syncEventer // 重置 EditBox.load() 同步事件设置\n delete t.element.__world.ignorePixelSnap // 重置 EditBox.load() 忽略对齐像素设置\n }\n }\n\n const type = isSelect ? EditorEvent.BEFORE_SELECT : EditorEvent.BEFORE_HOVER\n if (this.hasEvent(type)) this.emitEvent(new EditorEvent(type, { editor: t, 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, editBox, app } = this, mergeConfig = { ...config } // 实时合并,后期可优化\n if (element && element.editConfig) {\n let { editConfig } = element\n if (editConfig.hover || editConfig.hoverStyle) { // 元素的hover样式,不能覆盖到总配置里\n editConfig = { ...editConfig }\n delete editConfig.hover\n delete editConfig.hoverStyle\n }\n Object.assign(mergeConfig, editConfig) // 元素上的配置\n }\n if (editBox.config) Object.assign(mergeConfig, editBox.config) // EditBox 上的配置\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 if (isUndefined(mergeConfig.dragLimitAnimate)) mergeConfig.dragLimitAnimate = app && app.config.pointer.dragLimitAnimate\n return (this as IObject).mergedConfig = mergeConfig\n }\n } as ThisType<IEditor>)\n }\n}\n\n\n","import { IUI, ILeaferCanvas, IRenderOptions, IUIInputData, IMatrixWithOptionHalfData } from '@leafer-ui/interface'\nimport { Paint, UI, MatrixHelper, getBoundsData, getMatrixData, BoundsHelper, LeafBoundsHelper, isArray, isString, surfaceType, ColorConvert } from '@leafer-ui/draw'\n\nimport { IStroker } from '@leafer-in/interface'\n\nimport { targetAttr } from '../decorator/data'\n\n\nconst { abs } = Math\nconst { copy } = 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 @surfaceType('render-path')\n public strokePathType: 'path' | 'render-path'\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?: IUIInputData): void {\n if (style) this.set(style)\n this.target = target\n this.update()\n }\n\n public update(style?: IUIInputData): void {\n const { list } = this\n if (list.length) {\n setListWithFn(bounds, list, worldBounds)\n if (style) this.set(style)\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 canvas.setWorld(matrix, options.matrix)\n canvas.beginPath()\n\n\n if (this.strokePathType === 'path') {\n leaf.__drawPath(canvas)\n } else {\n if (leaf.__.__useArrow) leaf.__drawPath(canvas)\n else leaf.__.__pathForRender ? leaf.__drawRenderPath(canvas) : leaf.__drawPathByBox(canvas)\n }\n\n data.strokeWidth = strokeWidth / Math.max(aScaleX, aScaleY)\n\n if (data.shadow) {\n const shadow = data.shadow[0], { scaleX, scaleY } = this.getRenderScaleData(true, shadow.scaleFixed)\n canvas.save(), canvas.setWorldShadow(shadow.x * scaleX, shadow.y * scaleY, shadow.blur * scaleX, ColorConvert.string(shadow.color))\n }\n\n if (stroke) isString(stroke) ? Paint.stroke(stroke, this, canvas, options) : Paint.strokes(stroke, this, canvas, options)\n if (fill) isString(fill) ? Paint.fill(fill, this, canvas, options) : Paint.fills(fill, this, canvas, options)\n\n if (data.shadow) canvas.restore()\n\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 ? (isArray(value) ? 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, app } = this; return this.hittable && editor.visible && editor.hittable && editor.mergeConfig.selector && (app && app.mode === 'normal') }\n public get isMoveMode(): boolean { const { app } = this; return app && 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 { hoverTarget, mergeConfig } = editor, config = { ...mergeConfig }\n if (hoverTarget && hoverTarget.editConfig) Object.assign(config, hoverTarget.editConfig) // hover元素上的配置\n const { stroke, strokeWidth, hover, hoverStyle } = config\n this.hoverStroker.setTarget(hover ? hoverTarget : null, { stroke, strokeWidth, ...(hoverStyle || {}) })\n } else {\n this.hoverStroker.target = null\n }\n }\n\n protected onSelect(): void {\n if (this.running) {\n this.targetStroker.setTarget(this.editor.list)\n this.hoverStroker.target = null\n }\n }\n\n public update(): void {\n this.hoverStroker.update()\n\n const { stroke, strokeWidth, selectedPathType, selectedStyle } = this.editor.mergedConfig\n this.targetStroker.update({ stroke, strokeWidth: strokeWidth && Math.max(1, strokeWidth / 2), strokePathType: selectedPathType, ...(selectedStyle || {}) })\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, selectKeep } = 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 if (!selectKeep) 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 e.path.needUpdate = true // 需要更新一下path\n\n } else if (this.allow(e.target)) {\n\n if (!this.isHoldMultipleSelectKey(e) && !this.editor.mergedConfig.selectKeep) 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)) || (this.isHoldMultipleSelectKey(e) && !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 && (this.isHoldMultipleSelectKey(e) || continuousSelect)\n }\n\n public isHoldMultipleSelectKey(e: IPointerEvent): boolean {\n const { multipleSelectKey } = this.editor.mergedConfig\n if (multipleSelectKey) return e.isHoldKeys(multipleSelectKey)\n return e.shiftKey\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, Direction9, isNumber } from '@leafer-ui/draw'\nimport { DragBoundsHelper } from '@leafer-ui/core'\n\nimport { IEditorScaleEvent, IEditorSkewEvent, IEditorRotateEvent } from '@leafer-in/interface'\n\n\nconst { topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left } = Direction9\nconst { toPoint } = AroundHelper, { within, sign } = MathHelper, { abs } = Math\n\nexport const EditDataHelper = {\n\n getScaleData(target: IUI, startBounds: ILayoutBoundsData, direction: Direction9, totalMoveOrScale: IPointData | number, lockRatio: boolean | 'corner', around: IAround, flipable: boolean, scaleMode: boolean): IEditorScaleEvent {\n let align: IAlign, origin = {} as IPointData, scaleX: number = 1, scaleY: number = 1, lockScale: number\n\n const { boxBounds, widthRange, heightRange, dragBounds, worldBoxBounds } = target\n const { width, height } = startBounds\n\n // 获取已经改变的比例\n const originChangedScaleX = target.scaleX / startBounds.scaleX\n const originChangedScaleY = target.scaleY / startBounds.scaleY\n const signX = sign(originChangedScaleX)\n const signY = sign(originChangedScaleY)\n\n const changedScaleX = scaleMode ? originChangedScaleX : signX * boxBounds.width / width\n const changedScaleY = scaleMode ? originChangedScaleY : signY * boxBounds.height / height\n\n if (isNumber(totalMoveOrScale)) {\n\n scaleX = scaleY = Math.sqrt(totalMoveOrScale)\n\n } else {\n\n if (around) {\n totalMoveOrScale.x *= 2\n totalMoveOrScale.y *= 2\n }\n\n totalMoveOrScale.x *= scaleMode ? originChangedScaleX : signX\n totalMoveOrScale.y *= scaleMode ? originChangedScaleY : signY\n\n const topScale = (-totalMoveOrScale.y + height) / height\n const rightScale = (totalMoveOrScale.x + width) / width\n const bottomScale = (totalMoveOrScale.y + height) / height\n const leftScale = (-totalMoveOrScale.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 switch (direction) {\n case top:\n case bottom:\n scaleX = scaleY\n break\n case left:\n case right:\n scaleY = scaleX\n break\n default:\n lockScale = Math.sqrt(abs(scaleX * scaleY))\n scaleX = sign(scaleX) * lockScale\n scaleY = sign(scaleY) * lockScale\n }\n }\n }\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 scaleData = { x: scaleX, y: scaleY }\n DragBoundsHelper.limitScaleOf(target, origin, scaleData, lockRatio as boolean)\n scaleX = scaleData.x\n scaleY = scaleData.y\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 && abs(scaleX * worldBoxBounds.width) < 1) scaleX = sign(scaleX) / worldBoxBounds.width\n if (useScaleY && abs(scaleY * worldBoxBounds.height) < 1) scaleY = sign(scaleY) / worldBoxBounds.height\n\n if (lockRatio && scaleX !== scaleY) {\n lockScale = Math.min(abs(scaleX), abs(scaleY))\n scaleX = sign(scaleX) * lockScale\n scaleY = sign(scaleY) * lockScale\n }\n\n isFinite(scaleX) || (scaleX = 1)\n isFinite(scaleY) || (scaleY = 1)\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 updatePointCursor(editBox: IEditBox, e: IUIEvent): void {\n const { enterPoint: point, dragging, skewing, resizing, flippedX, flippedY } = editBox\n if (!point || !editBox.editor.editing || !editBox.canUse) return\n if (point.name === 'rect') return updateMoveCursor(editBox) // rect 移动元素\n if (point.name === 'circle') return // 独立旋转按钮\n\n let { rotation } = editBox\n const { pointType } = point, { moveCursor, resizeCursor, rotateCursor, skewCursor, moveable, resizeable, rotateable, skewable } = editBox.mergeConfig\n\n if (pointType === 'move') { // 移动类型\n point.cursor = moveCursor\n if (!moveable) point.visible = false\n return\n } else if (pointType === 'button') { // 普通按钮\n if (!point.cursor) point.cursor = 'pointer'\n return\n }\n\n let showResize = pointType.includes('resize')\n if (showResize && rotateable && (editBox.isHoldRotateKey(e) || !resizeable)) showResize = false\n const showSkew = skewable && !showResize && (point.name === 'resize-line' || pointType === 'skew')\n\n const cursor = dragging\n ? (skewing ? skewCursor : (resizing ? resizeCursor : rotateCursor))\n : (showSkew ? skewCursor : (showResize ? resizeCursor : rotateCursor))\n\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 if (editBox.canUse) 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, ITransformTool, IUIEvent, IEditPointInputData } from '@leafer-ui/interface'\nimport { Group, Text, AroundHelper, Direction9, ResizeEvent, BoundsHelper, DataHelper, isArray, isString, isNumber, isNull, getPointData } from '@leafer-ui/draw'\nimport { DragEvent, PointerEvent, KeyEvent, RotateEvent, ZoomEvent, MoveEvent } from '@leafer-ui/core'\n\nimport { IEditBox, IEditor, IEditPoint, IEditPointType } from '@leafer-in/interface'\n\nimport { updatePointCursor, updateMoveCursor } from '../editor/cursor'\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 gesturing: boolean\n\n public moving: boolean\n public resizing: boolean\n public rotating: boolean\n public skewing: boolean\n\n public view: IGroup = new Group() // 放置默认编辑工具控制点\n\n public rect: IEditPoint = new EditPoint({ 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, editBox } = this.editor\n return this.mergedConfig = config && (editBox !== this) ? { ...mergeConfig, ...config } : mergeConfig // 可能会出现多个editBox的情况\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 public get canUse(): boolean { return this.app && this.editor.editing } // 编辑框是否处于激活状态\n public get canGesture(): boolean { // 是否支持手势\n if (!this.canUse) return false\n const { moveable, resizeable, rotateable } = this.mergeConfig\n return isString(moveable) || isString(resizeable) || isString(rotateable)\n }\n public get canDragLimitAnimate(): boolean { return (this.moving && this.mergeConfig.dragLimitAnimate && this.target.dragBounds) as any as boolean }\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 this.listenPointEvents(rect, 'move', 8) // center\n\n view.addMany(...rotatePoints, rect, circle, buttons, ...resizeLines, ...resizePoints)\n this.add(view)\n }\n\n\n public load(): void {\n const { target, mergeConfig, single, rect, circle, resizePoints, resizeLines } = this\n const { stroke, strokeWidth, ignorePixelSnap } = mergeConfig\n\n const pointsStyle = this.getPointsStyle()\n const middlePointsStyle = this.getMiddlePointsStyle()\n const resizeLinesStyle = this.getResizeLinesStyle()\n\n this.visible = !target.locked\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 resizeP.rotation = ((i - (i % 2 ? 1 : 0)) / 2) * 90\n if (i % 2) resizeLines[(i - 1) / 2].set({ pointType: 'resize', rotation: (i - 1) / 2 * 90, ...(resizeLinesStyle[((i - 1) / 2) % resizeLinesStyle.length] || {}) } as IEditPointInputData)\n }\n\n // rotate\n circle.set(this.getPointStyle(mergeConfig.circle || mergeConfig.rotatePoint || pointsStyle[0]))\n\n // rect\n rect.set({ stroke, strokeWidth, opacity: 1, editConfig, ...(mergeConfig.rect || {}) })\n\n // 编辑框作为底部虚拟元素, 在 unload() 中重置\n const rectThrough = isNull(mergeConfig.rectThrough) ? single : mergeConfig.rectThrough\n rect.hittable = !rectThrough\n\n if (rectThrough) {\n target.syncEventer = rect // 同步给 rect 冒泡,在 target 属性装饰器中重置\n this.app.interaction.bottomList = [{ target: rect, proxy: target }]\n }\n\n // 忽略元素像素对齐,在 target 属性装饰器中重置\n if (single) DataHelper.stintSet(target.__world, 'ignorePixelSnap', ignorePixelSnap)\n\n updateMoveCursor(this)\n }\n\n // 必须来自 editor.update(),需同步更新编辑工具 \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.visible = !this.target.locked\n this.set({ x, y, scaleX, scaleY, rotation, skewX, skewY })\n this.updateBounds({ x: 0, y: 0, width, height })\n }\n\n public unload(): void {\n this.visible = false\n if (this.app) this.rect.syncEventer = this.app.interaction.bottomList = null\n }\n\n\n public updateBounds(bounds: IBoundsData): void {\n const { editor, mergeConfig, single, rect, circle, buttons, resizePoints, rotatePoints, resizeLines } = this\n const { editMask } = editor\n const { middlePoint, resizeable, rotateable, hideOnSmall, editBox, mask, dimOthers, bright, spread, hideRotatePoints, hideResizeLines } = mergeConfig\n\n editMask.visible = mask ? true : 0\n\n editor.setDimOthers(dimOthers)\n editor.setBright(!!dimOthers || bright)\n\n if (spread) BoundsHelper.spread(bounds, spread)\n\n if (this.view.worldOpacity) {\n const { width, height } = bounds\n const smallSize = isNumber(hideOnSmall) ? 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 resizeP.set(point)\n rotateP.set(point)\n\n // visible \n resizeP.visible = showPoints && !!(resizeable || rotateable)\n rotateP.visible = showPoints && rotateable && resizeable && !hideRotatePoints\n\n if (i % 2) { // top, right, bottom, left\n\n resizeL = resizeLines[(i - 1) / 2]\n resizeL.set(point)\n\n resizeL.visible = resizeP.visible && !hideResizeLines\n resizeP.visible = rotateP.visible = showPoints && !!middlePoint\n\n if (((i + 1) / 2) % 2) { // top, bottom\n resizeL.width = width + resizeL.height\n if (hideOnSmall && resizeP.width * 2 > width) resizeP.visible = false\n } else {\n resizeL.width = height + resizeL.height\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 getPointStyle(userStyle?: IBoxInputData): IBoxInputData {\n const { stroke, strokeWidth, pointFill, pointSize, pointRadius } = this.mergedConfig\n const defaultStyle = { fill: pointFill, stroke, strokeWidth, around: 'center', strokeAlign: 'center', opacity: 1, 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 isArray(point) ? point : [point]\n }\n\n public getMiddlePointsStyle(): IBoxInputData[] {\n const { middlePoint } = this.mergedConfig\n return isArray(middlePoint) ? middlePoint : (middlePoint ? [middlePoint] : this.getPointsStyle())\n }\n\n public getResizeLinesStyle(): IBoxInputData[] {\n const { resizeLine } = this.mergedConfig\n return isArray(resizeLine) ? resizeLine : [resizeLine]\n }\n\n\n // drag\n\n public onDragStart(e: DragEvent): void {\n this.dragging = true\n const point = this.dragPoint = e.current as IEditPoint, { pointType } = point\n const { moveable, resizeable, rotateable, skewable } = this.mergeConfig\n\n // 确定模式\n if (pointType === 'move') {\n moveable && (this.moving = true)\n } else {\n if (pointType.includes('rotate') || this.isHoldRotateKey(e) || !resizeable) {\n rotateable && (this.rotating = true)\n if (pointType === 'resize-rotate') resizeable && (this.resizing = true)\n else if (point.name === 'resize-line') skewable && (this.skewing = true), this.rotating = false\n } else if (pointType === 'resize') resizeable && (this.resizing = true)\n if (pointType === 'skew') skewable && (this.skewing = true)\n }\n\n this.onTransformStart(e)\n }\n\n public onDrag(e: DragEvent): void {\n const { transformTool, moving, resizing, rotating, skewing } = this\n if (moving) {\n transformTool.onMove(e)\n } else if (resizing || rotating || skewing) {\n const point = e.current as IEditPoint\n if (point.pointType) this.enterPoint = point// 防止变化\n if (rotating) transformTool.onRotate(e)\n if (resizing) transformTool.onScale(e)\n if (skewing) transformTool.onSkew(e)\n }\n updatePointCursor(this, e)\n }\n\n public onDragEnd(e: DragEvent): void {\n this.onTransformEnd(e)\n this.dragPoint = null\n }\n\n // 操作事件共用\n\n public onTransformStart(e: IUIEvent): void {\n if (this.moving || this.gesturing) this.editor.opacity = this.mergedConfig.hideOnMove ? 0 : 1 // move\n if (this.resizing) ResizeEvent.resizingKeys = this.editor.leafList.keys // 记录正在resize中的元素列表\n\n const { dragStartData, target } = this\n dragStartData.x = e.x\n dragStartData.y = e.y\n dragStartData.totalOffset = getPointData() // 缩放、旋转造成的总偏移量,一般用于手势操作的move纠正\n dragStartData.point = { x: target.x, y: target.y } // 用于移动\n dragStartData.bounds = { ...target.getLayoutBounds('box', 'local') } // 用于resize\n dragStartData.rotation = target.rotation // 用于旋转\n }\n\n public onTransformEnd(e: IUIEvent): void {\n if (this.canDragLimitAnimate && (e instanceof DragEvent || e instanceof MoveEvent)) this.transformTool.onMove(e)\n if (this.resizing) ResizeEvent.resizingKeys = null\n\n this.dragging = this.gesturing = this.moving = this.resizing = this.rotating = this.skewing = false\n this.editor.opacity = 1\n this.editor.update() // 移动端手势操作hideOnMove移动需强制更新一次 \n }\n\n // 手势控制元素\n\n public onMove(e: MoveEvent): void {\n if (this.canGesture && e.moveType !== 'drag') {\n e.stop()\n if (isString(this.mergedConfig.moveable)) {\n this.gesturing = this.moving = true\n switch (e.type) {\n case MoveEvent.START: this.onTransformStart(e); break\n case MoveEvent.END: this.onTransformEnd(e); break\n default: this.transformTool.onMove(e)\n }\n }\n }\n }\n\n public onScale(e: ZoomEvent): void {\n if (this.canGesture) {\n e.stop()\n if (isString(this.mergedConfig.resizeable)) {\n this.gesturing = this.resizing = true\n switch (e.type) {\n case ZoomEvent.START: this.onTransformStart(e); break\n case ZoomEvent.END: this.onTransformEnd(e); break\n default: this.transformTool.onScale(e)\n }\n }\n }\n }\n\n public onRotate(e: RotateEvent): void {\n if (this.canGesture) {\n e.stop()\n if (isString(this.mergedConfig.rotateable)) {\n this.gesturing = this.rotating = true\n switch (e.type) {\n case ZoomEvent.START: this.onTransformStart(e); break\n case ZoomEvent.END: this.onTransformEnd(e); break\n default: this.transformTool.onRotate(e)\n }\n }\n }\n }\n\n // 键盘\n\n public isHoldRotateKey(e: IUIEvent): boolean { // 按住ctrl在控制点上变旋转功能\n const { rotateKey } = this.mergedConfig\n if (rotateKey) return e.isHoldKeys(rotateKey)\n return e.metaKey || e.ctrlKey\n }\n\n protected onKey(e: KeyEvent): void {\n updatePointCursor(this, e)\n }\n\n public onArrow(e: IKeyEvent): void {\n if (this.canUse && 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) this.transformTool.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 this.__eventIds.push(\n point.on_([\n [DragEvent.START, this.onDragStart, this],\n [DragEvent.DRAG, this.onDrag, this],\n [DragEvent.END, this.onDragEnd, this],\n\n [PointerEvent.ENTER, (e: PointerEvent) => { this.enterPoint = point, updatePointCursor(this, e) }],\n [PointerEvent.LEAVE, () => { this.enterPoint = null }]\n ])\n )\n }\n\n protected __listenEvents(): void {\n const { rect, editor, __eventIds: events } = this\n\n events.push(\n rect.on_([\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 [[MoveEvent.START, MoveEvent.BEFORE_MOVE, MoveEvent.END], this.onMove, this, true],\n [[ZoomEvent.START, ZoomEvent.BEFORE_ZOOM, ZoomEvent.END], this.onScale, this, true],\n [[RotateEvent.START, RotateEvent.BEFORE_ROTATE, RotateEvent.END], this.onRotate, this, true]\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.scrollWorldTransform)\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 this.skipJSON = true\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, IUI } from '@leafer-ui/interface'\nimport { MathHelper, PointHelper, Matrix, LeafHelper, AroundHelper, isObject, isString, isNumber } 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\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 let move: IPointData, { dragLimitAnimate } = mergeConfig\n\n const isMoveEnd = e.type === MoveEvent.END || e.type === DragEvent.END\n const axisDrag = isString(target.draggable)\n const checkLimitMove = !dragLimitAnimate || isMoveEnd || axisDrag\n\n const total = { x: e.totalX, y: e.totalY }\n\n if (e instanceof MoveEvent) {\n PointHelper.move(total, target.getWorldPointByLocal(dragStartData.totalOffset, null, true))\n }\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 move = DragEvent.getValidMove(target, dragStartData.point, total, checkLimitMove)\n\n if (move.x || move.y) {\n if (dragLimitAnimate && !axisDrag && isMoveEnd) LeafHelper.animateMove(this as unknown as IUI, move, isNumber(dragLimitAnimate) ? dragLimitAnimate : 0.3) // 是否进行动画\n else this.move(move)\n }\n }\n\n public onScale(e: DragEvent | ZoomEvent): void {\n\n const { target, mergeConfig, single, dragStartData } = this.editBox\n let { around, lockRatio, flipable, editSize } = mergeConfig, totalMove: IPointData | number\n\n if (e instanceof ZoomEvent) {\n if (!around) around = target.getBoxPoint(e)\n totalMove = e.totalScale\n } else {\n totalMove = e.getInnerTotal(target)\n }\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, totalMove, lockRatio, EditDataHelper.getAround(around, e.altKey), flipable, !single || editSize === 'scale')\n\n const targetX = target.x, targetY = target.y\n\n if (e instanceof DragEvent && 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 PointHelper.move(dragStartData.totalOffset, target.x - targetX, target.y - targetY)\n }\n\n public onRotate(e: DragEvent | RotateEvent): void {\n\n const { target, mergeConfig, dragStartData } = this.editBox\n const { around, rotateAround, rotateGap, diagonalRotateKey } = mergeConfig\n const { direction } = e.current as IEditPoint\n\n let origin: IPointData, rotation: number\n\n if (e instanceof RotateEvent) {\n\n rotation = e.rotation\n origin = rotateAround ? AroundHelper.getPoint(rotateAround, target.boxBounds) : target.getBoxPoint(e)\n\n } else {\n\n const isDiagonalRotate = diagonalRotateKey ? e.isHoldKeys(diagonalRotateKey) : e.shiftKey // 对角旋转\n\n const data = EditDataHelper.getRotateData(target, direction, e, dragStartData, isDiagonalRotate ? null : (rotateAround || target.around || target.origin || around || 'center'))\n rotation = dragStartData.rotation + data.rotation - target.rotation\n origin = data.origin\n\n }\n\n rotation = MathHelper.float(MathHelper.getGapRotation(rotation, rotateGap, target.rotation), 2)\n if (!rotation) return\n\n const targetX = target.x, targetY = target.y\n\n this.rotateOf(origin, rotation)\n\n PointHelper.move(dragStartData.totalOffset, target.x - targetX, target.y - targetY)\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 (isObject(x)) 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 (isObject(check)) 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 (isObject(check)) 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 (isNumber(check)) 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 (isObject(check)) 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, ILeaferMode } from '@leafer-ui/interface'\nimport { Group, DataHelper, LeafList, RenderEvent, LeafHelper, Direction9, Plugin, isString, PropertyEvent, LeaferEvent, isArray } 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(onTarget)\n public target?: IUI | IUI[]\n\n @targetAttr(onHover)\n public hoverTarget?: IUI\n\n public dimTarget?: IGroup | IGroup[] // 需要淡化的容器\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 dragPoint(): IEditPoint { return this.editBox.dragPoint }\n\n public get dragging(): boolean { return this.editBox.dragging }\n public get gesturing(): boolean { return this.editBox.gesturing } // 手势操作元素中\n\n public get moving(): boolean { return this.editBox.moving }\n public get resizing(): boolean { return this.editBox.resizing }\n public get rotating(): boolean { return this.editBox.rotating }\n public get skewing(): boolean { return this.editBox.skewing }\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 get targetLeafer() { const first = this.list[0]; return first && first.leafer }\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 getItem(index?: number): IUI {\n return this.list[index || 0]\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 // 淡化 / 突出\n\n public setDimOthers(value: boolean | number, attrName: 'bright' | 'dim' = 'dim', list?: IUI[]): void {\n if (!list) {\n const { dimTarget, targetLeafer } = this\n list = dimTarget ? (isArray(dimTarget) ? dimTarget : [dimTarget]) : [targetLeafer]\n }\n if (list[0] && list[0][attrName] !== (value || false)) list.forEach(item => DataHelper.stintSet(item, attrName, value))\n }\n\n public setBright(value: boolean): void {\n this.setDimOthers(value, 'bright', this.list)\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\n // editTool\n\n public getEditTool(name: string): IEditTool {\n return this.editToolList[name] = this.editToolList[name] || EditToolCreator.get(name, this)\n }\n\n public updateEditTool(): void {\n this.unloadEditTool()\n\n if (this.editing) {\n const target = this.element\n let name = target.editOuter || 'EditTool'\n\n const { beforeEditOuter } = this.mergeConfig\n if (beforeEditOuter) {\n const check = beforeEditOuter({ target, name })\n if (isString(check)) name = check\n else if (check === false) return\n }\n\n if (EditToolCreator.list[name]) {\n const tool = this.editTool = this.getEditTool(name)\n this.editBox.load()\n tool.load()\n this.update()\n }\n }\n }\n\n public unloadEditTool(): void {\n let tool = this.editTool\n if (tool) {\n this.editBox.unload()\n tool.unload()\n this.editTool = null\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 getInnerEditor(name: string): IInnerEditor {\n return this.editToolList[name] = this.editToolList[name] || EditToolCreator.get(name, this)\n }\n\n public openInnerEditor(target?: IUI, nameOrSelect?: string | boolean, select?: boolean): void {\n let name: string\n if (isString(nameOrSelect)) name = nameOrSelect\n else if (!select) select = nameOrSelect\n\n if (target && select) this.target = target\n\n if (this.single) {\n if (!target) target = this.element\n if (!name) name = target.editInner\n\n const { beforeEditInner } = this.mergeConfig\n if (beforeEditInner) {\n const check = beforeEditInner({ target, name })\n if (isString(check)) name = check\n else if (check === false) return\n }\n\n if (EditToolCreator.list[name]) {\n this.editTool.unload()\n this.innerEditing = true\n this.innerEditor = this.getInnerEditor(name)\n this.innerEditor.editTarget = target\n\n this.emitInnerEvent(InnerEditorEvent.BEFORE_OPEN)\n this.innerEditor.load()\n this.emitInnerEvent(InnerEditorEvent.OPEN)\n }\n }\n }\n\n public closeInnerEditor(onlyInnerEditor?: boolean): 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 if (!onlyInnerEditor) this.updateEditTool()\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 onChildScroll(): void {\n if (this.multiple) this.updateEditBox()\n }\n\n // event \n\n public listenTargetEvents(): void {\n if (!this.targetEventIds.length) {\n const { app, leafer, targetLeafer, editMask } = this\n this.targetEventIds = [\n leafer.on_(RenderEvent.START, this.onRenderStart, this),\n targetLeafer && targetLeafer.on_(PropertyEvent.SCROLL, this.onChildScroll, this),\n app.on_(RenderEvent.CHILD_START, this.onAppRenderStart, this),\n app.on_(LeaferEvent.UPDATE_MODE, (data: { mode: ILeaferMode }) => { if (data.mode && data.mode !== 'normal') this.cancel() })\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(true)\n editor.unloadEditTool()\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\n protected _editBox: IEditBox\n public get editBox(): IEditBox { return this._editBox || this.editor.editBox } // 编辑框,默认为editor.editBox\n public set editBox(value: IEditBox) { this._editBox = value }\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 = editBox.target 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.updateLayout(); return ui.__.__isLinePath ? 'LineEditTool' : 'EditTool' }, dataType) // fix: Line 需要更新布局才能精准确定\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","isArray","SuppressedError","EditorEvent","Event","list","this","oldList","oldValue","constructor","type","data","super","assign","targetAttr","fn","privateKey","defineKey","get","set","old","t","config","isSelect","beforeSelect","check","isObject","setDimOthers","setBright","locked","splice","single","element","syncEventer","__world","ignorePixelSnap","BEFORE_SELECT","BEFORE_HOVER","hasEvent","emitEvent","editor","SELECT","AFTER_SELECT","HOVER","abs","Math","copy","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","strokePathType","__useArrow","__drawPath","__pathForRender","__drawRenderPath","__drawPathByBox","max","shadow","getRenderScaleData","scaleFixed","save","setWorldShadow","x","y","blur","ColorConvert","string","color","isString","Paint","strokes","fills","restore","destroy","stroker","prototype","surfaceType","SelectArea","Group","strokeArea","Rect","fillArea","addMany","setStyle","userStyle","reset","opacity","setBounds","EditSelectHelper","findOne","path","find","editable","findByBounds","branch","eachFind","children","child","len","isBranch","hitChildren","hitSelf","push","isFrame","includes","__layout","boxBounds","EditSelect","dragging","originList","running","app","mergeConfig","selector","mode","isMoveMode","interaction","moveMode","hoverStroker","targetStroker","Bounds","selectArea","__eventIds","__listenEvents","onHover","hoverTarget","editConfig","hover","hoverStyle","onSelect","selectedPathType","selectedStyle","mergedConfig","onPointerMove","e","canHover","findUI","hasItem","onBeforeDown","multiTouch","select","mobile","waitSelect","checkAndSelect","onTap","selectKeep","needRemoveItem","removeItem","allowSelect","isMultipleSelect","addItem","needUpdate","allow","isHoldMultipleSelectKey","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","rect","findPath","continuousSelect","multipleSelectKey","isHoldKeys","shiftKey","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","sign","MathHelper","EditDataHelper","getScaleData","startBounds","direction","totalMoveOrScale","lockRatio","around","flipable","scaleMode","align","lockScale","origin","widthRange","heightRange","worldBoxBounds","originChangedScaleX","originChangedScaleY","signX","signY","changedScaleX","changedScaleY","isNumber","sqrt","topScale","rightScale","bottomScale","leftScale","useScaleX","useScaleY","scaleData","DragBoundsHelper","limitScaleOf","nowWidth","nowHeight","min","isFinite","getRotateData","current","last","rotation","PointHelper","getRotation","getWorldPointByBox","getSkewData","move","skewX","skewY","getAround","altKey","getRotateDirection","totalDirection","round","getFlipDirection","flipedX","flipedY","cacheCursors","updatePointCursor","enterPoint","point","skewing","resizing","flippedX","flippedY","canUse","name","updateMoveCursor","pointType","moveCursor","resizeCursor","rotateCursor","skewCursor","moveable","resizeable","rotateable","skewable","cursor","showResize","isHoldRotateKey","showSkew","formatRotation","url","toDataURL","undefined","svg","encodeURIComponent","replace","toString","EditPoint","Box","useFastShadow","fourDirection","EditBox","_target","transformTool","_transformTool","tool","flipped","flippedOne","canGesture","canDragLimitAnimate","moving","dragLimitAnimate","view","hitFill","hitStroke","hitRadius","circle","buttons","resizePoints","rotatePoints","resizeLines","dragStartData","create","rotatePoint","resizeLine","resizePoint","arounds","listenPointEvents","add","load","pointsStyle","getPointsStyle","middlePointsStyle","getMiddlePointsStyle","resizeLinesStyle","getResizeLinesStyle","resizeP","getPointStyle","rectThrough","isNull","bottomList","DataHelper","stintSet","getLayoutBounds","updateBounds","unload","editMask","middlePoint","hideOnSmall","mask","dimOthers","bright","spread","hideRotatePoints","hideResizeLines","worldOpacity","smallSize","showPoints","rotateP","resizeL","directionData","layoutCircle","layoutButtons","circleDirection","circleMargin","buttonsMargin","buttonsDirection","indexOf","setButtonPosition","buttonsFixed","useMiddlePoint","useX","margin","pointFill","pointSize","pointRadius","defaultStyle","cornerRadius","offsetX","offsetY","dragPoint","rotating","onTransformStart","onMove","onRotate","onScale","onSkew","onTransformEnd","gesturing","hideOnMove","ResizeEvent","resizingKeys","keys","totalOffset","getPointData","moveType","stop","rotateKey","metaKey","ctrlKey","onKey","onArrow","keyEvent","distance","code","onDoubleTap","openInner","preventEditInner","onLongPress","editInner","textBox","Text","openInnerEditor","openGroup","ENTER","LEAVE","events","DOUBLE_TAP","LONG_PRESS","KeyEvent","HOLD","UP","DOWN","BEFORE_MOVE","BEFORE_ZOOM","RotateEvent","BEFORE_ROTATE","bigBounds","EditMask","__updateWorldBounds","__local","fillWorld","saveBlendMode","shape","__render","parent","__renderShape","restoreBlendMode","filterStyle","editSize","rotateGap","simulate","simulateTarget","zoomLayer","safeChange","getBounds","order","a","b","reverseOrder","EditorHelper","group","userGroup","sort","addAt","matrx","Matrix","divideParent","scrollWorldTransform","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","skipJSON","on","PropertyEvent","CHANGE","event","attrName","newValue","addValue","oldMatrix","rotationChange","changedTransform","divide","rotateOf","scaleOf","skewOf","changeFn","EditorMoveEvent","EditorScaleEvent","BEFORE_SCALE","SCALE","EditorRotateEvent","ROTATE","EditorSkewEvent","BEFORE_SKEW","SKEW","TransformTool","isMoveEnd","axisDrag","checkLimitMove","totalX","totalY","getWorldPointByLocal","getValidMove","animateMove","totalMove","getBoxPoint","totalScale","targetX","targetY","editTool","onScaleWithDrag","drag","scaleWithDrag","rotateAround","diagonalRotateKey","getPoint","isDiagonalRotate","float","getGapRotation","getInnerMove","checkTransform","beforeMove","world","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","targetLeafer","first","userConfig","editToolList","targetEventIds","default","Plugin","cancel","getItem","shiftItem","dimTarget","innerEditing","innerEditor","updateEditBox","getEditTool","updateEditTool","unloadEditTool","editOuter","beforeEditOuter","getEditSize","_ui","_e","_x","_y","_data","_origin","_scaleY","_axis","_rotation","_skewX","_skewY","_type","_func","emitGroupEvent","closeGroup","checkOpenedGroups","opened","every","hasParent","checkDeepSelect","editTarget","getInnerEditor","nameOrSelect","beforeEditInner","emitInnerEvent","closeInnerEditor","onlyInnerEditor","lock","unlock","onAppRenderStart","targetChanged","renderer","changed","forceRender","onRenderStart","onChildScroll","listenTargetEvents","RenderEvent","SCROLL","CHILD_START","LeaferEvent","UPDATE_MODE","removeTargetEvents","destroyed","values","isUndefined","pointer","useModule","InnerEditor","_editBox","eventIds","onCreate","onLoad","tree","onUpdate","onUnload","onDestroy","moveWorld","resize","transformWorld","scaleOfWorld","rotateOfWorld","skewOfWorld","toNumberPoints","LineEditTool","scaleOfEvent","line","isDragFrom","pathInputed","from","to","getFromToByPath","points","getFromToByPoints","getLocalPointByInner","getInnerPointByLocal","ui","movePoint","originPoints","fromPoint","fromTo","leftOrRight","innerToWorld","pen","clearPath","moveTo","lineTo","Creator","sky","addAttr","dataType","updateLayout","__isLinePath","setEditConfig","changeAttr","setEditOuter","toolName","setEditInner","editorName"],"mappings":"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","x_google_ignoreList":[0]}