269 lines
9.8 KiB
JavaScript
269 lines
9.8 KiB
JavaScript
const { ipcRenderer } = require('electron');
|
|
const { dialog } = require('@electron/remote');
|
|
|
|
// 辅助函数:获取文件名 (保留扩展名)
|
|
function get_filename(filePath) {
|
|
if (!filePath) return "";
|
|
return filePath.split(/[/\\]/).pop();
|
|
}
|
|
|
|
let s_lan = "zh";
|
|
|
|
function language_str(str) {
|
|
let t = {
|
|
"noFile": { zh: "当前文件不存在!", ozh: "This file does not exist!", en: "File not found!" },
|
|
"saveTime": { zh: "保存时间:", ozh: "保存時間:", en: "Saved on:" },
|
|
"selectFile": { zh: "请选择文件", ozh: "請選擇文件", en: "Please select a file" },
|
|
"comfirm": { zh: "确认", ozh: "確認", en: "Confirm" },
|
|
"cancel": { zh: "取消", ozh: "取消", en: "Cancel" },
|
|
"SDFile": { zh: "SoonDesign模板文件", ozh: "SoonDesign模闆文件", en: "SoonDesign Template File" },
|
|
"vers": { zh: "版本:", ozh: "版本:", en: "Version:" },
|
|
"copyright": { zh: "版权所有 © 2023", ozh: "版權所有 © 2023", en: "Copyright © 2023" },
|
|
"about": { zh: "关于 SoonDesign", ozh: "關於 SoonDesign", en: "About SoonDesign" },
|
|
"lost": { zh: "(文件已丢失)", ozh: "(文件已丟失)", en: "(File Lost)" },
|
|
"clickToDelete": { zh: "文件已丢失,点击删除此记录", ozh: "文件已丟失,點擊刪除此記錄", en: "File lost, click to remove" },
|
|
"deleted": { zh: "已删除", ozh: "已刪除", en: "Deleted" },
|
|
"whetherSave": { zh: "是否保存当前文件?", ozh: "是否保存當前文件?", en: "Save current file?" }, // 补全可能用到的翻译
|
|
"delTitle": { zh: "警告", ozh: "警告", en: "Warning" },
|
|
"delContent": { zh: "文件已丢失,确认是否删除?", ozh: "文件已丟失,確認是否刪除?", en: "File lost, confirm delete?" }
|
|
}
|
|
return t[str][s_lan] || t[str]['zh'];
|
|
}
|
|
|
|
layui.use(['layer', 'form', 'jquery'], function () {
|
|
var $ = layui.$;
|
|
var layer = layui.layer
|
|
, form = layui.form;
|
|
|
|
if (window.sysAPI && window.sysAPI.getAppVersion) {
|
|
window.sysAPI.getAppVersion().then(ver => {
|
|
$("#app-version").text("v" + ver);
|
|
}).catch(e => console.log(e));
|
|
}
|
|
|
|
ipcRenderer.send('get-sys-language');
|
|
|
|
ipcRenderer.on('close', (event, message) => {
|
|
ipcRenderer.send('run-close');
|
|
})
|
|
|
|
function langua_ge(lan = 'zh') {
|
|
$("[language='m']").each(function (i) {
|
|
$(this).html($(this).attr(lan));
|
|
})
|
|
$("[language='t']").each(function (i) {
|
|
$(this).attr("title", $(this).attr(lan));
|
|
})
|
|
}
|
|
|
|
$('#language_select').on('change', function () {
|
|
langua_ge($(this).find('option:selected').val());
|
|
s_lan = $(this).find('option:selected').val();
|
|
localStorage.setItem("lang", s_lan);
|
|
loadHistory();
|
|
});
|
|
|
|
ipcRenderer.on('sys-lan', (event, data) => {
|
|
let lang = localStorage.getItem("lang");
|
|
if (lang) {
|
|
s_lan = lang;
|
|
} else {
|
|
if (data.startsWith('zh')) {
|
|
s_lan = data === 'zh-TW' ? 'ozh' : 'zh';
|
|
} else {
|
|
s_lan = 'en';
|
|
}
|
|
}
|
|
langua_ge(s_lan);
|
|
$("#language_select").val(s_lan);
|
|
localStorage.setItem("lang", s_lan);
|
|
loadHistory();
|
|
});
|
|
|
|
// ==========================================
|
|
// 加载列表
|
|
// ==========================================
|
|
async function loadHistory() {
|
|
try {
|
|
const j = await window.sysAPI.readHistory();
|
|
let h = "";
|
|
let needUpdate = false;
|
|
|
|
for (let item of j.history) {
|
|
let src = "";
|
|
let fileExists = true;
|
|
let imgStyle = "";
|
|
let realType = item.type;
|
|
|
|
const soonData = await window.sysAPI.readJsonFile(item.path);
|
|
|
|
if (soonData) {
|
|
src = soonData.fp;
|
|
let fileType = soonData.soonType ? soonData.soonType : (soonData.backBlackPic ? 2 : 1);
|
|
if (item.type != fileType) {
|
|
item.type = fileType;
|
|
realType = fileType;
|
|
needUpdate = true;
|
|
}
|
|
} else {
|
|
fileExists = false;
|
|
if (realType && (realType == 2 || realType == "2")) {
|
|
src = "./public/images/bg_2.png";
|
|
} else {
|
|
src = "./public/images/bg_1.png";
|
|
}
|
|
imgStyle = "opacity: 0.6; filter: grayscale(100%);";
|
|
}
|
|
|
|
let displayName = get_filename(item.path);
|
|
let cardTitle = item.path;
|
|
let cardStyle = "";
|
|
|
|
if (!fileExists) {
|
|
displayName += ` <span style='color:#ff5722;font-size:12px;'>${language_str("lost")}</span>`;
|
|
cardTitle = language_str("clickToDelete");
|
|
cardStyle = "border: 1px dashed #ff5722;";
|
|
}
|
|
|
|
h += `<div class="card" data="${item.path}" title="${cardTitle}" style="${cardStyle}">
|
|
<div class="rect ${realType == 2 ? 'rect1' : ''}">
|
|
<img src="${src}" style="width:190px; ${imgStyle}">
|
|
<div class="tip">${displayName}</div>
|
|
</div>
|
|
</div>`
|
|
}
|
|
|
|
$(".card-list").html(h);
|
|
|
|
if (needUpdate) {
|
|
await window.sysAPI.writeHistory({ history: j.history });
|
|
}
|
|
|
|
} catch (e) {
|
|
console.error("加载历史记录出错", e);
|
|
}
|
|
}
|
|
|
|
// 按钮事件
|
|
$("#openfile").click(function () { OpenDialog(); });
|
|
$("#new1").click(function () {
|
|
// 这里如果你也想改成和保存一样的弹窗逻辑,可以在这里加
|
|
ipcRenderer.send('open-design-page', "", 1);
|
|
});
|
|
$("#new2").click(function () { ipcRenderer.send('open-design-page', "", 2); });
|
|
|
|
$("#about").click(async function () {
|
|
let version = "3.0.0";
|
|
try {
|
|
if (window.sysAPI && window.sysAPI.getAppVersion) {
|
|
const v = await window.sysAPI.getAppVersion();
|
|
version = "v" + v;
|
|
}
|
|
} catch (e) {}
|
|
|
|
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="./public/images/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>'
|
|
});
|
|
});
|
|
|
|
// ==========================================
|
|
// 点击事件 (修改后:完全匹配“保存”弹窗样式)
|
|
// ==========================================
|
|
$(".card-list").on("click", '.card', async function () {
|
|
let filePath = $(this).attr("data");
|
|
|
|
// 再次检查文件是否存在
|
|
const soonData = await window.sysAPI.readJsonFile(filePath);
|
|
|
|
if (soonData) {
|
|
// 1. 文件存在 -> 正常打开
|
|
let type = soonData.soonType ? soonData.soonType : (soonData.backBlackPic ? 2 : 1);
|
|
|
|
const currentData = await window.sysAPI.readHistory();
|
|
let newHistory = currentData.history.filter(item => item.path !== filePath);
|
|
newHistory.unshift({ path: filePath, time: Date.now(), type: type });
|
|
await window.sysAPI.writeHistory({ history: newHistory });
|
|
|
|
ipcRenderer.send('open-design-page', filePath, type);
|
|
} else {
|
|
// 2. 文件不存在 -> 警告确认
|
|
|
|
// 【关键修改】
|
|
// - 纯文字,左对齐 (text-align: left)
|
|
// - 适当的 padding
|
|
// - 去除所有图标
|
|
let contentHtml = `
|
|
<div style="padding: 20px 20px; text-align: left; color: #333; font-size: 14px;">
|
|
${language_str("delContent")}
|
|
</div>
|
|
`;
|
|
|
|
// 使用 layer.open
|
|
layer.open({
|
|
type: 1,
|
|
title: language_str("delTitle"), // 标题:警告
|
|
content: contentHtml,
|
|
btn: [language_str("comfirm"), language_str("cancel")],
|
|
btnAlign: 'r', // 【关键修改】按钮右对齐
|
|
area: ['300px', 'auto'], // 【关键修改】宽度设为 300px,标准小窗口
|
|
resize: false,
|
|
shadeClose: true,
|
|
yes: async function(index){
|
|
const currentData = await window.sysAPI.readHistory();
|
|
const newHistory = currentData.history.filter(item => item.path !== filePath);
|
|
|
|
if (newHistory.length !== currentData.history.length) {
|
|
await window.sysAPI.writeHistory({ history: newHistory });
|
|
layer.msg(language_str("deleted"), { icon: 1, time: 1000 });
|
|
loadHistory();
|
|
}
|
|
layer.close(index);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
function OpenDialog() {
|
|
dialog.showOpenDialog({
|
|
title: language_str("selectFile"),
|
|
buttonLabel: language_str("comfirm"),
|
|
filters: [
|
|
{ name: language_str("SDFile"), extensions: ['soon'] },
|
|
]
|
|
}).then(async (result) => {
|
|
if (result.canceled || !result.filePaths[0]) return;
|
|
|
|
let filePath = result.filePaths[0];
|
|
|
|
const soonData = await window.sysAPI.readJsonFile(filePath);
|
|
if (!soonData) {
|
|
layer.msg(language_str("noFile"));
|
|
return;
|
|
}
|
|
|
|
let type = soonData.soonType ? soonData.soonType : (soonData.backBlackPic ? 2 : 1);
|
|
|
|
const currentData = await window.sysAPI.readHistory();
|
|
let newHistory = currentData.history.filter(item => item.path !== filePath);
|
|
newHistory.unshift({ path: filePath, time: Date.now(), type: type });
|
|
|
|
await window.sysAPI.writeHistory({ history: newHistory });
|
|
|
|
ipcRenderer.send('open-design-page', filePath, type);
|
|
loadHistory();
|
|
|
|
}).catch(err => {
|
|
console.log(err)
|
|
})
|
|
}
|
|
}); |