fix 692 and some refactoring

This commit is contained in:
JFH
2022-01-03 17:23:06 -03:00
parent eb3567dc69
commit 9e96290a25
5 changed files with 81 additions and 80 deletions

View File

@@ -10,7 +10,7 @@ import { NS } from './namespaces.js'
import * as hstry from './history.js'
import * as pathModule from './path.js'
import {
isNullish, getStrokedBBoxDefaultVisible, setHref, getElement, getHref, getVisibleElements,
getStrokedBBoxDefaultVisible, setHref, getElement, getHref, getVisibleElements,
findDefs, getRotationAngle, getRefElem, getBBox as utilsGetBBox, walkTreePost, assignAttributes, getFeGaussianBlur
} from './utilities.js'
import {
@@ -37,6 +37,19 @@ let svgCanvas = null
*/
export const init = (canvas) => {
svgCanvas = canvas
svgCanvas.copySelectedElements = copySelectedElements
svgCanvas.groupSelectedElements = groupSelectedElements // Wraps all the selected elements in a group (`g`) element.
svgCanvas.pushGroupProperties = pushGroupProperty // Pushes all appropriate parent group properties down to its children
svgCanvas.ungroupSelectedElement = ungroupSelectedElement // Unwraps all the elements in a selected group (`g`) element
svgCanvas.moveToTopSelectedElement = moveToTopSelectedElem // Repositions the selected element to the bottom in the DOM to appear on top
svgCanvas.moveToBottomSelectedElement = moveToBottomSelectedElem // Repositions the selected element to the top in the DOM to appear under other elements
svgCanvas.moveUpDownSelected = moveUpDownSelected // Moves the select element up or down the stack, based on the visibly
svgCanvas.moveSelectedElements = moveSelectedElements // Moves selected elements on the X/Y axis.
svgCanvas.cloneSelectedElements = cloneSelectedElements // Create deep DOM copies (clones) of all selected elements and move them slightly
svgCanvas.alignSelectedElements = alignSelectedElements // Aligns selected elements.
svgCanvas.updateCanvas = updateCanvas // Updates the editor canvas width/height/position after a zoom has occurred.
svgCanvas.cycleElement = cycleElement // Select the next/previous element within the current layer.
svgCanvas.deleteSelectedElements = deleteSelectedElements // Removes all selected elements from the DOM and adds the change to the history
}
/**
@@ -46,9 +59,9 @@ export const init = (canvas) => {
* @fires module:selected-elem.SvgCanvas#event:changed
* @returns {void}
*/
export const moveToTopSelectedElem = function () {
const moveToTopSelectedElem = () => {
const [selected] = svgCanvas.getSelectedElements()
if (!isNullish(selected)) {
if (selected) {
const t = selected
const oldParent = t.parentNode
const oldNextSibling = t.nextSibling
@@ -69,9 +82,9 @@ export const moveToTopSelectedElem = function () {
* @fires module:selected-elem.SvgCanvas#event:changed
* @returns {void}
*/
export const moveToBottomSelectedElem = function () {
const moveToBottomSelectedElem = () => {
const [selected] = svgCanvas.getSelectedElements()
if (!isNullish(selected)) {
if (selected) {
let t = selected
const oldParent = t.parentNode
const oldNextSibling = t.nextSibling
@@ -102,7 +115,7 @@ export const moveToBottomSelectedElem = function () {
* @fires module:selected-elem.SvgCanvas#event:changed
* @returns {void}
*/
export const moveUpDownSelected = function (dir) {
const moveUpDownSelected = (dir) => {
const selectedElements = svgCanvas.getSelectedElements()
const selected = selectedElements[0]
if (!selected) { return }
@@ -113,7 +126,7 @@ export const moveUpDownSelected = function (dir) {
const list = svgCanvas.getIntersectionList(getStrokedBBoxDefaultVisible([selected]))
if (dir === 'Down') { list.reverse() }
Array.prototype.forEach.call(list, function (el) {
Array.prototype.forEach.call(list, (el) => {
if (!foundCur) {
if (el === selected) {
foundCur = true
@@ -151,7 +164,7 @@ export const moveUpDownSelected = function (dir) {
* @returns {BatchCommand|void} Batch command for the move
*/
export const moveSelectedElements = function (dx, dy, undoable = true) {
const moveSelectedElements = (dx, dy, undoable = true) => {
const selectedElements = svgCanvas.getSelectedElements()
const zoom = svgCanvas.getZoom()
// if undoable is not sent, default to true
@@ -206,7 +219,7 @@ export const moveSelectedElements = function (dx, dy, undoable = true) {
* @param {Float} y Float with the distance to move on the y-axis
* @returns {void}
*/
export const cloneSelectedElements = function (x, y) {
const cloneSelectedElements = (x, y) => {
const selectedElements = svgCanvas.getSelectedElements()
const currentGroup = svgCanvas.getCurrentGroup()
let i; let elem
@@ -214,7 +227,7 @@ export const cloneSelectedElements = function (x, y) {
// find all the elements selected (stop at first null)
const len = selectedElements.length
function index (el) {
const index = (el) => {
if (!el) return -1
let i = 0
do {
@@ -229,13 +242,13 @@ export const cloneSelectedElements = function (x, y) {
* @param {Element} b
* @returns {Integer}
*/
function sortfunction (a, b) {
const sortfunction = (a, b) => {
return (index(b) - index(a))
}
selectedElements.sort(sortfunction)
for (i = 0; i < len; ++i) {
elem = selectedElements[i]
if (isNullish(elem)) { break }
if (!elem) { break }
}
// use slice to quickly get the subset of elements we need
const copiedElements = selectedElements.slice(0, i)
@@ -264,7 +277,7 @@ export const cloneSelectedElements = function (x, y) {
* @param {"selected"|"largest"|"smallest"|"page"} relativeTo
* @returns {void}
*/
export const alignSelectedElements = function (type, relativeTo) {
const alignSelectedElements = (type, relativeTo) => {
const selectedElements = svgCanvas.getSelectedElements()
const bboxes = [] // angles = [];
const len = selectedElements.length
@@ -273,7 +286,7 @@ export const alignSelectedElements = function (type, relativeTo) {
let miny = Number.MAX_VALUE; let maxy = Number.MIN_VALUE
let curwidth = Number.MIN_VALUE; let curheight = Number.MIN_VALUE
for (let i = 0; i < len; ++i) {
if (isNullish(selectedElements[i])) { break }
if (!selectedElements[i]) { break }
const elem = selectedElements[i]
bboxes[i] = getStrokedBBoxDefaultVisible([elem])
@@ -326,7 +339,7 @@ export const alignSelectedElements = function (type, relativeTo) {
const dx = new Array(len)
const dy = new Array(len)
for (let i = 0; i < len; ++i) {
if (isNullish(selectedElements[i])) { break }
if (!selectedElements[i]) { break }
// const elem = selectedElements[i];
const bbox = bboxes[i]
dx[i] = 0
@@ -368,7 +381,7 @@ export const alignSelectedElements = function (type, relativeTo) {
* @fires module:selected-elem.SvgCanvas#event:changed
* @returns {void}
*/
export const deleteSelectedElements = function () {
const deleteSelectedElements = () => {
const selectedElements = svgCanvas.getSelectedElements()
const batchCmd = new BatchCommand('Delete Elements')
const len = selectedElements.length
@@ -376,7 +389,7 @@ export const deleteSelectedElements = function () {
for (let i = 0; i < len; ++i) {
const selected = selectedElements[i]
if (isNullish(selected)) { break }
if (!selected) { break }
let parent = selected.parentNode
let t = selected
@@ -411,7 +424,7 @@ export const deleteSelectedElements = function () {
* @function module:selected-elem.SvgCanvas#copySelectedElements
* @returns {void}
*/
export const copySelectedElements = function () {
const copySelectedElements = () => {
const selectedElements = svgCanvas.getSelectedElements()
const data =
JSON.stringify(selectedElements.map((x) => svgCanvas.getJsonFromSvgElements(x)))
@@ -431,7 +444,7 @@ export const copySelectedElements = function () {
* @param {string} [urlArg]
* @returns {void}
*/
export const groupSelectedElements = function (type, urlArg) {
const groupSelectedElements = (type, urlArg) => {
const selectedElements = svgCanvas.getSelectedElements()
if (!type) { type = 'g' }
let cmdStr = ''
@@ -467,7 +480,7 @@ export const groupSelectedElements = function (type, urlArg) {
let i = selectedElements.length
while (i--) {
let elem = selectedElements[i]
if (isNullish(elem)) { continue }
if (!elem) { continue }
if (elem.parentNode.tagName === 'a' && elem.parentNode.childNodes.length === 1) {
elem = elem.parentNode
@@ -492,7 +505,7 @@ export const groupSelectedElements = function (type, urlArg) {
* @param {boolean} undoable
* @returns {BatchCommand|void}
*/
export const pushGroupProperty = function (g, undoable) {
const pushGroupProperty = (g, undoable) => {
const children = g.childNodes
const len = children.length
const xform = g.getAttribute('transform')
@@ -686,7 +699,7 @@ export const pushGroupProperty = function (g, undoable) {
* @fires module:selected-elem.SvgCanvas#event:selected
* @returns {void}
*/
export const convertToGroup = function (elem) {
const convertToGroup = (elem) => {
const selectedElements = svgCanvas.getSelectedElements()
if (!elem) {
elem = selectedElements[0]
@@ -807,7 +820,7 @@ export const convertToGroup = function (elem) {
// recalculate dimensions on the top-level children so that unnecessary transforms
// are removed
walkTreePost(g, function (n) {
walkTreePost(g, (n) => {
try {
recalculateDimensions(n)
} catch (e) {
@@ -817,7 +830,7 @@ export const convertToGroup = function (elem) {
// Give ID for any visible element missing one
const visElems = g.querySelectorAll(svgCanvas.getVisElems())
Array.prototype.forEach.call(visElems, function (el) {
Array.prototype.forEach.call(visElems, (el) => {
if (!el.id) { el.id = svgCanvas.getNextId() }
})
@@ -840,7 +853,7 @@ export const convertToGroup = function (elem) {
* @function module:selected-elem.SvgCanvas#ungroupSelectedElement
* @returns {void}
*/
export const ungroupSelectedElement = function () {
const ungroupSelectedElement = () => {
const selectedElements = svgCanvas.getSelectedElements()
const dataStorage = svgCanvas.getDataStorage()
let g = selectedElements[0]
@@ -915,22 +928,22 @@ export const ungroupSelectedElement = function () {
* @fires module:svgcanvas.SvgCanvas#event:ext_canvasUpdated
* @returns {module:svgcanvas.CanvasInfo}
*/
export const updateCanvas = function (w, h) {
const updateCanvas = (w, h) => {
svgCanvas.getSvgRoot().setAttribute('width', w)
svgCanvas.getSvgRoot().setAttribute('height', h)
const zoom = svgCanvas.getZoom()
const bg = document.getElementById('canvasBackground')
const oldX = Number(svgCanvas.getSvgContent().getAttribute('x'))
const oldY = Number(svgCanvas.getSvgContent().getAttribute('y'))
const x = ((w - this.contentW * zoom) / 2)
const y = ((h - this.contentH * zoom) / 2)
const x = ((w - svgCanvas.contentW * zoom) / 2)
const y = ((h - svgCanvas.contentH * zoom) / 2)
assignAttributes(svgCanvas.getSvgContent(), {
width: this.contentW * zoom,
height: this.contentH * zoom,
width: svgCanvas.contentW * zoom,
height: svgCanvas.contentH * zoom,
x,
y,
viewBox: '0 0 ' + this.contentW + ' ' + this.contentH
viewBox: '0 0 ' + svgCanvas.contentW + ' ' + svgCanvas.contentH
})
assignAttributes(bg, {
@@ -977,7 +990,7 @@ export const updateCanvas = function (w, h) {
* @fires module:svgcanvas.SvgCanvas#event:selected
* @returns {void}
*/
export const cycleElement = function (next) {
const cycleElement = (next) => {
const selectedElements = svgCanvas.getSelectedElements()
const currentGroup = svgCanvas.getCurrentGroup()
let num
@@ -985,7 +998,7 @@ export const cycleElement = function (next) {
let elem = false
const allElems = getVisibleElements(currentGroup || svgCanvas.getCurrentDrawing().getCurrentLayer())
if (!allElems.length) { return }
if (isNullish(curElem)) {
if (!curElem) {
num = next ? allElems.length - 1 : 0
elem = allElems[num]
} else {