Sockets funcionais

This commit is contained in:
JotaChina committed 2025-11-04 16:33:21 -03:00
1 parent 97c0daf697
commit d38cd9e60f
4 files changed
+89 -21

No files matched your search

+50 -1
View File
@@ -61,7 +61,6 @@ export async function loadProjectFromServer(fileName) {
}
}
// --- NENHUMA MUDANÇA DAQUI PARA BAIXO ---
// 'parseMmpContent' agora é chamado pelo 'socket.js'
// quando ele recebe a ação 'LOAD_PROJECT' ou 'load_project_state'.
@@ -244,6 +243,56 @@ export function generateMmpFile() {
}
}
// Função auxiliar (pode ser movida para cá) que gera o XML a partir do appState
// Copiada de generateMmpFile/modifyAndSaveExistingMmp
function generateXmlFromState() {
if (!appState.global.originalXmlDoc) {
// Se não houver XML original, precisamos gerar um novo
// Por simplicidade, para este fix, vamos retornar o estado atual do LMMS
// mas o ideal seria gerar o XML completo (como generateNewMmp)
console.warn("Não há XML original para modificar. Usando a base atual do appState.");
// No seu caso, use o conteúdo de generateNewMmp()
return "";
}
const xmlDoc = appState.global.originalXmlDoc.cloneNode(true);
const head = xmlDoc.querySelector("head");
if (head) {
head.setAttribute("bpm", document.getElementById("bpm-input").value);
head.setAttribute("num_bars", document.getElementById("bars-input").value);
head.setAttribute("timesig_numerator", document.getElementById("compasso-a-input").value);
head.setAttribute("timesig_denominator", document.getElementById("compasso-b-input").value);
}
const bbTrackContainer = xmlDoc.querySelector('track[type="1"] > bbtrack > trackcontainer');
if (bbTrackContainer) {
bbTrackContainer.querySelectorAll('track[type="0"]').forEach(node => node.remove());
const tracksXml = appState.pattern.tracks.map((track) => createTrackXml(track)).join("");
const tempDoc = new DOMParser().parseFromString(`<root>${tracksXml}</root>`, "application/xml");
Array.from(tempDoc.documentElement.children).forEach((newTrackNode) => {
bbTrackContainer.appendChild(newTrackNode);
});
}
const serializer = new XMLSerializer();
return serializer.serializeToString(xmlDoc);
}
/**
* Envia o estado ATUAL do projeto (XML dos padrões) para o servidor
* para que ele persista a "cópia temporária" em disco/memória.
* Deve ser chamado APÓS alterações significativas no padrão (steps, tracks).
*/
export function syncPatternStateToServer() {
if (!window.ROOM_NAME) return; // Não faz nada se não estiver em sala
const currentXml = generateXmlFromState();
// NOTA: Usamos um novo tipo de ação para não confundir com o carregamento de arquivo
sendAction({
type: 'SYNC_PATTERN_STATE',
xml: currentXml
});
}
function createTrackXml(track) {
if (track.patterns.length === 0) return "";
const ticksPerStep = 12;