ce76bb8018
- 删除 design1 ui 遗留代码,修复加载竞态与新建不弹保存提示 - cloud-files 归一化旧版 .soon,IndexedDB 写入完成后再跳转设计页 - 模板/本地 .soon 首次保存须另存为,离开前统一确认 - 发版缓存 bust(version.js、soon-cache.js)及宝塔 Nginx 配置文档 Co-authored-by: Cursor <cursoragent@cursor.com>
2422 lines
83 KiB
JavaScript
2422 lines
83 KiB
JavaScript
// 移至上层和移至下层的事件处理在下方(第 2179 行),避免重复绑定
|
|
|
|
var _keyctrl = false,
|
|
_keyc = false,
|
|
_textEdit = false,
|
|
_inputEdit = false;
|
|
$('input').focus(function () {
|
|
_inputEdit = true;
|
|
});
|
|
$('input').blur(function () {
|
|
_inputEdit = false;
|
|
});
|
|
$('textarea').focus(function () {
|
|
_inputEdit = true;
|
|
});
|
|
$('textarea').blur(function () {
|
|
_inputEdit = false;
|
|
});
|
|
$("body").keyup(function (event) {
|
|
// 兼容三端�?modifier key 检测(Windows/Linux: Ctrl, Mac: Cmd/Meta�?
|
|
if (event.keyCode == 17 || event.keyCode == 91 || event.keyCode == 93) { // Ctrl 键或 Meta 键(Mac Cmd)释�?
|
|
_keyctrl = false;
|
|
};
|
|
if (event.keyCode == 67) {
|
|
_keyc = false;
|
|
};
|
|
})
|
|
$("body").keydown(function (event) {
|
|
// 统一的快捷键处理(兼�?Windows/Linux: Ctrl, Mac: Cmd/Meta�?
|
|
const isModifierKey = event.ctrlKey || event.metaKey; // 兼容三端
|
|
|
|
// 快捷键处理(在输入框或文本区域中时不触发,除了删除相关的�?
|
|
if (!_inputEdit && !_textEdit) {
|
|
// CTRL/CMD+N - 新建
|
|
if (isModifierKey && event.keyCode == 78) {
|
|
event.preventDefault();
|
|
$("#new").click();
|
|
return;
|
|
}
|
|
// CTRL/CMD+O - 打开
|
|
if (isModifierKey && event.keyCode == 79) {
|
|
event.preventDefault();
|
|
$("#open").click();
|
|
return;
|
|
}
|
|
// CTRL/CMD+S - 保存
|
|
if (isModifierKey && !event.shiftKey && event.keyCode == 83) {
|
|
event.preventDefault();
|
|
$("#save").click();
|
|
return;
|
|
}
|
|
// CTRL/CMD+SHIFT+S - 保存副本
|
|
if (isModifierKey && event.shiftKey && event.keyCode == 83) {
|
|
event.preventDefault();
|
|
if (typeof window.output === 'function') {
|
|
window.output(null, saveAs);
|
|
}
|
|
return;
|
|
}
|
|
// CTRL/CMD+Z - 还原
|
|
if (isModifierKey && !event.shiftKey && event.keyCode == 90) {
|
|
event.preventDefault();
|
|
$("#previous").click();
|
|
return;
|
|
}
|
|
// CTRL/CMD+Y - 重做
|
|
if (isModifierKey && !event.shiftKey && event.keyCode == 89) {
|
|
event.preventDefault();
|
|
$("#next").click();
|
|
return;
|
|
}
|
|
// CTRL/CMD+C - 复制
|
|
if (isModifierKey && event.keyCode == 67 && event.target.nodeName == 'BODY') {
|
|
event.preventDefault();
|
|
window.copySelection();
|
|
return;
|
|
}
|
|
// CTRL/CMD+V - 粘贴
|
|
if (isModifierKey && event.keyCode == 86 && event.target.nodeName == 'BODY') {
|
|
event.preventDefault();
|
|
window.pasteFromClipboard();
|
|
return;
|
|
}
|
|
|
|
// CTRL/CMD + SHIFT + DEL (Windows) �?CMD + SHIFT + Backspace (Mac) - 清空
|
|
if (isModifierKey && event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) {
|
|
event.preventDefault();
|
|
$("#clean").click();
|
|
return;
|
|
}
|
|
|
|
// CTRL/CMD + DEL (Windows) �?CMD + Backspace (Mac) - 删除
|
|
if (isModifierKey && !event.shiftKey && (event.keyCode == 46 || event.keyCode == 8)) {
|
|
event.preventDefault();
|
|
$("#delete").click();
|
|
return;
|
|
}
|
|
|
|
}
|
|
// 兼容三端�?modifier key 检测(Windows/Linux: Ctrl, Mac: Cmd/Meta�?
|
|
if (event.keyCode == 17 || event.metaKey) { // Ctrl 键或 Meta 键(Mac Cmd�?
|
|
_keyctrl = true;
|
|
if (_keyc && _textEdit) {
|
|
//同时按下且在编辑状�?
|
|
setTimeout("clipboard.writeText( (clipboard.readText()+' ') );", 1)
|
|
}
|
|
}
|
|
if (event.keyCode == 67) {
|
|
_keyc = true;
|
|
if (_keyctrl & _textEdit) {
|
|
//同时按下且在编辑状�?
|
|
setTimeout("clipboard.writeText( (clipboard.readText()+' ') );", 1)
|
|
}
|
|
}
|
|
if (event.keyCode == 37) {
|
|
//left
|
|
let v = -1;
|
|
if (_keyctrl || event.ctrlKey || event.metaKey) {
|
|
v = -5;
|
|
}
|
|
const currentCanvas = window.canvas || canvas;
|
|
if (currentCanvas && currentCanvas.getActiveObject()) {
|
|
let x = currentCanvas.getActiveObject().get('left');
|
|
x += v;
|
|
currentCanvas.getActiveObject().set('left', x);
|
|
currentCanvas.renderAll();
|
|
if (typeof window.recordState === 'function') {
|
|
window.recordState();
|
|
} else if (typeof recordState === 'function') {
|
|
recordState();
|
|
}
|
|
if (typeof updateControls === 'function') {
|
|
updateControls();
|
|
}
|
|
}
|
|
}
|
|
if (event.keyCode == 38) {
|
|
//up
|
|
let v = -1;
|
|
if (_keyctrl || event.ctrlKey || event.metaKey) {
|
|
v = -5;
|
|
}
|
|
const currentCanvas = window.canvas || canvas;
|
|
if (currentCanvas && currentCanvas.getActiveObject()) {
|
|
let y = currentCanvas.getActiveObject().get('top');
|
|
y += v;
|
|
currentCanvas.getActiveObject().set('top', y);
|
|
currentCanvas.renderAll();
|
|
if (typeof window.recordState === 'function') {
|
|
window.recordState();
|
|
} else if (typeof recordState === 'function') {
|
|
recordState();
|
|
}
|
|
if (typeof updateControls === 'function') {
|
|
updateControls();
|
|
}
|
|
}
|
|
}
|
|
if (event.keyCode == 39) {
|
|
//right
|
|
let v = 1;
|
|
if (_keyctrl || event.ctrlKey || event.metaKey) {
|
|
v = 5;
|
|
}
|
|
const currentCanvas = window.canvas || canvas;
|
|
if (currentCanvas && currentCanvas.getActiveObject()) {
|
|
let x = currentCanvas.getActiveObject().get('left');
|
|
x += v;
|
|
currentCanvas.getActiveObject().set('left', x);
|
|
currentCanvas.renderAll();
|
|
if (typeof window.recordState === 'function') {
|
|
window.recordState();
|
|
} else if (typeof recordState === 'function') {
|
|
recordState();
|
|
}
|
|
if (typeof updateControls === 'function') {
|
|
updateControls();
|
|
}
|
|
}
|
|
}
|
|
if (event.keyCode == 40) {
|
|
//down
|
|
let v = 1;
|
|
if (_keyctrl || event.ctrlKey || event.metaKey) {
|
|
v = 5;
|
|
}
|
|
const currentCanvas = window.canvas || canvas;
|
|
if (currentCanvas && currentCanvas.getActiveObject()) {
|
|
let y = currentCanvas.getActiveObject().get('top');
|
|
y += v;
|
|
currentCanvas.getActiveObject().set('top', y);
|
|
currentCanvas.renderAll();
|
|
if (typeof window.recordState === 'function') {
|
|
window.recordState();
|
|
} else if (typeof recordState === 'function') {
|
|
recordState();
|
|
}
|
|
if (typeof updateControls === 'function') {
|
|
updateControls();
|
|
}
|
|
}
|
|
}
|
|
// 普通删除键(DEL键,没有按CTRL/CMD�?
|
|
if (event.keyCode == 46 && !isModifierKey && !_inputEdit && !_textEdit) {
|
|
// 使用 window.canvas 作为后备,确保在 eval() 加载 .jsc 时也能访问
|
|
const currentCanvas = window.canvas || canvas;
|
|
const currentObjs = window.objs || objs;
|
|
if (!currentCanvas) {
|
|
return;
|
|
}
|
|
let actObjs = currentCanvas.getActiveObjects();
|
|
let allObjs = currentCanvas.getObjects();
|
|
let flag = 0;
|
|
for (let item of actObjs) {
|
|
if (item != allObjs[0]) {
|
|
let i = getIndex(item, currentCanvas);//0是背景,所以从1开始,但objs不包含背景图片,故要-1
|
|
currentObjs.splice(i - 1, 1);
|
|
currentCanvas.remove(item);
|
|
flag = 1;
|
|
|
|
}
|
|
}
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
currentCanvas.discardActiveObject();
|
|
if (flag == 1) {
|
|
if (typeof window.recordState === 'function') {
|
|
window.recordState();
|
|
} else if (typeof recordState === 'function') {
|
|
recordState();
|
|
}
|
|
currentCanvas.renderAll();
|
|
if (typeof window.handleObjectSelected === 'function') {
|
|
window.handleObjectSelected();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
// pre_add_image 已在 design1.js 中定义为全局变量
|
|
$("#addPic").click(function () {
|
|
OpenDialog();
|
|
function OpenDialog() {
|
|
var dialogApi = (typeof dialog !== 'undefined' && dialog) ? dialog : (window.platformBridge && window.platformBridge.showOpenDialog ? { showOpenDialog: function(opts) { return window.platformBridge.showOpenDialog(opts); } } : null);
|
|
if (!dialogApi) return;
|
|
dialogApi.showOpenDialog({
|
|
title: language_str("selectPic"),
|
|
buttonLabel: language_str("comf"),
|
|
filters: [{ name: 'Image File Type', extensions: ['png', 'jpg', 'jpeg'] }]
|
|
}).then(function(result) {
|
|
if (result.canceled) return;
|
|
var url = (result.files && result.files[0]) ? URL.createObjectURL(result.files[0]) : (result.filePaths && result.filePaths[0]);
|
|
if (!url) return;
|
|
fabric.Image.fromURL(url, function (image) {
|
|
//image.left = pointer.x;
|
|
image.setSrc(image.toDataURL(), function (image) {
|
|
pre_add_image = image;
|
|
background_image.hoverCursor = "crosshair";
|
|
$(this).css("background-color", "#646E76");
|
|
|
|
$("#addOutPic").css("background-color", "");
|
|
$("#addText").css("background-color", "");
|
|
$("#addCircleText").css("background-color", "");
|
|
$("#addOutText").css("background-color", "");
|
|
$("#addRect").css("background-color", "");
|
|
$("#addCircle").css("background-color", "");
|
|
$("#addLine").css("background-color", "");
|
|
$("#addQrCode").css("background-color", "");
|
|
$("#addBarCode").css("background-color", "");
|
|
$("#addCounter").css("background-color", "");
|
|
addState = 1;
|
|
});
|
|
//canvas.add(image);
|
|
});
|
|
}).catch(err => {
|
|
})
|
|
}
|
|
});
|
|
$("#addOutPic").click(function () {
|
|
background_image.hoverCursor = "crosshair";
|
|
$(this).css("background-color", "#646E76");
|
|
|
|
$("#addPic").css("background-color", "");
|
|
$("#addText").css("background-color", "");
|
|
$("#addCircleText").css("background-color", "");
|
|
$("#addOutText").css("background-color", "");
|
|
$("#addRect").css("background-color", "");
|
|
$("#addCircle").css("background-color", "");
|
|
$("#addLine").css("background-color", "");
|
|
$("#addQrCode").css("background-color", "");
|
|
$("#addBarCode").css("background-color", "");
|
|
$("#addCounter").css("background-color", "");
|
|
addState = 2;
|
|
});
|
|
$("#addText").click(function () {
|
|
background_image.hoverCursor = "crosshair";
|
|
$(this).css("background-color", "#646E76");
|
|
|
|
$("#addPic").css("background-color", "");
|
|
$("#addOutPic").css("background-color", "");
|
|
$("#addCircleText").css("background-color", "");
|
|
$("#addOutText").css("background-color", "");
|
|
$("#addRect").css("background-color", "");
|
|
$("#addCircle").css("background-color", "");
|
|
$("#addLine").css("background-color", "");
|
|
$("#addQrCode").css("background-color", "");
|
|
$("#addBarCode").css("background-color", "");
|
|
$("#addCounter").css("background-color", "");
|
|
addState = 3;
|
|
});
|
|
|
|
$("#addCircleText").click(function () {
|
|
background_image.hoverCursor = "crosshair";
|
|
$(this).css("background-color", "#646E76");
|
|
|
|
$("#addPic").css("background-color", "");
|
|
$("#addOutPic").css("background-color", "");
|
|
$("#addText").css("background-color", "");
|
|
$("#addOutText").css("background-color", "");
|
|
$("#addRect").css("background-color", "");
|
|
$("#addCircle").css("background-color", "");
|
|
$("#addLine").css("background-color", "");
|
|
$("#addQrCode").css("background-color", "");
|
|
$("#addBarCode").css("background-color", "");
|
|
$("#addCounter").css("background-color", "");
|
|
addState = 11;
|
|
});
|
|
$("#addOutText").click(function () {
|
|
background_image.hoverCursor = "crosshair";
|
|
$(this).css("background-color", "#646E76");
|
|
|
|
$("#addPic").css("background-color", "");
|
|
$("#addOutPic").css("background-color", "");
|
|
$("#addText").css("background-color", "");
|
|
$("#addCircleText").css("background-color", "");
|
|
$("#addRect").css("background-color", "");
|
|
$("#addCircle").css("background-color", "");
|
|
$("#addLine").css("background-color", "");
|
|
$("#addQrCode").css("background-color", "");
|
|
$("#addBarCode").css("background-color", "");
|
|
$("#addCounter").css("background-color", "");
|
|
addState = 4;
|
|
});
|
|
$("#addRect").click(function () {
|
|
background_image.hoverCursor = "crosshair";
|
|
$(this).css("background-color", "#646E76");
|
|
|
|
$("#addPic").css("background-color", "");
|
|
$("#addOutPic").css("background-color", "");
|
|
$("#addText").css("background-color", "");
|
|
$("#addCircleText").css("background-color", "");
|
|
$("#addOutText").css("background-color", "");
|
|
$("#addCircle").css("background-color", "");
|
|
$("#addLine").css("background-color", "");
|
|
$("#addQrCode").css("background-color", "");
|
|
$("#addBarCode").css("background-color", "");
|
|
$("#addCounter").css("background-color", "");
|
|
addState = 5;
|
|
});
|
|
$("#addCircle").click(function () {
|
|
background_image.hoverCursor = "crosshair";
|
|
$(this).css("background-color", "#646E76");
|
|
|
|
$("#addPic").css("background-color", "");
|
|
$("#addOutPic").css("background-color", "");
|
|
$("#addText").css("background-color", "");
|
|
$("#addCircleText").css("background-color", "");
|
|
$("#addOutText").css("background-color", "");
|
|
$("#addRect").css("background-color", "");
|
|
$("#addLine").css("background-color", "");
|
|
$("#addQrCode").css("background-color", "");
|
|
$("#addBarCode").css("background-color", "");
|
|
$("#addCounter").css("background-color", "");
|
|
addState = 6;
|
|
});
|
|
$("#addLine").click(function () {
|
|
background_image.hoverCursor = "crosshair";
|
|
$(this).css("background-color", "#646E76");
|
|
|
|
$("#addPic").css("background-color", "");
|
|
$("#addOutPic").css("background-color", "");
|
|
$("#addText").css("background-color", "");
|
|
$("#addCircleText").css("background-color", "");
|
|
$("#addOutText").css("background-color", "");
|
|
$("#addRect").css("background-color", "");
|
|
$("#addCircle").css("background-color", "");
|
|
$("#addQrCode").css("background-color", "");
|
|
$("#addBarCode").css("background-color", "");
|
|
$("#addCounter").css("background-color", "");
|
|
addState = 7;
|
|
});
|
|
$("#addQrCode").click(function () {
|
|
background_image.hoverCursor = "crosshair";
|
|
$(this).css("background-color", "#646E76");
|
|
|
|
$("#addPic").css("background-color", "");
|
|
$("#addOutPic").css("background-color", "");
|
|
$("#addText").css("background-color", "");
|
|
$("#addCircleText").css("background-color", "");
|
|
$("#addOutText").css("background-color", "");
|
|
$("#addRect").css("background-color", "");
|
|
$("#addCircle").css("background-color", "");
|
|
$("#addLine").css("background-color", "");
|
|
$("#addBarCode").css("background-color", "");
|
|
$("#addCounter").css("background-color", "");
|
|
addState = 8;
|
|
});
|
|
$("#addBarCode").click(function () {
|
|
background_image.hoverCursor = "crosshair";
|
|
$(this).css("background-color", "#646E76");
|
|
|
|
$("#addPic").css("background-color", "");
|
|
$("#addOutPic").css("background-color", "");
|
|
$("#addText").css("background-color", "");
|
|
$("#addCircleText").css("background-color", "");
|
|
$("#addOutText").css("background-color", "");
|
|
$("#addRect").css("background-color", "");
|
|
$("#addCircle").css("background-color", "");
|
|
$("#addLine").css("background-color", "");
|
|
$("#addQrCode").css("background-color", "");
|
|
$("#addCounter").css("background-color", "");
|
|
addState = 9;
|
|
});
|
|
$("#addCounter").click(function () {
|
|
background_image.hoverCursor = "crosshair";
|
|
$(this).css("background-color", "#646E76");
|
|
|
|
$("#addPic").css("background-color", "");
|
|
$("#addOutPic").css("background-color", "");
|
|
$("#addText").css("background-color", "");
|
|
$("#addCircleText").css("background-color", "");
|
|
$("#addOutText").css("background-color", "");
|
|
$("#addRect").css("background-color", "");
|
|
$("#addCircle").css("background-color", "");
|
|
$("#addLine").css("background-color", "");
|
|
$("#addQrCode").css("background-color", "");
|
|
$("#addBarCode").css("background-color", "");
|
|
addState = 10;
|
|
});
|
|
$("#version_change").click(function () {
|
|
if (bg_version == 1) {
|
|
bg_version = 2;
|
|
} else {
|
|
bg_version = 1;
|
|
}
|
|
// 类型改变
|
|
$("#source_front").attr("src", soonAsset("front_bg") + bg_version + "_1.png");
|
|
canvas.renderAll();
|
|
|
|
});
|
|
$("#front_side").click(function () {
|
|
$(this).addClass("ui-button-active");
|
|
$("#back_side").removeClass("ui-button-active");
|
|
$(".canvas-container:eq(0)").show();
|
|
$(".canvas-container:eq(1)").hide();
|
|
canvas = canvas1;
|
|
objs = objs1;
|
|
background_image = background_image1;
|
|
window.canvas = canvas;
|
|
window.objs = objs;
|
|
window.background_image = background_image;
|
|
next_objs = next_objs1;
|
|
pre_objs = pre_objs1;
|
|
next_json = next_json1;
|
|
pre_json = pre_json1;
|
|
recordObjs = recordObjs1;
|
|
recordJson = recordJson1;
|
|
step = step1;
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
|
|
$("#line_control").hide();
|
|
$("#base_control").hide();
|
|
$("#pic_control").hide();
|
|
$("#out_pic_control").hide();
|
|
$("#text_control").hide();
|
|
$("#circle_text_control").hide();
|
|
$("#out_text_control").hide();
|
|
$("#rect_control").hide();
|
|
$("#circle_control").hide();
|
|
$("#counter_control").hide();
|
|
$("#qrcode_Controll").hide();
|
|
$("#barcode_controll").hide();
|
|
$("#component_type").text(language_str("bg"));//背景
|
|
});
|
|
$("#back_side").click(function () {
|
|
$(this).addClass("ui-button-active");
|
|
$("#front_side").removeClass("ui-button-active");
|
|
$(".canvas-container:eq(0)").hide();
|
|
$(".canvas-container:eq(1)").show();
|
|
canvas = canvas2;
|
|
objs = objs2;
|
|
background_image = background_image2;
|
|
window.canvas = canvas;
|
|
window.objs = objs;
|
|
window.background_image = background_image;
|
|
next_objs = next_objs2;
|
|
pre_objs = pre_objs2;
|
|
next_json = next_json2;
|
|
pre_json = pre_json2;
|
|
recordObjs = recordObjs2;
|
|
recordJson = recordJson2;
|
|
step = step2;
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
$("#line_control").hide();
|
|
$("#base_control").hide();
|
|
$("#pic_control").hide();
|
|
$("#out_pic_control").hide();
|
|
$("#text_control").hide();
|
|
$("#circle_text_control").hide();
|
|
$("#out_text_control").hide();
|
|
$("#rect_control").hide();
|
|
$("#circle_control").hide();
|
|
$("#counter_control").hide();
|
|
$("#qrcode_Controll").hide();
|
|
$("#barcode_controll").hide();
|
|
$("#component_type").text(language_str("bg"));//"背景"
|
|
});
|
|
$("#top_alignment").click(function () {
|
|
let _objs = canvas.getActiveObjects();
|
|
if (_objs.length == 1) {
|
|
//只选中了一�?
|
|
let obj = _objs[0];
|
|
obj.setCoords();
|
|
let coords = obj.getCoords(true);
|
|
let objMinY = getCoordsMinY(coords);
|
|
let bgMinY = getCoordsMinY(background_image.getCoords(true));
|
|
let deltaY = bgMinY - objMinY;
|
|
obj.set("top", obj.get("top") + deltaY);
|
|
obj.setCoords();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
return;
|
|
}
|
|
// 多个对象对齐:找到所有对象边界框的最小Y值
|
|
let minTop = Infinity;
|
|
for (let item of _objs) {
|
|
item.setCoords();
|
|
let coords = item.getCoords(true);
|
|
let itemMinY = getCoordsMinY(coords);
|
|
if (itemMinY < minTop) {
|
|
minTop = itemMinY;
|
|
}
|
|
}
|
|
// 将所有对象对齐到最小Y值
|
|
groupItems = [];
|
|
for (let item of _objs) {
|
|
item.setCoords();
|
|
let coords = item.getCoords(true);
|
|
let itemMinY = getCoordsMinY(coords);
|
|
let deltaY = minTop - itemMinY;
|
|
item.set("top", item.get("top") + deltaY);
|
|
item.setCoords();
|
|
groupItems.push(item);
|
|
}
|
|
canvas.discardActiveObject();
|
|
let sel = new fabric.ActiveSelection(groupItems, {
|
|
canvas: canvas,
|
|
});
|
|
canvas.setActiveObject(sel);
|
|
canvas.requestRenderAll();
|
|
canvas.renderAll();
|
|
|
|
});
|
|
$("#bottom_alignment").click(function () {
|
|
let _objs = canvas.getActiveObjects();
|
|
if (_objs.length == 1) {
|
|
//只选中了一�?
|
|
let idx = getIndex(_objs[0]);
|
|
let type = objs[idx - 1].type;
|
|
let other = 0;//strokeWidth
|
|
if (type == 5 || type == 6 || type == 7) {
|
|
other = _objs[0].get("strokeWidth")
|
|
}
|
|
let obj = _objs[0];
|
|
obj.setCoords();
|
|
let coords = obj.getCoords(true);
|
|
let objMaxY = getCoordsMaxY(coords);
|
|
let bgMaxY = getCoordsMaxY(background_image.getCoords(true));
|
|
let deltaY = bgMaxY - objMaxY;
|
|
obj.set("top", obj.get("top") + deltaY);
|
|
obj.setCoords();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
return;
|
|
}
|
|
// 多个对象对齐:找到所有对象边界框的最大Y值
|
|
let maxBottom = -Infinity;
|
|
for (let item of _objs) {
|
|
item.setCoords();
|
|
let coords = item.getCoords(true);
|
|
let itemMaxY = getCoordsMaxY(coords);
|
|
if (itemMaxY > maxBottom) {
|
|
maxBottom = itemMaxY;
|
|
}
|
|
}
|
|
// 将所有对象对齐到最大Y值
|
|
groupItems = [];
|
|
for (let item of _objs) {
|
|
item.setCoords();
|
|
let coords = item.getCoords(true);
|
|
let itemMaxY = getCoordsMaxY(coords);
|
|
let deltaY = maxBottom - itemMaxY;
|
|
item.set("top", item.get("top") + deltaY);
|
|
item.setCoords();
|
|
groupItems.push(item);
|
|
}
|
|
canvas.discardActiveObject();
|
|
let sel = new fabric.ActiveSelection(groupItems, {
|
|
canvas: canvas,
|
|
});
|
|
canvas.setActiveObject(sel);
|
|
canvas.requestRenderAll();
|
|
canvas.renderAll();
|
|
|
|
});
|
|
$("#center_y_alignment").click(function () {
|
|
let _objs = canvas.getActiveObjects();
|
|
if (_objs.length == 1) {
|
|
//只选中了一�?
|
|
let idx = getIndex(_objs[0]);
|
|
let type = objs[idx - 1].type;
|
|
let other = 0;//strokeWidth
|
|
if (type == 5 || type == 6 || type == 7) {
|
|
other = _objs[0].get("strokeWidth")
|
|
}
|
|
let obj = _objs[0];
|
|
obj.setCoords();
|
|
let coords = obj.getCoords(true);
|
|
let objMinY = getCoordsMinY(coords);
|
|
let objMaxY = getCoordsMaxY(coords);
|
|
let objCenterY = (objMinY + objMaxY) / 2;
|
|
let bgCoords = background_image.getCoords(true);
|
|
let bgMinY = getCoordsMinY(bgCoords);
|
|
let bgMaxY = getCoordsMaxY(bgCoords);
|
|
let bgCenterY = (bgMinY + bgMaxY) / 2;
|
|
let deltaY = bgCenterY - objCenterY;
|
|
obj.set("top", obj.get("top") + deltaY);
|
|
obj.setCoords();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
return;
|
|
}
|
|
// 多个对象对齐:找到所有对象边界框的中心Y值
|
|
let minTop = Infinity;
|
|
let maxBottom = -Infinity;
|
|
for (let item of _objs) {
|
|
item.setCoords();
|
|
let coords = item.getCoords(true);
|
|
let itemMinY = getCoordsMinY(coords);
|
|
let itemMaxY = getCoordsMaxY(coords);
|
|
if (itemMinY < minTop) minTop = itemMinY;
|
|
if (itemMaxY > maxBottom) maxBottom = itemMaxY;
|
|
}
|
|
let groupCenterY = (minTop + maxBottom) / 2;
|
|
// 将所有对象对齐到中心Y值
|
|
groupItems = [];
|
|
for (let item of _objs) {
|
|
item.setCoords();
|
|
let coords = item.getCoords(true);
|
|
let itemMinY = getCoordsMinY(coords);
|
|
let itemMaxY = getCoordsMaxY(coords);
|
|
let itemCenterY = (itemMinY + itemMaxY) / 2;
|
|
let deltaY = groupCenterY - itemCenterY;
|
|
item.set("top", item.get("top") + deltaY);
|
|
item.setCoords();
|
|
groupItems.push(item);
|
|
}
|
|
canvas.discardActiveObject();
|
|
let sel = new fabric.ActiveSelection(groupItems, {
|
|
canvas: canvas,
|
|
});
|
|
canvas.setActiveObject(sel);
|
|
canvas.requestRenderAll();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#left_alignment").click(function () {
|
|
let _objs = canvas.getActiveObjects();
|
|
if (_objs.length == 1) {
|
|
//只选中了一�?
|
|
let obj = _objs[0];
|
|
obj.setCoords();
|
|
let coords = obj.getCoords(true);
|
|
let objMinX = getCoordsMinX(coords);
|
|
let bgMinX = getCoordsMinX(background_image.getCoords(true));
|
|
let deltaX = bgMinX - objMinX;
|
|
obj.set("left", obj.get("left") + deltaX);
|
|
obj.setCoords();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
return;
|
|
}
|
|
// 多个对象对齐:找到所有对象边界框的最小X值
|
|
let minLeft = Infinity;
|
|
for (let item of _objs) {
|
|
item.setCoords();
|
|
let coords = item.getCoords(true);
|
|
let itemMinX = getCoordsMinX(coords);
|
|
if (itemMinX < minLeft) {
|
|
minLeft = itemMinX;
|
|
}
|
|
}
|
|
// 将所有对象对齐到最小X值
|
|
groupItems = [];
|
|
for (let item of _objs) {
|
|
item.setCoords();
|
|
let coords = item.getCoords(true);
|
|
let itemMinX = getCoordsMinX(coords);
|
|
let deltaX = minLeft - itemMinX;
|
|
item.set("left", item.get("left") + deltaX);
|
|
item.setCoords();
|
|
groupItems.push(item);
|
|
}
|
|
canvas.discardActiveObject();
|
|
let sel = new fabric.ActiveSelection(groupItems, {
|
|
canvas: canvas,
|
|
});
|
|
canvas.setActiveObject(sel);
|
|
canvas.requestRenderAll();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#right_alignment").click(function () {
|
|
let _objs = canvas.getActiveObjects();
|
|
if (_objs.length == 1) {
|
|
//只选中了一�?
|
|
let idx = getIndex(_objs[0]);
|
|
let type = objs[idx - 1].type;
|
|
let other = 0;//strokeWidth
|
|
if (type == 5 || type == 6 || type == 7) {
|
|
other = item.get("strokeWidth")
|
|
}
|
|
let obj = _objs[0];
|
|
obj.setCoords();
|
|
let coords = obj.getCoords(true);
|
|
let objMaxX = getCoordsMaxX(coords);
|
|
let bgMaxX = getCoordsMaxX(background_image.getCoords(true));
|
|
let deltaX = bgMaxX - objMaxX;
|
|
obj.set("left", obj.get("left") + deltaX);
|
|
obj.setCoords();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
return;
|
|
}
|
|
// 多个对象对齐:找到所有对象边界框的最大X值
|
|
let maxRight = -Infinity;
|
|
for (let item of _objs) {
|
|
item.setCoords();
|
|
let coords = item.getCoords(true);
|
|
let itemMaxX = getCoordsMaxX(coords);
|
|
if (itemMaxX > maxRight) {
|
|
maxRight = itemMaxX;
|
|
}
|
|
}
|
|
// 将所有对象对齐到最大X值
|
|
let groupItems = [];
|
|
for (let item of _objs) {
|
|
item.setCoords();
|
|
let coords = item.getCoords(true);
|
|
let itemMaxX = getCoordsMaxX(coords);
|
|
let deltaX = maxRight - itemMaxX;
|
|
item.set("left", item.get("left") + deltaX);
|
|
item.setCoords();
|
|
groupItems.push(item);
|
|
}
|
|
//BUG1
|
|
canvas.discardActiveObject();
|
|
let sel = new fabric.ActiveSelection(groupItems, {
|
|
canvas: canvas,
|
|
});
|
|
canvas.setActiveObject(sel);
|
|
canvas.requestRenderAll();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#center_x_alignment").click(function () {
|
|
let _objs = canvas.getActiveObjects();
|
|
if (_objs.length == 1) {
|
|
//只选中了一�?
|
|
let idx = getIndex(_objs[0]);
|
|
let type = objs[idx - 1].type;
|
|
let other = 0;//strokeWidth
|
|
if (type == 5 || type == 6 || type == 7) {
|
|
other = _objs[0].get("strokeWidth")
|
|
}
|
|
let obj = _objs[0];
|
|
obj.setCoords();
|
|
let coords = obj.getCoords(true);
|
|
let objMinX = getCoordsMinX(coords);
|
|
let objMaxX = getCoordsMaxX(coords);
|
|
let objCenterX = (objMinX + objMaxX) / 2;
|
|
let bgCoords = background_image.getCoords(true);
|
|
let bgMinX = getCoordsMinX(bgCoords);
|
|
let bgMaxX = getCoordsMaxX(bgCoords);
|
|
let bgCenterX = (bgMinX + bgMaxX) / 2;
|
|
let deltaX = bgCenterX - objCenterX;
|
|
obj.set("left", obj.get("left") + deltaX);
|
|
obj.setCoords();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
return;
|
|
}
|
|
// 多个对象对齐:找到所有对象边界框的中心X值
|
|
let minLeft = Infinity;
|
|
let maxRight = -Infinity;
|
|
for (let item of _objs) {
|
|
item.setCoords();
|
|
let coords = item.getCoords(true);
|
|
let itemMinX = getCoordsMinX(coords);
|
|
let itemMaxX = getCoordsMaxX(coords);
|
|
if (itemMinX < minLeft) minLeft = itemMinX;
|
|
if (itemMaxX > maxRight) maxRight = itemMaxX;
|
|
}
|
|
let groupCenterX = (minLeft + maxRight) / 2;
|
|
// 将所有对象对齐到中心X值
|
|
groupItems = [];
|
|
for (let item of _objs) {
|
|
item.setCoords();
|
|
let coords = item.getCoords(true);
|
|
let itemMinX = getCoordsMinX(coords);
|
|
let itemMaxX = getCoordsMaxX(coords);
|
|
let itemCenterX = (itemMinX + itemMaxX) / 2;
|
|
let deltaX = groupCenterX - itemCenterX;
|
|
item.set("left", item.get("left") + deltaX);
|
|
item.setCoords();
|
|
groupItems.push(item);
|
|
}
|
|
canvas.discardActiveObject();
|
|
let sel = new fabric.ActiveSelection(groupItems, {
|
|
canvas: canvas,
|
|
});
|
|
canvas.setActiveObject(sel);
|
|
canvas.requestRenderAll();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#up_obj").click(function () {//上移,放到前�?数组中在后面
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if (idx + 1 != canvas.getObjects().length) {
|
|
canvas.bringForward(canvas.getActiveObject());
|
|
canvas.renderAll();
|
|
let temp = objs[idx - 1];
|
|
objs[idx - 1] = objs[idx];
|
|
objs[idx] = temp;
|
|
//console.log(objs);
|
|
|
|
window.recordState();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
if (typeof window.selectObj === 'function') {
|
|
window.selectObj(idx);
|
|
}
|
|
}
|
|
});
|
|
$("#down_obj").click(function () {//下移,放到后�?数组中在前面
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if (idx != 1) {
|
|
canvas.sendBackwards(canvas.getActiveObject());
|
|
canvas.renderAll();
|
|
//[objs[idx-2],objs[idx-1]] = [objs[idx-1],objs[idx-2]];
|
|
|
|
let temp = objs[idx - 1];
|
|
objs[idx - 1] = objs[idx - 2];
|
|
objs[idx - 2] = temp;
|
|
window.recordState();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
if (typeof window.selectObj === 'function') {
|
|
window.selectObj(idx - 2);
|
|
}
|
|
}
|
|
});
|
|
$("#set_bg").click(function () {//设置为背�?
|
|
let obj = canvas.getActiveObject();
|
|
let idx = getIndex(obj);
|
|
const scaleX = 2787 / obj.width
|
|
const scaleY = 2787 / obj.height
|
|
// 使用缩放后的实际尺寸计算位置,确保与初始背景图片位置一致
|
|
const scaledWidth = obj.width * scaleX;
|
|
const scaledHeight = obj.height * scaleY;
|
|
obj.set({
|
|
scaleX: scaleX,
|
|
scaleY: scaleY,
|
|
left: ($('#canvas1').width() - scaledWidth) / 2,
|
|
top: ($('#canvas1').height() - scaledHeight) / 2,
|
|
});
|
|
$('#text_w').val(2787)
|
|
$('#text_h').val(2787)
|
|
$('#text_x').val(0)
|
|
$('#text_y').val(0)
|
|
if (obj.get("selectable")) {
|
|
obj.set("selectable", false);
|
|
$("#lock_img").attr("src", soonAsset("lock20.png"))
|
|
}
|
|
canvas.sendToBack(obj);
|
|
canvas.bringForward(obj);
|
|
canvas.renderAll();
|
|
let objItem = objs.splice(idx - 1, 1)[0]
|
|
objs.unshift(objItem)
|
|
window.recordState();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
if (typeof window.selectObj === 'function') {
|
|
window.selectObj(0);
|
|
}
|
|
});
|
|
|
|
// ==========================================
|
|
// onStateRestored 函数在 core.js 中定义并附加到 window 对象
|
|
// ==========================================
|
|
$("#previous").click(function () {
|
|
// 正在应用历史(撤销/重做)时,直接忽略新的点击,防止并发操作
|
|
if (window._isApplyingHistory) {
|
|
return;
|
|
}
|
|
|
|
if (step.val == 0) return;
|
|
|
|
step.val--;
|
|
|
|
// 判断当前是正面还是背面
|
|
if ($("#front_side").hasClass("ui-button-active")) {
|
|
// 1. 恢复业务数据
|
|
objs1 = JSON.parse(recordObjs1[step.val]);
|
|
objs = objs1;
|
|
|
|
// 2. 恢复画布 (使用回调函数)
|
|
window._isApplyingHistory = true;
|
|
canvas.loadFromJSON(recordJson1[step.val], function () {
|
|
// 加载后解锁所有对象(背景除外)
|
|
if (typeof window.unlockAllObjects === 'function') {
|
|
window.unlockAllObjects(canvas);
|
|
}
|
|
// 重新生成二维码和条码(因为它们需要根据 objs 数据动态生成)
|
|
if (typeof window.regenerateQrCodesAndBarcodes === 'function') {
|
|
window.regenerateQrCodesAndBarcodes(canvas, objs1);
|
|
}
|
|
if (typeof window.onStateRestored === 'function') {
|
|
window.onStateRestored(); // 图片加载完才执行这一行
|
|
}
|
|
window._isApplyingHistory = false;
|
|
});
|
|
} else {
|
|
// 背面逻辑
|
|
objs2 = JSON.parse(recordObjs2[step.val]);
|
|
objs = objs2;
|
|
|
|
window._isApplyingHistory = true;
|
|
canvas.loadFromJSON(recordJson2[step.val], function () {
|
|
// 加载后解锁所有对象(背景除外)
|
|
if (typeof window.unlockAllObjects === 'function') {
|
|
window.unlockAllObjects(canvas);
|
|
}
|
|
// 重新生成二维码和条码(因为它们需要根据 objs 数据动态生成)
|
|
if (typeof window.regenerateQrCodesAndBarcodes === 'function') {
|
|
window.regenerateQrCodesAndBarcodes(canvas, objs2);
|
|
}
|
|
if (typeof window.onStateRestored === 'function') {
|
|
window.onStateRestored();
|
|
}
|
|
window._isApplyingHistory = false;
|
|
});
|
|
}
|
|
});
|
|
// ==========================================
|
|
$("#next").click(function () {
|
|
// 正在应用历史(撤销/重做)时,直接忽略新的点击,防止并发操作
|
|
if (window._isApplyingHistory) {
|
|
return;
|
|
}
|
|
|
|
// 获取当前历史记录的最大长度
|
|
let maxLen = $("#front_side").hasClass("ui-button-active") ? recordObjs1.length : recordObjs2.length;
|
|
|
|
if (step.val >= maxLen - 1) return;
|
|
|
|
step.val++;
|
|
|
|
if ($("#front_side").hasClass("ui-button-active")) {
|
|
objs1 = JSON.parse(recordObjs1[step.val]);
|
|
objs = objs1;
|
|
|
|
window._isApplyingHistory = true;
|
|
canvas.loadFromJSON(recordJson1[step.val], function () {
|
|
// 加载后解锁所有对象(背景除外)
|
|
if (typeof window.unlockAllObjects === 'function') {
|
|
window.unlockAllObjects(canvas);
|
|
}
|
|
// 重新生成二维码和条码(因为它们需要根据 objs 数据动态生成)
|
|
if (typeof window.regenerateQrCodesAndBarcodes === 'function') {
|
|
window.regenerateQrCodesAndBarcodes(canvas, objs1);
|
|
}
|
|
if (typeof window.onStateRestored === 'function') {
|
|
window.onStateRestored(); // 图片加载完才执行这一行
|
|
}
|
|
window._isApplyingHistory = false;
|
|
});
|
|
} else {
|
|
objs2 = JSON.parse(recordObjs2[step.val]);
|
|
objs = objs2;
|
|
|
|
window._isApplyingHistory = true;
|
|
canvas.loadFromJSON(recordJson2[step.val], function () {
|
|
// 加载后解锁所有对象(背景除外)
|
|
if (typeof window.unlockAllObjects === 'function') {
|
|
window.unlockAllObjects(canvas);
|
|
}
|
|
// 重新生成二维码和条码(因为它们需要根据 objs 数据动态生成)
|
|
if (typeof window.regenerateQrCodesAndBarcodes === 'function') {
|
|
window.regenerateQrCodesAndBarcodes(canvas, objs2);
|
|
}
|
|
if (typeof window.onStateRestored === 'function') {
|
|
window.onStateRestored();
|
|
}
|
|
window._isApplyingHistory = false;
|
|
});
|
|
}
|
|
});
|
|
|
|
$("#clean").click(function () {
|
|
objs.splice(0, objs.length);
|
|
|
|
let allObjs = canvas.getObjects();
|
|
for (let item of allObjs) {
|
|
if (item != allObjs[0]) {
|
|
canvas.remove(item);
|
|
}
|
|
}
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
window.recordState();
|
|
});
|
|
$("#rotate").click(function () {
|
|
let obj = canvas.getActiveObject();
|
|
obj.rotate(Math.round((obj.get("angle") + 90) % 360));
|
|
$("#text_r").val(obj.get("angle"));
|
|
canvas.renderAll();
|
|
updateControls();
|
|
window.recordState();
|
|
});
|
|
$('#vertical_obj').click(function () {
|
|
let obj = canvas.getActiveObject();
|
|
obj.set("flipY", !obj.get("flipY"));
|
|
canvas.renderAll();
|
|
updateControls();
|
|
window.recordState();
|
|
});
|
|
$('#align_obj').click(function () {
|
|
let obj = canvas.getActiveObject();
|
|
obj.set("flipX", !obj.get("flipX"));
|
|
canvas.renderAll();
|
|
updateControls();
|
|
window.recordState();
|
|
});
|
|
$("#text_italics").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已�?
|
|
canvas.getActiveObject().set("fontStyle", "normal")
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未�?
|
|
canvas.getActiveObject().set("fontStyle", "italic")
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#text_bold").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已�?恢复正常
|
|
canvas.getActiveObject().set("fontWeight", "normal")
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未�?
|
|
canvas.getActiveObject().set("fontWeight", "bold")
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#text_underline").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已�?
|
|
canvas.getActiveObject().set("underline", false)
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未�?
|
|
canvas.getActiveObject().set("underline", true)
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#text_linethrough").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已�?
|
|
canvas.getActiveObject().set("linethrough", false)
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未�?
|
|
canvas.getActiveObject().set("linethrough", true)
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
|
|
$("#circle_text_italics").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已�?
|
|
canvas.getActiveObject().set("fontStyle", "normal")
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未�?
|
|
canvas.getActiveObject().set("fontStyle", "italic")
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#circle_text_bold").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已�?恢复正常
|
|
canvas.getActiveObject().set("fontWeight", "normal")
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未�?
|
|
canvas.getActiveObject().set("fontWeight", "bold")
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
|
|
$('#out_left_alignment').click(function () {
|
|
$('#out_left_alignment').parent().removeClass('tool1')
|
|
$('#out_right_alignment').parent().removeClass('tool1')
|
|
$('#out_center_alignment').parent().removeClass('tool1')
|
|
setTimeout(() => {
|
|
$('#out_left_alignment').parent().addClass('tool1')
|
|
});
|
|
canvas.getActiveObject().set('textAlign', 'left')
|
|
let idx = getIndex(canvas.getActiveObject())
|
|
objs[idx - 1].align = 'left'
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
})
|
|
$('#out_right_alignment').click(function () {
|
|
$('#out_left_alignment').parent().removeClass('tool1')
|
|
$('#out_right_alignment').parent().removeClass('tool1')
|
|
$('#out_center_alignment').parent().removeClass('tool1')
|
|
setTimeout(() => {
|
|
$('#out_right_alignment').parent().addClass('tool1')
|
|
});
|
|
canvas.getActiveObject().set('textAlign', 'right')
|
|
let idx = getIndex(canvas.getActiveObject())
|
|
objs[idx - 1].align = 'right'
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
})
|
|
$('#out_center_alignment').click(function () {
|
|
$('#out_left_alignment').parent().removeClass('tool1')
|
|
$('#out_right_alignment').parent().removeClass('tool1')
|
|
$('#out_center_alignment').parent().removeClass('tool1')
|
|
setTimeout(() => {
|
|
$('#out_center_alignment').parent().addClass('tool1')
|
|
});
|
|
canvas.getActiveObject().set('textAlign', 'center')
|
|
let idx = getIndex(canvas.getActiveObject())
|
|
objs[idx - 1].align = 'center'
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
})
|
|
|
|
$("#out_text_italics").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已�?
|
|
canvas.getActiveObject().set("fontStyle", "normal")
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未�?
|
|
canvas.getActiveObject().set("fontStyle", "italic")
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#out_text_bold").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已�?恢复正常
|
|
canvas.getActiveObject().set("fontWeight", "normal")
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未�?
|
|
canvas.getActiveObject().set("fontWeight", "bold")
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#out_text_underline").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已�?
|
|
canvas.getActiveObject().set("underline", false)
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未�?
|
|
canvas.getActiveObject().set("underline", true)
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#out_text_linethrough").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已�?
|
|
canvas.getActiveObject().set("linethrough", false)
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未�?
|
|
canvas.getActiveObject().set("linethrough", true)
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#lock").off('click').on('click', function (e) {
|
|
e.stopPropagation();
|
|
if (!canvas.getActiveObject()) return;
|
|
let obj = canvas.getActiveObject();
|
|
// 检查是否已锁定(通过lockMovementX判断,因为锁定时会设置所有lock属性)
|
|
let isLocked = obj.get("lockMovementX") === true;
|
|
let shouldLock = !isLocked;
|
|
|
|
// 锁定/解锁所有编辑操作,但保持选中状态(不取消选中)
|
|
obj.set({
|
|
lockMovementX: shouldLock,
|
|
lockMovementY: shouldLock,
|
|
lockRotation: shouldLock,
|
|
lockScalingX: shouldLock,
|
|
lockScalingY: shouldLock,
|
|
lockSkewingX: shouldLock,
|
|
lockSkewingY: shouldLock,
|
|
// 锁定时不可选中,解锁时可选中(但保持当前选中状态)
|
|
selectable: !shouldLock,
|
|
evented: !shouldLock
|
|
});
|
|
if (shouldLock) {
|
|
$("#lock_img").attr("src", soonAsset("lock20.png"))//已锁定
|
|
} else {
|
|
$("#lock_img").attr("src", soonAsset("unlock20.png"))//已解锁
|
|
}
|
|
updateControls();
|
|
window.recordState();
|
|
// 更新对象列表以同步锁状态
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
canvas.renderAll();
|
|
});
|
|
$("#text_back_transparent").click(function () {
|
|
canvas.getActiveObject().set("textBackgroundColor", "");
|
|
$("#text_back_color").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#circle_text_back_transparent").click(function () {
|
|
canvas.getActiveObject().set("textBackgroundColor", "");
|
|
$("#circle_text_back_color").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#out_text_back_transparent").click(function () {
|
|
canvas.getActiveObject().set("textBackgroundColor", "");
|
|
$("#out_text_back_color").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#rect_transparent").click(function () {
|
|
canvas.getActiveObject().set("fill", "");
|
|
$("#rect_color").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#rect_stroke_transparent").click(function () {
|
|
canvas.getActiveObject().set("stroke", "");
|
|
$("#rect_stroke").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#circle_transparent").click(function () {
|
|
canvas.getActiveObject().set("fill", "");
|
|
$("#circle_color").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#circle_stroke_transparent").click(function () {
|
|
canvas.getActiveObject().set("stroke", "");
|
|
$("#circle_stroke").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
|
|
$("#copy").click(function () {
|
|
window.copySelection();
|
|
})
|
|
// 粘贴
|
|
$("#paste").click(function () {
|
|
window.pasteFromClipboard();
|
|
})
|
|
|
|
$("#save").click(function () {
|
|
if (typeof window.output === 'function') {
|
|
window.output();
|
|
}
|
|
});
|
|
function getDate() {
|
|
let date = new Date();
|
|
return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
|
|
}
|
|
function getAbsoluteXY(_obj) {
|
|
let coord = _obj.get("lineCoords");
|
|
return [_obj.get("left"), _obj.get("top")]
|
|
}
|
|
$("#open").click(function () {
|
|
function OpenDialog() {
|
|
var dialogApi = (typeof dialog !== 'undefined' && dialog) ? dialog : (window.platformBridge && window.platformBridge.showOpenDialog ? { showOpenDialog: function(opts) { return window.platformBridge.showOpenDialog(opts); } } : null);
|
|
if (!dialogApi) return;
|
|
dialogApi.showOpenDialog({
|
|
title: "请选择文件",
|
|
buttonLabel: language_str("comf"),
|
|
filters: [{ name: 'Soon File Type', extensions: ['soon'] }]
|
|
}).then(function(result) {
|
|
if (result.canceled) return;
|
|
var file = (result.files && result.files[0]) || result.file;
|
|
function openWithKey(fileKey, j) {
|
|
var type = j.soonType ? j.soonType : j.backBlackPic ? 2 : 1;
|
|
if (type == 2) {
|
|
if (window.platformBridge) window.platformBridge.openDesignPage(fileKey, type);
|
|
return;
|
|
}
|
|
if (typeof window.openFile === 'function') {
|
|
window.openFile(fileKey, j);
|
|
}
|
|
}
|
|
function importAndOpen(j, fileName) {
|
|
if (typeof window.openFile === 'function') {
|
|
window.openFile(fileName || 'design.soon', j);
|
|
}
|
|
if (typeof window.soonPutSoonSession === 'function') {
|
|
var localKey = window.soonPutSoonSession(j, fileName || 'design.soon');
|
|
if (localKey && typeof window.soonScheduleCloudImport === 'function') {
|
|
window.soonScheduleCloudImport(localKey, fileName || 'design.soon');
|
|
}
|
|
}
|
|
}
|
|
if (file && file.text) {
|
|
file.text().then(function(t) {
|
|
var j;
|
|
try { j = JSON.parse(t); } catch (e) {
|
|
if (typeof window.soonReportOpenLoadError === 'function') {
|
|
window.soonReportOpenLoadError('模板/文件加载失败');
|
|
}
|
|
return;
|
|
}
|
|
importAndOpen(j, file.name || 'design.soon');
|
|
}).catch(function() {
|
|
if (typeof window.soonReportOpenLoadError === 'function') {
|
|
window.soonReportOpenLoadError('模板/文件加载失败');
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
var filePath = result.filePaths && result.filePaths[0];
|
|
if (!filePath) return;
|
|
var fs = typeof require !== 'undefined' ? require('fs') : null;
|
|
if (fs) {
|
|
var fsData = fs.readFileSync(filePath);
|
|
importAndOpen(JSON.parse(fsData.toString()), filePath);
|
|
}
|
|
}).catch(function(err) {});
|
|
}
|
|
if (typeof window.soonConfirmLeaveThen === 'function') {
|
|
window.soonConfirmLeaveThen(OpenDialog);
|
|
} else {
|
|
OpenDialog();
|
|
}
|
|
});
|
|
$("#new").click(function () {
|
|
function goFirstPage() {
|
|
if (ipcRenderer) ipcRenderer.send('open-first-page');
|
|
else if (window.platformBridge) window.platformBridge.openFirstPage();
|
|
}
|
|
if (typeof window.soonConfirmLeaveThen === 'function') {
|
|
window.soonConfirmLeaveThen(goFirstPage);
|
|
return;
|
|
}
|
|
if (step.val == 0) {
|
|
goFirstPage();
|
|
return;
|
|
}
|
|
layer.confirm(language_str("whetherSave"), function (index) {//confirm 是否保存当前文件�?
|
|
if (typeof window.output === 'function') {
|
|
window.output(function() { goFirstPage(); });
|
|
}
|
|
}, function (index) {
|
|
goFirstPage();
|
|
});
|
|
});
|
|
|
|
// ===========================================================
|
|
$("#text_y").bind('input propertychange', function () {
|
|
if (window._soonSyncingFontControls) return;
|
|
if (!canvas.getActiveObject()) return;
|
|
if ($("#text_y").val() == "") {
|
|
$("#text_y").val(0)
|
|
}
|
|
let val = background_image.top;
|
|
if ($("#text_y").val() != "") {
|
|
val = background_image.top + parseInt($("#text_y").val());
|
|
}
|
|
canvas.getActiveObject().set("top", val)
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#text_x").bind('input propertychange', function () {
|
|
if (window._soonSyncingFontControls) return;
|
|
if (!canvas.getActiveObject()) return;
|
|
if ($("#text_x").val() == "") {
|
|
$("#text_x").val(0)
|
|
}
|
|
let val = background_image.left;
|
|
if ($("#text_x").val() != "") {
|
|
val = background_image.left + parseInt($("#text_x").val());
|
|
}
|
|
canvas.getActiveObject().set("left", val)
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#text_w").bind('input propertychange', function () {
|
|
if (window._soonSyncingFontControls) return;
|
|
if (!canvas.getActiveObject()) return;
|
|
let val = "0";
|
|
if ($("#text_w").val() != "") {
|
|
val = $("#text_w").val();
|
|
}
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if (idx <= 0 || !objs[idx - 1]) return;
|
|
let type = objs[idx - 1].type;
|
|
if (type == 3 || type == 4) {
|
|
canvas.getActiveObject().set("width", parseInt(val))
|
|
} else {
|
|
canvas.getActiveObject().set("scaleX", parseInt(val) / canvas.getActiveObject().get("width"))
|
|
}
|
|
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#text_h").bind('input propertychange', function () {
|
|
if (window._soonSyncingFontControls) return;
|
|
if (!canvas.getActiveObject()) return;
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if (idx <= 0 || !objs[idx - 1]) return;
|
|
if (objs[idx - 1].type == 7) {
|
|
if ($("#text_h").val() == "") {
|
|
$("#text_h").val(canvas.getActiveObject().get("strokeWidth"));
|
|
}
|
|
canvas.getActiveObject().set("strokeWidth", parseInt($("#text_h").val()));
|
|
canvas.renderAll();
|
|
return;
|
|
}
|
|
let val = "0";
|
|
if ($("#text_h").val() != "") {
|
|
val = $("#text_h").val();
|
|
}
|
|
let type = objs[idx - 1].type;
|
|
if (type == 3 || type == 4) {
|
|
canvas.getActiveObject().set("height", parseInt(val))
|
|
} else {
|
|
canvas.getActiveObject().set("scaleY", parseInt(val) / canvas.getActiveObject().get("height"))
|
|
}
|
|
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#text_r").bind('input propertychange', function () {
|
|
if (window._soonSyncingFontControls) return;
|
|
if (!canvas.getActiveObject()) return;
|
|
if ($("#text_r").val() == "") {
|
|
$("#text_r").val("0")
|
|
}
|
|
$("#text_r").val(parseInt($("#text_r").val()) % 360)
|
|
//canvas.getActiveObject().set("rotate", val)
|
|
canvas.getActiveObject().rotate(parseInt($("#text_r").val()))
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#out_pic_field_name").bind('input propertychange', function () {
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
objs[idx - 1].name = $("#out_pic_field_name").val();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
window.recordState();
|
|
})
|
|
|
|
$("#text_black").click(function () {
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if ($(this).prop("checked")) {
|
|
objs[idx - 1].black = true;
|
|
} else {
|
|
objs[idx - 1].black = false;
|
|
}
|
|
window.recordState();
|
|
});
|
|
$("#out_text_field_name").bind('input propertychange', function () {
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
objs[idx - 1].name = $("#out_text_field_name").val();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
window.recordState();
|
|
})
|
|
$("#qrcode_field_name").bind('input propertychange', function () {
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
objs[idx - 1].name = $("#qrcode_field_name").val();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
window.recordState();
|
|
})
|
|
$("#qrcode_color").bind('input propertychange', function () {
|
|
let item = canvas.getActiveObject();
|
|
let qr = jrQrcode.getQrBase64($("#qrcode_val").val(), { padding: 0, foreground: $(this).val() });
|
|
let idx = getIndex(item);
|
|
objs[idx - 1].color = $(this).val();
|
|
item.setSrc(qr, function (img) {
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
});
|
|
$("#qrcode_val").bind('input propertychange', function () {
|
|
let val = $(this).val() ? $(this).val() : 'https://www.cardsoon.com'
|
|
let item = canvas.getActiveObject();
|
|
let qr = jrQrcode.getQrBase64(val, { padding: 0, foreground: $("#qrcode_color").val() });
|
|
let idx = getIndex(item);
|
|
objs[idx - 1].val = val;
|
|
item.setSrc(qr, function (img) {
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
});
|
|
$("#barcode_color").bind('input propertychange', function () {
|
|
let item = canvas.getActiveObject();
|
|
let idx = getIndex(item);
|
|
objs[idx - 1].color = $(this).val();
|
|
JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font });
|
|
let barcode = document.getElementById('barcode');
|
|
let bar = barcode.toDataURL("image/png");
|
|
item.setSrc(bar, function (img) {
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
});
|
|
$("#barcode_field_name").bind('input propertychange', function () {
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
objs[idx - 1].name = $("#barcode_field_name").val();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
window.recordState();
|
|
})
|
|
$("#text_color").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("fill", $("#text_color").val());
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#text_back_color").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("textBackgroundColor", $("#text_back_color").val());
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#text_size").bind('input propertychange', function () {
|
|
if (window._soonSyncingFontControls) return;
|
|
let val = 1
|
|
if (parseFloat($("#text_size").val())) {
|
|
val = parseFloat($("#text_size").val())
|
|
if (val < 1) {
|
|
val = 1
|
|
} else if (val > dpi) {
|
|
val = dpi
|
|
} else if (val % 0.5 !== 0) {
|
|
val = Math.round(val * 2) / 2
|
|
}
|
|
|
|
}
|
|
$("#text_size").val(val)
|
|
canvas.getActiveObject().set("fontSize", val * dpi / 72);
|
|
$("#text_h").val((canvas.getActiveObject().get("height")).toFixed(0));
|
|
$("#text_w").val((canvas.getActiveObject().get("width")).toFixed(0));
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#circle_text_color").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("fill", $("#circle_text_color").val());
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#circle_text_back_color").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("textBackgroundColor", $("#circle_text_back_color").val());
|
|
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#circle_text_text").bind('input propertychange', function () {
|
|
let val = $("#circle_text_text").val().trim()
|
|
// 有内容时不加首行缩进(前面的空格),只保留后面的空格
|
|
canvas.getActiveObject().set("text", val ? `${val} ` : ` ${val} `);
|
|
canvas.renderAll();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
window.recordState();
|
|
})
|
|
$("#out_text_color").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("fill", $("#out_text_color").val());
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#out_text_back_color").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("textBackgroundColor", $("#out_text_back_color").val());
|
|
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#out_text_size").bind('input propertychange', function () {
|
|
if (window._soonSyncingFontControls) return;
|
|
let val = 1
|
|
if (parseFloat($("#out_text_size").val())) {
|
|
val = parseFloat($("#out_text_size").val())
|
|
if (val < 1) {
|
|
val = 1
|
|
} else if (val > dpi) {
|
|
val = dpi
|
|
} else if (val % 0.5 !== 0) {
|
|
val = Math.round(val * 2) / 2
|
|
}
|
|
|
|
}
|
|
$("#out_text_size").val(val)
|
|
canvas.getActiveObject().set("fontSize", val * dpi / 72);
|
|
$("#text_h").val((canvas.getActiveObject().get("height")).toFixed(0));
|
|
$("#text_w").val((canvas.getActiveObject().get("width")).toFixed(0));
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
// 监听合成文本输入框 (占位符)
|
|
$("#out_text_text").on('input propertychange', function () {
|
|
let val = $(this).val();
|
|
|
|
// 【核心修改】如果值为空,强制给 2 个空格
|
|
if (val === "") {
|
|
val = " ";
|
|
}
|
|
|
|
let obj = canvas.getActiveObject();
|
|
if (obj) {
|
|
obj.set("text", val);
|
|
obj.setCoords();
|
|
canvas.requestRenderAll();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
window.recordState();
|
|
}
|
|
});
|
|
$("#rect_color").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("fill", $("#rect_color").val());
|
|
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#rect_stroke").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("stroke", $("#rect_stroke").val());
|
|
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#rect_stroke_width").bind('input propertychange', function () {
|
|
if ($("#rect_stroke_width").val() == "") {
|
|
$("#rect_stroke_width").val("0")
|
|
} else {
|
|
$("#rect_stroke_width").val(parseInt($("#rect_stroke_width").val()))
|
|
}
|
|
canvas.getActiveObject().set("strokeWidth", parseInt($("#rect_stroke_width").val()));
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#rect_radius").bind('input propertychange', function () {
|
|
if ($("#rect_radius").val() == "") {
|
|
$("#rect_radius").val("0")
|
|
} else {
|
|
$("#rect_radius").val(parseInt($("#rect_radius").val()))
|
|
}
|
|
canvas.getActiveObject().set("rx", parseInt($("#rect_radius").val()));
|
|
canvas.getActiveObject().set("ry", parseInt($("#rect_radius").val()));
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#circle_color").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("fill", $("#circle_color").val());
|
|
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#circle_stroke").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("stroke", $("#circle_stroke").val());
|
|
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#circle_stroke_width").bind('input propertychange', function () {
|
|
if ($("#circle_stroke_width").val() == "") {
|
|
$("#circle_stroke_width").val("0")
|
|
} else {
|
|
$(this).val(parseInt($(this).val()))
|
|
}
|
|
canvas.getActiveObject().set("strokeWidth", parseInt($("#circle_stroke_width").val()));
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#counter_start").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("text", $("#counter_start").val());
|
|
let item = canvas.getActiveObject();
|
|
let idx = getIndex(item);
|
|
objs[idx - 1].start = $(this).val();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#counter_add").bind('input propertychange', function () {
|
|
let item = canvas.getActiveObject();
|
|
let idx = getIndex(item);
|
|
objs[idx - 1].add = $(this).val();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#counter_color").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("fill", $("#counter_color").val());
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#count_size").bind('input propertychange', function () {
|
|
if (window._soonSyncingFontControls) return;
|
|
let val = 1
|
|
if (parseFloat($("#count_size").val())) {
|
|
val = parseFloat($("#count_size").val())
|
|
if (val < 1) {
|
|
val = 1
|
|
} else if (val > dpi) {
|
|
val = dpi
|
|
} else if (val % 0.5 !== 0) {
|
|
val = Math.round(val * 2) / 2
|
|
}
|
|
|
|
}
|
|
$("#count_size").val(val)
|
|
canvas.getActiveObject().set("fontSize", val * dpi / 72);
|
|
$("#text_h").val((canvas.getActiveObject().get("height")).toFixed(0));
|
|
$("#text_w").val((canvas.getActiveObject().get("width")).toFixed(0));
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#line_color").bind('input propertychange', function () {
|
|
canvas.getActiveObject().set("stroke", $("#line_color").val());
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
$("#line_dist").bind('input propertychange', function () {
|
|
if ($("#line_dist").val() == "") {
|
|
$("#line_dist").val(0)
|
|
}
|
|
canvas.getActiveObject().set("strokeDashArray", [parseInt($("#line_dist").val()), parseInt($("#line_dist").val())])
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
})
|
|
// 监听普通文本输入 (占位符)
|
|
$("#text_text").on('input propertychange', function () {
|
|
// 1. 获取输入框的值,不要用 trim(),否则无法输入空格
|
|
let val = $(this).val();
|
|
|
|
// 2. 核心修改:只有当删光时,才给 4 个空格作为占位符
|
|
if (val === "") {
|
|
val = " "; // 4个空格,比原来的2个更宽,更好点
|
|
}
|
|
// 3. 更新对象
|
|
canvas.getActiveObject().set("text", val);
|
|
canvas.requestRenderAll(); // 使用 requestRenderAll 性能更好
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
window.recordState();
|
|
});
|
|
$("#barcode_val").bind('input propertychange', function () {
|
|
let item = canvas.getActiveObject();
|
|
let idx = getIndex(item);
|
|
objs[idx - 1].val = $(this).val();
|
|
JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font });
|
|
|
|
let barcode = document.getElementById('barcode');
|
|
let bar = barcode.toDataURL("image/png");
|
|
item.setSrc(bar, function (img) {
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
})
|
|
$("#barcode_show").click(function () {
|
|
let item = canvas.getActiveObject();
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
let val = $("#barcode_size").val();
|
|
let displayValue = true;
|
|
if ($(this).prop("checked")) {
|
|
objs[idx - 1].show = true;
|
|
displayValue = false;
|
|
} else {
|
|
objs[idx - 1].show = false;
|
|
displayValue = true;
|
|
}
|
|
//val = 0; // Remove this hack
|
|
JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: val * dpi / 72, font: objs[idx - 1].font, displayValue: displayValue });
|
|
let barcode = document.getElementById('barcode');
|
|
let bar = barcode.toDataURL("image/png");
|
|
item.setSrc(bar, function (img) {
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
});
|
|
$("#barcode_size").bind('input propertychange', function () {
|
|
let item = canvas.getActiveObject();
|
|
let idx = getIndex(item);
|
|
let val = 1
|
|
if (parseFloat($(this).val())) {
|
|
val = parseFloat($(this).val())
|
|
if (val < 1) {
|
|
val = 1
|
|
} else if (val > dpi) {
|
|
val = dpi
|
|
} else if (val % 0.5 !== 0) {
|
|
val = Math.round(val * 2) / 2
|
|
}
|
|
|
|
}
|
|
$("#barcode_size").val(val)
|
|
objs[idx - 1].fontSize = val * dpi / 72;
|
|
JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font });
|
|
|
|
let barcode = document.getElementById('barcode');
|
|
let bar = barcode.toDataURL("image/png");
|
|
item.setSrc(bar, function (img) {
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
})
|
|
$('#count_font_family').on('change', function () {
|
|
canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text())
|
|
canvas.renderAll()
|
|
window.recordState();
|
|
});
|
|
$('#text_font_family').on('change', function () {
|
|
canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text())
|
|
canvas.renderAll()
|
|
window.recordState();
|
|
});
|
|
|
|
$('#circle_text_font_family').on('change', function () {
|
|
canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text())
|
|
canvas.renderAll()
|
|
window.recordState();
|
|
});
|
|
|
|
$('#language_select').on('change', function () {//语言选择
|
|
langua_ge($(this).find('option:selected').val());
|
|
s_lan = $(this).find('option:selected').val();
|
|
localStorage.setItem("lang", s_lan);
|
|
});
|
|
$('#barcode_font_family').on('change', function () {
|
|
let item = canvas.getActiveObject();
|
|
let idx = getIndex(item);
|
|
objs[idx - 1].font = $(this).find('option:selected').text();
|
|
JsBarcode("#barcode", objs[idx - 1].val, { margin: 0, lineColor: objs[idx - 1].color, fontSize: objs[idx - 1].fontSize, font: objs[idx - 1].font });
|
|
|
|
let barcode = document.getElementById('barcode');
|
|
let bar = barcode.toDataURL("image/png");
|
|
item.setSrc(bar, function (img) {
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
//window.recordState();
|
|
});
|
|
$('#out_text_font_family').on('change', function () {
|
|
canvas.getActiveObject().set("fontFamily", $(this).find('option:selected').text())
|
|
canvas.renderAll()
|
|
window.recordState();
|
|
});
|
|
$(".obj_list").on("click", "div", function () {
|
|
let idx = objs.length - 1 - $(this).index();
|
|
if (typeof window.selectObj === 'function') {
|
|
window.selectObj(idx);
|
|
}
|
|
});
|
|
$("#exceed").click(function () {
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if ($(this).prop("checked")) {
|
|
objs[idx - 1].exceed = true;
|
|
} else {
|
|
objs[idx - 1].exceed = false;
|
|
}
|
|
window.recordState();
|
|
});
|
|
$("#autoWrap").click(function () {
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if ($(this).prop("checked")) {
|
|
|
|
objs[idx - 1].autoWrap = true;
|
|
} else {
|
|
objs[idx - 1].autoWrap = false;
|
|
}
|
|
window.recordState();
|
|
});
|
|
$("#fixSize").click(function () {
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if ($(this).prop("checked")) {
|
|
|
|
objs[idx - 1].fixSize = true;
|
|
} else {
|
|
objs[idx - 1].fixSize = false;
|
|
}
|
|
window.recordState();
|
|
});
|
|
$("#circle_text_center").click(function () {
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if ($(this).prop("checked")) {
|
|
objs[idx - 1].circleCenter = 1;
|
|
} else {
|
|
objs[idx - 1].circleCenter = 0;
|
|
}
|
|
window.recordState();
|
|
});
|
|
|
|
// ===========================================================
|
|
$("#text_italics").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已选
|
|
canvas.getActiveObject().set("fontStyle", "normal")
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未选
|
|
canvas.getActiveObject().set("fontStyle", "italic")
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#text_bold").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已选,恢复正常
|
|
canvas.getActiveObject().set("fontWeight", "normal")
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未选
|
|
canvas.getActiveObject().set("fontWeight", "bold")
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#text_underline").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已选
|
|
canvas.getActiveObject().set("underline", false)
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未选
|
|
canvas.getActiveObject().set("underline", true)
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#text_linethrough").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已选
|
|
canvas.getActiveObject().set("linethrough", false)
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未选
|
|
canvas.getActiveObject().set("linethrough", true)
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
|
|
$("#circle_text_italics").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已选
|
|
canvas.getActiveObject().set("fontStyle", "normal")
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未选
|
|
canvas.getActiveObject().set("fontStyle", "italic")
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#circle_text_bold").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已选,恢复正常
|
|
canvas.getActiveObject().set("fontWeight", "normal")
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未选
|
|
canvas.getActiveObject().set("fontWeight", "bold")
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
|
|
$('#out_left_alignment').click(function () {
|
|
$('#out_left_alignment').parent().removeClass('tool1')
|
|
$('#out_right_alignment').parent().removeClass('tool1')
|
|
$('#out_center_alignment').parent().removeClass('tool1')
|
|
setTimeout(() => {
|
|
$('#out_left_alignment').parent().addClass('tool1')
|
|
});
|
|
canvas.getActiveObject().set('textAlign', 'left')
|
|
let idx = getIndex(canvas.getActiveObject())
|
|
objs[idx - 1].align = 'left'
|
|
window.recordState();
|
|
canvas.renderAll()
|
|
})
|
|
$('#out_right_alignment').click(function () {
|
|
$('#out_left_alignment').parent().removeClass('tool1')
|
|
$('#out_right_alignment').parent().removeClass('tool1')
|
|
$('#out_center_alignment').parent().removeClass('tool1')
|
|
setTimeout(() => {
|
|
$('#out_right_alignment').parent().addClass('tool1')
|
|
});
|
|
canvas.getActiveObject().set('textAlign', 'right')
|
|
let idx = getIndex(canvas.getActiveObject())
|
|
objs[idx - 1].align = 'right'
|
|
window.recordState();
|
|
canvas.renderAll()
|
|
})
|
|
$('#out_center_alignment').click(function () {
|
|
$('#out_left_alignment').parent().removeClass('tool1')
|
|
$('#out_right_alignment').parent().removeClass('tool1')
|
|
$('#out_center_alignment').parent().removeClass('tool1')
|
|
setTimeout(() => {
|
|
$('#out_center_alignment').parent().addClass('tool1')
|
|
});
|
|
canvas.getActiveObject().set('textAlign', 'center')
|
|
let idx = getIndex(canvas.getActiveObject())
|
|
objs[idx - 1].align = 'center'
|
|
window.recordState();
|
|
canvas.renderAll()
|
|
})
|
|
|
|
$("#out_text_italics").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已选
|
|
canvas.getActiveObject().set("fontStyle", "normal")
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未选
|
|
canvas.getActiveObject().set("fontStyle", "italic")
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#out_text_bold").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已选,恢复正常
|
|
canvas.getActiveObject().set("fontWeight", "normal")
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未选
|
|
canvas.getActiveObject().set("fontWeight", "bold")
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#out_text_underline").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已选
|
|
canvas.getActiveObject().set("underline", false)
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未选
|
|
canvas.getActiveObject().set("underline", true)
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#out_text_linethrough").click(function () {
|
|
if ($(this).hasClass("ui-radio-acitve")) {
|
|
//已选
|
|
canvas.getActiveObject().set("linethrough", false)
|
|
$(this).removeClass("ui-radio-acitve")
|
|
} else {
|
|
//未选
|
|
canvas.getActiveObject().set("linethrough", true)
|
|
$(this).addClass("ui-radio-acitve")
|
|
}
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
|
|
// ===========================================================
|
|
$("#delete").click(function () {
|
|
let actObjs = canvas.getActiveObjects();
|
|
let allObjs = canvas.getObjects();
|
|
let flag = 0;
|
|
for (let item of actObjs) {
|
|
if (item != allObjs[0]) {
|
|
let i = getIndex(item);//0是背景,所以从1开始,但objs不包含背景图片,故要-1
|
|
objs.splice(i - 1, 1);
|
|
canvas.remove(item);
|
|
flag = 1;
|
|
|
|
}
|
|
}
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
canvas.discardActiveObject();
|
|
if (flag == 1) {
|
|
window.recordState();
|
|
canvas.renderAll();
|
|
}
|
|
});
|
|
// 移至上层和移至下层:先取消所有绑定(包括第一处的绑定),然后重新绑定(确保只绑定一次)
|
|
// 注意:第一处的事件绑定(第 842 行和第 861 行)会被这里的 off('click') 取消
|
|
$("#up_obj").off('click').on('click', function () {//上移,放到前面 数组中在后面
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if (idx + 1 != canvas.getObjects().length) {
|
|
canvas.bringForward(canvas.getActiveObject());
|
|
canvas.renderAll();
|
|
let temp = objs[idx - 1];
|
|
objs[idx - 1] = objs[idx];
|
|
objs[idx] = temp;
|
|
|
|
window.recordState();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
if (typeof window.selectObj === 'function') {
|
|
window.selectObj(idx);
|
|
}
|
|
}
|
|
});
|
|
$("#down_obj").off('click').on('click', function () {//下移,放到后面 数组中在前面
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if (idx != 1) {
|
|
canvas.sendBackwards(canvas.getActiveObject());
|
|
canvas.renderAll();
|
|
|
|
let temp = objs[idx - 1];
|
|
objs[idx - 1] = objs[idx - 2];
|
|
objs[idx - 2] = temp;
|
|
window.recordState();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
if (typeof window.selectObj === 'function') {
|
|
window.selectObj(idx - 2);
|
|
}
|
|
}
|
|
});
|
|
$("#set_bg").click(function () {//设置为背景
|
|
let obj = canvas.getActiveObject();
|
|
let idx = getIndex(obj);
|
|
const scaleX = 2787 / obj.width
|
|
const scaleY = 2787 / obj.height
|
|
// 使用缩放后的实际尺寸计算位置,确保与初始背景图片位置一致
|
|
const scaledWidth = obj.width * scaleX;
|
|
const scaledHeight = obj.height * scaleY;
|
|
obj.set({
|
|
scaleX: scaleX,
|
|
scaleY: scaleY,
|
|
left: ($('#canvas1').width() - scaledWidth) / 2,
|
|
top: ($('#canvas1').height() - scaledHeight) / 2,
|
|
});
|
|
$('#text_w').val(2787)
|
|
$('#text_h').val(2787)
|
|
$('#text_x').val(0)
|
|
$('#text_y').val(0)
|
|
// 设为背景时,锁定所有编辑操作,并设置为不可选中
|
|
obj.set({
|
|
lockMovementX: true,
|
|
lockMovementY: true,
|
|
lockRotation: true,
|
|
lockScalingX: true,
|
|
lockScalingY: true,
|
|
lockSkewingX: true,
|
|
lockSkewingY: true,
|
|
selectable: false,
|
|
evented: false
|
|
});
|
|
$("#lock_img").attr("src", soonAsset("lock20.png"))
|
|
canvas.sendToBack(obj);
|
|
canvas.bringForward(obj);
|
|
canvas.renderAll();
|
|
let objItem = objs.splice(idx - 1, 1)[0]
|
|
objs.unshift(objItem)
|
|
|
|
// 确保背景图(索引0)的锁定属性被正确设置
|
|
setTimeout(() => {
|
|
let bgObj = canvas.getObjects()[0];
|
|
if (bgObj) {
|
|
bgObj.set({
|
|
lockMovementX: true,
|
|
lockMovementY: true,
|
|
lockRotation: true,
|
|
lockScalingX: true,
|
|
lockScalingY: true,
|
|
lockSkewingX: true,
|
|
lockSkewingY: true,
|
|
selectable: false,
|
|
evented: false
|
|
});
|
|
canvas.renderAll();
|
|
}
|
|
}, 100);
|
|
|
|
window.recordState();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
if (typeof window.selectObj === 'function') {
|
|
window.selectObj(0);
|
|
}
|
|
});
|
|
// 重复的lock点击事件已移除,使用第一处的绑定
|
|
$("#text_back_transparent").click(function () {
|
|
canvas.getActiveObject().set("textBackgroundColor", "");
|
|
$("#text_back_color").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#circle_text_back_transparent").click(function () {
|
|
canvas.getActiveObject().set("textBackgroundColor", "");
|
|
$("#circle_text_back_color").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#out_text_back_transparent").click(function () {
|
|
canvas.getActiveObject().set("textBackgroundColor", "");
|
|
$("#out_text_back_color").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#rect_transparent").click(function () {
|
|
canvas.getActiveObject().set("fill", "");
|
|
$("#rect_color").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#rect_stroke_transparent").click(function () {
|
|
canvas.getActiveObject().set("stroke", "");
|
|
$("#rect_stroke").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#circle_transparent").click(function () {
|
|
canvas.getActiveObject().set("fill", "");
|
|
$("#circle_color").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
$("#circle_stroke_transparent").click(function () {
|
|
canvas.getActiveObject().set("stroke", "");
|
|
$("#circle_stroke").val("#ffffff");
|
|
canvas.renderAll();
|
|
window.recordState();
|
|
});
|
|
|
|
// ===========================================================
|
|
$("#about").click(async function () {
|
|
// 1. 先异步获取版本号
|
|
let version = "0.0.0"; // 默认值,防止获取失败
|
|
try {
|
|
if (window.sysAPI && window.sysAPI.getAppVersion) {
|
|
const v = await window.sysAPI.getAppVersion();
|
|
version = "v" + v; // 拼接一个 v,变成 v2.3.017
|
|
}
|
|
} catch (e) {
|
|
}
|
|
|
|
// 2. 获取成功后再弹出窗口
|
|
layer.open({
|
|
type: 1
|
|
, title: language_str("about")
|
|
, area: '450px;'
|
|
, id: 'LAY_layuipro'
|
|
, moveType: 1
|
|
, content: '<div style="padding-top:20px;padding-bottom:30px;background-color: #32363A; color: #fff; font-weight: 300;text-align:center;">' +
|
|
'<div style="width: 120px;margin: 0 auto;"><img style="width: 120px;" src="' + soonAsset('IconA.png') + '"></div>' +
|
|
'<div style="font-size:24px;">Soon Design</div>' +
|
|
'<div style="font-size:14px;">' + language_str("vers") + ' ' + version + '</div>' +
|
|
'<div style="font-size:14px;">' + language_str("copyright") + '</div>' +
|
|
'</div>'
|
|
});
|
|
})
|
|
$("#help").click(function() {
|
|
if (window.platformBridge && window.platformBridge.openHelp) window.platformBridge.openHelp();
|
|
else if (ipcRenderer && ipcRenderer.send) ipcRenderer.send('open-help-file');
|
|
});
|
|
|
|
// ===========================================================
|
|
$('#display').on('click', function () {
|
|
// 类型改变
|
|
fabric.Image.fromURL(soonAsset('front_bg') + bg_version + '_1.png', function (i1) {
|
|
i1.left = background_image.left;
|
|
i1.top = background_image.top;
|
|
let img1 = i1;
|
|
|
|
fabric.Image.fromURL(soonAsset('back_bg_1.png'), function (i2) {
|
|
i2.left = background_image.left;
|
|
i2.top = background_image.top;
|
|
let img2 = i2;
|
|
fabric.Image.fromURL(soonAsset('op_1.png'), function (i3) {
|
|
i3.left = background_image.left;
|
|
i3.top = background_image.top;
|
|
let img3 = i3;
|
|
if (typeof window.display_func === 'function') {
|
|
window.display_func(img1, img2, img3);
|
|
}
|
|
})
|
|
})
|
|
})
|
|
});
|
|
$("#output").click(function () {
|
|
// 另存为:传递 saveAs 函数作为第二个参数
|
|
if (typeof window.output === 'function') {
|
|
window.output(null, saveAs); // 调用output函数,使用saveAs进行另存为
|
|
}
|
|
});
|
|
|
|
// 确保移至上层和移至下层的事件绑定正确(在文件末尾再次确认)
|
|
// 取消所有绑定,然后重新绑定第二处的实现(第 2171 行和第 2189 行)
|
|
$(document).ready(function () {
|
|
setTimeout(function () {
|
|
$("#up_obj").off('click').on('click', function () {
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if (idx + 1 != canvas.getObjects().length) {
|
|
canvas.bringForward(canvas.getActiveObject());
|
|
canvas.renderAll();
|
|
let temp = objs[idx - 1];
|
|
objs[idx - 1] = objs[idx];
|
|
objs[idx] = temp;
|
|
window.recordState();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
if (typeof window.selectObj === 'function') {
|
|
window.selectObj(idx);
|
|
}
|
|
}
|
|
});
|
|
$("#down_obj").off('click').on('click', function () {
|
|
let idx = getIndex(canvas.getActiveObject());
|
|
if (idx != 1) {
|
|
canvas.sendBackwards(canvas.getActiveObject());
|
|
canvas.renderAll();
|
|
let temp = objs[idx - 1];
|
|
objs[idx - 1] = objs[idx - 2];
|
|
objs[idx - 2] = temp;
|
|
window.recordState();
|
|
if (typeof window.updateList === 'function') {
|
|
window.updateList();
|
|
}
|
|
if (typeof window.selectObj === 'function') {
|
|
window.selectObj(idx - 2);
|
|
}
|
|
}
|
|
});
|
|
}, 100);
|
|
});
|