use nih_plug_vizia::vizia::prelude::*; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; /// A custom toggleable button coupled to an `Arc>> { lens: L, } impl>> SafeModeButton { /// Creates a new button bound to the `Arc`. pub fn new(cx: &mut Context, lens: L, label: impl Res) -> Handle where T: ToString, { Self { lens: lens.clone() } .build(cx, move |cx| { Label::new(cx, label); }) .checked(lens.map(|v| v.load(Ordering::Relaxed))) // We'll pretend this is a param-button, so this class is used for assigning a unique // color .class("safe-mode") } } impl>> View for SafeModeButton { fn element(&self) -> Option<&'static str> { // Reuse the styling from param-button Some("param-button") } fn event(&mut self, cx: &mut EventContext, event: &mut Event) { event.map(|window_event, meta| match window_event { WindowEvent::MouseDown(MouseButton::Left) // We don't need special double and triple click handling | WindowEvent::MouseDoubleClick(MouseButton::Left) | WindowEvent::MouseTripleClick(MouseButton::Left) => { // We can just unconditionally toggle the boolean here let atomic = self.lens.get(cx); atomic.fetch_xor(true, Ordering::AcqRel); meta.consume(); } _ => {} }); } }