Padronização da interface e atualização do sync entre clientes

This commit is contained in:
JotaChina committed 2025-11-27 22:02:02 -03:00
1 parent 3f714c88de
commit 7d9d2b0f63
10 files changed
+796 -377

No files matched your search

+60 -3
View File
@@ -5,7 +5,7 @@ import {
restartAudioEditorIfPlaying,
} from "./audio/audio_audio.js";
import { initializeAudioContext } from "./audio.js";
import { handleFileLoad, generateMmpFile, BLANK_PROJECT_XML } from "./file.js";
import { handleFileLoad, generateMmpFile } from "./file.js";
import {
renderAll,
loadAndRenderSampleBrowser,
@@ -13,7 +13,7 @@ import {
closeOpenProjectModal,
} from "./ui.js";
import { renderAudioEditor } from "./audio/audio_ui.js";
import { adjustValue, enforceNumericInput } from "./utils.js";
import { adjustValue, enforceNumericInput, DEFAULT_PROJECT_XML } from "./utils.js";
import { ZOOM_LEVELS } from "./config.js";
import { loadProjectFromServer } from "./file.js";
import { sendAction, joinRoom, setUserName } from "./socket.js";
@@ -61,6 +61,11 @@ const PROJECT_NAME = new URLSearchParams(window.location.search).get("project");
? PROJECT_NAME
: `${PROJECT_NAME}.mmp`;
loadProjectFromServer(filename);
} else if (!restored && !PROJECT_NAME) {
// CORREÇÃO: Se entrou numa sala vazia sem projeto na URL,
// inicializa o XML base para não dar erro depois.
const parser = new DOMParser();
appState.global.originalXmlDoc = parser.parseFromString(DEFAULT_PROJECT_XML, "application/xml");
}
})(); // Fim do initApp
@@ -313,7 +318,7 @@ document.addEventListener("DOMContentLoaded", () => {
)
)
return;
sendAction({ type: "LOAD_PROJECT", xml: BLANK_PROJECT_XML });
sendAction({ type: "LOAD_PROJECT", xml: DEFAULT_PROJECT_XML });
});
addBarBtn?.addEventListener("click", () => {
@@ -341,6 +346,29 @@ document.addEventListener("DOMContentLoaded", () => {
initializeAudioContext();
sendAction({ type: "REMOVE_LAST_TRACK" });
});
// 👇 ATUALIZE ESTE LISTENER
removeInstrumentBtn?.addEventListener("click", () => {
initializeAudioContext();
// Pega o ID da faixa que está selecionada/ativa na interface
const activeId = appState.pattern.activeTrackId;
if (activeId) {
// Envia comando seguro por ID
sendAction({
type: "REMOVE_TRACK_BY_ID",
trackId: activeId
});
} else {
// Fallback: se não tiver ID ativo, tenta pegar a última (comportamento antigo, mas seguro localmente)
const tracks = appState.pattern.tracks;
if (tracks.length > 0) {
const lastId = tracks[tracks.length - 1].id;
sendAction({ type: "REMOVE_TRACK_BY_ID", trackId: lastId });
}
}
});
playBtn?.addEventListener("click", () => {
initializeAudioContext();
@@ -496,6 +524,35 @@ document.addEventListener("DOMContentLoaded", () => {
});
}
const removeAudioTrackBtn = document.getElementById("remove-audio-track-btn");
if (removeAudioTrackBtn) {
removeAudioTrackBtn.addEventListener("click", () => {
initializeAudioContext();
// Verifica quantas faixas existem
const trackCount = appState.audio.tracks.length;
if (trackCount > 0) {
// Pega a ÚLTIMA faixa da lista
const lastTrack = appState.audio.tracks[trackCount - 1];
// Verifica se tem clips nela (segurança)
const hasClips = appState.audio.clips.some(c => c.trackId === lastTrack.id);
if (hasClips && !confirm("A última pista contém clips de áudio. Deseja removê-la mesmo assim?")) {
return;
}
// 🔥 A MUDANÇA CRUCIAL: Envia o ID, e usa o NOME NOVO do comando
sendAction({
type: "REMOVE_AUDIO_LANE_BY_ID",
trackId: lastTrack.id
});
} else {
showToast("Não há pistas de áudio para remover.", "warning");
}
});
}
// Navegador de Samples (local)
loadAndRenderSampleBrowser();