par-term-settings-ui 0.19.0

Settings UI for par-term terminal emulator
Documentation
//! Transparency section of the window settings tab.

use crate::SettingsUI;
use crate::search::SearchTag;
use crate::section::{SLIDER_WIDTH, collapsing_section};
use std::collections::HashSet;

const SLIDER_HEIGHT: f32 = 18.0;

pub(crate) fn show_transparency_section(
    ui: &mut egui::Ui,
    settings: &mut SettingsUI,
    changes_this_frame: &mut bool,
    collapsed: &mut HashSet<String>,
) {
    collapsing_section(
        ui,
        "Transparency",
        "window_transparency",
        true,
        collapsed,
        |ui| {
            ui.horizontal(|ui| {
                ui.label("Opacity:");
                let response = ui
                    .add_sized(
                        [SLIDER_WIDTH, SLIDER_HEIGHT],
                        crate::units::percent(egui::Slider::new(
                            &mut settings.config.window.window_opacity,
                            0.1..=1.0,
                        )),
                    )
                    .search_tag(&["window_opacity"]);
                if response.changed() {
                    log::info!(
                        "Opacity slider changed to: {}",
                        settings.config.window.window_opacity
                    );
                    settings.has_changes = true;
                    *changes_this_frame = true;
                }
                crate::reset::reset_button(ui, settings, changes_this_frame, |c| {
                    &mut c.window.window_opacity
                });
            });

            if ui
                .checkbox(
                    &mut settings.config.background.transparency_affects_only_default_background,
                    "Transparency affects only default background",
                ).search_tag(&["transparency_affects_only_default_background"])
                .on_hover_text(
                    "When enabled, colored backgrounds (syntax highlighting, status bars) remain opaque for better readability",
                )
                .changed()
            {
                settings.has_changes = true;
                *changes_this_frame = true;
            }

            if ui
                .checkbox(&mut settings.config.background.keep_text_opaque, "Keep text opaque").search_tag(&["keep_text_opaque"])
                .on_hover_text(
                    "When enabled, text is always rendered at full opacity regardless of window transparency",
                )
                .changed()
            {
                settings.has_changes = true;
                *changes_this_frame = true;
            }

            // Blur settings (macOS only)
            #[cfg(target_os = "macos")]
            {
                ui.add_space(8.0);

                if ui
                    .checkbox(&mut settings.config.window.blur_enabled, "Enable window blur").search_tag(&["blur_enabled"])
                    .on_hover_text(
                        "Blur content behind the transparent window for better readability (requires transparency)",
                    )
                    .changed()
                {
                    settings.has_changes = true;
                    *changes_this_frame = true;
                }

                crate::dependent::dependent(
                    ui,
                    settings.config.window.blur_enabled,
                    "Enable window blur",
                    |ui| {
                        ui.horizontal(|ui| {
                            ui.label("Blur radius:");
                            // Convert u32 to i32 for slider, clamp to valid range
                            let mut radius_i32 = settings.config.window.blur_radius.min(64) as i32;
                            if ui
                                .add(egui::Slider::new(&mut radius_i32, 1..=64).suffix(" px"))
                                .search_tag(&["blur_radius"])
                                .on_hover_text("Blur intensity (higher = more blur)")
                                .changed()
                            {
                                settings.config.window.blur_radius = radius_i32 as u32;
                                settings.has_changes = true;
                                *changes_this_frame = true;
                            }
                        });
                    },
                );
            }
        },
    );
}