diff --git a/lib/src/interfaces/models.ts b/lib/src/interfaces/models.ts index 818a713..db92e95 100644 --- a/lib/src/interfaces/models.ts +++ b/lib/src/interfaces/models.ts @@ -1,30 +1,10 @@ import { UUID_V4 } from "@gxc-solutions/lett-js"; -import { IPoint } from "@gxc-solutions/math"; +import { IPoint, ITransform } from "@gxc-solutions/math"; import { ISolidFill } from "./fill"; import { IStroke } from "./stroke"; export type ModelConstructor = new (...args: any[]) => IModel; -export type TypeOfModel = "collection-model" | "ellipse-model" | "rectangle-model" | "image-model" | "text-object"; - -export interface IModel { - readonly id: UUID_V4; - readonly type: TypeOfModel; -} - -export interface ITransform { - scaleX: number; - scaleY: number; - - translateY: number; - translateX: number; - - skewY: number; - skewX: number; - - rotate: number; -} - export interface IEllipse { radiusX: number; radiusY: number; @@ -38,7 +18,15 @@ export interface IRectangle { left: number; } +export type TypeOfModel = "collection-model" | "ellipse-model" | "rectangle-model" | "image-model" | "text-object"; + +export interface IModel { + readonly id: UUID_V4; + readonly type: TypeOfModel; +} + export interface IEllipseModel extends IModel { + readonly type: "ellipse-model"; ellipse: IEllipse; transform: ITransform; stroke: IStroke; @@ -48,6 +36,7 @@ export interface IEllipseModel extends IModel { } export interface IRectangleModel extends IModel { + readonly type: "rectangle-model"; rectangle: IRectangle; transform: ITransform; stroke: IStroke; @@ -57,6 +46,7 @@ export interface IRectangleModel extends IModel { } export interface IImageModel extends IModel { + readonly type: "image-model"; rectangle: IRectangle; transform: ITransform; stroke: IStroke; diff --git a/lib/src/interfaces/state.ts b/lib/src/interfaces/state.ts new file mode 100644 index 0000000..1657c3d --- /dev/null +++ b/lib/src/interfaces/state.ts @@ -0,0 +1,7 @@ +export interface ISelectableObject { + isSelected: boolean; +} + +export interface IVisibleObject { + isVisible: boolean; +} diff --git a/lib/src/models/objects/base.ts b/lib/src/models/objects/base.ts index ba19720..d92c579 100644 --- a/lib/src/models/objects/base.ts +++ b/lib/src/models/objects/base.ts @@ -2,7 +2,7 @@ import { ignore } from "../../decorators"; import { TypeOfModel } from "../../interfaces"; import { uuidv4, UUID_V4 } from "@gxc-solutions/lett-js/web-api/uuidv4"; -export abstract class BaseItem { +export abstract class BaseModel { @ignore readonly id: UUID_V4; abstract readonly type: TypeOfModel; name = ""; @@ -14,5 +14,5 @@ export abstract class BaseItem { tags: Record = {}; - abstract copy(): BaseItem; + abstract copy(): BaseModel; } diff --git a/lib/src/models/objects/ellipce.ts b/lib/src/models/objects/ellipse.ts similarity index 67% rename from lib/src/models/objects/ellipce.ts rename to lib/src/models/objects/ellipse.ts index 57faa12..57108ed 100644 --- a/lib/src/models/objects/ellipce.ts +++ b/lib/src/models/objects/ellipse.ts @@ -1,12 +1,13 @@ -import { Ellipse, Point, Transform } from "@gxc-solutions/math"; +import { UUID_V4 } from "@gxc-solutions/lett-js"; +import { Ellipse, getBounds, Point, Transform } from "@gxc-solutions/math"; +import { ignore } from "../../decorators"; import { TypeOfModel } from "../../interfaces"; import { SolidFill } from "../solid-fill"; import { Stroke } from "../stroke"; -import { BaseItem } from "./base"; -import { ignore } from "../../decorators"; -import { UUID_V4 } from "@gxc-solutions/lett-js"; +import { BaseModel } from "./base"; +import { ISelectableObject } from "../../interfaces/state"; -export class EllipseObject extends BaseItem { +export class EllipseObject extends BaseModel implements ISelectableObject { @ignore readonly type: TypeOfModel = "ellipse-model"; transform = new Transform(); @@ -23,6 +24,10 @@ export class EllipseObject extends BaseItem { stroke = new Stroke(); fill = new SolidFill(); + get bounds() { + return getBounds(this.ellipse.toRectangle(), this.transform); + } + constructor(id?: UUID_V4) { super(id); } diff --git a/lib/src/models/objects/image.ts b/lib/src/models/objects/image.ts index acfb407..75ed3ae 100644 --- a/lib/src/models/objects/image.ts +++ b/lib/src/models/objects/image.ts @@ -1,17 +1,23 @@ -import { Rectangle, Transform } from "@gxc-solutions/math"; +import { getBounds, Rectangle, Transform } from "@gxc-solutions/math"; import { ignore } from "../../decorators"; import { TypeOfModel } from "../../interfaces"; import { Stroke } from "../stroke"; -import { BaseItem } from "./base"; +import { BaseModel } from "./base"; import { UUID_V4 } from "@gxc-solutions/lett-js"; import { SolidFill } from "../solid-fill"; +import { ISelectableObject } from "../../interfaces/state"; -export class ImageItem extends BaseItem { +export class ImageItem extends BaseModel implements ISelectableObject { @ignore readonly type: TypeOfModel = "image-model"; transform = new Transform(); rectangle = new Rectangle(); + isSelected = false; + + isVisible = true; + isLocked = false; + stroke = new Stroke(); fill = new SolidFill(); @@ -24,14 +30,15 @@ export class ImageItem extends BaseItem { url: string; }; - isLocked = false; - isSelected = false; + get bounds() { + return getBounds(this.rectangle, this.transform); + } constructor(id?: UUID_V4) { super(id); } - copy(): BaseItem { + copy(): BaseModel { throw new Error("Method not implemented."); } } diff --git a/lib/src/models/objects/index.ts b/lib/src/models/objects/index.ts index d368b44..2dbc57b 100644 --- a/lib/src/models/objects/index.ts +++ b/lib/src/models/objects/index.ts @@ -1,5 +1,5 @@ export * from "./base"; -export * from "./ellipce"; +export * from "./ellipse"; export * from "./image"; export * from "./rectangle"; export * from "./text"; diff --git a/lib/src/models/objects/rectangle.ts b/lib/src/models/objects/rectangle.ts index 033154f..2363569 100644 --- a/lib/src/models/objects/rectangle.ts +++ b/lib/src/models/objects/rectangle.ts @@ -1,11 +1,12 @@ -import { Rectangle, Transform } from "@gxc-solutions/math"; +import { getBounds, Rectangle, Transform } from "@gxc-solutions/math"; import { ignore } from "../../decorators"; -import { BaseItem } from "./base"; +import { BaseModel } from "./base"; import { Stroke } from "../stroke"; import { SolidFill } from "../solid-fill"; import { UUID_V4 } from "@gxc-solutions/lett-js"; +import { ISelectableObject } from "../../interfaces/state"; -export class RectangleItem extends BaseItem { +export class RectangleItem extends BaseModel implements ISelectableObject { @ignore readonly type = "rectangle-model"; transform = new Transform(); @@ -22,11 +23,15 @@ export class RectangleItem extends BaseItem { stroke = new Stroke(); fill = new SolidFill(); + get bounds() { + return getBounds(this.rectangle, this.transform); + } + constructor(id?: UUID_V4) { super(id); } - copy(): BaseItem { + copy(): BaseModel { throw new Error("Not implemented!"); } } diff --git a/lib/src/models/objects/text.ts b/lib/src/models/objects/text.ts index 23b0e9a..577e1f1 100644 --- a/lib/src/models/objects/text.ts +++ b/lib/src/models/objects/text.ts @@ -1,7 +1,7 @@ import { ignore } from "../../decorators"; -import { BaseItem } from "./base"; +import { BaseModel } from "./base"; -export class TextItem extends BaseItem { +export class TextItem extends BaseModel { @ignore readonly type = "text-object"; isSelected = false; @@ -20,7 +20,7 @@ export class TextItem extends BaseItem { // lineHeight: number; // ~leading // letterSpacing: number; // ~tracking - copy(): BaseItem { + copy(): BaseModel { throw new Error("Method not implemented."); } } diff --git a/lib/src/package.json b/lib/src/package.json index fed4822..d232456 100644 --- a/lib/src/package.json +++ b/lib/src/package.json @@ -1,6 +1,6 @@ { "name": "@gxc-solutions/model-base", - "version": "0.0.4", + "version": "0.0.5", "main": "index.js", "author": "GXC Solutions", "publishConfig": { @@ -10,7 +10,7 @@ "peerDependencies": { "@gxc-solutions/colors": "0.0.1", "@gxc-solutions/lett-js": "^1.0.1", - "@gxc-solutions/math": "^0.0.2", + "@gxc-solutions/math": "^0.0.3", "reflect-metadata": "^0.2.2" } } diff --git a/lib/src/parser.ts b/lib/src/parser.ts index 366b39e..515a36c 100644 --- a/lib/src/parser.ts +++ b/lib/src/parser.ts @@ -16,7 +16,7 @@ import { ITransform, TypeOfModel, } from "./interfaces"; -import { EllipseObject } from "./models/objects/ellipce"; +import { EllipseObject } from "./models/objects/ellipse"; import { ImageItem } from "./models/objects/image"; import { Stroke } from "./models/stroke"; import { SolidFill } from "./models/solid-fill"; diff --git a/package-lock.json b/package-lock.json index d10ec9d..095f313 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@gxc-solutions/colors": "0.0.1", "@gxc-solutions/lett-js": "^1.0.1", - "@gxc-solutions/math": "^0.0.2", + "@gxc-solutions/math": "^0.0.3", "reflect-metadata": "^0.2.2" }, "devDependencies": { @@ -708,9 +708,9 @@ "integrity": "sha512-wmRXERIrb3md5G3OI4dEBQmzh005meLm7EMK5K5U1eFX+GjuhAGSm/Wi/eag0LQmjy+L1R9koxsuhzN2vTfigA==" }, "node_modules/@gxc-solutions/math": { - "version": "0.0.2", - "resolved": "https://npm.gxc-solutions.ru/@gxc-solutions/math/-/math-0.0.2.tgz", - "integrity": "sha512-R6zYvbspis+XoHZ7lwyVLAUGZkJwivbeo94VtN7cSZzOA86AgVev+UQeHt9S1Ua4d1FwgxYVasck1/l5WXR7CQ==" + "version": "0.0.3", + "resolved": "https://npm.gxc-solutions.ru/@gxc-solutions/math/-/math-0.0.3.tgz", + "integrity": "sha512-B39/C/3YzfSbLgsf0sBpZILTSO8TIZVbh6tv3pXulG1qDL1tg41mLjp7M263MsC7ARzj7ME8WWsniBj0C4L+XA==" }, "node_modules/@humanfs/core": { "version": "0.19.1", diff --git a/package.json b/package.json index 8e41497..bc82568 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "dependencies": { "@gxc-solutions/colors": "0.0.1", "@gxc-solutions/lett-js": "^1.0.1", - "@gxc-solutions/math": "^0.0.2", + "@gxc-solutions/math": "^0.0.3", "reflect-metadata": "^0.2.2" } }