use crate::{MainWindow, SettingsModel};
use slint::ComponentHandle;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct HiddenRenderSettings {
pub preview_size: i32,
pub preview_spp: i32,
pub motion_preview_index: i32,
pub live_compute_index: i32,
pub live_transfer_index: i32,
pub contribute_to_final_picture: bool,
pub local_compute_index: i32,
pub bounce_index: i32,
}
impl HiddenRenderSettings {
pub const DEFAULT: Self = Self {
preview_size: 160,
preview_spp: 256,
motion_preview_index: 0,
live_compute_index: 2,
live_transfer_index: 0,
contribute_to_final_picture: true,
local_compute_index: 1,
bounce_index: 2,
};
#[must_use]
pub fn in_use(&self) -> bool {
*self != Self::DEFAULT
}
}
pub(in crate::gui) fn setup_advanced_in_use_callback(ui: &MainWindow) {
ui.global::<SettingsModel>().on_advanced_in_use(
|preview_size,
preview_spp,
motion_preview_index,
live_compute_index,
live_transfer_index,
contribute_to_final_picture,
local_compute_index,
bounce_index| {
HiddenRenderSettings {
preview_size,
preview_spp,
motion_preview_index,
live_compute_index,
live_transfer_index,
contribute_to_final_picture,
local_compute_index,
bounce_index,
}
.in_use()
},
);
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{
gui::{
local_compute_target_from_index, local_preview_scale_from_index,
remote::live_compute_target_from_index,
},
settings::model::{AppSettings, LiveTransfer},
};
const DEFAULT: HiddenRenderSettings = HiddenRenderSettings::DEFAULT;
const BOUNCE_LADDER: [u32; 6] = [4, 8, 12, 24, 64, 128];
#[test]
fn the_default_settings_are_not_advanced() {
assert!(!DEFAULT.in_use());
}
#[test]
fn every_hidden_setting_off_its_default_counts_as_in_use() {
let changed = [
HiddenRenderSettings {
preview_size: 224,
..DEFAULT
},
HiddenRenderSettings {
preview_spp: 512,
..DEFAULT
},
HiddenRenderSettings {
motion_preview_index: 1,
..DEFAULT
},
HiddenRenderSettings {
live_compute_index: 0,
..DEFAULT
},
HiddenRenderSettings {
live_transfer_index: 1,
..DEFAULT
},
HiddenRenderSettings {
contribute_to_final_picture: false,
..DEFAULT
},
HiddenRenderSettings {
local_compute_index: 2,
..DEFAULT
},
HiddenRenderSettings {
bounce_index: 4,
..DEFAULT
},
];
for settings in changed {
assert!(settings.in_use(), "{settings:?}");
}
}
#[test]
fn the_default_values_are_the_persisted_defaults() {
let persisted = AppSettings::default();
assert_eq!(
u32::try_from(DEFAULT.preview_size).ok(),
Some(persisted.preview_size)
);
assert_eq!(
u32::try_from(DEFAULT.preview_spp).ok(),
Some(persisted.preview_spp)
);
assert_eq!(
local_preview_scale_from_index(DEFAULT.motion_preview_index),
persisted.local_preview_scale
);
assert_eq!(
live_compute_target_from_index(DEFAULT.live_compute_index),
persisted.live_compute_target
);
assert_eq!(
local_compute_target_from_index(DEFAULT.local_compute_index),
persisted.local_compute_target
);
assert_eq!(
DEFAULT.contribute_to_final_picture,
persisted.contribute_to_final_picture
);
assert_eq!(
LiveTransfer::from_index(DEFAULT.live_transfer_index),
LiveTransfer::default()
);
let bounces = usize::try_from(DEFAULT.bounce_index)
.ok()
.and_then(|index| BOUNCE_LADDER.get(index));
assert_eq!(bounces, Some(&persisted.max_bounces));
}
#[test]
fn the_bounce_ladder_has_the_six_caps_the_dialog_draws() {
assert_eq!(BOUNCE_LADDER.len(), 6);
assert!(BOUNCE_LADDER.windows(2).all(|pair| pair[0] < pair[1]));
}
}