import color from "picocolors"; import boxen from "boxen"; import { gridSelect } from "./grid.js"; import * as convertTool from "./convert/index.js"; import * as ktx2Tool from "./ktx2/index.js"; import * as gltfTool from "./gltf/index.js"; import * as modelTool from "./model/index.js"; import * as imageTool from "./image/index.js"; import * as spriteTool from "./sprite/index.js"; import * as lodTool from "./lod/index.js"; import * as audioTool from "./audio/index.js"; import * as scaffoldTool from "./scaffold/index.js"; let poemConfig = { lines: ["你我皆牛马", "生在人世间", "终日奔波苦", "一刻不得闲"], perLine: 2, padding: { top: 2, bottom: 2, left: 6, right: 6 }, borderStyle: "double", borderColor: "cyan", }; let updateInfo = null; const tools = [ { name: "格式转换", desc: "支持多种模型格式转换", tool: convertTool }, { name: "KTX2 纹理压缩", desc: "图片转KTX2格式", tool: ktx2Tool }, { name: "glTF扩展", desc: "添加KHR_texture_basisu", tool: gltfTool }, { name: "模型压缩", desc: "压缩glTF/GLB模型", tool: modelTool }, { name: "图片批量处理", desc: "裁剪/缩放/转换", tool: imageTool }, { name: "Sprite图集", desc: "合并精灵图集", tool: spriteTool }, { name: "LOD生成器", desc: "生成多级细节", tool: lodTool }, { name: "音频压缩", desc: "压缩音频文件", tool: audioTool }, { name: "项目脚手架", desc: "快速创建项目模板", tool: scaffoldTool }, ]; export function setPoem(lines, perLine = 2) { poemConfig.lines = lines; poemConfig.perLine = perLine; } export function setPoemStyle(style) { Object.assign(poemConfig, style); } export function setUpdateInfo(info) { updateInfo = info; } function renderPoem() { const merged = []; for (let i = 0; i < poemConfig.lines.length; i += poemConfig.perLine) { merged.push(poemConfig.lines.slice(i, i + poemConfig.perLine).join(",")); } return boxen(color.yellow(merged.join("\n")), { padding: poemConfig.padding, borderStyle: poemConfig.borderStyle, borderColor: poemConfig.borderColor, textAlignment: "center", float: "center", }); } function renderUpdateInfo(selected) { if (!updateInfo) return ""; const btn = selected ? color.cyan("[ 立即更新 ]") :color.white(" 立即更新 ") ; const msg = `📦 发现新版本: ${color.red(updateInfo.current)} → ${color.green(updateInfo.latest)} ${btn}`; return "\n" + boxen(color.yellow(msg), { padding: { top: 0, bottom: 0, left: 2, right: 2 }, borderStyle: "round", borderColor: "green", textAlignment: "center", float: "center", }); } function renderHeader(onUpdate) { return renderPoem() + renderUpdateInfo(onUpdate); } export async function showMainMenu() { return gridSelect({ items: tools, cols: 3, colWidth: 24, renderHeader: renderHeader, updateInfo: updateInfo, }); } export { tools, poemConfig };