daemos 0.1.2

A local-only music player
Documentation
use egui::RichText;

use crate::{config::core::SharedConfig, context::SharedContext};

const DEFAULT_POPUP_SIZE: [f32; 2] = [300.0, 200.0];
const WINDOW_HEADER_SPACING: f32 = 5.0;

#[derive(Debug, Clone)]
pub struct PlaybackDebugPopup {
    _config: SharedConfig,
    context: SharedContext,
}

impl PlaybackDebugPopup {
    pub fn new(config: SharedConfig, context: SharedContext) -> Self {
        Self {
            _config: config,
            context,
        }
    }

    pub fn ui(&mut self, ctx: &egui::Context) {
        if !self.context.borrow().ui.visibility.debug_playback() {
            return;
        }

        let context = self.context.borrow();
        let playback_context = context.playback.clone();

        egui::Window::new("Playback Debug")
            .open(self.context.borrow_mut().ui.visibility.debug_playback_mut())
            .resizable(true)
            .title_bar(true)
            .min_size(egui::Vec2::from(DEFAULT_POPUP_SIZE))
            .show(ctx, |ui| {
                let track_context = &playback_context.selected_track;
                let control = &playback_context.control;

                ui.group(|ui| {
                    ui.label(RichText::new("Track Info").underline().heading());
                    ui.add_space(WINDOW_HEADER_SPACING);

                    ui.label(format!("Loaded: {}", track_context.is_some()));

                    if let Some(track_context) = &track_context {
                        ui.label(format!("Path: {:?}", track_context.track.path));
                        ui.label(format!(
                            "Duration: {} seconds",
                            track_context.track.duration_secs
                        ));
                    }
                });

                ui.separator();

                ui.group(|ui| {
                    ui.label(RichText::new("Playback State").underline().heading());
                    ui.add_space(WINDOW_HEADER_SPACING);

                    ui.label(format!(
                        "Playing: {:?}",
                        track_context.as_ref().map(|track| track.playing)
                    ));

                    if let Some(base) = control.progress_base {
                        ui.label(format!("Progress Base: {base:.2?}"));
                    } else {
                        ui.label("Progress Base: None");
                    }

                    if let Some(ts) = control.progress_timestamp {
                        ui.label(format!("Progress Timestamp: {ts:?}"));
                    } else {
                        ui.label("Progress Timestamp: None");
                    }

                    if let Some(simulated) = control.current_progress() {
                        ui.label(format!("Simulated Current Progress: {simulated:.2?}"));
                    } else {
                        ui.label("Simulated Current Progress: None");
                    }
                });

                ui.separator();

                ui.group(|ui| {
                    ui.label(RichText::new("Volume State").underline().heading());
                    ui.add_space(WINDOW_HEADER_SPACING);

                    ui.label(format!("Volume: {:.2}", control.volume));
                    ui.label(format!("Last Volume Sent: {:.2}", control.last_volume_sent));
                });
            });
    }
}