-
+
@@ -462,8 +465,9 @@ export default function App(){
const[globalBypass,setGlobalBypass]=useState(false);
const[loadingPreset,setLoadingPreset]=useState(false);
const[focusBlockId,setFocusBlockId]=useState(null);
- const[modelBrowserBlockId,setModelBrowserBlockId]=useState(null);
- const[footswitchMode,setFootswitchMode]=useState("stomp");
+ const [modelBrowserBlockId,setModelBrowserBlockId]=useState(null);
+ const [footswitchMode,setFootswitchMode]=useState("stomp");
+ const [addBlockType,setAddBlockType]=useState(null); // null | "picker"
// ── Undo/Redo ──
const [undoStack, setUndoStack] = useState([]);
@@ -546,6 +550,7 @@ export default function App(){
// ── Main Menu & Settings ──
const [menuOpen, setMenuOpen] = useState(false);
const [settingsView, setSettingsView] = useState(null); // "settings" | "eq" | null
+ const [overlayView, setOverlayView] = useState(null); // "save" | "bypass" | "wifi" | null
const handleMenuSelect = useCallback((itemId) => {
setMenuOpen(false);
@@ -556,8 +561,14 @@ export default function App(){
setState(prev => ({ ...prev, tuner_enabled: true }));
API.tunerToggle(true).catch(() => {});
break;
- default:
- // save, bypass, wifi — placeholder for now
+ case "save":
+ setOverlayView("save");
+ break;
+ case "bypass":
+ setOverlayView("bypass");
+ break;
+ case "wifi":
+ setOverlayView("wifi");
break;
}
}, []);
@@ -584,7 +595,7 @@ export default function App(){
useEffect(()=>{loadState();const id=setInterval(loadState,3000);return()=>clearInterval(id);},[loadState]);
// VU animation fallback when no real data
- useEffect(()=>{const id=setInterval(()=>{setVuLevel(p=>Math.max(0,Math.min(100,p+(Math.random()-0.45)*8)));},150);return()=>clearInterval(id);},[]);
+ useEffect(()=>{const id=setInterval(()=>{setVuLevel(p=>Math.max(0,Math.min(100,p+(Math.random()-0.5)*50+3)));},120);return()=>clearInterval(id);},[]);
// ── Load presets from API ──
useEffect(()=>{
@@ -681,9 +692,18 @@ export default function App(){
setBlocks(prev=>{const arr=[...prev];const[m]=arr.splice(fromIdx,1);arr.splice(toIdx,0,m);return arr;});
},[takeSnapshot]);
const handleAddBlock=useCallback(()=>{
+ setAddBlockType("picker");
+ },[takeSnapshot]);
+ const handleAddBlockType=useCallback((type)=>{
takeSnapshot();
- userChangedBlock.current=true;const id="block_"+Date.now();
- setBlocks(prev=>[...prev,{id,type:"overdrive",name:"New Drive",bypassed:false,params:{drive:30,tone:50,level:70}}]);
+ userChangedBlock.current=true;
+ const id="block_"+Date.now();
+ const defs=getBlockParams(type);
+ const init={};
+ defs.forEach(p=>{init[p.key]=p.def;});
+ const displayName=BLOCK_DISPLAY_NAMES[type]||type.charAt(0).toUpperCase()+type.slice(1);
+ setBlocks(prev=>[...prev,{id,type,name:displayName,bypassed:false,params:init}]);
+ setAddBlockType(null);
setTimeout(()=>{userChangedBlock.current=false;},3000);
},[takeSnapshot]);
const handleRemoveBlock=useCallback((id)=>{
@@ -786,7 +806,7 @@ export default function App(){
-
{state.connected?"CONNECTED":"OFFLINE"}
+
{state.connected?"CONNECTED":"OFFLINE"}
{/* Undo/Redo */}