File size: 4,373 Bytes
e636070 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
class ScenesPanel {
constructor() {
this.scenes = new Set();
this.currentScene = null;
this.container = document.querySelector('.scene-buttons');
this.clearBtn = document.querySelector('.clear-selection-btn');
this.init();
}
init() {
// this.initEventListeners();
// 监听消息中的场景更新
window.addEventListener('scene-update', (event) => {
const sceneNumber = event.detail.scene;
if (sceneNumber !== undefined) {
this.addScene(sceneNumber);
}
});
// 监听WebSocket消息
window.addEventListener('websocket-message', (event) => {
const message = event.detail;
// 如果是初始数据,获取已有场景
if (message.type === 'initial_data' && message.data.history_messages) {
message.data.history_messages.forEach(message => this.addScene(message.scene));
}
// 从状态更新中获取场景信息
if (message.type === 'message' && message.data.scene !== undefined) {
this.addScene(message.data.scene);
}
});
}
addScene(sceneNumber) {
// 只添加已经结束的场景
if (!this.scenes.has(sceneNumber) && sceneNumber !== undefined) {
console.log(`Adding scene ${sceneNumber}`);
this.scenes.add(sceneNumber);
this.renderSceneButtons();
console.log('Current scenes:', Array.from(this.scenes));
}
}
initEventListeners() {
// 清除选择按钮事件
this.clearBtn.addEventListener('click', () => {
this.clearSelection();
});
}
renderSceneButtons() {
this.container.innerHTML = '';
// 将场景号排序
const sortedScenes = Array.from(this.scenes).sort((a, b) => a - b);
sortedScenes.forEach(scene => {
const button = document.createElement('button');
button.className = 'scene-btn';
if (this.currentScene === scene) {
button.classList.add('active');
}
button.textContent = `场景 ${scene}`;
button.addEventListener('click', () => {
this.selectScene(scene);
});
this.container.appendChild(button);
});
}
selectScene(sceneNumber) {
const buttons = this.container.querySelectorAll('.scene-btn');
buttons.forEach(btn => btn.classList.remove('active'));
if (this.currentScene === sceneNumber) {
// 如果点击当前选中的场景,取消选择
this.currentScene = null;
console.log('Scene selection cleared');
} else {
// 选中新场景
this.currentScene = sceneNumber;
buttons.forEach(btn => {
if (btn.textContent === `场景 ${sceneNumber}`) {
btn.classList.add('active');
}
});
console.log('Scene selected:', sceneNumber);
}
// 触发场景选择事件
window.dispatchEvent(new CustomEvent('scene-selected', {
detail: { scene: this.currentScene }
}));
if (window.ws && window.ws.readyState === WebSocket.OPEN) {
// 添加发送 WebSocket 消息
window.ws.send(JSON.stringify({
type: 'request_scene_characters',
scene: this.currentScene
}));
}
}
clearSelection() {
this.currentScene = null;
const buttons = this.container.querySelectorAll('.scene-btn');
buttons.forEach(btn => btn.classList.remove('active'));
// 确保清除选择时也触发事件
const sceneEvent = new CustomEvent('scene-selected', {
detail: { scene: null }
});
window.dispatchEvent(sceneEvent);
if (window.ws && window.ws.readyState === WebSocket.OPEN) {
// 添加发送 WebSocket 消息
window.ws.send(JSON.stringify({
type: 'request_scene_characters',
scene: null
}));
}
}
}
const scenesPanel = new ScenesPanel(); |