You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
obws/src/client/transitions.rs

121 lines
4.5 KiB
Rust

use chrono::Duration;
use serde::Serialize;
use super::Client;
use crate::{requests::RequestType, responses, Error, Result};
/// API functions related to transitions.
pub struct Transitions<'a> {
pub(super) client: &'a Client,
}
impl<'a> Transitions<'a> {
/// List of all transitions available in the frontend's dropdown menu.
pub async fn get_transition_list(&self) -> Result<responses::TransitionList> {
self.client
.send_message(RequestType::GetTransitionList)
.await
}
/// Get the name of the currently selected transition in the frontend's dropdown menu.
pub async fn get_current_transition(&self) -> Result<responses::CurrentTransition> {
self.client
.send_message(RequestType::GetCurrentTransition)
.await
}
/// Set the active transition.
///
/// - `transition_name`: The name of the transition.
pub async fn set_current_transition(&self, transition_name: &str) -> Result<()> {
self.client
.send_message(RequestType::SetCurrentTransition { transition_name })
.await
}
/// Set the duration of the currently selected transition if supported.
///
/// - `duration`: Desired duration of the transition (in milliseconds).
pub async fn set_transition_duration(&self, duration: Duration) -> Result<()> {
self.client
.send_message(RequestType::SetTransitionDuration { duration })
.await
}
/// Get the duration of the currently selected transition if supported.
pub async fn get_transition_duration(&self) -> Result<Duration> {
self.client
.send_message::<responses::TransitionDuration>(RequestType::GetTransitionDuration)
.await
.map(|td| td.transition_duration)
}
/// Get the position of the current transition.
pub async fn get_transition_position(&self) -> Result<f64> {
self.client
.send_message::<responses::TransitionPosition>(RequestType::GetTransitionPosition)
.await
.map(|tp| tp.position)
}
/// Get the current settings of a transition.
///
/// - `transition_name`: Transition name.
pub async fn get_transition_settings(
&self,
transition_name: &str,
) -> Result<serde_json::Value> {
self.client
.send_message::<responses::TransitionSettings>(RequestType::GetTransitionSettings {
transition_name,
})
.await
.map(|ts| ts.transition_settings)
}
/// Change the current settings of a transition.
///
/// - `transition_name`: Transition name.
/// - `transition_settings`: Transition settings (they can be partial)
pub async fn set_transition_settings<T>(
&self,
transition_name: &str,
transition_settings: &T,
) -> Result<serde_json::Value>
where
T: Serialize,
{
self.client
.send_message::<responses::TransitionSettings>(RequestType::SetTransitionSettings {
transition_name,
transition_settings: &serde_json::to_value(transition_settings)
.map_err(Error::SerializeCustomData)?,
})
.await
.map(|ts| ts.transition_settings)
}
/// Release the T-Bar (like a user releasing their mouse button after moving it). *YOU MUST CALL
/// THIS if you called [`set_t_bar_position`](Self::set_t_bar_position) with the `release`
/// parameter set to `false`.*
pub async fn release_t_bar(&self) -> Result<()> {
self.client.send_message(RequestType::ReleaseTBar).await
}
/// If your code needs to perform multiple successive T-Bar moves (e.g. : in an animation, or in
/// response to a user moving a T-Bar control in your User Interface), set `release` to false
/// and call [`release_t_bar`](Self::release_t_bar) later once the animation/interaction is
/// over.
///
/// - `position`: T-Bar position. This value must be between 0.0 and 1.0.
/// - `release`: Whether or not the T-Bar gets released automatically after setting its new
/// position (like a user releasing their mouse button after moving the T-Bar). Call
/// [`release_t_bar`](Self::release_t_bar) manually if you set `release` to false. Defaults to
/// true.
pub async fn set_t_bar_position(&self, position: f64, release: Option<bool>) -> Result<()> {
self.client
.send_message(RequestType::SetTBarPosition { position, release })
.await
}
}