scrawl-canvas
Version:
Responsive, interactive and more accessible HTML5 canvas elements. Scrawl-canvas is a JavaScript library designed to make using the HTML5 canvas element easier, and more fun
169 lines (108 loc) • 5.11 kB
JavaScript
// # Pivot mixin
// This mixin defines the attributes and functionality required by an artefact so that it can position and rotate itself using values set in another artefact.
// #### Imports
import { artefact, asset } from '../core/library.js';
import { isa_boolean, mergeOver, pushUnique, removeItem, Ωempty } from '../helper/utilities.js';
// Shared constants
import { CORNER_LABELS, PIVOT, START, T_BEZIER, T_CELL, T_LINE, T_POLYLINE, T_QUADRATIC, ZERO_STR } from '../helper/shared-vars.js';
// Local constants (none defined)
// #### Export function
export default function (P = Ωempty) {
// #### Shared attributes
const defaultAttributes = {
// __pivot__ - reference artefact object. Can also be set using the artefact's name-String.
pivot: ZERO_STR,
// __pivotCorner__ - Element artefacts allow other artefacts to use their corner positions as pivots, by setting this attribute to `topLeft`, `topRight`, `bottomRight` or `bottomLeft`; default is `''` to use the Element's start coordinate.
pivotCorner: ZERO_STR,
// __pivotPin__ - Polyline entitys comprise a set of pin coordinates with the start being pin[0]; can reference other pins by setting this attribute to the appropriate index value (for example, the second pin will be pin[1]).
pivotPin: 0,
// __pivotIndex__ - EnhancedLabel entitys comprise a set of TextUnits, each with their own `startData` coordinate; we can reference that coordinate by setting this attribute to the appropriate index value (number).
// + Defaults to '-1', which means we should use the entity's layoutTemplate artefact's start position
pivotIndex: -1,
// __addPivotHandle__, __addPivotOffset__, __addPivotRotation__ - Boolean flags. When set, the artifact will add its own values to the reference artefact's values, rather than use them as replacement values.
addPivotHandle: false,
addPivotOffset: true,
addPivotRotation: false,
};
P.defs = mergeOver(P.defs, defaultAttributes);
// #### Packet management
P.packetObjects = pushUnique(P.packetObjects, ['pivot']);
// #### Clone management
// No additional clone functionality defined here
// #### Kill management
// No additional kill functionality defined here
// #### Get, Set, deltaSet
const S = P.setters;
// #### Prototype functions
// __pivot__
S.pivot = function (item) {
if (isa_boolean(item) && !item) {
this.pivot = null;
if (this.lockTo[0] === PIVOT) this.lockTo[0] = START;
if (this.lockTo[1] === PIVOT) this.lockTo[1] = START;
this.dirtyStampPositions = true;
this.dirtyStampHandlePositions = true;
}
else {
const oldPivot = this.pivot,
name = this.name;
let newPivot = (item.substring) ? artefact[item] : item;
if (!newPivot) {
newPivot = asset[item];
if (newPivot && newPivot.type !== T_CELL) newPivot = false;
}
if (newPivot && newPivot.name) {
if (oldPivot && oldPivot.name !== newPivot.name) removeItem(oldPivot.pivoted, name);
pushUnique(newPivot.pivoted, name);
this.pivot = newPivot;
this.dirtyStampPositions = true;
this.dirtyStampHandlePositions = true;
}
// To help fix the bug where user has pivoted to an artefact which they have not yet defined
else if (newPivot == null) this.pivot = item;
}
};
// __pivotCorner__
S.pivotCorner = function (item) {
if (CORNER_LABELS.includes(item)) this.pivotCorner = item;
this.dirtyStart = true;
};
// __pivotIndex__
S.pivotIndex = function (item) {
this.pivotIndex = item;
this.dirtyStart = true;
};
// __addPivotHandle__, __addPivotOffset__, __addPivotRotation__
S.addPivotHandle = function (item) {
this.addPivotHandle = item;
this.dirtyHandle = true;
};
S.addPivotOffset = function (item) {
this.addPivotOffset = item;
this.dirtyOffset = true;
};
S.addPivotRotation = function (item) {
this.addPivotRotation = item;
this.dirtyRotation = true;
};
// #### Prototype functions
// `updatePivotSubscribers`
P.updatePivotSubscribers = function () {
let art;
this.pivoted.forEach(name => {
art = artefact[name];
if (!art) {
art = asset[name];
if (!art || art.type !== T_CELL) art = false;
}
if (art) {
art.dirtyStart = true;
if (art.addPivotHandle) art.dirtyHandle = true;
if (art.addPivotOffset) art.dirtyOffset = true;
if (art.addPivotRotation) art.dirtyRotation = true;
if (art.type === T_POLYLINE) art.dirtyPins = true;
else if (art.type === T_LINE || art.type === T_QUADRATIC || art.type === T_BEZIER) art.dirtyPins.push(this.name);
}
}, this);
};
}