复制粘贴保存快捷键

This commit is contained in:
24kycj
2025-06-03 02:02:42 +08:00
parent 71aa2c3d1f
commit fef055494e
4 changed files with 192 additions and 4 deletions
+1 -1
View File
@@ -1 +1 @@
{"history":[{"time":"2025-5-28","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi6.soon"},{"time":"2025-4-10","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi7.soon"},{"time":"2025-4-9","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi5.soon"},{"time":"2025-4-9","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi.soon"}]} {"history":[{"time":"2025-6-2","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi6.soon"},{"time":"2025-4-10","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi7.soon"},{"time":"2025-4-9","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi5.soon"},{"time":"2025-4-9","path":"E:\\project\\sideline\\shanghaikashu\\文件\\soon文件\\ceshi.soon"}]}
+97 -3
View File
@@ -775,6 +775,11 @@
ipcRenderer.send('get-scale-rate'); ipcRenderer.send('get-scale-rate');
const { clipboard } = require('electron') const { clipboard } = require('electron')
const dpi = 600 const dpi = 600
// 内部剪贴板
let clipboardData = {
objects: null,
offset: 10 // 粘贴位置偏移量
};
//var encrypt = new JSEncrypt(); //var encrypt = new JSEncrypt();
//encrypt.setPublicKey(`-----BEGIN PUBLIC KEY----- //encrypt.setPublicKey(`-----BEGIN PUBLIC KEY-----
//MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDAbKQ46WevL9PapJ+AlZqSzczkTovu7STH //MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDAbKQ46WevL9PapJ+AlZqSzczkTovu7STH
@@ -4354,7 +4359,7 @@
recordObjs2.push(JSON.stringify(objs2)) recordObjs2.push(JSON.stringify(objs2))
let j2 = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]); let j2 = canvas2.toJSON(["selectable", "hoverable", "hoverCursor", "text", "fontStyle", "fontWeight", "underline"]);
j2.objects[0].hoverCursor = "default"; // j2.objects[0].hoverCursor = "default";
recordJson2.push(j2); recordJson2.push(j2);
}, 0); }, 0);
} }
@@ -5001,7 +5006,6 @@
recordState(); recordState();
} }
function selectCircleText() { function selectCircleText() {
console.log(canvas.getActiveObject().get("text"))
$("#circle_text_control").show(); $("#circle_text_control").show();
$("#circle_text_color").val(canvas.getActiveObject().get("fill")); $("#circle_text_color").val(canvas.getActiveObject().get("fill"));
$("#circle_text_back_color").val(canvas.getActiveObject().get("textBackgroundColor") == "" ? '#ffffff' : canvas.getActiveObject().get("textBackgroundColor")); $("#circle_text_back_color").val(canvas.getActiveObject().get("textBackgroundColor") == "" ? '#ffffff' : canvas.getActiveObject().get("textBackgroundColor"));
@@ -6191,7 +6195,7 @@
}); });
canvas1.on("object:moving", function (e) { canvas1.on("object:moving", function (e) {
let obj = canvas.getActiveObject() let obj = canvas.getActiveObject()
if (objs[getIndex(e.target) - 1].type ===11) { if (objs[getIndex(e.target) - 1].type && objs[getIndex(e.target) - 1].type ===11) {
let pointer = { let pointer = {
x: obj.left, x: obj.left,
y: obj.top y: obj.top
@@ -6210,6 +6214,96 @@
} }
updateControls(); updateControls();
}); });
// 监听键盘事件
window.addEventListener('keydown', handleKeyDown);
function handleKeyDown(e) {
// 检测 Ctrl+C
if ((e.ctrlKey || e.metaKey) && e.keyCode === 67) {
copySelection();
e.preventDefault(); // 阻止默认复制行为
}
// 检测 Ctrl+V
if ((e.ctrlKey || e.metaKey) && e.keyCode === 86) {
pasteFromClipboard();
e.preventDefault(); // 阻止默认粘贴行为
}
// 检测 Ctrl+S
if ((e.ctrlKey || e.metaKey) && e.keyCode === 83) {
output();
e.preventDefault(); // 阻止默认粘贴行为
}
}
// 复制选中对象
function copySelection() {
const activeObjects = canvas.getActiveObjects();
if (!activeObjects || activeObjects.length === 0) {
console.log("未选中任何对象");
return;
}
// 存储原始对象用于克隆
clipboardData.objects = activeObjects;
console.log(activeObjects)
console.log(`已复制 ${activeObjects.length} 个对象`);
}
// 粘贴对象
function pasteFromClipboard() {
if (!clipboardData.objects || clipboardData.objects.length === 0) {
console.log("剪贴板为空");
return;
}
// 克隆所有对象
fabric.util.enlivenObjects(
clipboardData.objects.map(obj => obj.toObject()),
clonedObjects => {
// 设置新位置(添加偏移)
clonedObjects.forEach((clone, index) => {
let idx = getIndex(clipboardData.objects[index])
console.log(clone)
clone.set({
left: clone.left + clipboardData.offset,
top: clone.top + clipboardData.offset,
evented: true
});
// 计算整体偏移
const groupOffset = clone.group;
if (groupOffset) {
clone.set({
left: groupOffset.left + clipboard.offset,
top: groupOffset.top + clipboard.offset
});
}
// 添加到画布
canvas.add(clone);
let tobj = {...objs[idx-1]}
if (tobj.name) tobj.name = tobj.name + objs.length
objs.push(tobj);
canvas.renderAll();
updateList();
recordState();
});
// 选中粘贴的对象
canvas.discardActiveObject();
const sel = new fabric.ActiveSelection(clonedObjects, {
canvas: canvas
});
canvas.setActiveObject(sel);
canvas.requestRenderAll();
selectObj(objs.length - 1);
// 增加下次偏移
clipboardData.offset += 10;
}
);
}
canvas1.on("object:scaling", function (event) { canvas1.on("object:scaling", function (event) {
//if(objs[getIndex(event.target) - 1].type == 5 || objs[getIndex(event.target) - 1].type == 6){ //if(objs[getIndex(event.target) - 1].type == 5 || objs[getIndex(event.target) - 1].type == 6){
// //canvas.getActiveObject().set("width", canvas.getActiveObject().get("width") * canvas.getActiveObject().get("scaleX")); // //canvas.getActiveObject().set("width", canvas.getActiveObject().get("width") * canvas.getActiveObject().get("scaleX"));
+94
View File
@@ -752,6 +752,11 @@
ipcRenderer.send('get-scale-rate') ipcRenderer.send('get-scale-rate')
const { clipboard } = require('electron') const { clipboard } = require('electron')
const dpi = 300 const dpi = 300
// 内部剪贴板
let clipboardData = {
objects: null,
offset: 10 // 粘贴位置偏移量
};
//var encrypt = new JSEncrypt(); //var encrypt = new JSEncrypt();
//encrypt.setPublicKey(`-----BEGIN PUBLIC KEY----- //encrypt.setPublicKey(`-----BEGIN PUBLIC KEY-----
//MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDAbKQ46WevL9PapJ+AlZqSzczkTovu7STH //MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDAbKQ46WevL9PapJ+AlZqSzczkTovu7STH
@@ -5629,6 +5634,95 @@
// } // }
updateControls(); updateControls();
}); });
// 监听键盘事件
window.addEventListener('keydown', handleKeyDown);
function handleKeyDown(e) {
// 检测 Ctrl+C
if ((e.ctrlKey || e.metaKey) && e.keyCode === 67) {
copySelection();
e.preventDefault(); // 阻止默认复制行为
}
// 检测 Ctrl+V
if ((e.ctrlKey || e.metaKey) && e.keyCode === 86) {
pasteFromClipboard();
e.preventDefault(); // 阻止默认粘贴行为
}
// 检测 Ctrl+S
if ((e.ctrlKey || e.metaKey) && e.keyCode === 83) {
output();
e.preventDefault(); // 阻止默认粘贴行为
}
}
// 复制选中对象
function copySelection() {
const activeObjects = canvas.getActiveObjects();
if (!activeObjects || activeObjects.length === 0) {
console.log("未选中任何对象");
return;
}
// 存储原始对象用于克隆
clipboardData.objects = activeObjects;
console.log(activeObjects)
console.log(`已复制 ${activeObjects.length} 个对象`);
}
// 粘贴对象
function pasteFromClipboard() {
if (!clipboardData.objects || clipboardData.objects.length === 0) {
console.log("剪贴板为空");
return;
}
// 克隆所有对象
fabric.util.enlivenObjects(
clipboardData.objects.map(obj => obj.toObject()),
clonedObjects => {
// 设置新位置(添加偏移)
clonedObjects.forEach((clone, index) => {
let idx = getIndex(clipboardData.objects[index])
console.log(clone)
clone.set({
left: clone.left + clipboardData.offset,
top: clone.top + clipboardData.offset,
evented: true
});
// 计算整体偏移
const groupOffset = clone.group;
if (groupOffset) {
clone.set({
left: groupOffset.left + clipboard.offset,
top: groupOffset.top + clipboard.offset
});
}
// 添加到画布
canvas.add(clone);
let tobj = {...objs[idx-1]}
if (tobj.name) tobj.name = tobj.name + objs.length
objs.push(tobj);
canvas.renderAll();
updateList();
recordState();
});
// 选中粘贴的对象
canvas.discardActiveObject();
const sel = new fabric.ActiveSelection(clonedObjects, {
canvas: canvas
});
canvas.setActiveObject(sel);
canvas.requestRenderAll();
selectObj(objs.length - 1);
// 增加下次偏移
clipboardData.offset += 10;
}
);
}
canvas1.on('object:scaling', function (event) { canvas1.on('object:scaling', function (event) {
//if(objs[getIndex(event.target) - 1].type == 5 || objs[getIndex(event.target) - 1].type == 6){ //if(objs[getIndex(event.target) - 1].type == 5 || objs[getIndex(event.target) - 1].type == 6){
// //canvas.getActiveObject().set("width", canvas.getActiveObject().get("width") * canvas.getActiveObject().get("scaleX")); // //canvas.getActiveObject().set("width", canvas.getActiveObject().get("width") * canvas.getActiveObject().get("scaleX"));
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB