Reload controls after menu/boolean/button change
Switching a menu control (e.g. exposure auto → manual) changes the flags on related controls (e.g. exposure_absolute loses FLAG_GRABBED). Re-fetch and re-render controls silently after any non-slider change so the updated enabled/read-only states are reflected immediately. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -37,6 +37,7 @@ const CTRL_CLASSES = [
|
||||
const known_peers = new Map(); /* key: addr:name -> peer */
|
||||
let selected_peer = null;
|
||||
let selected_device_idx = null;
|
||||
let selected_device_path = null;
|
||||
let device_data = null;
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
@@ -245,6 +246,7 @@ function make_device_item(idx, path, label, device_caps, is_capture) {
|
||||
|
||||
async function select_device(idx, path) {
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user