|
|
|
|
@@ -6,37 +6,36 @@
|
|
|
|
|
* @copyright 2010 Christian Tzurcanu, 2010 Alexis Deveria
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
const name = "shapes";
|
|
|
|
|
const name = 'shapes'
|
|
|
|
|
|
|
|
|
|
const loadExtensionTranslation = async function (svgEditor) {
|
|
|
|
|
let translationModule;
|
|
|
|
|
const lang = svgEditor.configObj.pref('lang');
|
|
|
|
|
let translationModule
|
|
|
|
|
const lang = svgEditor.configObj.pref('lang')
|
|
|
|
|
try {
|
|
|
|
|
// eslint-disable-next-line no-unsanitized/method
|
|
|
|
|
translationModule = await import(`./locale/${lang}.js`);
|
|
|
|
|
translationModule = await import(`./locale/${lang}.js`)
|
|
|
|
|
} catch (_error) {
|
|
|
|
|
console.warn(`Missing translation (${lang}) for ${name} - using 'en'`);
|
|
|
|
|
translationModule = await import(`./locale/en.js`);
|
|
|
|
|
console.warn(`Missing translation (${lang}) for ${name} - using 'en'`)
|
|
|
|
|
translationModule = await import('./locale/en.js')
|
|
|
|
|
}
|
|
|
|
|
svgEditor.i18next.addResourceBundle(lang, name, translationModule.default);
|
|
|
|
|
};
|
|
|
|
|
svgEditor.i18next.addResourceBundle(lang, name, translationModule.default)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
name,
|
|
|
|
|
async init () {
|
|
|
|
|
const svgEditor = this;
|
|
|
|
|
const canv = svgEditor.svgCanvas;
|
|
|
|
|
const { $id } = canv;
|
|
|
|
|
const svgroot = canv.getSvgRoot();
|
|
|
|
|
let lastBBox = {};
|
|
|
|
|
await loadExtensionTranslation(svgEditor);
|
|
|
|
|
const svgEditor = this
|
|
|
|
|
const canv = svgEditor.svgCanvas
|
|
|
|
|
const { $id } = canv
|
|
|
|
|
const svgroot = canv.getSvgRoot()
|
|
|
|
|
let lastBBox = {}
|
|
|
|
|
await loadExtensionTranslation(svgEditor)
|
|
|
|
|
|
|
|
|
|
const modeId = 'shapelib';
|
|
|
|
|
const startClientPos = {};
|
|
|
|
|
const modeId = 'shapelib'
|
|
|
|
|
const startClientPos = {}
|
|
|
|
|
|
|
|
|
|
let curShape;
|
|
|
|
|
let startX;
|
|
|
|
|
let startY;
|
|
|
|
|
let curShape
|
|
|
|
|
let startX
|
|
|
|
|
let startY
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
callback () {
|
|
|
|
|
@@ -44,28 +43,28 @@ export default {
|
|
|
|
|
const buttonTemplate = `
|
|
|
|
|
<se-explorerbutton id="tool_shapelib" title="${svgEditor.i18next.t(`${name}:buttons.0.title`)}" lib="./extensions/ext-shapes/shapelib/"
|
|
|
|
|
src="shapelib.svg"></se-explorerbutton>
|
|
|
|
|
`;
|
|
|
|
|
canv.insertChildAtIndex($id('tools_left'), buttonTemplate, 9);
|
|
|
|
|
$id('tool_shapelib').addEventListener("click", () => {
|
|
|
|
|
if (this.leftPanel.updateLeftPanel("tool_shapelib")) {
|
|
|
|
|
canv.setMode(modeId);
|
|
|
|
|
`
|
|
|
|
|
canv.insertChildAtIndex($id('tools_left'), buttonTemplate, 9)
|
|
|
|
|
$id('tool_shapelib').addEventListener('click', () => {
|
|
|
|
|
if (this.leftPanel.updateLeftPanel('tool_shapelib')) {
|
|
|
|
|
canv.setMode(modeId)
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
mouseDown (opts) {
|
|
|
|
|
const mode = canv.getMode();
|
|
|
|
|
if (mode !== modeId) { return undefined; }
|
|
|
|
|
const mode = canv.getMode()
|
|
|
|
|
if (mode !== modeId) { return undefined }
|
|
|
|
|
|
|
|
|
|
const currentD = document.getElementById('tool_shapelib').dataset.draw;
|
|
|
|
|
startX = opts.start_x;
|
|
|
|
|
const x = startX;
|
|
|
|
|
startY = opts.start_y;
|
|
|
|
|
const y = startY;
|
|
|
|
|
const curStyle = canv.getStyle();
|
|
|
|
|
const currentD = document.getElementById('tool_shapelib').dataset.draw
|
|
|
|
|
startX = opts.start_x
|
|
|
|
|
const x = startX
|
|
|
|
|
startY = opts.start_y
|
|
|
|
|
const y = startY
|
|
|
|
|
const curStyle = canv.getStyle()
|
|
|
|
|
|
|
|
|
|
startClientPos.x = opts.event.clientX;
|
|
|
|
|
startClientPos.y = opts.event.clientY;
|
|
|
|
|
startClientPos.x = opts.event.clientX
|
|
|
|
|
startClientPos.y = opts.event.clientY
|
|
|
|
|
|
|
|
|
|
curShape = canv.addSVGElemensFromJson({
|
|
|
|
|
element: 'path',
|
|
|
|
|
@@ -76,87 +75,87 @@ export default {
|
|
|
|
|
opacity: curStyle.opacity / 2,
|
|
|
|
|
style: 'pointer-events:none'
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
curShape.setAttribute('transform', 'translate(' + x + ',' + y + ') scale(0.005) translate(' + -x + ',' + -y + ')');
|
|
|
|
|
curShape.setAttribute('transform', 'translate(' + x + ',' + y + ') scale(0.005) translate(' + -x + ',' + -y + ')')
|
|
|
|
|
|
|
|
|
|
canv.recalculateDimensions(curShape);
|
|
|
|
|
canv.recalculateDimensions(curShape)
|
|
|
|
|
|
|
|
|
|
lastBBox = curShape.getBBox();
|
|
|
|
|
lastBBox = curShape.getBBox()
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
started: true
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
mouseMove (opts) {
|
|
|
|
|
const mode = canv.getMode();
|
|
|
|
|
if (mode !== modeId) { return; }
|
|
|
|
|
const mode = canv.getMode()
|
|
|
|
|
if (mode !== modeId) { return }
|
|
|
|
|
|
|
|
|
|
const zoom = canv.getZoom();
|
|
|
|
|
const evt = opts.event;
|
|
|
|
|
const zoom = canv.getZoom()
|
|
|
|
|
const evt = opts.event
|
|
|
|
|
|
|
|
|
|
const x = opts.mouse_x / zoom;
|
|
|
|
|
const y = opts.mouse_y / zoom;
|
|
|
|
|
const x = opts.mouse_x / zoom
|
|
|
|
|
const y = opts.mouse_y / zoom
|
|
|
|
|
|
|
|
|
|
const tlist = curShape.transform.baseVal;
|
|
|
|
|
const box = curShape.getBBox();
|
|
|
|
|
const left = box.x; const top = box.y;
|
|
|
|
|
const tlist = curShape.transform.baseVal
|
|
|
|
|
const box = curShape.getBBox()
|
|
|
|
|
const left = box.x; const top = box.y
|
|
|
|
|
|
|
|
|
|
const newbox = {
|
|
|
|
|
x: Math.min(startX, x),
|
|
|
|
|
y: Math.min(startY, y),
|
|
|
|
|
width: Math.abs(x - startX),
|
|
|
|
|
height: Math.abs(y - startY)
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let sx = (newbox.width / lastBBox.width) || 1;
|
|
|
|
|
let sy = (newbox.height / lastBBox.height) || 1;
|
|
|
|
|
let sx = (newbox.width / lastBBox.width) || 1
|
|
|
|
|
let sy = (newbox.height / lastBBox.height) || 1
|
|
|
|
|
|
|
|
|
|
// Not perfect, but mostly works...
|
|
|
|
|
let tx = 0;
|
|
|
|
|
let tx = 0
|
|
|
|
|
if (x < startX) {
|
|
|
|
|
tx = lastBBox.width;
|
|
|
|
|
tx = lastBBox.width
|
|
|
|
|
}
|
|
|
|
|
let ty = 0;
|
|
|
|
|
let ty = 0
|
|
|
|
|
if (y < startY) {
|
|
|
|
|
ty = lastBBox.height;
|
|
|
|
|
ty = lastBBox.height
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// update the transform list with translate,scale,translate
|
|
|
|
|
const translateOrigin = svgroot.createSVGTransform();
|
|
|
|
|
const scale = svgroot.createSVGTransform();
|
|
|
|
|
const translateBack = svgroot.createSVGTransform();
|
|
|
|
|
const translateOrigin = svgroot.createSVGTransform()
|
|
|
|
|
const scale = svgroot.createSVGTransform()
|
|
|
|
|
const translateBack = svgroot.createSVGTransform()
|
|
|
|
|
|
|
|
|
|
translateOrigin.setTranslate(-(left + tx), -(top + ty));
|
|
|
|
|
translateOrigin.setTranslate(-(left + tx), -(top + ty))
|
|
|
|
|
if (!evt.shiftKey) {
|
|
|
|
|
const max = Math.min(Math.abs(sx), Math.abs(sy));
|
|
|
|
|
const max = Math.min(Math.abs(sx), Math.abs(sy))
|
|
|
|
|
|
|
|
|
|
sx = max * (sx < 0 ? -1 : 1);
|
|
|
|
|
sy = max * (sy < 0 ? -1 : 1);
|
|
|
|
|
sx = max * (sx < 0 ? -1 : 1)
|
|
|
|
|
sy = max * (sy < 0 ? -1 : 1)
|
|
|
|
|
}
|
|
|
|
|
scale.setScale(sx, sy);
|
|
|
|
|
scale.setScale(sx, sy)
|
|
|
|
|
|
|
|
|
|
translateBack.setTranslate(left + tx, top + ty);
|
|
|
|
|
tlist.appendItem(translateBack);
|
|
|
|
|
tlist.appendItem(scale);
|
|
|
|
|
tlist.appendItem(translateOrigin);
|
|
|
|
|
translateBack.setTranslate(left + tx, top + ty)
|
|
|
|
|
tlist.appendItem(translateBack)
|
|
|
|
|
tlist.appendItem(scale)
|
|
|
|
|
tlist.appendItem(translateOrigin)
|
|
|
|
|
|
|
|
|
|
canv.recalculateDimensions(curShape);
|
|
|
|
|
canv.recalculateDimensions(curShape)
|
|
|
|
|
|
|
|
|
|
lastBBox = curShape.getBBox();
|
|
|
|
|
lastBBox = curShape.getBBox()
|
|
|
|
|
},
|
|
|
|
|
mouseUp (opts) {
|
|
|
|
|
const mode = canv.getMode();
|
|
|
|
|
if (mode !== modeId) { return undefined; }
|
|
|
|
|
const mode = canv.getMode()
|
|
|
|
|
if (mode !== modeId) { return undefined }
|
|
|
|
|
|
|
|
|
|
const keepObject = (opts.event.clientX !== startClientPos.x && opts.event.clientY !== startClientPos.y);
|
|
|
|
|
const keepObject = (opts.event.clientX !== startClientPos.x && opts.event.clientY !== startClientPos.y)
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
keep: keepObject,
|
|
|
|
|
element: curShape,
|
|
|
|
|
started: false
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|