fix: remove alert(), fix waveform zoom, add waveform scroll (wheel + ctrl+wheel)
This commit is contained in:
18
js/events.js
18
js/events.js
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
Reference in New Issue
Block a user