use crate::SettingsUI;
use par_term_config::{ShaderConfig, ShaderMetadata};
pub(super) fn save_settings_to_shader_metadata(
settings: &mut SettingsUI,
shader_name: &str,
existing_metadata: &Option<par_term_config::ShaderMetadata>,
) {
let shader_path = par_term_config::Config::shader_path(shader_name);
if !shader_path.exists() {
log::error!(
"Cannot save metadata: shader file not found: {}",
shader_path.display()
);
settings.shader_editor_error = Some(format!(
"Cannot save metadata: shader file not found:\n{}",
shader_path.display()
));
return;
}
let new_metadata = build_metadata_from_settings(settings, shader_name, existing_metadata);
match par_term_config::update_shader_metadata_file(&shader_path, &new_metadata) {
Ok(()) => {
log::info!("Saved metadata to shader: {}", shader_path.display());
settings.shader_metadata_cache.invalidate(shader_name);
settings.shader_editor_error = None;
}
Err(e) => {
log::error!("Failed to save metadata to shader: {}", e);
settings.shader_editor_error = Some(format!("Failed to save metadata:\n{}", e));
}
}
}
fn build_metadata_from_settings(
settings: &SettingsUI,
shader_name: &str,
existing_metadata: &Option<ShaderMetadata>,
) -> ShaderMetadata {
let mut metadata = existing_metadata.clone().unwrap_or_else(|| ShaderMetadata {
name: Some(shader_name.trim_end_matches(".glsl").to_string()),
author: None,
description: None,
version: Some("1.0.0".to_string()),
defaults: ShaderConfig::default(),
});
let current_override = settings.config.shader_configs.get(shader_name);
let meta_defaults = existing_metadata.as_ref().map(|m| &m.defaults);
let mut new_defaults = ShaderConfig::default();
let effective_speed = current_override
.and_then(|o| o.animation_speed)
.or_else(|| meta_defaults.and_then(|m| m.animation_speed))
.unwrap_or(settings.config.shader.custom_shader_animation_speed);
if (effective_speed - 1.0).abs() > 0.001 {
new_defaults.animation_speed = Some(effective_speed);
}
let effective_brightness = current_override
.and_then(|o| o.brightness)
.or_else(|| meta_defaults.and_then(|m| m.brightness))
.unwrap_or(settings.config.shader.custom_shader_brightness);
if (effective_brightness - 1.0).abs() > 0.001 {
new_defaults.brightness = Some(effective_brightness);
}
let effective_text_opacity = current_override
.and_then(|o| o.text_opacity)
.or_else(|| meta_defaults.and_then(|m| m.text_opacity))
.unwrap_or(settings.config.shader.custom_shader_text_opacity);
if (effective_text_opacity - 1.0).abs() > 0.001 {
new_defaults.text_opacity = Some(effective_text_opacity);
}
let effective_full_content = current_override
.and_then(|o| o.full_content)
.or_else(|| meta_defaults.and_then(|m| m.full_content))
.unwrap_or(settings.config.shader.custom_shader_full_content);
if effective_full_content {
new_defaults.full_content = Some(true);
}
let effective_channel0 = current_override
.and_then(|o| o.channel0.clone())
.or_else(|| meta_defaults.and_then(|m| m.channel0.clone()))
.or_else(|| settings.config.shader.custom_shader_channel0.clone());
if effective_channel0.is_some() {
new_defaults.channel0 = effective_channel0;
}
let effective_channel1 = current_override
.and_then(|o| o.channel1.clone())
.or_else(|| meta_defaults.and_then(|m| m.channel1.clone()))
.or_else(|| settings.config.shader.custom_shader_channel1.clone());
if effective_channel1.is_some() {
new_defaults.channel1 = effective_channel1;
}
let effective_channel2 = current_override
.and_then(|o| o.channel2.clone())
.or_else(|| meta_defaults.and_then(|m| m.channel2.clone()))
.or_else(|| settings.config.shader.custom_shader_channel2.clone());
if effective_channel2.is_some() {
new_defaults.channel2 = effective_channel2;
}
let effective_channel3 = current_override
.and_then(|o| o.channel3.clone())
.or_else(|| meta_defaults.and_then(|m| m.channel3.clone()))
.or_else(|| settings.config.shader.custom_shader_channel3.clone());
if effective_channel3.is_some() {
new_defaults.channel3 = effective_channel3;
}
let effective_cubemap = current_override
.and_then(|o| o.cubemap.clone())
.or_else(|| meta_defaults.and_then(|m| m.cubemap.clone()))
.or_else(|| settings.config.shader.custom_shader_cubemap.clone());
if effective_cubemap.is_some() {
new_defaults.cubemap = effective_cubemap;
}
let effective_cubemap_enabled = current_override
.and_then(|o| o.cubemap_enabled)
.or_else(|| meta_defaults.and_then(|m| m.cubemap_enabled))
.unwrap_or(settings.config.shader.custom_shader_cubemap_enabled);
if !effective_cubemap_enabled {
new_defaults.cubemap_enabled = Some(false);
}
let effective_use_background = current_override
.and_then(|o| o.use_background_as_channel0)
.or_else(|| meta_defaults.and_then(|m| m.use_background_as_channel0))
.unwrap_or(
settings
.config
.shader
.custom_shader_use_background_as_channel0,
);
if effective_use_background {
new_defaults.use_background_as_channel0 = Some(true);
}
metadata.defaults = new_defaults;
metadata
}