diff --git a/dev/web/public/app.mjs b/dev/web/public/app.mjs index 8e0b1e6..26f7bed 100644 --- a/dev/web/public/app.mjs +++ b/dev/web/public/app.mjs @@ -35,9 +35,10 @@ const CTRL_CLASSES = [ * ------------------------------------------------------------------------- */ const known_peers = new Map(); /* key: addr:name -> peer */ -let selected_peer = null; -let selected_device_idx = null; -let device_data = null; +let selected_peer = null; +let selected_device_idx = null; +let selected_device_path = null; +let device_data = null; /* ------------------------------------------------------------------------- * Utilities @@ -244,7 +245,8 @@ function make_device_item(idx, path, label, device_caps, is_capture) { } async function select_device(idx, path) { - selected_device_idx = idx; + selected_device_idx = idx; + selected_device_path = path; document.querySelectorAll('.device-item').forEach(el => { el.classList.toggle('selected', parseInt(el.dataset.idx) === idx); }); @@ -272,6 +274,20 @@ async function load_controls(device_idx, device_path) { } } +/* Silent reload — no loading flash; used after a control change that may + * alter other controls' flags (e.g. switching exposure mode ungrabs + * exposure_absolute). */ +async function reload_controls() { + if (selected_device_idx === null || selected_device_path === null) { return; } + try { + const result = await api('GET', `/api/devices/${selected_device_idx}/controls`); + by_id('controls-title').textContent = `Controls — ${selected_device_path}`; + render_controls(selected_device_idx, result.controls ?? []); + } catch (err) { + toast(err.message, 'err'); + } +} + function render_controls(device_idx, controls) { const scroll = by_id('controls-scroll'); @@ -377,10 +393,10 @@ function make_ctrl_row(device_idx, ctrl) { }; if (ctrl.type === CTRL_BUTTON) { - input_el.addEventListener('click', send); + input_el.addEventListener('click', async () => { await send(); await reload_controls(); }); } else if (ctrl.type === CTRL_BOOLEAN || ctrl.type === CTRL_MENU || ctrl.type === CTRL_INTEGER_MENU) { - input_el.addEventListener('change', send); + input_el.addEventListener('change', async () => { await send(); await reload_controls(); }); } else { input_el.addEventListener('pointerup', send); input_el.addEventListener('keyup', send);