use std::sync::Arc;
use crate::{
params::{Param, internals::ParamPtr},
plugin::{Plugin, PluginState},
};
use super::PluginApi;
pub trait GuiContext: Send + Sync + 'static {
fn plugin_api(&self) -> PluginApi;
fn request_resize(&self) -> bool;
unsafe fn raw_begin_set_parameter(&self, param: ParamPtr);
unsafe fn raw_set_parameter_normalized(&self, param: ParamPtr, normalized: f32);
unsafe fn raw_end_set_parameter(&self, param: ParamPtr);
fn get_state(&self) -> PluginState;
fn set_state(&self, state: PluginState);
}
pub struct AsyncExecutor<P: Plugin> {
pub(crate) execute_background: Arc<dyn Fn(P::BackgroundTask) + Send + Sync>,
pub(crate) execute_gui: Arc<dyn Fn(P::BackgroundTask) + Send + Sync>,
}
impl<P: Plugin> AsyncExecutor<P> {
pub fn new(
execute_background: Arc<dyn Fn(P::BackgroundTask) + Send + Sync>,
execute_gui: Arc<dyn Fn(P::BackgroundTask) + Send + Sync>,
) -> Self {
Self {
execute_background,
execute_gui,
}
}
}
impl<P: Plugin> Clone for AsyncExecutor<P> {
fn clone(&self) -> Self {
Self {
execute_background: self.execute_background.clone(),
execute_gui: self.execute_gui.clone(),
}
}
}
pub struct ParamSetter<'a> {
pub raw_context: &'a dyn GuiContext,
}
impl<P: Plugin> AsyncExecutor<P> {
pub fn execute_background(&self, task: P::BackgroundTask) {
(self.execute_background)(task);
}
pub fn execute_gui(&self, task: P::BackgroundTask) {
(self.execute_gui)(task);
}
}
impl<'a> ParamSetter<'a> {
pub fn new(context: &'a dyn GuiContext) -> Self {
Self {
raw_context: context,
}
}
pub fn begin_set_parameter<P: Param>(&self, param: &P) {
unsafe { self.raw_context.raw_begin_set_parameter(param.as_ptr()) };
}
pub fn set_parameter<P: Param>(&self, param: &P, value: P::Plain) {
let ptr = param.as_ptr();
let normalized = param.preview_normalized(value);
unsafe {
self.raw_context
.raw_set_parameter_normalized(ptr, normalized)
};
}
pub fn set_parameter_normalized<P: Param>(&self, param: &P, normalized: f32) {
let ptr = param.as_ptr();
unsafe {
self.raw_context
.raw_set_parameter_normalized(ptr, normalized)
};
}
pub fn end_set_parameter<P: Param>(&self, param: &P) {
unsafe { self.raw_context.raw_end_set_parameter(param.as_ptr()) };
}
}