三栏布局 - ResizeObserver 等比例分配替代固定默认值恢复 - 修复拖拽+窗口调整竞态卡死(needsRecalcRef 延迟补算) - containerRef.current 动态读取 DOM 替代闭包 el Seedance2Content - 从占位文本重构为内容编排控件(文本+图片/视频/音频上传) - 根据 spec.image_files/video_files/audio_files 动态渲染上传区域 - 值 JSON 序列化 → 提交时转 ContentItem[](text/image_url/video_url/audio_url) 图片上传兼容视频文件 - buildAccept 根据 file_filter 区分 image/video 前缀 - createMediaBeforeUpload 动态放行 video/* MIME - 公共模块 media-upload-utils.ts 本地存储基建 - sql.js (WASM SQLite) + safeStorage 加密持久化 - 8个IPC文件操作通道 + resolveSafe 路径穿越防护 - <userData>/heixiu-data/ 沙箱 + JWT用户隔离 - 7表DDL + 游标分页 + LRU媒体淘汰 其他 - 修复 errorMessageRef 渲染期写入警告 - 媒体预览回退直接URL(<img>无CORS限制)+ output_type类型补充 - CSP wasm-unsafe-eval + https: CDN媒体源
58 lines
1.9 KiB
TypeScript
58 lines
1.9 KiB
TypeScript
// ============================================================
|
||
// controls/index.ts — Widget 注册表
|
||
//
|
||
// 职责:
|
||
// 1. 定义 WidgetProps 统一接口
|
||
// 2. 维护 Qt 控件名 → React 组件的 WIDGET_MAP 映射
|
||
// 3. 导出 WidgetType 联合类型供外部使用
|
||
//
|
||
// 新增控件类型只需两步:
|
||
// ① 在 controls/ 下创建组件文件
|
||
// ② 在 WIDGET_MAP 中加一行
|
||
// ============================================================
|
||
|
||
import type { ComponentType } from 'react';
|
||
import type { WidgetProps } from './types';
|
||
|
||
import { TextInput } from './TextInput';
|
||
import { LineInput } from './LineInput';
|
||
import { ComboBox } from './ComboBox';
|
||
import { Checkbox } from './Checkbox';
|
||
import { SpinBox } from './SpinBox';
|
||
import { DoubleSpinBox } from './DoubleSpinBox';
|
||
import { ImageInput } from './ImageInput';
|
||
import { ImageListInput } from './ImageListInput';
|
||
import { AudioListInput } from './AudioListInput';
|
||
import { VideoInput } from './VideoInput';
|
||
import { SeedanceContent } from './SeedanceContent';
|
||
|
||
export type { WidgetProps } from './types';
|
||
|
||
// ---------- 注册表 ----------
|
||
|
||
/**
|
||
* Qt 控件名 → React 组件的映射表。
|
||
*
|
||
* 键来自 API param_schema[].ui.widget 字段(原 Python Qt 客户端的组件类名),
|
||
* 值为 useUI/ 下的对应 React 组件。
|
||
*/
|
||
export const WIDGET_MAP: Record<string, ComponentType<WidgetProps>> = {
|
||
textEdit: TextInput,
|
||
lineEdit: LineInput,
|
||
comboBox: ComboBox,
|
||
checkbox: Checkbox,
|
||
spinBox: SpinBox,
|
||
doubleSpinBox: DoubleSpinBox,
|
||
imageInput: ImageInput,
|
||
imageList: ImageListInput,
|
||
audioList: AudioListInput,
|
||
videoInput: VideoInput,
|
||
seedance2Content: SeedanceContent,
|
||
};
|
||
|
||
/** 已知的 widget 类型字面量联合 */
|
||
export type WidgetType = keyof typeof WIDGET_MAP;
|
||
|
||
/** 未知控件类型的兜底组件(渲染为普通 Input) */
|
||
export const FALLBACK_WIDGET: ComponentType<WidgetProps> = LineInput;
|