#![allow(dead_code)]
#[derive(Debug, Clone)]
pub struct RackFocusView {
pub near_focus_dist: f32,
pub far_focus_dist: f32,
pub focus_progress: f32,
pub transition_speed: f32,
pub blur_amount: f32,
pub enabled: bool,
}
impl RackFocusView {
pub fn new() -> Self {
RackFocusView {
near_focus_dist: 1.0,
far_focus_dist: 10.0,
focus_progress: 0.0,
transition_speed: 1.0,
blur_amount: 0.5,
enabled: true,
}
}
}
impl Default for RackFocusView {
fn default() -> Self {
Self::new()
}
}
pub fn new_rack_focus_view() -> RackFocusView {
RackFocusView::new()
}
pub fn rfv_current_focus_dist(rfv: &RackFocusView) -> f32 {
rfv.near_focus_dist + (rfv.far_focus_dist - rfv.near_focus_dist) * rfv.focus_progress
}
pub fn rfv_set_focus_progress(rfv: &mut RackFocusView, progress: f32) {
rfv.focus_progress = progress.clamp(0.0, 1.0);
}
pub fn rfv_set_speed(rfv: &mut RackFocusView, speed: f32) {
rfv.transition_speed = speed.max(0.0);
}
pub fn rfv_set_blur(rfv: &mut RackFocusView, blur: f32) {
rfv.blur_amount = blur.clamp(0.0, 1.0);
}
pub fn rfv_set_enabled(rfv: &mut RackFocusView, enabled: bool) {
rfv.enabled = enabled;
}
pub fn rfv_to_json(rfv: &RackFocusView) -> String {
format!(
r#"{{"near_focus":{},"far_focus":{},"progress":{},"blur":{},"enabled":{}}}"#,
rfv.near_focus_dist, rfv.far_focus_dist, rfv.focus_progress, rfv.blur_amount, rfv.enabled
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_near_focus() {
let r = new_rack_focus_view();
assert!((r.near_focus_dist - 1.0).abs() < 1e-5, );
}
#[test]
fn test_focus_at_near_when_progress_zero() {
let r = new_rack_focus_view();
let dist = rfv_current_focus_dist(&r);
assert!((dist - r.near_focus_dist).abs() < 1e-5, );
}
#[test]
fn test_focus_at_far_when_progress_one() {
let mut r = new_rack_focus_view();
rfv_set_focus_progress(&mut r, 1.0);
let dist = rfv_current_focus_dist(&r);
assert!((dist - r.far_focus_dist).abs() < 1e-5, );
}
#[test]
fn test_set_speed() {
let mut r = new_rack_focus_view();
rfv_set_speed(&mut r, 2.0);
assert!((r.transition_speed - 2.0).abs() < 1e-5, );
}
#[test]
fn test_set_blur_clamped() {
let mut r = new_rack_focus_view();
rfv_set_blur(&mut r, 2.0);
assert!((r.blur_amount - 1.0).abs() < 1e-6, );
}
#[test]
fn test_set_progress_clamped() {
let mut r = new_rack_focus_view();
rfv_set_focus_progress(&mut r, -0.5);
assert!((r.focus_progress).abs() < 1e-6, );
}
#[test]
fn test_set_enabled() {
let mut r = new_rack_focus_view();
rfv_set_enabled(&mut r, false);
assert!(!r.enabled ,);
}
#[test]
fn test_to_json_contains_near_focus() {
let r = new_rack_focus_view();
let j = rfv_to_json(&r);
assert!(j.contains("\"near_focus\""), );
}
#[test]
fn test_enabled_default() {
let r = new_rack_focus_view();
assert!(r.enabled ,);
}
#[test]
fn test_focus_midpoint() {
let mut r = new_rack_focus_view();
rfv_set_focus_progress(&mut r, 0.5);
let dist = rfv_current_focus_dist(&r);
let mid = (r.near_focus_dist + r.far_focus_dist) / 2.0;
assert!((dist - mid).abs() < 1e-4, );
}
}