use crate::AppKit;
use day_spec::NodeId;
use day_spec::props::{ProgressPatch as ActivityPatch, ProgressProps as ActivityProps};
use objc2::rc::Retained;
use objc2::{MainThreadOnly, msg_send};
use objc2_app_kit::{NSControlSize, NSProgressIndicator, NSProgressIndicatorStyle, NSView};
fn control_size(large: bool) -> NSControlSize {
if large {
NSControlSize::Large
} else {
NSControlSize::Regular
}
}
fn set_animating(spinner: &NSProgressIndicator, on: bool) {
unsafe {
if on {
spinner.startAnimation(None);
} else {
spinner.stopAnimation(None);
}
}
}
pub(crate) fn make(backend: &mut AppKit, p: &ActivityProps, _id: NodeId) -> Retained<NSView> {
let mtm = backend.mtm();
let spinner: Retained<NSProgressIndicator> =
unsafe { msg_send![NSProgressIndicator::alloc(mtm), init] };
spinner.setStyle(NSProgressIndicatorStyle::Spinning);
spinner.setIndeterminate(true);
spinner.setDisplayedWhenStopped(true);
spinner.setControlSize(control_size(p.large));
set_animating(&spinner, p.animating);
Retained::from(<NSProgressIndicator as AsRef<NSView>>::as_ref(&spinner))
}
pub(crate) fn update(_backend: &mut AppKit, h: &Retained<NSView>, patch: &ActivityPatch) {
let Some(spinner) = h.downcast_ref::<NSProgressIndicator>() else {
return;
};
match patch {
ActivityPatch::Value(_) => {}
ActivityPatch::Animating(on) => set_animating(spinner, *on),
}
}