fix: remove alert(), fix waveform zoom, add waveform scroll (wheel + ctrl+wheel)

This commit is contained in:
Jose Luis Montañes
2026-03-19 22:08:26 +01:00
parent d5de328898
commit 7c58174f5f
3 changed files with 22 additions and 5 deletions

View File

@@ -214,12 +214,26 @@ export function initEvents() {
document.getElementById('wave-step').addEventListener('click', manualStep); document.getElementById('wave-step').addEventListener('click', manualStep);
document.getElementById('wave-zoom-in').addEventListener('click', () => { document.getElementById('wave-zoom-in').addEventListener('click', () => {
state.waveZoom = Math.min(60, state.waveZoom + 5); state.waveZoom = Math.min(100, state.waveZoom + 5);
}); });
document.getElementById('wave-zoom-out').addEventListener('click', () => { document.getElementById('wave-zoom-out').addEventListener('click', () => {
state.waveZoom = Math.max(5, state.waveZoom - 5); state.waveZoom = Math.max(2, state.waveZoom - 5);
}); });
// Scroll waveform with mouse wheel
document.getElementById('wave-canvas').addEventListener('wheel', e => {
e.preventDefault();
if (e.ctrlKey || e.metaKey) {
// Ctrl+wheel = zoom waveform
const delta = e.deltaY > 0 ? -3 : 3;
state.waveZoom = Math.max(2, Math.min(100, state.waveZoom + delta));
} else {
// Wheel = scroll waveform horizontally
const scrollDelta = e.deltaY > 0 ? 3 : -3;
state.waveScroll = Math.max(0, state.waveScroll + scrollDelta);
}
}, { passive: false });
// ==================== SIMULATION CONTROLS ==================== // ==================== SIMULATION CONTROLS ====================
document.getElementById('sim-run-btn').addEventListener('click', () => { document.getElementById('sim-run-btn').addEventListener('click', () => {
if (state.simRunning) stopSim(); else startSim(); if (state.simRunning) stopSim(); else startSim();

View File

@@ -20,7 +20,7 @@ export function simTick() {
export function startSim() { export function startSim() {
if (state.simRunning) return; if (state.simRunning) return;
const hasClocks = state.gates.some(g => g.type === 'CLOCK'); const hasClocks = state.gates.some(g => g.type === 'CLOCK');
if (!hasClocks) { alert('Place a CLOCK gate first!'); return; } if (!hasClocks) return;
state.simRunning = true; state.simRunning = true;

View File

@@ -121,11 +121,14 @@ export function drawWaveforms() {
return; return;
} }
// Auto-scroll to show latest // Auto-scroll to show latest (only if we're already near the end)
const maxVisible = Math.floor(wc.width / state.waveZoom); const maxVisible = Math.floor(wc.width / state.waveZoom);
if (state.timeStep > maxVisible) { const isNearEnd = state.waveScroll >= state.timeStep - maxVisible - 2;
if (state.timeStep > maxVisible && isNearEnd) {
state.waveScroll = state.timeStep - maxVisible; state.waveScroll = state.timeStep - maxVisible;
} }
// Clamp scroll to valid range
state.waveScroll = Math.max(0, Math.min(state.timeStep - 1, state.waveScroll));
// Draw time grid // Draw time grid
wctx.strokeStyle = '#151520'; wctx.strokeStyle = '#151520';