297 lines
12 KiB
JavaScript
297 lines
12 KiB
JavaScript
/**
|
|
* 小助手功能特性管理模块
|
|
* 负责管理所有功能开关、按钮可见性、功能状态变更等
|
|
*/
|
|
|
|
import { logger } from '../utils/logger.js';
|
|
|
|
// 外部注入的 promptAssistant 实例
|
|
let promptAssistant = null;
|
|
// 外部注入的 PromptAssistant 类
|
|
let PromptAssistant = null;
|
|
// 外部注入的 UIToolkit
|
|
let UIToolkit = null;
|
|
// 外部注入的 HistoryCacheService
|
|
let HistoryCacheService = null;
|
|
// 外部注入的 imageCaption 实例
|
|
let imageCaption = null;
|
|
// 外部注入的 ImageCaption 类
|
|
let ImageCaption = null;
|
|
// 外部注入的 nodeHelpTranslator 实例
|
|
let nodeHelpTranslator = null;
|
|
|
|
/**
|
|
* 注入依赖实例(由主入口调用)
|
|
*/
|
|
export function setFeatureModuleDeps({ promptAssistant: pa, PromptAssistant: PAC, UIToolkit: ui, HistoryCacheService: hc, imageCaption: ic, ImageCaption: ICC, nodeHelpTranslator: nht }) {
|
|
promptAssistant = pa;
|
|
PromptAssistant = PAC;
|
|
UIToolkit = ui;
|
|
HistoryCacheService = hc;
|
|
imageCaption = ic;
|
|
ImageCaption = ICC;
|
|
nodeHelpTranslator = nht;
|
|
// 初始化时同步日志级别
|
|
try {
|
|
if (typeof window !== 'undefined' && window.FEATURES) {
|
|
if (typeof window.FEATURES.logLevel === 'undefined') {
|
|
window.FEATURES.logLevel = 0;
|
|
}
|
|
if (typeof logger.setLevel === 'function') {
|
|
logger.setLevel(window.FEATURES.logLevel);
|
|
}
|
|
}
|
|
} catch (e) { }
|
|
}
|
|
|
|
/**
|
|
* 功能特性配置对象
|
|
* 控制各个功能的启用状态
|
|
*/
|
|
export const FEATURES = {
|
|
// 基础功能开关
|
|
enabled: true,
|
|
|
|
// 具体功能开关
|
|
history: true, // 历史功能(包含历史、撤销、重做)
|
|
tag: true,
|
|
expand: true,
|
|
translate: true,
|
|
autoTranslate: false, // 自动翻译功能
|
|
imageCaption: true, // 图像反推提示词功能
|
|
nodeHelpTranslator: true, // 节点帮助文档翻译功能
|
|
|
|
// 翻译格式化选项
|
|
translateFormatPunctuation: true, // 标点符号自动转成半角
|
|
translateFormatSpace: true, // 移除多余空格
|
|
translateFormatDots: false, // 处理连续点号
|
|
translateFormatNewline: false, // 保留换行符
|
|
|
|
// 混合语言翻译缓存
|
|
cacheMixedLangTranslation: false, // 是否缓存混合语言翻译结果
|
|
|
|
// 混合语言翻译规则
|
|
mixedLangTranslateRule: 'auto_minor', // 自动翻译小比例语言
|
|
|
|
// 系统设置
|
|
showStreamingProgress: true, // 显示流式输出进度(终端日志)
|
|
enableStreaming: true, // 启用前端流式输出效果
|
|
|
|
/**
|
|
* 从配置加载功能开关状态
|
|
* 必须在 app.ui.settings 加载完成后调用
|
|
*/
|
|
loadSettings() {
|
|
if (typeof app === 'undefined' || !app.ui || !app.ui.settings) return;
|
|
|
|
// 辅助函数:加载布尔值设置,如果未设置则保持默认值
|
|
const loadBool = (key, settingId) => {
|
|
const val = app.ui.settings.getSettingValue(settingId);
|
|
if (typeof val === 'boolean') {
|
|
this[key] = val;
|
|
}
|
|
};
|
|
|
|
// 加载基础功能开关
|
|
loadBool('enabled', "PromptAssistant.Features.Enabled");
|
|
loadBool('history', "PromptAssistant.Features.History");
|
|
loadBool('tag', "PromptAssistant.Features.Tag");
|
|
loadBool('expand', "PromptAssistant.Features.Expand");
|
|
loadBool('translate', "PromptAssistant.Features.Translate");
|
|
loadBool('imageCaption', "PromptAssistant.Features.ImageCaption");
|
|
loadBool('nodeHelpTranslator', "PromptAssistant.Features.NodeHelpTranslator");
|
|
loadBool('useTranslateCache', "PromptAssistant.Features.UseTranslateCache");
|
|
|
|
// 加载翻译格式化选项
|
|
loadBool('translateFormatPunctuation', "PromptAssistant.Features.TranslateFormatPunctuation");
|
|
loadBool('translateFormatSpace', "PromptAssistant.Features.TranslateFormatSpace");
|
|
loadBool('translateFormatDots', "PromptAssistant.Features.TranslateFormatDots");
|
|
|
|
// 加载混合语言缓存选项
|
|
loadBool('cacheMixedLangTranslation', "PromptAssistant.Features.CacheMixedLangTranslation");
|
|
loadBool('translateFormatNewline', "PromptAssistant.Features.TranslateFormatNewline");
|
|
|
|
// 加载混合语言翻译规则
|
|
const mixedLangRule = app.ui.settings.getSettingValue("PromptAssistant.Features.MixedLangTranslateRule");
|
|
if (mixedLangRule) {
|
|
this.mixedLangTranslateRule = mixedLangRule;
|
|
}
|
|
|
|
// 加载系统设置
|
|
loadBool('showStreamingProgress', "PromptAssistant.Settings.ShowStreamingProgress");
|
|
loadBool('enableStreaming', "PromptAssistant.Settings.EnableStreaming");
|
|
|
|
// 加载日志级别
|
|
const logLevel = app.ui.settings.getSettingValue("PromptAssistant.Settings.LogLevel");
|
|
if (logLevel !== undefined) {
|
|
// 确保是数字
|
|
const level = parseInt(logLevel);
|
|
if (!isNaN(level)) {
|
|
if (typeof window !== 'undefined') {
|
|
if (!window.FEATURES) window.FEATURES = {};
|
|
window.FEATURES.logLevel = level;
|
|
}
|
|
if (logger) logger.setLevel(level);
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 更新所有实例的按钮显示状态
|
|
* 根据功能开关状态控制UI元素的显示和隐藏
|
|
*/
|
|
updateButtonsVisibility() {
|
|
if (!PromptAssistant) return;
|
|
// 遍历所有助手实例
|
|
PromptAssistant.instances.forEach((instance) => {
|
|
if (instance.buttons) {
|
|
// 历史相关按钮 - 由单一的history开关控制
|
|
if (instance.buttons['history']) {
|
|
instance.buttons['history'].style.display = this.history ? 'block' : 'none';
|
|
}
|
|
if (instance.buttons['undo']) {
|
|
instance.buttons['undo'].style.display = this.history ? 'block' : 'none';
|
|
}
|
|
if (instance.buttons['redo']) {
|
|
instance.buttons['redo'].style.display = this.history ? 'block' : 'none';
|
|
}
|
|
|
|
// 分隔线1 - 在历史功能之后
|
|
if (instance.buttons['divider1']) {
|
|
const hasHistoryFeature = this.history;
|
|
const hasOtherFeatures = this.tag || this.expand || this.translate;
|
|
const showDivider1 = hasHistoryFeature && hasOtherFeatures;
|
|
instance.buttons['divider1'].style.display = showDivider1 ? 'block' : 'none';
|
|
}
|
|
|
|
// 其他功能按钮
|
|
if (instance.buttons['tag']) {
|
|
instance.buttons['tag'].style.display = this.tag ? 'block' : 'none';
|
|
}
|
|
if (instance.buttons['expand']) {
|
|
instance.buttons['expand'].style.display = this.expand ? 'block' : 'none';
|
|
}
|
|
if (instance.buttons['translate']) {
|
|
instance.buttons['translate'].style.display = this.translate ? 'block' : 'none';
|
|
}
|
|
|
|
// 记录日志 (太频繁,已移除)
|
|
// logger.debug(`按钮更新 | 节点ID: ${instance.nodeId}`);
|
|
}
|
|
});
|
|
|
|
// 处理图像小助手的按钮显示
|
|
if (ImageCaption) {
|
|
ImageCaption.instances.forEach((assistant) => {
|
|
if (assistant.buttons) {
|
|
// 图像反推按钮
|
|
if (assistant.buttons['caption_zh']) {
|
|
assistant.buttons['caption_zh'].style.display = this.imageCaption ? 'block' : 'none';
|
|
}
|
|
if (assistant.buttons['caption_en']) {
|
|
assistant.buttons['caption_en'].style.display = this.imageCaption ? 'block' : 'none';
|
|
}
|
|
|
|
// 如果图像反推功能被禁用,隐藏整个小助手
|
|
if (assistant.element) {
|
|
if (!this.imageCaption) {
|
|
assistant.element.style.display = 'none';
|
|
} else {
|
|
// 始终显示图像小助手
|
|
assistant.element.style.display = 'flex';
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 处理功能开关状态变化
|
|
*/
|
|
export function handleFeatureChange(featureName, value, oldValue) {
|
|
if (!PromptAssistant || !promptAssistant) return;
|
|
// 无论总开关状态如何,功能开关始终独立工作
|
|
// 如果是从禁用变为启用,需要重新创建按钮
|
|
if (value && !oldValue) {
|
|
// 只有当小助手系统已初始化时才重建按钮
|
|
if (PromptAssistant.instances.size > 0) {
|
|
// 重新创建所有实例的按钮
|
|
PromptAssistant.instances.forEach((instance) => {
|
|
if (instance.element && instance.innerContent) {
|
|
// 清空现有按钮容器
|
|
instance.innerContent.innerHTML = '';
|
|
instance.buttons = {};
|
|
// 重新创建所有按钮
|
|
promptAssistant.addFunctionButtons(instance);
|
|
}
|
|
});
|
|
logger.debug(`功能重建 | 结果:完成 | 功能: ${featureName}`);
|
|
|
|
// 重新计算并更新所有实例的宽度
|
|
promptAssistant.updateAllInstancesWidth();
|
|
if (imageCaption && imageCaption.updateAllInstancesWidth) {
|
|
imageCaption.updateAllInstancesWidth();
|
|
}
|
|
}
|
|
|
|
// 如果是图像反推功能被启用
|
|
if (featureName === '图像反推' && imageCaption) {
|
|
// 启用图像小助手功能
|
|
if (imageCaption.initialized) {
|
|
// 重置节点初始化标记
|
|
if (app.canvas && app.canvas.graph) {
|
|
const nodes = app.canvas.graph._nodes || [];
|
|
nodes.forEach(node => {
|
|
if (node) {
|
|
node._imageCaptionInitialized = false;
|
|
}
|
|
});
|
|
}
|
|
|
|
// 如果有当前选中的节点,立即处理
|
|
if (app.canvas && app.canvas.selected_nodes && Object.keys(app.canvas.selected_nodes).length > 0) {
|
|
app.canvas._imageCaptionSelectionHandler(app.canvas.selected_nodes);
|
|
}
|
|
} else {
|
|
// 如果图像小助手尚未初始化,则初始化它
|
|
imageCaption.initialize().then(() => {
|
|
// 初始化完成后处理当前选中的节点
|
|
if (app.canvas && app.canvas.selected_nodes && Object.keys(app.canvas.selected_nodes).length > 0) {
|
|
app.canvas._imageCaptionSelectionHandler(app.canvas.selected_nodes);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// 如果是节点帮助翻译功能被启用
|
|
if (featureName === '节点帮助翻译' && nodeHelpTranslator) {
|
|
// 启用节点帮助翻译功能
|
|
nodeHelpTranslator.initialize();
|
|
}
|
|
} else {
|
|
// 否则只更新显示状态
|
|
FEATURES.updateButtonsVisibility();
|
|
|
|
// 如果是图像反推功能被禁用
|
|
if (featureName === '图像反推' && !value && imageCaption) {
|
|
// 清理所有图像小助手实例
|
|
imageCaption.cleanup();
|
|
}
|
|
|
|
// 如果是节点帮助翻译功能被禁用
|
|
if (featureName === '节点帮助翻译' && !value && nodeHelpTranslator) {
|
|
// 清理节点帮助翻译功能
|
|
nodeHelpTranslator.cleanup();
|
|
}
|
|
|
|
// 功能开关变化时,更新所有实例的宽度
|
|
if (PromptAssistant.instances.size > 0 || (ImageCaption && ImageCaption.instances.size > 0)) {
|
|
promptAssistant.updateAllInstancesWidth();
|
|
if (imageCaption && imageCaption.updateAllInstancesWidth) {
|
|
imageCaption.updateAllInstancesWidth();
|
|
}
|
|
}
|
|
}
|
|
}
|